Как реализовать загрузку номенклатуры из XLSX в 1С с иерархией, ценами и изображениями

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

Загрузка данных из внешних файлов — одна из самых частых задач для разработчика 1С. В данной статье мы подробно разберем, как создать внешнюю обработку, которая не просто считывает таблицу Excel, но и корректно создает карточки товаров, выстраивает иерархию папок, регистрирует цены и прикрепляет изображения. Мы проанализируем типичные ошибки новичков и рассмотрим современные подходы к реализации этого функционала.

Шаг 1: Подготовка интерфейса и выбор файла

Для начала нам необходимо создать форму обработки, где пользователь сможет выбрать файл. Проанализируем код, который позволяет вызвать стандартное диалоговое окно Windows для выбора XLSX-файла. Важно помнить, что работа с файловой системой на клиенте требует использования специальных процедур.

Рассмотрим пример кода для выбора пути к файлу:


&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь; // Отключаем стандартное действие, чтобы вызвать свой диалог
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите файл XLSX";
    Фильтр = "Excel файлы (*.xlsx)|*.xlsx"; 
    Диалог.Фильтр = Фильтр; 
    Диалог.МножественныйВыбор = Ложь;
    
    Если Диалог.Выбрать() Тогда
        Объект.ПутьКФайлу = Диалог.ПолноеИмяФайла;
    КонецЕсли;
КонецПроцедуры

Здесь мы используем объект ДиалогВыбораФайла. Обратите внимание на свойство СтандартнаяОбработка = Ложь. Это критически важно, иначе система попытается выполнить стандартное действие для поля ввода, что может помешать работе нашего кода.

Шаг 2: Чтение данных из Excel. COM-объект против Табличного документа

Традиционно для чтения Excel в 1С использовался COMОбъект("Excel.Application"). Это мощный инструмент, но у него есть существенные минусы: необходимость установленного Microsoft Excel на компьютере и низкая скорость работы. Разберем код функции чтения данных, предложенный в обсуждении, и выясним причину распространенной ошибки.

Автор столкнулся с ошибкой "Недостаточно фактических параметров". Проанализируем ситуацию: в модуле объекта функция определена с параметрами, а при вызове в модуле формы они не были переданы. Выясним, как это исправить.

Правильный вызов функции в модуле формы должен выглядеть так:


&НаСервере
Процедура ЗагрузитьНаСервере()
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    // Передаем путь к файлу в качестве параметра
    ТаблицаДанных = ОбработкаОбъект.ИзExcelВТаблицу(Объект.ПутьКФайлу); 
    
    Если ТаблицаДанных <> Неопределено Тогда
        ОбработкаОбъект.ЗагрузитьДанныеВНоменклатуру(ТаблицаДанных);
    КонецЕсли;
КонецПроцедуры

Важное замечание: Если вы хотите сделать загрузку более универсальной и быстрой, рекомендуем использовать метод ТабличныйДокумент.Прочитать(). Он работает без установленного Excel и значительно быстрее считывает данные в оперативную память.

Шаг 3: Поиск дублей и создание номенклатуры

При загрузке товаров необходимо реализовать логику поиска существующих элементов. В качестве "ключа поиска" обычно выступает Артикул, Штрихкод или Наименование. Рассмотрим алгоритм: если товар найден и стоит флаг "Перезаписывать дубли", мы обновляем реквизиты. Если не найден — создаем новый.

Посмотрим на пример реализации поиска на сервере:


Функция НайтиСоздатьТовар(ДанныеСтроки, КлючПоиска, Перезаписывать)
    СсылкаНаТовар = Справочники.Номенклатура.ПустаяСсылка();
    
    // Поиск по выбранному ключу (например, Артикул)
    Если КлючПоиска = "Артикул" Тогда
        СсылкаНаТовар = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", ДанныеСтроки.Артикул);
    ИначеЕсли КлючПоиска = "Наименование" Тогда
        СсылкаНаТовар = Справочники.Номенклатура.НайтиПоНаименованию(ДанныеСтроки.Наименование);
    КонецЕсли;

    Если СсылкаНаТовар.Пустая() Тогда
        НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
        ЗаполнитьДанныеТовара(НовыйОбъект, ДанныеСтроки);
        НовыйОбъект.Записать();
        Возврат НовыйОбъект.Ссылка;
    ИначеЕсли Перезаписывать Тогда
        ОбъектТовара = СсылкаНаТовар.ПолучитьОбъект();
        ЗаполнитьДанныеТовара(ОбъектТовара, ДанныеСтроки);
        ОбъектТовара.Записать();
        Возврат СсылкаНаТовар;
    КонецЕсли;
    
    Возврат СсылкаНаТовар;
КонецФункции

Шаг 4: Работа с иерархией (Группы товаров)

В файле Excel часто есть колонка "Группа". Если группа многоуровневая (например, "Техника/Кухня/Миксеры"), нам нужно реализовать рекурсивный поиск или создание каждой подпапки. Выясним, как это сделать правильно. Для 1С группа — это такой же элемент справочника, но с признаком ЭтоГруппа = Истина.

Рассмотрим логику создания иерархии:

  1. Разбиваем строку из колонки "Группа" по разделителю (например, "/").
  2. Ищем первую группу в корне справочника.
  3. Если нашли — переходим внутрь, если нет — создаем новую группу, устанавливаем ей Родитель = Справочники.Номенклатура.ПустаяСсылка().
  4. Повторяем для каждого вложенного уровня, передавая ссылку на найденную/созданную родительскую группу.

Шаг 5: Загрузка изображений

Загрузка картинок — технически сложный этап. В современных конфигурациях (УТ 11, УНФ, ERP) изображения хранятся в отдельном справочнике НоменклатураПрисоединенныеФайлы. Проанализируем последовательность действий:

  1. Получаем путь к картинке из файла Excel.
  2. Читаем файл в ДвоичныеДанные.
  3. Помещаем эти данные во временное хранилище.
  4. Создаем элемент в справочнике присоединенных файлов, где владельцем указываем наш товар.
  5. В самой карточке номенклатуры устанавливаем реквизит ОсновноеИзображение.

Пример кода для работы с картинкой:


КартинкаОбъект = Справочники.НоменклатураПрисоединенныеФайлы.СоздатьЭлемент();
КартинкаОбъект.Владелец = СсылкаНаТовар;
КартинкаОбъект.Наименование = "Основное фото " + СсылкаНаТовар.Наименование;
// Здесь должна быть логика работы с Регистром Сведений или Хранилищем значений
// в зависимости от вашей конфигурации
КартинкаОбъект.Записать();

Шаг 6: Регистрация цен продажи

Цены в 1С не записываются напрямую в карточку товара. Они хранятся в периодическом регистре сведений ЦеныНоменклатуры. Чтобы установить цену, нужно создать документ УстановкаЦенНоменклатуры или воспользоваться менеджером записи регистра.

Разберем вариант с использованием менеджера записи:


МенеджерЗаписи = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Номенклатура = СсылкаНаТовар;
МенеджерЗаписи.ВидЦены = ВыбранныйВидЦены; // Реквизит с формы
МенеджерЗаписи.Цена = ДанныеСтроки.Цена;
МенеджерЗаписи.Валюта = Справочники.Валюты.НайтиПоКоду("643"); // Рубли
МенеджерЗаписи.Записать();

Типичные ошибки и советы

Проанализируем основные "грабли", на которые наступают новички:

Подводя итог, можно сказать, что создание загрузчика — это комплексная задача, требующая понимания архитектуры 1С: от работы с файлами до управления регистрами сведений. Следуя приведенным выше шагам, вы сможете создать надежный инструмент для автоматизации наполнения базы данных.

← На главную