Как программно создать характеристики номенклатуры в 1С:УНФ?

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

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

Основная сложность, с которой сталкиваются при решении этой задачи, — это непонимание разницы между свойствами характеристик и самими характеристиками. Давайте разберемся в этой концепции.

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

Этап 1. Создание и настройка Категории номенклатуры

На этом этапе мы создадим категорию «Обувь», включим для нее использование характеристик и добавим в нее наши свойства — «Цвет» и «Размер».

Критически важный момент: все настройки категории, включая флаг ИспользоватьХарактеристики, нужно устанавливать до первой записи объекта в базу данных. В противном случае платформа не сможет корректно подготовить структуру объекта.

Свойства «Цвет» и «Размер» должны быть созданы как элементы Плана видов характеристик ДополнительныеРеквизитыИСведения. Если их еще нет в системе, их нужно создать программно. Для удобства можно использовать вспомогательную функцию.

Посмотрим на пример кода для создания категории и добавления в нее свойств:


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

// --- 1. Создание Категории номенклатуры ---
КатНомен = Справочники.КатегорииНоменклатуры.СоздатьЭлемент();
КатНомен.Наименование = "Обувь";
КатНомен.ТипНоменклатурыПоУмолчанию = Перечисления.ТипыНоменклатуры.Запас;
КатНомен.ЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.шт;

// --- 2. Включаем использование характеристик ПЕРЕД записью ---
КатНомен.ИспользоватьХарактеристики = Истина;

// --- 3. Находим или создаем нужные Свойства ---
СвойствоЦвет = НайтиИлиСоздатьСвойство("Цвет");
СвойствоРазмер = НайтиИлиСоздатьСвойство("Размер");

// --- 4. Добавляем созданные свойства в табличную часть категории ---
НоваяСтрокаСвойств = КатНомен.СвойстваХарактеристик.Добавить();
НоваяСтрокаСвойств.Свойство = СвойствоЦвет;

НоваяСтрокаСвойств = КатНомен.СвойстваХарактеристик.Добавить();
НоваяСтрокаСвойств.Свойство = СвойствоРазмер;

// --- 5. Записываем полностью настроенную категорию ---
КатНомен.Записать();

Этап 2. Создание номенклатуры и конкретной характеристики

Теперь, когда у нас есть настроенная категория, мы можем создать товар, например, «Ботинки», и для него — характеристику «Красный, 41». Справочник ХарактеристикиНоменклатуры подчинен справочнику Номенклатура, поэтому для создания характеристики нам сначала нужен ее владелец — элемент номенклатуры.

Значения свойств («Красный», «41») также должны быть созданы как элементы справочника ЗначенияСвойствОбъектов. Этот справочник подчинен владельцу — свойству из Плана видов характеристик.

Рассмотрим код для создания одной конкретной характеристики.


// Вспомогательная функция для поиска или создания значения свойства
&НаСервере
Функция НайтиИлиСоздатьЗначениеСвойства(СвойствоВладелец, Значение)
    
    // Ищем значение в справочнике
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ЗначенияСвойствОбъектов.Ссылка
        |ИЗ
        |    Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
        |ГДЕ
        |    ЗначенияСвойствОбъектов.Владелец = &Владелец
        |    И ЗначенияСвойствОбъектов.Наименование = &Наименование";
    
    Запрос.УстановитьПараметр("Владелец", СвойствоВладелец);
    Запрос.УстановитьПараметр("Наименование", Строка(Значение));
    
    Результат = Запрос.Выполнить();
    
    Если Результат.Пустой() Тогда
        // Если не нашли - создаем
        НовоеЗначение = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
        НовоеЗначение.Владелец = СвойствоВладелец;
        НовоеЗначение.Наименование = Строка(Значение);
        НовоеЗначение.Записать();
        СсылкаНаЗначение = НовоеЗначение.Ссылка;
    Иначе
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        СсылкаНаЗначение = Выборка.Ссылка;
    КонецЕсли;
    
    Возврат СсылкаНаЗначение;
    
КонецФункции

// --- Предполагается, что КатНомен и Свойства уже созданы на предыдущем этапе ---
// --- 1. Создаем саму Номенклатуру ---
НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент();
НовыйТовар.Наименование = "Ботинки мужские";
НовыйТовар.КатегорияНоменклатуры = КатНомен.Ссылка; // Присваиваем нашу категорию
НовыйТовар.Записать();
НоменклатураВладелец = НовыйТовар.Ссылка;

// --- 2. Создаем элемент Характеристики ---
НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
НоваяХарактеристика.Владелец = НоменклатураВладелец; // Указываем владельца!
НоваяХарактеристика.Наименование = "Красный, 41"; // Наименование можно формировать автоматически

// --- 3. Находим или создаем конкретные значения для наших свойств ---
ЗначениеКрасный = НайтиИлиСоздатьЗначениеСвойства(СвойствоЦвет, "Красный");
Значение41 = НайтиИлиСоздатьЗначениеСвойства(СвойствоРазмер, 41);

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

НоваяСтрокаТЧ = НоваяХарактеристика.ДополнительныеРеквизиты.Добавить();
НоваяСтрокаТЧ.Свойство = СвойствоРазмер; // Ссылка на элемент ПВХ
НоваяСтрокаТЧ.Значение = Значение41; // Ссылка на элемент Справочника

// --- 5. Записываем характеристику ---
НоваяХарактеристика.Записать();

Анализ типичных ошибок

Проанализируем первоначальный код из темы форума, чтобы понять, какие ошибки были допущены и почему он не работал.

  1. Неправильный порядок записи. Код КатНомен.Записать(); выполнялся до Катномен.ИспользоватьХарактеристики=Истина;. Это главная логическая ошибка. Объект сначала записывался в базу со стандартной структурой, а уже потом делалась попытка изменить его ключевое свойство, что не приводило к нужному результату.
  2. Путаница между свойством и характеристикой. Автор пытался создать элемент справочника ХарактеристикиНоменклатуры с наименованием «Размер». Но «Размер» — это свойство, а не готовая характеристика.
  3. Неверный тип данных для свойства. В строке НовХарСтрокаТЧ.Свойство = "Размер"; реквизиту Свойство, который ожидает ссылку на элемент Плана видов характеристик, присваивалась строка. Это вызвало бы ошибку несоответствия типов.
  4. Некорректное заполнение значений. Код НовХарСтрокаТЧ.Значение = 42; НовХарСтрокаТЧ.Значение = 41; пытался записать два разных значения в один и тот же реквизит одной строки. Для каждого значения свойства (например, для цвета и для размера) должна быть создана отдельная строка в табличной части ДополнительныеРеквизиты.

Таким образом, понимание трехуровневой структуры «Категория -> Свойства -> Характеристика» и правильное использование ссылочных типов данных являются ключом к успешному программному созданию характеристик номенклатуры в 1С:УНФ.

← На главную