Загрузка номенклатуры, цен и количеств из внешних файлов Excel — одна из самых частых задач при автоматизации учета. Рассмотрим подробно, как реализовать этот функционал, минимизируя ручной труд и избегая ошибок.
Этот метод подходит для любых конфигураций и версий платформы. Суть его заключается в прямом обращении к приложению Excel.Application через COM-интерфейс. Рассмотрим, как считать данные напрямую при выборе файла:
Режим = РежимДиалогаВыбораФайла.Открытие;
Диалог = Новый ДиалогВыбораФайла(Режим);
Если Диалог.Выбрать() Тогда
Ex = Новый COMОбъект("Excel.Application");
Ex.Workbooks.Open(Диалог.ПолноеИмяФайла);
Лист = Ex.ActiveSheet;
ОбДок = СсылкаНаОбъект.ПолучитьОбъект();
Для К = 1 По 1000 Цикл
Если Лист.Cells(К, 1).Value = Неопределено Тогда Прервать; КонецЕсли;
НоменклатураНаименование = Лист.Cells(К, 1).Value;
Количество = Лист.Cells(К, 2).Value;
Цена = Лист.Cells(К, 3).Value;
СтрокаТЧ = ОбДок.Товары.Добавить();
СтрокаТЧ.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(НоменклатураНаименование);
СтрокаТЧ.Количество = Количество;
СтрокаТЧ.Цена = Цена;
КонецЦикла;
ОбДок.Записать();
Ex.Quit();
КонецЕсли;
Важно: При использовании COMОбъект убедитесь, что на сервере или клиентской машине установлен Microsoft Excel. Также всегда вызывайте метод Quit(), чтобы не оставлять «висящие» процессы в диспетчере задач.
Если вы хотите избежать инициализации COMОбъекта, можно воспользоваться встроенным методом чтения файла в ТабличныйДокумент. Это работает быстрее и не зависит от установленного офисного пакета.
Разберем шаги этого метода:
ТабличныйДокумент.ОписаниеИсточникаДанных для передачи данных в ПостроительОтчета.ТаблицуЗначений.
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПолноеИмяФайла);
Источник = Новый ОписаниеИсточникаДанных(ТабДок.Область());
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Источник;
Построитель.Выполнить();
ТЗ = Построитель.Результат.Выгрузить();
Объект.Товары.Загрузить(ТЗ);
Одним из ключевых моментов при загрузке является поиск ссылки на справочник по наименованию. Использование НайтиПоНаименованию может привести к ошибкам, если в базе есть дубли или неточности в написании. Мы настоятельно рекомендуем:
Номенклатура дополнительный реквизит (например, КодПоставщика).НайтиПоРеквизиту.Ссылка.Пустая()), выводите сообщение пользователю о том, что конкретный товар не найден.Если вы работаете в интерфейсе Управляемых форм, помните, что обращение к серверным методам требует передачи данных через РеквизитФормыВЗначение и обратно через ЗначениеВРеквизитФормы. Это позволяет корректно обновлять состояние формы после внесения изменений в объект.
&НаСервере
Процедура ЗагрузитьДанныеНаСервере(ДанныеТаблицы)
ОбДок = РеквизитФормыВЗначение("Объект");
// Логика заполнения ТЧ...
ЗначениеВРеквизитФормы(ОбДок, "Объект");
КонецПроцедуры
Применяя эти методы, вы сможете создать надежный инструмент для импорта данных, который значительно ускорит работу пользователей с документами в системе 1С. Анализируйте структуру файла, проводите валидацию данных на этапе чтения и всегда предусматривайте обработку исключительных ситуаций.