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