Зачастую перед специалистами 1С встает задача по импорту большого объема данных из внешних файлов. Когда речь заходит о загрузке нескольких документов Реализация товаров и услуг из одного Excel-файла, стандартные инструменты могут потребовать адаптации. Разберем, как подойти к решению этой задачи системно и эффективно.
Прежде чем приступать к написанию кода, необходимо проанализировать структуру вашего Excel-файла. Как правило, такие файлы имеют один из двух видов:
Для разработки надежного механизма мы рекомендуем сначала считать все данные из файла в промежуточную структуру, например, в ТаблицаЗначений. Это позволит избежать лишних обращений к объектам метаданных в процессе чтения файла.
Для чтения файлов Excel в 1С:Бухгалтерия 3.0 существует два основных подхода. Мы рекомендуем использовать метод ТабличныйДокумент.Прочитать(), так как он не требует установленного пакета Microsoft Office на сервере, что значительно повышает скорость и стабильность работы.
Рассмотрим пример того, как организовать считывание данных в табличный документ для дальнейшей обработки:
// Создаем объект для чтения файла
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
// Загружаем данные в таблицу значений для удобного перебора
ТЗ = Новый ТаблицаЗначений;
// Добавляем необходимые колонки
ТЗ.Колонки.Добавить("НомерДокумента");
ТЗ.Колонки.Добавить("ДатаДокумента");
// ... остальные поля
После того как данные оказались в ТаблицаЗначений, мы можем переходить к самой процедуре создания документов. Основная логика заключается в группировке строк по документам. Предлагаем следующий алгоритм:
ДокументОбъект.РеализацияТоваровУслуг.Документы.РеализацияТоваровУслуг.НайтиПоНомеру() или запрос к базе данных для проверки наличия документа в системе.Пример логики заполнения табличной части:
// В цикле перебора таблицы значений
Если НомерДокумента <> ТекущийНомер Тогда
// Записываем предыдущий документ, если он был создан
Если ДокументОбъект <> Неопределено Тогда
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
// Создаем новый документ
ДокументОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
ДокументОбъект.Дата = ДатаДокумента;
// Заполняем реквизиты шапки
КонецЕсли;
// Заполняем табличную часть Товары
НоваяСтрока = ДокументОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = НайтиНоменклатуру(НаименованиеИзExcel);
НоваяСтрока.Количество = Количество;
При реализации собственного кода для импорта обязательно учитывайте следующие аспекты:
Артикул или Код.НачатьТранзакцию() и ЗафиксироватьТранзакцию(), чтобы избежать частичной загрузки данных при сбое.РежимЗаписиДокумента.Запись. Только после успешного заполнения всех строк документа можно выполнять ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение).Помните, что универсального «готового» решения под все форматы файлов не существует, так как каждый клиент предоставляет данные в своем уникальном виде. Написав собственную обработку на основе ТаблицаЗначений, вы получите гибкий инструмент, который можно легко адаптировать под изменения форматов в будущем.