Доброго времени суток господа. У меня 1с 7.70.027 Торговля и Склад для Украины 7.70.048 и я написал такую вот обработку:
Процедура СозРасходки()
// Создаем новый документ "Расходная накладная"
Накладная = СоздатьОбъект("Документ.РасходнаяНакладная");
Накладная.Новый();
ДатаДок = РабочаяДата(Контекст, "Запись");
Файл = СоздатьОбъект("Текст");
Файл.Открыть("C:\inetpub\ftproot\Kontakt\ExpenseInvoice_24-10-2024_17-29-19.txt");
// Чтение данных из первых строк файла
НаименованиеСклада = СокрЛП(Сред(Файл.ПолучитьСтроку(1), Найти(Файл.ПолучитьСтроку(1), ":") + 1));
НаименованиеФирмы = СокрЛП(Сред(Файл.ПолучитьСтроку(2), Найти(Файл.ПолучитьСтроку(2), ":") + 1));
НаименованиеКонтрагента = СокрЛП(Сред(Файл.ПолучитьСтроку(3), Найти(Файл.ПолучитьСтроку(3), ":") + 1));
// Поиск фирмы по наименованию из файла
спрФирма = СоздатьОбъект("Справочник.Фирмы");
спрФирма.НайтиПоНаименованию(НаименованиеФирмы);
Если спрФирма.Код <> 0 Тогда
Накладная.Фирма = спрФирма.ТекущийЭлемент();
Иначе
Сообщить("Фирма не найдена: " + НаименованиеФирмы);
КонецЕсли;
// Поиск контрагента по наименованию из файла
спрКонтрагент = СоздатьОбъект("Справочник.Контрагенты");
спрКонтрагент.НайтиПоНаименованию(НаименованиеКонтрагента);
Если спрКонтрагент.Код <> 0 Тогда
Накладная.Контрагент = спрКонтрагент.ТекущийЭлемент();
Иначе
Сообщить("Контрагент не найден: " + НаименованиеКонтрагента);
КонецЕсли;
// Получаем место хранения по наименованию из файла
спрСклад = СоздатьОбъект("Справочник.МестаХранения");
спрСклад.НайтиПоНаименованию(НаименованиеСклада);
Если спрСклад.Код <> 0 Тогда
Накладная.Склад = спрСклад.ТекущийЭлемент();
Иначе
Сообщить("Склад не найден: " + НаименованиеСклада);
КонецЕсли;
// Чтение строк файла
ЧтениеПродолжается = 1; // Инициализация флага продолжения чтения
ТекущаяСтрока = "";
Пока ЧтениеПродолжается = 1 Цикл
// Читаем строку из файла
СтатусЧтения = Файл.ПолучитьСтроку(ТекущаяСтрока);
// Проверяем, были ли строки в файле
Если СтатусЧтения = 0 Тогда
ЧтениеПродолжается = 0; // Если строк больше нет, выходим из цикла
ИначеЕсли ТекущаяСтрока = "" Тогда
Продолжить; // Пропускаем пустые строки
Иначе
// Обработка строки с артикулом
Если Лев(ТекущаяСтрока, 8) = "Артикул:" Тогда
Артикул = СокрЛП(Сред(ТекущаяСтрока, 9));
// Читаем строку с количеством
СтрокаКоличество = "";
Файл.ПрочитатьСтроку(СтрокаКоличество);
Если Лев(СтрокаКоличество, 10) = "Количество:" Тогда
Количество = Число(СокрЛП(Сред(СтрокаКоличество, 11)));
// Добавление строки в табличную часть
СтрокаТЧ = Накладная.Товары.Добавить();
СтрокаТЧ.Артикул = Артикул;
СтрокаТЧ.Количество = Количество;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Записываем документ
Накладная.Записать();
Сообщить("Расходная накладная успешно создана!");
КонецПроцедуры
Склад: "склад"
Фирма: "название фопа"
Контрагент: "контрагент"
Товары:
Артикул: 3
Количество: 1
Артикул: 11782
Количество: 2
и т.д.(по количеству товара)
kayfatuch @ Сегодня, 20:09
,
вот так работает ?
спрКонтрагент.НайтиПоНаименованию(НаименованиеКонтрагента,0,1);
Если Лев(ТекущаяСтрока, 8) = "Артикул:" Тогда
спрКонтрагент.НайтиПоНаименованию(НаименованиеКонтрагента,0,1);
ИначеЕсли ТекущаяСтрока = "" Тогда
Продолжить; // Пропускаем пустые строки
kayfatuch @ Сегодня, 20:48
,
Отладчик - это вещь !
Итак вот нынешняя версия процедуры:
Процедура СозРасходки()
// Создаем новый документ "Расходная накладная"
Накладная = СоздатьОбъект("Документ.РасходнаяНакладная");
Накладная.Новый();
ДатаДок = РабочаяДата(Контекст, "Запись");
Файл = СоздатьОбъект("Текст");
Файл.Открыть("C:\inetpub\ftproot\Kontakt\ExpenseInvoice_24-10-2024_17-29-19.txt");
// Чтение данных из первых строк файла
НаименованиеСклада = СокрЛП(Сред(Файл.ПолучитьСтроку(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);
ТЗК.УстановитьПараметрыКолонки("Артикул", , , , , 24);
ТЗК.УстановитьПараметрыКолонки("Количество", , , , , 13);
ТЗК.НоваяСтрока();
ТЗК.Артикул = Артикул;
ТЗК.Количество = Количество;
КонецЕсли;
// Переход к следующей строке
ТекущаяСтрока = ТекущаяСтрока + 1;
КонецЦикла;
// Записываем документ
Накладная.Записать();
Сообщить("Расходная накладная успешно создана!");
КонецПроцедуры
Если Найти(СтатусЧтения, "Артикул:") > 0 Тогда
Артикул = СокрЛП(Сред(СтатусЧтения, Найти(СтатусЧтения, ":") + 1));
ТекущаяСтрока = ТекущаяСтрока + 1;
// Считываем количество
КоличествоСтрока = Файл.ПолучитьСтроку(ТекущаяСтрока);
Количество = Число(СокрЛП(Сред(КоличествоСтрока, Найти(КоличествоСтрока, ":") + 1)));
// Добавляем строку в табличную часть
ТЗК = СоздатьОбъект("ТаблицаЗначений"); //Вот здесь каждый раз объект Таблица ПЕРЕСОЗДАЁТСЯ !
Процедура СозРасходки()
// Создаем новый документ "Расходная накладная"
Накладная = СоздатьОбъект("Документ.РасходнаяНакладная");
Накладная.Новый();
ДатаДок = РабочаяДата(Контекст, "Запись");
Файл = СоздатьОбъект("Текст");
Файл.Открыть("C:\inetpub\ftproot\Kontakt\ExpenseInvoice_24-10-2024_17-29-19.txt");
ТЗК = СоздатьОбъект("ТаблицаЗначений")
Процедура СозРасходки()
// Создаем новый документ "Расходная накладная"
Накладная = СоздатьОбъект("Документ.РасходнаяНакладная");
Накладная.Новый();
ДатаДок = РабочаяДата(Контекст, "Запись");
Файл = СоздатьОбъект("Текст");
Файл.Открыть("C:\inetpub\ftproot\Kontakt\ExpenseInvoice_24-10-2024_17-29-19.txt");
ТЗК = СоздатьОбъект("ТаблицаЗначений")
kayfatuch @ Сегодня, 14:09
,
Вместо ТЗ добавляй строку в документ:
Накладная.НоваяСтрока();
...
Накладная.Количество = Количество;
...
Накладная.НоваяСтрока();
...
Накладная.Количество = Количество;
ФС.УстТекКаталог(каталог); //здесь пропишите маршрут своего каталога с файлами
ИмяФайла = "";
ИмяФайла = ФС.НайтиПервыйФайл("*.txt"); //здесь укажите нужную вам маску файлов
Пока СтрДлина(ИмяФайла)<>0 Цикл
ИмяФайла = ФС.НайтиСледующийФайл();
сообщить(ИмяФайла);
КонецЦикла;
ТекстФайл = СоздатьОбъект("Текст");
ТекстФайл.Открыть("Файл.txt");
Для i = 1 По ТекстФайл.КоличествоСтрок() Цикл
нужнаяСтрока=ТекстФайл.ПолучитьСтроку(i); //здесь анализируйте содержимое строки
Сообщить(нужнаяСтрока);
КонецЦикла;
kayfatuch @ Сегодня, 14:56
,
Объединить 2 цикла , в примерах, которые я выкладывал выше.
Один цикл - перебор файлов типа .txt.Внутри этого цикла-считывание информации из текстового файла.
В помощь.В объекте ФС есть метод - Атрибуты файла.
Это если понадобится фильтровать файлы в каталоге по дате создания.
АтрибутыФайла(<?>,,,,,,);
Синтаксис:
АтрибутыФайла(<ИмяФайла>,<РазмерФайла>,<АтрибутыФайла>,<ВремяСоздания>,<ВремяПоследнегоДоступа>,<ВремяПоследнейЗаписи>,<РасширенноеИмяФайла>)
Назначение:
Возвращает атрибуты файла (в параметрах).
Параметры:
<ИмяФайла> - строка с именем файла;
<РазмерФайла> - переменная, принимающая размер файла в байтах;
<АтрибутыФайла> - переменная, принимающая атрибуты файла;
Возвращаемое строковое значение длиной 9 символов, в котором закодированы атрибуты файла. Символы могут принимать значения ''0'' или ''1'':
первый символ: если ''1'' - файл только для чтения;
второй символ: если ''1'' - скрытый файл;
третий символ: если ''1'' - системный файл;
четвертый символ: если ''1'' - каталог;
пятый символ: если ''1'' - архивный файл;
шестой символ: если ''1'' - обычный файл (все другие атрибуты не установлены);
седьмой символ: если ''1'' - временный файл;
восьмой символ: если ''1'' - файл, сжатый каким-либо архиватором;
девятый символ: если ''1'' - нет доступа к файлу.
<ВремяСоздания> - переменная, принимающая строку с датой и временем создания файла;
<ВремяПоследнегоДоступа> - переменная, принимающая строку с датой и временем последнего доступа к файлу;
<ВремяПоследнейЗаписи> - переменная, принимающая строку с датой и временем последней записи файла;
<РасширенноеИмяФайла> - переменная, принимающая строку с полным именем файла.
Функция ОбработатьОдинТекстовийФайл(ВхФайл)
Успех=1; //для контроля, если что-то пойдет не так в обработке файла
ТекстФайл = СоздатьОбъект("Текст");
ТекстФайл.Открыть(ВхФайл);
Для i = 1 По ТекстФайл.КоличествоСтрок() Цикл
нужнаяСтрока=ТекстФайл.ПолучитьСтроку(i); //здесь анализируйте содержимое строки
// получили строку и разносим в документ, как нужно
Если НештатнаяСитуация тогда
Успех = 0;
КонецЕсли;
Сообщить(нужнаяСтрока);
КонецЦикла;
Возврат Успех
КонецФункции
Процедура ОбработатьВсеТекстовиеФайлиВКаталоге()
ФС.УстТекКаталог(каталог); //здесь пропишите маршрут своего каталога с файлами
ИмяФайла = "";
ИмяФайла = ФС.НайтиПервыйФайл("*.txt"); //здесь укажите нужную вам маску файлов
Пока СтрДлина(ИмяФайла)<>0 Цикл
//тут обойдем все текстовые файли в каталоге
ИмяФайла = ФС.НайтиСледующийФайл();
УспехОбработкиФайла=ОбработатьОдинТекстовийФайл(ИмяФайла);
Если УспехОбпаботкиФайла=1 тогда
// если очередной файл обработали, удаляем его с каталога
ФС.УдалитьФайл(ИмяФайла);
КонецЕсли;
сообщить(ИмяФайла);
КонецЦикла;
КонецПроцедуры
kayfatuch @ Вчера, 10:47
,
Вторая не выходит для документа вытянуть данные об товаре.
Щоби добавити товар у накладну - спочатку його по артикулу потрібно знайти у довіднику. Потім вже з довідника вставляти у розхідну...
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua