В практике интеграции 1С с внешними системами или при переносе данных из устаревших версий (например, 1С 7.7) часто возникает задача загрузки данных из текстовых файлов (TXT или CSV). Особую сложность представляет ситуация, когда один файл содержит сразу несколько документов, где за строкой с реквизитами накладной следуют строки с перечнем товаров. В этой статье мы подробно разберем, как реализовать механизм загрузки таких данных в «1С:Управление торговлей 11.5», проанализируем программный подход и рассмотрим альтернативные методы обработки файлов.
Прежде чем приступать к написанию кода, давайте проанализируем структуру данных, которую нам необходимо обработать. В типовом случае файл выглядит следующим образом:
Главная проблема заключается в том, что стандартная обработка 1С «Загрузка данных из файла» рассчитана на «плоские» таблицы, где каждая строка содержит полную информацию о документе. В нашем же случае структура иерархическая. Поэтому нам потребуется либо программная обработка, либо предварительная трансформация файла в Excel.
Рассмотрим основной алгоритм загрузки. Нам необходимо прочитать файл построчно и определить логику переключения между документами. Проанализируем ситуацию: как только программа встречает слово «Накладная», она должна завершить формирование текущего документа и начать создание нового.
Для работы с текстовыми данными в 1С используется объект ЧтениеТекста. Важно помнить, что файлы из старых систем (7.7) часто имеют кодировку Windows-1251 (ANSI). Если не указать её явно, мы получим нечитаемые символы вместо названий товаров.
Разберем пример кода для реализации этой логики:
&НаСервере
Процедура ЗагрузитьДанныеИзФайлаНаСервере(ПутьКФайлу)
Текст = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.ANSI);
ТекущийДокументОбъект = Неопределено;
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
// Проверяем, является ли строка началом новой накладной
Если Найти(Стр, "Накладная") > 0 Тогда
// Если уже был открыт документ, записываем его перед созданием нового
Если ТекущийДокументОбъект <> Неопределено Тогда
ТекущийДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
// Создаем новый документ "Приобретение товаров и услуг"
ТекущийДокументОбъект = Документы.ПриобретениеТоваровУслуг.СоздатьДокумент();
ТекущийДокументОбъект.Дата = ТекущаяДата(); // В реальном коде парсим дату из строки
// Здесь должна быть логика поиска организации и склада по кодам из файла
ИначеЕсли ТекущийДокументОбъект <> Неопределено Тогда
// Если строка не является заголовком, значит это товарная позиция
НоваяСтрока = ТекущийДокументОбъект.Товары.Добавить();
// Пример парсинга строки по разделителю ";"
МассивДанных = СтрРазделить(Стр, ";");
// Поиск номенклатуры (например, по штрихкоду из 6-й колонки)
Штрихкод = МассивДанных[5];
НоменклатураСсылка = ПоискНоменклатурыПоШтрихкоду(Штрихкод);
Если Не НоменклатураСсылка.Пустая() Тогда
НоваяСтрока.Номенклатура = НоменклатураСсылка;
НоваяСтрока.Количество = Число(МассивДанных[9]);
НоваяСтрока.Цена = Число(МассивДанных[10]);
КонецЕсли;
КонецЕсли;
Стр = Текст.ПрочитатьСтроку();
КонецЦикла;
// Не забываем записать последний документ из файла
Если ТекущийДокументОбъект <> Неопределено Тогда
ТекущийДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецПроцедуры
Если задача разовая и писать сложную обработку нет времени, воспользуемся советом опытных пользователей: приведем файл к «плоскому» виду. Выясним, как это сделать быстрее всего.
Теперь, когда у вас есть таблица, где в каждой строке указан номер накладной, вы можете воспользоваться типовой обработкой 1С: «НСИ и администрирование» — «Начальное заполнение» — «Загрузка данных из файла». При загрузке укажите, что документы нужно разделять по колонке «Номер накладной».
Проанализируем критические моменты, на которых чаще всего «спотыкаются» разработчики при реализации загрузки в УТ 11.5:
1. Поиск объектов: Никогда не полагайтесь только на наименование. В файлах из 7.7 часто присутствуют лишние пробелы или спецсимволы. Мы рекомендуем следующий приоритет поиска:
ШтрихкодыНоменклатуры.Номенклатура.2. Заполнение обязательных реквизитов: В УТ 11.5 документ ПриобретениеТоваровУслуг требует обязательного указания хозяйственной операции, валюты и налогообложения. Если эти данные отсутствуют в файле, их необходимо прописать жестко в коде или вынести в настройки обработки на форме.
3. Транзакционность: Проанализируем ситуацию: что будет, если в середине загрузки произойдет ошибка? Чтобы не получить в базе «половину» документов, рекомендуется оборачивать цикл загрузки в транзакцию:
НачатьТранзакцию();
Попытка
// Логика загрузки...
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка при загрузке: " + ОписаниеОшибки());
КонецПопытки;
Загрузка нескольких накладных из одного текстового файла — это задача на построение правильного алгоритма десериализации данных. Выяснив структуру файла (где заголовок, а где строки), мы можем либо программно создать документы через ЧтениеТекста, либо подготовить данные в Excel для использования штатных средств 1С. Выбор метода зависит от частоты выполнения задачи и ваших навыков программирования в среде 1С:Предприятие.