// Чтение данных из первых строк файла НаименованиеСклада = СокрЛП(Сред(Файл.ПолучитьСтроку(1), Найти(Файл.ПолучитьСтроку(1), ":") + 1)); НаименованиеФирмы = СокрЛП(Сред(Файл.ПолучитьСтроку(2), Найти(Файл.ПолучитьСтроку(2), ":") + 1)); НаименованиеКонтрагента = СокрЛП(Сред(Файл.ПолучитьСтроку(3), Найти(Файл.ПолучитьСтроку(3), ":") + 1));
// Поиск фирмы по наименованию из файла спрФирма = СоздатьОбъект("Справочник.Фирмы"); спрФирма.НайтиПоНаименованию(НаименованиеФирмы); Если спрФирма.Код <> 0 Тогда Накладная.Фирма = спрФирма.ТекущийЭлемент(); Иначе Сообщить("Фирма не найдена: " + НаименованиеФирмы); КонецЕсли;
// Поиск контрагента по наименованию из файла спрКонтрагент = СоздатьОбъект("Справочник.Контрагенты"); спрКонтрагент.НайтиПоНаименованию(НаименованиеКонтрагента); Если спрКонтрагент.Код <> 0 Тогда Накладная.Контрагент = спрКонтрагент.ТекущийЭлемент(); Иначе Сообщить("Контрагент не найден: " + НаименованиеКонтрагента); КонецЕсли;
// Получаем место хранения по наименованию из файла спрСклад = СоздатьОбъект("Справочник.МестаХранения"); спрСклад.НайтиПоНаименованию(НаименованиеСклада); Если спрСклад.Код <> 0 Тогда Накладная.Склад = спрСклад.ТекущийЭлемент(); Иначе Сообщить("Склад не найден: " + НаименованиеСклада); КонецЕсли;
Пока ЧтениеПродолжается = 1 Цикл // Читаем строку из файла СтатусЧтения = Файл.ПолучитьСтроку(ТекущаяСтрока);
// Проверяем, были ли строки в файле Если СтатусЧтения = 0 Тогда ЧтениеПродолжается = 0; // Если строк больше нет, выходим из цикла ИначеЕсли ТекущаяСтрока = "" Тогда Продолжить; // Пропускаем пустые строки Иначе // Обработка строки с артикулом Если Лев(ТекущаяСтрока, 8) = "Артикул:" Тогда Артикул = СокрЛП(Сред(ТекущаяСтрока, 9));
// Читаем строку с количеством СтрокаКоличество = ""; Файл.ПрочитатьСтроку(СтрокаКоличество); Если Лев(СтрокаКоличество, 10) = "Количество:" Тогда Количество = Число(СокрЛП(Сред(СтрокаКоличество, 11)));
// Добавление строки в табличную часть СтрокаТЧ = Накладная.Товары.Добавить(); СтрокаТЧ.Артикул = Артикул; СтрокаТЧ.Количество = Количество; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла;
// Записываем документ Накладная.Записать(); Сообщить("Расходная накладная успешно создана!"); КонецПроцедуры
Суть вопроса просьба помощи. конечная цель процедуры работать автономно и постоянно искать файл и создавать на его основе документ в зависимости от названия документа. На данный момент я застопорился в двух моментах: первый если контрагент прописан в подкаталоге он не находится для вставки. Вторая не выходит для документа вытянуть данные об товаре. Если кому поможет вставлю пример как выглядит файл на основе которого заполняется документ. Буду благодарен любой помощи.
Пример документа:
Склад: "склад" Фирма: "название фопа" Контрагент: "контрагент"
Группа: Пользователи
Сообщений: 480
Из: Казахстан
Спасибо сказали: 49 раз
Рейтинг: 49
Цитата(kayfatuch @ 15.11.24, 18:33)
первый если контрагент прописан в подкаталоге он не находится для вставки
Синтаксис Поиска в справочниках по наименованию:
НайтиПоНаименованию(<?>,,); Синтаксис: НайтиПоНаименованию(<Наименование>,<Режим>,<ФлагПоиска>) Назначение: Найти элемент справочника по наименованию. Возвращает: 1 - если действие выполнено; 0 - если действие не выполнено (элемент не найден). Параметры: <Наименование> - строка с наименованием искомого элемента справочника, <Режим> - необязательный параметр. Число: 1 - поиск внутри установленного подчинения (родителя); 0 - поиск во всем справочнике вне зависимости от родителя. Значение по умолчанию - 1. <ФлагПоиска> - необязательный параметр. Число: 1 - найти точное соответствие наименования; 0 - найти наименование по первым символам. Значение по умолчанию - 0.
НайтиПоНаименованию(<?>,,); Синтаксис: НайтиПоНаименованию(<Наименование>,<Режим>,<ФлагПоиска>) Назначение: Найти элемент справочника по наименованию. Возвращает: 1 - если действие выполнено; 0 - если действие не выполнено (элемент не найден). Параметры: <Наименование> - строка с наименованием искомого элемента справочника, <Режим> - необязательный параметр. Число: 1 - поиск внутри установленного подчинения (родителя); 0 - поиск во всем справочнике вне зависимости от родителя. Значение по умолчанию - 1. <ФлагПоиска> - необязательный параметр. Число: 1 - найти точное соответствие наименования; 0 - найти наименование по первым символам. Значение по умолчанию - 0.
Спасибо большое. Видимо проглядел когда читал описание функции.
Да, вполне и первого параметра оказалось достаточно что бы нашёл специфичного контрагента, но решил оба прописать.
Цитата(andrew76 @ 15.11.24, 17:17)
может в базе разночтение идёт - "Артикул :" или "АРТИКУЛ:" либо ещё как-то исковеркано пользователями ?
Сам файл генерируется программой на ТСД да и файл скидывается в закрытую директорию. Тут скорее сейчас странность в том что программа в вечный цикл падает. Причём я добавил сообщения для проверки считываются ли данные из файла(артикул, количество) но они не выводятся.... Такое ощущения будто либо я к многострочной части формы неверно обращаюсь то ли с перебором в файле напортачил...
А может быть в "пустой" строке есть ещё какие-либо символы (пробелы,спецсимволы) ?
Нет нашёл где была проблема. Я натупил и не добавил обработку перехода на новую строку. Но легче от этого не стало( я даже попробовал просто скопировать формулу как искал склад и т.п. всё равно пустота
// Чтение данных из первых строк файла НаименованиеСклада = СокрЛП(Сред(Файл.ПолучитьСтроку(1), Найти(Файл.ПолучитьСтроку(1), ":") + 1)); НаименованиеФирмы = СокрЛП(Сред(Файл.ПолучитьСтроку(2), Найти(Файл.ПолучитьСтроку(2), ":") + 1)); НаименованиеКонтрагента = СокрЛП(Сред(Файл.ПолучитьСтроку(3), Найти(Файл.ПолучитьСтроку(3), ":") + 1));
// Поиск фирмы по наименованию из файла спрФирма = СоздатьОбъект("Справочник.Фирмы"); спрФирма.НайтиПоНаименованию(НаименованиеФирмы); Если спрФирма.Код <> 0 Тогда Накладная.Фирма = спрФирма.ТекущийЭлемент(); Иначе Сообщить("Фирма не найдена: " + НаименованиеФирмы); КонецЕсли;
// Поиск контрагента по наименованию из файла спрКонтрагент = СоздатьОбъект("Справочник.Контрагенты"); спрКонтрагент.НайтиПоНаименованию(НаименованиеКонтрагента, 0, 1); Если спрКонтрагент.Код <> 0 Тогда Накладная.Контрагент = спрКонтрагент.ТекущийЭлемент(); Иначе Сообщить("Контрагент не найден: " + НаименованиеКонтрагента); КонецЕсли;
// Получаем место хранения по наименованию из файла спрСклад = СоздатьОбъект("Справочник.МестаХранения"); спрСклад.НайтиПоНаименованию(НаименованиеСклада); Если спрСклад.Код <> 0 Тогда Накладная.Склад = спрСклад.ТекущийЭлемент(); Иначе Сообщить("Склад не найден: " + НаименованиеСклада); КонецЕсли;
// Обработка строк файла ТекущаяСтрока = 6; // Начинаем с 6-й строки ПустыхСтрокПодряд = 0; // Счетчик пустых строк
Пока ПустыхСтрокПодряд < 3 Цикл СтатусЧтения = Файл.ПолучитьСтроку(ТекущаяСтрока);
Если СтатусЧтения = "" Тогда ПустыхСтрокПодряд = ПустыхСтрокПодряд + 1; ТекущаяСтрока = ТекущаяСтрока + 1; Продолжить; Иначе ПустыхСтрокПодряд = 0; // Сброс счетчика, если строка не пустая КонецЕсли;
Если Найти(СтатусЧтения, "Артикул:") > 0 Тогда Артикул = СокрЛП(Сред(СтатусЧтения, Найти(СтатусЧтения, ":") + 1)); ТекущаяСтрока = ТекущаяСтрока + 1;
// Считываем количество КоличествоСтрока = Файл.ПолучитьСтроку(ТекущаяСтрока); Количество = Число(СокрЛП(Сред(КоличествоСтрока, Найти(КоличествоСтрока, ":") + 1)));
// Добавляем строку в табличную часть ТЗК = СоздатьОбъект("ТаблицаЗначений"); ТЗК.НоваяКолонка("Артикул", "Строка", 24); ТЗК.НоваяКолонка("Количество", "Число", 13);
Группа: Пользователи
Сообщений: 480
Из: Казахстан
Спасибо сказали: 49 раз
Рейтинг: 49
Цитата(kayfatuch @ 16.11.24, 4:54)
а в таблицу нихрена не вставляем
В таблицу не вставляем ? Вставляем,конечно,только после вставки,объект Таблица каждый раз пересоздаётся полностью поэтому и кажется ,что Таблица пустая.
Если Найти(СтатусЧтения, "Артикул:") > 0 Тогда Артикул = СокрЛП(Сред(СтатусЧтения, Найти(СтатусЧтения, ":") + 1)); ТекущаяСтрока = ТекущаяСтрока + 1;
// Считываем количество КоличествоСтрока = Файл.ПолучитьСтроку(ТекущаяСтрока); Количество = Число(СокрЛП(Сред(КоличествоСтрока, Найти(КоличествоСтрока, ":") + 1)));
// Добавляем строку в табличную часть ТЗК = СоздатьОбъект("ТаблицаЗначений"); //Вот здесь каждый раз объект Таблица ПЕРЕСОЗДАЁТСЯ !
Чтобы это не мешало,нужно строчку ТЗК = СоздатьОбъект("ТаблицаЗначений") перенести выше по тексту:
Попробовал и ничего не изменилось. В этом моменте и кроется вопрос даже по старому есть же последняя подборка пар артикул/количество которые должны сохранится а результат нулевой. Да и в целом структура с ТЗК это я выдрал из стандартной процедуры моей базы... Может я что-то упускаю?.. По отладчику виже что он код проходит. но открывая документ в нём только фирма/склад/контрагент заполнены а многострочная часть пустая...
Спасибо помогло! Правда странно при вставке не сработала функция таблицы на поиск наименования по артикулу.... ладно добавлю в коде вставку. как и курс долбаный..
Из всех проблем осталась только одна.. как перебирать все файлы с определённым заголовком и перемещать после обработки.. насколько же это проще в 8 по сравнению с 7.7(
Группа: Пользователи
Сообщений: 480
Из: Казахстан
Спасибо сказали: 49 раз
Рейтинг: 49
Цитата(kayfatuch @ 16.11.24, 19:40)
как перебирать все файлы с определённым заголовком
С определённым заголовком файла или по определенному расширению файла нужно перебирать файлы ? Если с определённым заголовком файла,то штатными средствами 1с 7.7 этого сделать нельзя.Нужно подключать внешнюю компоненту. Если же по определенному расширению файла перебирать файлы в папке,то это можно так примерно сделать:
ФС.УстТекКаталог(каталог); //здесь пропишите маршрут своего каталога с файлами ИмяФайла = ""; ИмяФайла = ФС.НайтиПервыйФайл("*.txt"); //здесь укажите нужную вам маску файлов
Пока СтрДлина(ИмяФайла)<>0 Цикл ИмяФайла = ФС.НайтиСледующийФайл(); сообщить(ИмяФайла); КонецЦикла;
С определённым заголовком файла или по определенному расширению файла нужно перебирать файлы ? Если с определённым заголовком файла,то штатными средствами 1с 7.7 этого сделать нельзя.Нужно подключать внешнюю компоненту. Если же по определенному расширению файла перебирать файлы в папке,то это можно так примерно сделать:
Нет именно определённый заголовок. Расширение то одинаковое условно есть файл с такими именами "ExpenseInvoice_24-10-2024_17-29-19.txt" и "IncomeInvoice_24-10-2024_17-29-19.txt" и вот они падают в папку обмена. надо что бы 1с находила по примеру типа "ExpenseInvoice*.txt" и "IncomeInvoice*.txt" по очереди в папке, втягивала их на основе заголовка(соответственно приходку в приходку расходку в расходку) и далее каким либо способом исключала их из прохода(обработка будет работать в цикле на отдельном пользователе(периодично просыпаясь и засыпая)) далее от этих файлов можно и средствами винды избавлятся.. Вот собственно в чём полная суть этой обработки.
Внешняя компонента говорите... будем искать значит..
Группа: Пользователи
Сообщений: 480
Из: Казахстан
Спасибо сказали: 49 раз
Рейтинг: 49
Цитата(kayfatuch @ 17.11.24, 2:43)
втягивала их на основе заголовка(соответственно приходку в приходку расходку в расходку)
Не совсем понял.Если просто прочитать содержимое текстового файла,то компоненты внешние не нужны. В 1С 7.7 есть объект "Текст" для таких случаев.
ТекстФайл = СоздатьОбъект("Текст"); ТекстФайл.Открыть("Файл.txt"); Для i = 1 По ТекстФайл.КоличествоСтрок() Цикл нужнаяСтрока=ТекстФайл.ПолучитьСтроку(i); //здесь анализируйте содержимое строки Сообщить(нужнаяСтрока); КонецЦикла;
Если же нужно побайтовое чтение из файла,то нужна будет внешняя компонента.
Не совсем понял.Если просто прочитать содержимое текстового файла,то компоненты внешние не нужны. В 1С 7.7 есть объект "Текст" для таких случаев.
Если совсем простыми словами: ТСД генерирует приходка.txt расходка.txt, далее эти файлы отправляются на сервер в папку обмена. 1С должна на основе названия файла(хотя можно и в сам файл маркер вставить) считать его и создать или приходный документ или расходный. после считывания должна проверить есть ли ещё документы для считывания и т.д. Сложность тут с учётом предложенного вами варианта в том как сделать что бы 1с больше не спотыкалась об один и тот же файл при выборе файла для втягивания... была мысль очищать файл в конце но тут вопрос как ей сказать что раз файл пустой нужно найти следующий
Группа: Пользователи
Сообщений: 480
Из: Казахстан
Спасибо сказали: 49 раз
Рейтинг: 49
kayfatuch @ Сегодня, 14:56
,
Объединить 2 цикла , в примерах, которые я выкладывал выше. Один цикл - перебор файлов типа .txt.Внутри этого цикла-считывание информации из текстового файла.
В помощь.В объекте ФС есть метод - Атрибуты файла. Это если понадобится фильтровать файлы в каталоге по дате создания.
АтрибутыФайла(<?>,,,,,,); Синтаксис: АтрибутыФайла(<ИмяФайла>,<РазмерФайла>,<АтрибутыФайла>,<ВремяСоздания>,<ВремяПоследнегоДоступа>,<ВремяПоследнейЗаписи>,<РасширенноеИмяФайла>) Назначение: Возвращает атрибуты файла (в параметрах). Параметры: <ИмяФайла> - строка с именем файла; <РазмерФайла> - переменная, принимающая размер файла в байтах; <АтрибутыФайла> - переменная, принимающая атрибуты файла; Возвращаемое строковое значение длиной 9 символов, в котором закодированы атрибуты файла. Символы могут принимать значения ''0'' или ''1'': первый символ: если ''1'' - файл только для чтения; второй символ: если ''1'' - скрытый файл; третий символ: если ''1'' - системный файл; четвертый символ: если ''1'' - каталог; пятый символ: если ''1'' - архивный файл; шестой символ: если ''1'' - обычный файл (все другие атрибуты не установлены); седьмой символ: если ''1'' - временный файл; восьмой символ: если ''1'' - файл, сжатый каким-либо архиватором; девятый символ: если ''1'' - нет доступа к файлу. <ВремяСоздания> - переменная, принимающая строку с датой и временем создания файла; <ВремяПоследнегоДоступа> - переменная, принимающая строку с датой и временем последнего доступа к файлу; <ВремяПоследнейЗаписи> - переменная, принимающая строку с датой и временем последней записи файла; <РасширенноеИмяФайла> - переменная, принимающая строку с полным именем файла.
Сложность тут с учётом предложенного вами варианта в том как сделать что бы 1с больше не спотыкалась об один и тот же файл при выборе файла для втягивания... была мысль очищать файл в конце но тут вопрос как ей сказать что раз файл пустой нужно найти следующий
Вам вже всю потрібну інформацію виклали више.
Функция ОбработатьОдинТекстовийФайл(ВхФайл) Успех=1; //для контроля, если что-то пойдет не так в обработке файла ТекстФайл = СоздатьОбъект("Текст"); ТекстФайл.Открыть(ВхФайл); Для i = 1 По ТекстФайл.КоличествоСтрок() Цикл нужнаяСтрока=ТекстФайл.ПолучитьСтроку(i); //здесь анализируйте содержимое строки // получили строку и разносим в документ, как нужно Если НештатнаяСитуация тогда Успех = 0; КонецЕсли;
Сообщить(нужнаяСтрока); КонецЦикла;
Возврат Успех КонецФункции
Процедура ОбработатьВсеТекстовиеФайлиВКаталоге() ФС.УстТекКаталог(каталог); //здесь пропишите маршрут своего каталога с файлами ИмяФайла = ""; ИмяФайла = ФС.НайтиПервыйФайл("*.txt"); //здесь укажите нужную вам маску файлов
Пока СтрДлина(ИмяФайла)<>0 Цикл //тут обойдем все текстовые файли в каталоге ИмяФайла = ФС.НайтиСледующийФайл(); УспехОбработкиФайла=ОбработатьОдинТекстовийФайл(ИмяФайла); Если УспехОбпаботкиФайла=1 тогда // если очередной файл обработали, удаляем его с каталога ФС.УдалитьФайл(ИмяФайла); КонецЕсли; сообщить(ИмяФайла); КонецЦикла; КонецПроцедуры
Сообщение отредактировал volodya1122 - 17.11.24, 21:52
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!