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