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

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

В конфигурации «1С:Управление торговлей 10.3» работа с характеристиками номенклатуры (такими как размер, цвет или материал) имеет специфическую архитектуру. Часто начинающие разработчики пытаются найти значения этих свойств непосредственно в полях справочника ХарактеристикиНоменклатуры, но обнаруживают там только стандартные реквизиты: Владелец и Наименование. В этой статье мы подробно разберем, как устроено хранение данных характеристик и как правильно изменять их программным путем.

Архитектура хранения характеристик

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

  1. Справочник ХарактеристикиНоменклатуры — это основные элементы, которые мы выбираем в документах. У каждой характеристики есть владелец (номенклатура или вид номенклатуры).
  2. План видов характеристик (ПВХ) СвойстваОбъектов — здесь хранятся описания самих свойств (например, «Размер RU», «Цвет», «Производитель»).
  3. Регистр сведений ЗначенияСвойствОбъектов — это «сердце» механизма. Именно здесь хранятся конкретные значения для каждой характеристики.

Таким образом, чтобы изменить «Размер RU» у характеристики, нам нужно не редактировать сам справочник, а создать или изменить запись в регистре сведений, где Объект — это наша характеристика, а Свойство — ссылка на нужный элемент из ПВХ.

Шаг 1. Поиск характеристики и её владельца

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Характеристики.Ссылка КАК Характеристика,
    |	Характеристики.Владелец КАК НоменклатураВладелец,
    |	Характеристики.Наименование КАК ТекущееНаименование
    |ИЗ
    |	Справочник.ХарактеристикиНоменклатуры КАК Характеристики
    |ГДЕ
    |	Характеристики.Владелец = &НужнаяНоменклатура";

Запрос.УстановитьПараметр("НужнаяНоменклатура", СсылкаНаТовар);
РезультатЗапроса = Запрос.Выполнить();

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

Шаг 2. Получение ссылки на свойство

Перед записью значения нам нужно точно знать, какое свойство мы меняем. Разберем, как найти ссылку на свойство «Размер RU» в Плане видов характеристик СвойстваОбъектов. Лучше всего искать по наименованию или заранее предопределенному коду, если он задан:


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

Шаг 3. Программное изменение значения в регистре сведений

Теперь перейдем к самому важному — записи нового значения. Для этого мы будем использовать МенеджерЗаписи регистра сведений ЗначенияСвойствОбъектов. Этот способ удобен тем, что он автоматически проверяет наличие существующей записи: если запись есть — она обновится, если нет — создастся новая.

Рассмотрим пример кода для изменения значения:


// Предположим, у нас есть переменная СсылкаНаХарактеристику и НовоеЗначениеРазмера
МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();

// Устанавливаем ключевые поля (измерения)
МенеджерЗаписи.Объект = СсылкаНаХарактеристику;
МенеджерЗаписи.Свойство = СвойствоРазмер;

// Пытаемся прочитать существующую запись
МенеджерЗаписи.Прочитать();

// Устанавливаем новое значение (ресурс)
МенеджерЗаписи.Значение = НовоеЗначениеРазмера;

// Записываем данные в базу
Попытка
    МенеджерЗаписи.Записать();
Исключение
    Сообщить("Ошибка при записи свойства: " + ОписаниеОшибки());
КонецПопытки;

Обратите внимание: НовоеЗначениеРазмера должно соответствовать типу, который указан для данного свойства в ПВХ (обычно это ссылка на справочник ЗначенияСвойствОбъектов или число/строка).

Шаг 4. Обновление наименования характеристики

Выясним одну важную деталь: в УТ 10.3 наименование характеристики часто является составным (например, «Красный, 42»). Когда мы меняем значение свойства в регистре, само поле Наименование в справочнике не обновляется автоматически. Если этого не сделать, пользователи в подборе и отчетах будут видеть старые данные.

Проанализируем, как обновить наименование программно:


ОбъектХарактеристика = СсылкаНаХарактеристику.ПолучитьОбъект();

// В типовой УТ 10.3 часто есть функция формирования наименования. 
// Если ее нет, формируем строку самостоятельно на основе всех свойств.
НовоеИмя = "Размер: " + Строка(НовоеЗначениеРазмера); 

ОбъектХарактеристика.Наименование = НовоеИмя;
ОбъектХарактеристика.Записать();

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

Массовое изменение характеристик: оптимизация

Если нам нужно изменить характеристики у всей номенклатуры (как просил автор в сообщении №2), следует избегать получения объекта в каждой итерации цикла, если это не требуется. Однако, поскольку свойства хранятся в регистре, основная нагрузка ляжет на работу с менеджером записи. Рассмотрим пример цикла обработки:


Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
    
    // 1. Меняем значение в регистре
    МЗ = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
    МЗ.Объект = Выборка.Характеристика;
    МЗ.Свойство = СвойствоРазмер;
    МЗ.Значение = НужныйРазмер;
    МЗ.Записать();
    
    // 2. Обновляем текстовое представление, если нужно
    ХарактеристикаОбъект = Выборка.Характеристика.ПолучитьОбъект();
    ХарактеристикаОбъект.Наименование = "Размер " + Строка(НужныйРазмер);
    ХарактеристикаОбъект.Записать();
    
КонецЦикла;

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

Типичные ошибки при работе

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

← На главную