Как программно добавить элементы в справочник Номенклатура с созданием группы и установкой вида номенклатуры

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

Процесс автоматизации загрузки данных в 1С часто сопряжен с необходимостью не просто создать новые карточки товаров, но и правильно структурировать их в базе данных. В этой статье мы подробно разберем, как реализовать программное добавление элементов в справочник Номенклатура, автоматически создавать для них целевую группу (папку) и корректно заполнять такие важные реквизиты, как Вид номенклатуры и Родитель.

Разбор типичных ошибок при создании групп и элементов

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

Вторая распространенная ошибка — путаница между объектом и ссылкой. Для установки родителя нам нужна именно Ссылка, а не объект, иначе может потребоваться поиск и замена битых ссылок. Также важно помнить, что стандартный реквизит для иерархии называется Родитель, а не "Группа".

Шаг 1: Правильное создание или поиск группы номенклатуры

Рассмотрим подробнее процесс работы с группами. Нам необходимо убедиться, что мы не создаем дубликаты папок при каждом запуске обработки (в этом поможет групповая выгрузка и загрузка файлов). Для этого сначала выполним поиск группы по наименованию, и если она не найдена — создадим новую.

Выясним причину, почему важно проверять существование группы: если ваша обработка или обмен через брокеры будет запускаться ежедневно, без проверки вы получите сотни одинаковых папок в корне справочника. Проанализируем правильный алгоритм:


// Определим имя нашей целевой папки
ИмяГруппы = "Номенклатуры с сайта";

// Сначала ищем, нет ли уже такой группы
ГруппаСсылка = Справочники.Номенклатура.НайтиПоНаименованию(ИмяГруппы, Истина);

Если ГруппаСсылка.Пустая() Тогда
    // Если не нашли, создаем новый объект группы
    НоваяГруппаОбъект = Справочники.Номенклатура.СоздатьГруппу();
    НоваяГруппаОбъект.Наименование = ИмяГруппы;
    
    // Обязательно записываем объект в базу, чтобы получить ссылку
    НоваяГруппаОбъект.Записать();
    ГруппаСсылка = НоваяГруппаОбъект.Ссылка;
    Сообщить("Создана новая группа: " + ИмяГруппы);
КонецЕсли;

Шаг 2: Подготовка данных перед циклом (Оптимизация)

Посмотрим на пример, где поиск вида номенклатуры происходил внутри цикла. Это неэффективно. Если в файле 1000 позиций (например, при использовании модуля «Трансформер»), программа сделает 1000 лишних запросов. Вид номенклатуры нужно найти один раз до начала цикла.


// Находим ссылку на вид номенклатуры один раз
ВидНоменклатурыСсылка = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Продукция");

Если ВидНоменклатурыСсылка.Пустая() Тогда
    Сообщить("Внимание! Вид номенклатуры 'Продукция' не найден в базе. Загрузка может быть некорректной.");
    Возврат;
КонецЕсли;

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

Теперь разберем по шагам основной цикл создания элементов. Мы будем использовать полученную ранее ГруппаСсылка и ВидНоменклатурыСсылка. Также крайне важно проверять уникальность по артикулу, чтобы не создавать дубли товаров.


Для Каждого ЭлементДанных Из Объект.ДанныеФайла Цикл
    
    // 1. Проверка на существование по артикулу
    АртикулДляПоиска = СокрЛП(ЭлементДанных.Артикул);
    НайденнаяСсылка = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", АртикулДляПоиска);
    
    Если Не НайденнаяСсылка.Пустая() Тогда
        Сообщить("Продукция с артикулом " + АртикулДляПоиска + " уже существует. Пропускаем.");
        Продолжить;
    КонецЕсли;
    
    // 2. Создание нового элемента
    НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
    
    // Заполнение основных реквизитов
    НовыйЭлемент.Наименование = ЭлементДанных.Наименование;
    НовыйЭлемент.Артикул      = АртикулДляПоиска;
    
    // Установка иерархии (родителя) и вида
    НовыйЭлемент.Родитель         = ГруппаСсылка;
    НовыйЭлемент.ВидНоменклатуры = ВидНоменклатурыСсылка;
    
    // 3. Заполнение обязательных реквизитов для учета
    // В типовых конфигурациях часто требуются единицы измерения и ставки НДС
    // Для примера установим базовые значения:
    НовыйЭлемент.ЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт");
    
    Попытка
        НовыйЭлемент.Записать();
        Сообщить("Добавлен элемент: " + НовыйЭлемент.Наименование);
    Исключение
        Сообщить("Ошибка при записи элемента " + ЭлементДанных.Наименование + ": " + ОписаниеОшибки());
    КонецПопытки;
    
КонецЦикла;

Важные рекомендации по работе с объектами 1С

Рассмотрим подробнее дополнительные нюансы, которые сделают вашу обработку надежной и профессиональной:

  1. Использование транзакций: При массовой загрузке (сотни и тысячи элементов) рекомендуется оборачивать цикл в транзакцию. Это ускоряет запись и гарантирует целостность данных. Если в середине процесса произойдет критический сбой, база "откатится" к исходному состоянию, не оставляя мусора.
    
    НачатьТранзакцию();
    Попытка
        // Ваш цикл загрузки
        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
        Сообщить("Загрузка прервана из-за ошибки.");
    КонецПопытки;
    
  2. Контроль типов данных: При получении данных из JSON все значения могут приходить в виде строк. Убедитесь, что числа (цены, остатки) преобразуются функцией Число(), а даты — функцией Дата() перед записью в реквизиты.
  3. Метод ЗаполнитьЗначенияСвойств: Если структура вашего JSON совпадает с именами реквизитов в 1С (например, поле в файле называется "Артикул" и реквизит называется "Артикул"), вы можете заменить длинный список присваиваний одной командой: ЗаполнитьЗначенияСвойств(НовыйЭлемент, ЭлементДанных). Это значительно сокращает объем кода.
  4. Интерфейсные решения: Как советовали опытные разработчики в обсуждении, лучше не "зашивать" поиск группы или вида номенклатуры по наименованию прямо в код. Добавьте на форму обработки реквизиты с типом СправочникСсылка.Номенклатура и СправочникСсылка.ВидыНоменклатуры. Тогда пользователь сможет сам выбрать, в какую папку и с каким видом загружать товары, что сделает инструмент универсальным.

Подведем итог: создание элементов справочника требует внимательного отношения к иерархии (реквизит Родитель) и обязательным реквизитам. Всегда проверяйте существование ссылок перед их использованием и стремитесь выносить поиск константных значений за пределы циклов для обеспечения высокой производительности системы.

← На главную