Программное создание номенклатуры — одна из наиболее частых задач при интеграции 1С с интернет-магазинами или загрузке данных из внешних файлов, таких как Excel. В современных конфигурациях, построенных на базе «1С:Библиотеки стандартных подсистем» (БСП), недостаточно просто присвоить значения текстовым полям. Номенклатура имеет множество связанных объектов: виды номенклатуры, единицы измерения, ставки НДС и дополнительные реквизиты. Разберем по шагам, как сделать это правильно, чтобы избежать ошибок и обеспечить корректность данных в базе.
Начнем с основ. Создание любого элемента справочника начинается с вызова метода СоздатьЭлемент(). Рассмотрим простейший пример заполнения основных реквизитов, таких как наименование и артикул.
НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НоваяНоменклатура.Наименование = "Смартфон стандарт";
НоваяНоменклатура.НаименованиеПолное = "Смартфон стандарт (черный)";
НоваяНоменклатура.Артикул = "АРТ-12345";
// Пока не записываем, нужно заполнить обязательные поля!
Важный нюанс: в конфигурациях типа УТ 11 или ERP 2 критически важно сначала определить ВидНоменклатуры. Именно от него зависят настройки учета (использование характеристик, серий, упаковок) и значения по умолчанию.
Часто новички совершают ошибку, пытаясь присвоить реквизитам типа «Ссылка» или «Перечисление» обычную строку. Например, код НоваяНоменклатура.СтавкаНДС = "18%" приведет к ошибке или пустой ссылке. Проанализируем, как правильно обращаться к таким типам данных.
1. Заполнение перечислений:
Для таких полей, как СтавкаНДС, ТипНоменклатуры или Качество, необходимо использовать объект Перечисления.
// Для новых версий конфигураций (с поддержкой НДС 20%)
НоваяНоменклатура.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
// Определение типа номенклатуры
НоваяНоменклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар;
// Установка качества
НоваяНоменклатура.Качество = Перечисления.ГрадацииКачества.Новый;
2. Поиск ссылочных данных:
Если реквизит ссылается на другой справочник (например, Производитель или СхемаОбеспечения), нам нужно найти ссылку на соответствующий элемент. Рассмотрим ситуацию, когда мы ищем производителя по наименованию, а если его нет — создаем новый.
Функция НайтиИлиСоздатьПроизводителя(ИмяПроизводителя)
Ссылка = Справочники.Производители.НайтиПоНаименованию(ИмяПроизводителя);
Если Ссылка.Пустая() Тогда
НовыйОбъект = Справочники.Производители.СоздатьЭлемент();
НовыйОбъект.Наименование = ИмяПроизводителя;
НовыйОбъект.Записать();
Возврат НовыйОбъект.Ссылка;
КонецЕсли;
Возврат Ссылка;
КонецФункции
В современных конфигурациях 1С существует встроенный механизм, который значительно упрощает жизнь разработчику. Вместо того чтобы вручную прописывать каждую настройку, мы можем попросить систему заполнить реквизиты на основании выбранного вида номенклатуры. Разберем этот эффективный способ.
// Сначала устанавливаем вид номенклатуры
НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Электроника");
// Используем типовой метод для заполнения настроек учета
Справочники.Номенклатура.ЗаполнитьРеквизитыПоВидуНоменклатуры(НоваяНоменклатура);
// Теперь можно дозаполнить уникальные данные
НоваяНоменклатура.Наименование = "Монитор 24 дюйма";
НоваяНоменклатура.Записать();
Этот метод автоматически заполнит такие поля, как единицы измерения, группы финансового учета, использование характеристик и другие настройки, заданные в карточке вида номенклатуры.
Если мы создаем тысячи позиций из Excel, необходимо учитывать производительность и обходить лишние проверки модуля объекта. Для этого используем свойство ОбменДанными.Загрузка.
Рассмотрим рекомендации по оптимизации:
ОбменДанными.Загрузка = Истина позволяет записывать объекты даже с неполностью заполненными данными, если это требуется на промежуточном этапе.
НачатьТранзакцию();
Попытка
Для Каждого СтрокаИзExcel Из ТаблицаДанных Цикл
// Поиск дубля по артикулу
Если Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", СтрокаИзExcel.Артикул).Пустая() Тогда
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.ОбменДанными.Загрузка = Истина;
// Заполнение данных...
НовыйОбъект.Записать();
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка при загрузке: " + ОписаниеОшибки());
КонецПопытки;
Часто параметры товара (цвет, материал, бренд) хранятся в табличной части ДополнительныеРеквизиты. Просто присвоить им значение через точку нельзя. Выясним, как программно добавить свойство.
// Добавление доп. реквизита "Цвет"
НоваяСтрока = НоваяНоменклатура.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Цвет (Номенклатура)");
НоваяСтрока.Значение = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Черный");
После создания основной карточки номенклатуры часто требуется привязать к ней штрихкод. Помните, что штрихкоды в УТ 11 хранятся в независимом регистре сведений ШтрихкодыНоменклатуры. Рассмотрим пример создания записи в регистре.
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Номенклатура = НоваяНоменклатура.Ссылка;
МенеджерЗаписи.Штрихкод = "2000000012345";
МенеджерЗаписи.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
МенеджерЗаписи.Записать();
Подведем итог: для правильного программного создания номенклатуры мы должны соблюдать иерархию. Сначала определяем ВидНоменклатуры, затем используем системный метод ЗаполнитьРеквизитыПоВидуНоменклатуры, корректно заполняем ссылки и перечисления, и в завершение, при необходимости, работаем с регистрами штрихкодов и дополнительными сведениями. Такой подход гарантирует, что созданные товары будут корректно отображаться в отчетах и участвовать в складском учете.