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