При интеграции 1С с маркетплейсами (Ozon, Wildberries, Яндекс.Маркет) или при первоначальном наполнении базы данных часто возникает задача загрузки номенклатуры из файлов Excel (форматы .xls, .xlsx). Шаблоны поставщиков обычно содержат разнородную информацию в одной строке: базовые реквизиты, штрихкоды, цены, остатки на складе, а также весогабаритные характеристики (ВГХ) и специфические свойства товара (например, для книг — это автор, год издания и издательство).
Для начинающих разработчиков и аналитиков архитектура хранения этих данных в конфигурации 1С:Управление торговлей 11 (УТ 11) может показаться неочевидной. Рассмотрим подробно, в какие именно объекты базы данных правильно распределять информацию из плоской таблицы Excel и как реализовать этот процесс программно или с помощью типовых инструментов.
Попытка загрузить все колонки таблицы Excel в один объект — справочник Номенклатура — является грубой ошибкой. В системе 1С данные разделены по разным сущностям для обеспечения высокой производительности и гибкости учета. Распределим реквизиты из нашего файла по целевым объектам конфигурации:
Наименование — записывается в стандартные поля Рабочее наименование (для поиска и отображения в списках) и Наименование для печати (для документов и выгрузки на сайт).Артикул ИМТ (идентификатор модели) — если товар ведется без характеристик, загружается в стандартное поле Артикул. Если это товар с характеристиками (например, одежда с размерами), артикул модели может быть записан в дополнительный реквизит, а характеристики будут иметь свои уникальные штрихкоды.Издательство — наиболее правильно сопоставить со стандартным встроенным справочником Производители (поле Производитель в карточке номенклатуры). Это позволит строить аналитические отчеты по продажам в разрезе издательств штатными средствами системы.Ozon ID — уникальный идентификатор карточки на маркетплейсе. Создается как дополнительный реквизит с типом значения Строка или Число.Автор — создается как дополнительный реквизит. Тип значения может быть текстовым (Строка) или ссылочным (значение из подчиненного справочника дополнительных значений, если требуется строгая фильтрация).Год — дополнительный реквизит с типом Число (формат без десятичных знаков и группировки).Комплектация — текстовый дополнительный реквизит карточки товара. Также текстовое описание комплекта можно загрузить в стандартное поле карточки номенклатуры Описание.ШК / Баркод — штрихкоды в 1С никогда не хранятся непосредственно в карточке товара. Для этого существует независимый регистр сведений ШтрихкодыНоменклатуры. При загрузке для каждой позиции номенклатуры создается запись в этом регистре с привязкой к конкретной номенклатуре, характеристике (если используется) и упаковке.Вес товара с упаковкой (г), Высота, Глубина, Ширина предмета и упаковки. По правилам систем ERP-класса, к которым относится УТ 11, габариты и вес привязываются не к самому товару, а к его упаковкам (справочник УпаковкиНоменклатуры). При импорте необходимо автоматически создавать для товара индивидуальную упаковку (например, "Штука") и заполнять в ней реквизиты веса и габаритов.Цена — в карточке товара цена не хранится, так как она меняется со временем. Для регистрации цен используется специальный документ Установка цен номенклатуры. При импорте на основании файла создается этот документ, который делает записи в регистр сведений.Количество — остатки товаров на складах изменяются только при проведении первичных документов. Для их загрузки создается документ Ввод начальных остатков (если учет только начинается) или документ Оприходование излишков товаров.Прежде чем приступать к написанию кода загрузки, необходимо настроить систему. Выясним, как создать дополнительные свойства для номенклатуры без изменения конфигурации:
После этого созданные поля появятся во вкладке "Реквизиты" в карточке товара соответствующего вида номенклатуры, а в базе данных они будут физически записываться в табличную часть ДополнительныеРеквизиты объекта СправочникСсылка.Номенклатура.
Рассмотрим пример кода на языке 1С для программного создания номенклатуры, заполнения дополнительных реквизитов, записи штрихкодов и установки весогабаритных характеристик. Предположим, что мы уже прочитали файл Excel во временную таблицу значений ТаблицаДанных.
Проанализируем детальный алгоритм заполнения карточки товара и связанных регистров:
// Обход загруженных строк из Excel
Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
// 1. Поиск существующего товара по Артикулу или Создание нового
ТоварСсылка = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", СтрокаТЗ.АртикулИМТ);
Если ТоварСсылка.Пустая() Тогда
ТоварОбъект = Справочники.Номенклатура.СоздатьЭлемент();
ТоварОбъект.Наименование = СтрокаТЗ.Наименование;
ТоварОбъект.НаименованиеПолное = СтрокаТЗ.Наименование;
ТоварОбъект.Артикул = СтрокаТЗ.АртикулИМТ;
// Установка обязательных реквизитов для УТ 11
ТоварОбъект.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Книги");
ТоварОбъект.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар;
ТоварОбъект.ЕдиницаИзмерения = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию("шт");
// Заполнение Производителя (Издательства)
Если ЗначениеЗаполнено(СтрокаТЗ.Издательство) Тогда
ИздательствоСсылка = Справочники.Производители.НайтиПоНаименованию(СтрокаТЗ.Издательство);
Если ИздательствоСсылка.Пустая() Тогда
НовыйПроизводитель = Справочники.Производители.СоздатьЭлемент();
НовыйПроизводитель.Наименование = СтрокаТЗ.Издательство;
НовыйПроизводитель.Записать();
ТоварОбъект.Производитель = НовыйПроизводитель.Ссылка;
Иначе
ТоварОбъект.Производитель = ИздательствоСсылка;
EndIf;
EndIf;
// Заполнение стандартных реквизитов веса (если используется базовый вес)
ТоварОбъект.ВесЧислитель = СтрокаТЗ.ВесСУпаковкой / 1000; // Переводим граммы в килограммы
ТоварОбъект.ВесЗнаменатель = 1;
// 2. Заполнение табличной части дополнительных реквизитов
// Заполним реквизит "Автор"
СвойствоАвтор = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Автор (Книги)");
Если Не СвойствоАвтор.Пустая() Тогда
НоваяСтрока = ТоварОбъект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = СвойствоАвтор;
НоваяСтрока.Значение = СтрокаТЗ.Автор;
EndIf;
// Заполним реквизит "Ozon ID"
СвойствоOzon = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Ozon ID");
Если Не СвойствоOzon.Пустая() Тогда
НоваяСтрока = ТоварОбъект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = СвойствоOzon;
НоваяСтрока.Значение = СтрокаТЗ.OzonID;
EndIf;
ТоварОбъект.Записать();
ТоварСсылка = ТоварОбъект.Ссылка;
Иначе
ТоварОбъект = ТоварСсылка.ПолучитьОбъект();
EndIf;
// 3. Создание записи в регистре сведений "Штрихкоды номенклатуры"
Если ЗначениеЗаполнено(СтрокаТЗ.Штрихкод) Тогда
ЗаписьШтрихкода = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
ЗаписьШтрихкода.Штрихкод = СтрокаТЗ.Штрихкод;
ЗаписьШтрихкода.Номенклатура = ТоварСсылка;
// Проверяем, нет ли уже такого штрихкода в базе данных
ЗаписьШтрихкода.Прочитать();
Если Не ЗаписьШтрихкода.Выбран() Тогда
ЗаписьШтрихкода.Штрихкод = СтрокаТЗ.Штрихкод;
ЗаписьШтрихкода.Номенклатура = ТоварСсылка;
ЗаписьШтрихкода.Записать();
EndIf;
EndIf;
// 4. Заполнение весогабаритных характеристик в справочнике Упаковок
Если ЗначениеЗаполнено(СтрокаТЗ.ВысотаУпаковки) Тогда
// Ищем базовую упаковку товара
УпаковкаСсылка = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоРеквизиту("Владелец", ТоварСсылка);
Если УпаковкаСсылка.Пустая() Тогда
УпаковкаОбъект = Справочники.УпаковкиЕдиницыИзмерения.СоздатьЭлемент();
УпаковкаОбъект.Владелец = ТоварСсылка;
УпаковкаОбъект.Наименование = "Индивидуальная упаковка";
УпаковкаОбъект.ТипУпаковки = Перечисления.ТипыУпаковокНоменклатуры.Конечная;
УпаковкаОбъект.Числитель = 1;
УпаковкаОбъект.Знаменатель = 1;
УпаковкаОбъект.ЕдиницаИзмерения = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию("шт");
Иначе
УпаковкаОбъект = УпаковкаСсылка.ПолучитьОбъект();
EndIf;
// Заполняем физические размеры упаковки (в 1С размеры хранятся в мм или см в зависимости от настроек)
УпаковкаОбъект.Высота = СтрокаТЗ.ВысотаУпаковки;
УпаковкаОбъект.Ширина = СтрокаТЗ.ШиринаУпаковки;
УпаковкаОбъект.Глубина = СтрокаТЗ.ГлубинаУпаковки;
УпаковкаОбъект.Вес = СтрокаТЗ.ВесСУпаковкой / 1000;
УпаковкаОбъект.Записать();
EndIf;
КонецЦикла;
Если вам нужно выполнить загрузку разово без привлечения программиста и написания внешних обработок, в УТ 11 предусмотрен встроенный гибкий механизм импорта:
Важное ограничение: Типовой импорт за один проход загрузит только свойства самой карточки номенклатуры. Для загрузки цен, штрихкодов и остатков процедуру придется повторить отдельно, выбирая на первом шаге соответствующие объекты (например, "Загрузка цен номенклатуры" или загрузка табличной части документов ввода остатков), сопоставляя строки по полю Артикул.