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