Загрузка данных из внешних файлов — одна из самых частых задач для разработчика 1С. В данной статье мы подробно разберем, как создать внешнюю обработку, которая не просто считывает таблицу Excel, но и корректно создает карточки товаров, выстраивает иерархию папок, регистрирует цены и прикрепляет изображения. Мы проанализируем типичные ошибки новичков и рассмотрим современные подходы к реализации этого функционала.
Для начала нам необходимо создать форму обработки, где пользователь сможет выбрать файл. Проанализируем код, который позволяет вызвать стандартное диалоговое окно Windows для выбора XLSX-файла. Важно помнить, что работа с файловой системой на клиенте требует использования специальных процедур.
Рассмотрим пример кода для выбора пути к файлу:
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартное действие, чтобы вызвать свой диалог
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл XLSX";
Фильтр = "Excel файлы (*.xlsx)|*.xlsx";
Диалог.Фильтр = Фильтр;
Диалог.МножественныйВыбор = Ложь;
Если Диалог.Выбрать() Тогда
Объект.ПутьКФайлу = Диалог.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры
Здесь мы используем объект ДиалогВыбораФайла. Обратите внимание на свойство СтандартнаяОбработка = Ложь. Это критически важно, иначе система попытается выполнить стандартное действие для поля ввода, что может помешать работе нашего кода.
Традиционно для чтения Excel в 1С использовался COMОбъект("Excel.Application"). Это мощный инструмент, но у него есть существенные минусы: необходимость установленного Microsoft Excel на компьютере и низкая скорость работы. Разберем код функции чтения данных, предложенный в обсуждении, и выясним причину распространенной ошибки.
Автор столкнулся с ошибкой "Недостаточно фактических параметров". Проанализируем ситуацию: в модуле объекта функция определена с параметрами, а при вызове в модуле формы они не были переданы. Выясним, как это исправить.
Правильный вызов функции в модуле формы должен выглядеть так:
&НаСервере
Процедура ЗагрузитьНаСервере()
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
// Передаем путь к файлу в качестве параметра
ТаблицаДанных = ОбработкаОбъект.ИзExcelВТаблицу(Объект.ПутьКФайлу);
Если ТаблицаДанных <> Неопределено Тогда
ОбработкаОбъект.ЗагрузитьДанныеВНоменклатуру(ТаблицаДанных);
КонецЕсли;
КонецПроцедуры
Важное замечание: Если вы хотите сделать загрузку более универсальной и быстрой, рекомендуем использовать метод ТабличныйДокумент.Прочитать(). Он работает без установленного Excel и значительно быстрее считывает данные в оперативную память.
При загрузке товаров необходимо реализовать логику поиска существующих элементов. В качестве "ключа поиска" обычно выступает Артикул, Штрихкод или Наименование. Рассмотрим алгоритм: если товар найден и стоит флаг "Перезаписывать дубли", мы обновляем реквизиты. Если не найден — создаем новый.
Посмотрим на пример реализации поиска на сервере:
Функция НайтиСоздатьТовар(ДанныеСтроки, КлючПоиска, Перезаписывать)
СсылкаНаТовар = Справочники.Номенклатура.ПустаяСсылка();
// Поиск по выбранному ключу (например, Артикул)
Если КлючПоиска = "Артикул" Тогда
СсылкаНаТовар = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", ДанныеСтроки.Артикул);
ИначеЕсли КлючПоиска = "Наименование" Тогда
СсылкаНаТовар = Справочники.Номенклатура.НайтиПоНаименованию(ДанныеСтроки.Наименование);
КонецЕсли;
Если СсылкаНаТовар.Пустая() Тогда
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
ЗаполнитьДанныеТовара(НовыйОбъект, ДанныеСтроки);
НовыйОбъект.Записать();
Возврат НовыйОбъект.Ссылка;
ИначеЕсли Перезаписывать Тогда
ОбъектТовара = СсылкаНаТовар.ПолучитьОбъект();
ЗаполнитьДанныеТовара(ОбъектТовара, ДанныеСтроки);
ОбъектТовара.Записать();
Возврат СсылкаНаТовар;
КонецЕсли;
Возврат СсылкаНаТовар;
КонецФункции
В файле Excel часто есть колонка "Группа". Если группа многоуровневая (например, "Техника/Кухня/Миксеры"), нам нужно реализовать рекурсивный поиск или создание каждой подпапки. Выясним, как это сделать правильно. Для 1С группа — это такой же элемент справочника, но с признаком ЭтоГруппа = Истина.
Рассмотрим логику создания иерархии:
Родитель = Справочники.Номенклатура.ПустаяСсылка().Загрузка картинок — технически сложный этап. В современных конфигурациях (УТ 11, УНФ, ERP) изображения хранятся в отдельном справочнике НоменклатураПрисоединенныеФайлы. Проанализируем последовательность действий:
ДвоичныеДанные.ОсновноеИзображение.Пример кода для работы с картинкой:
КартинкаОбъект = Справочники.НоменклатураПрисоединенныеФайлы.СоздатьЭлемент();
КартинкаОбъект.Владелец = СсылкаНаТовар;
КартинкаОбъект.Наименование = "Основное фото " + СсылкаНаТовар.Наименование;
// Здесь должна быть логика работы с Регистром Сведений или Хранилищем значений
// в зависимости от вашей конфигурации
КартинкаОбъект.Записать();
Цены в 1С не записываются напрямую в карточку товара. Они хранятся в периодическом регистре сведений ЦеныНоменклатуры. Чтобы установить цену, нужно создать документ УстановкаЦенНоменклатуры или воспользоваться менеджером записи регистра.
Разберем вариант с использованием менеджера записи:
МенеджерЗаписи = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Номенклатура = СсылкаНаТовар;
МенеджерЗаписи.ВидЦены = ВыбранныйВидЦены; // Реквизит с формы
МенеджерЗаписи.Цена = ДанныеСтроки.Цена;
МенеджерЗаписи.Валюта = Справочники.Валюты.НайтиПоКоду("643"); // Рубли
МенеджерЗаписи.Записать();
Проанализируем основные "грабли", на которые наступают новички:
Число, используйте функцию Число(Значение), предварительно очистив строку от лишних пробелов с помощью СокрЛП().НачатьТранзакцию() и ЗафиксироватьТранзакцию() для ускорения процесса.ПоместитьФайлВоВременноеХранилище.Подводя итог, можно сказать, что создание загрузчика — это комплексная задача, требующая понимания архитектуры 1С: от работы с файлами до управления регистрами сведений. Следуя приведенным выше шагам, вы сможете создать надежный инструмент для автоматизации наполнения базы данных.