Как программно заполнить дополнительные реквизиты в 1С:Управление торговлей 11.4?

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

При разработке в среде 1С:Управление торговлей 11.4 (и других конфигурациях на базе БСП) часто возникает задача программного изменения дополнительных реквизитов. Эти реквизиты не являются физическими полями таблиц базы данных, а хранятся в специальной табличной части объекта. В этой статье мы подробно разберем, как правильно найти нужное свойство и установить его значение, используя как прямую работу с объектом, так и стандартные функции библиотеки стандартных подсистем (БСП).

Понимание структуры хранения дополнительных реквизитов

Прежде чем приступать к написанию кода, проанализируем, где именно хранятся эти данные. У таких объектов, как Справочник.Номенклатура, Справочник.ХарактеристикиНоменклатуры, Справочник.Контрагенты и многих других, существует табличная часть с именем ДополнительныеРеквизиты. Она состоит из двух ключевых колонок:

  1. Свойство — ссылка на элемент плана видов характеристик ДополнительныеРеквизитыИСведения.
  2. Значение — само значение свойства, тип которого определяется в настройках этого свойства (может быть строкой, числом, датой или ссылкой на справочник ЗначенияСвойствОбъектов).

Рассмотрим два основных способа решения задачи: "ручной" метод через объектную технику и "универсальный" метод через механизмы БСП.

Способ 1: Прямая работа с табличной частью объекта

Этот метод полезен, когда вы уже работаете с объектом (например, в модуле объекта перед записью или в обработке заполнения) и вам нужно быстро изменить данные. Разберем по шагам, как это реализовать.

Проанализируем ситуацию: нам нужно проверить, существует ли уже строка с нужным свойством. Если да — обновить значение, если нет — добавить новую строку.


// Предположим, у нас есть ОбъектНоменклатуры (Объект)
// И мы знаем название реквизита, который хотим заполнить

НазваниеРеквизита = "Цвет (базовый)"; // Название свойства
НужноеЗначение = "Красный";         // Значение, которое хотим установить

// 1. Ищем само свойство в плане видов характеристик
СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(НазваниеРеквизита);

Если СвойствоСсылка.Пустая() Тогда
    Сообщить("Свойство с таким названием не найдено!");
    Возврат;
КонецЕсли;

// 2. Ищем строку в табличной части объекта
СтрокаСвойства = ОбъектНоменклатуры.ДополнительныеРеквизиты.Найти(СвойствоСсылка, "Свойство");

Если СтрокаСвойства = Неопределено Тогда
    // Если свойства еще нет в списке, добавляем новую строку
    СтрокаСвойства = ОбъектНоменклатуры.ДополнительныеРеквизиты.Добавить();
    СтрокаСвойства.Свойство = СвойствоСсылка;
КонецЕсли;

// 3. Устанавливаем значение
// Важно: если тип свойства "Дополнительное значение", нужно передавать ссылку на справочник ЗначенияСвойствОбъектов
СтрокаСвойства.Значение = НужноеЗначение;

// 4. Не забываем записать объект, если это происходит не в процедуре ПередЗаписью
// ОбъектНоменклатуры.Записать();

Важный нюанс: Если ваш дополнительный реквизит имеет тип "Дополнительное значение" (список), то просто присвоить строку "Красный" в поле Значение нельзя. Программа выдаст ошибку несоответствия типов. В этом случае необходимо сначала найти ссылку на элемент в справочнике ЗначенияСвойствОбъектов, где владельцем является наше свойство.

Способ 2: Использование универсального метода БСП (Рекомендуется)

В современных конфигурациях, таких как УТ 11.4, ERP или КА 2, разработчики БСП предусмотрели специальный программный интерфейс для работы со свойствами. Использование общего модуля УправлениеСвойствами позволяет избежать написания лишнего кода и гарантирует соблюдение всех проверок.

Выясним причину, почему этот способ лучше: он автоматически обрабатывает создание новых строк, удаление пустых и корректно работает с блокировками данных. Самый мощный метод здесь — ЗаписатьСвойстваУОбъекта.

Рассмотрим пример использования этого метода:


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

// Заполняем данные для записи
НоваяСтрока = ТаблицаСвойств.Добавить();
НоваяСтрока.Свойство = СвойствоСсылка; // Найдено заранее
НоваяСтрока.Значение = ИскомоеЗначение; // Ссылка на значение или примитивный тип

// Вызываем стандартный метод БСП
// ВладелецСвойств - это ссылка на объект (Номенклатура, Контрагент и т.д.)
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойств);

Этот метод самостоятельно откроет объект на чтение/запись, изменит табличную часть ДополнительныеРеквизиты и зафиксирует изменения в базе данных. Это наиболее "чистый" способ с точки зрения архитектуры 1С.

Работа со справочником «Значения свойств объектов»

Если вы программно заполняете свойства типа "Список", вам часто придется создавать новые значения "на лету". Посмотрим на ситуацию: пользователь загружает данные из Excel, и в базе еще нет нужного цвета или размера.

Проанализируем алгоритм поиска или создания нового значения для выпадающего списка:


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

Дополнительные рекомендации и тонкости

Разберем несколько важных моментов, которые часто упускают из виду:

Таким образом, мы рассмотрели различные подходы к заполнению дополнительных реквизитов в УТ 11.4. Для разовых задач и простых манипуляций подойдет прямая работа с табличной частью. Для надежных интеграций и массового изменения данных всегда лучше использовать методы общего модуля УправлениеСвойствами, так как они учитывают внутреннюю логику конфигурации и стандарты разработки БСП.

← На главную