Как программно добавить или изменить значения дополнительных реквизитов в 1С

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

Работа с дополнительными реквизитами (удобно через загрузка дополнительных реквизитов из внешних файлов) — одна из самых частых задач при автоматизации бизнес-процессов в 1С. Поскольку дополнительные реквизиты не являются жестко заданными полями в конфигураторе, обращение к ним через «точку» (например, Объект.ИмяРеквизита) невозможно. В типовых конфигурациях, таких как УНФ, ERP, УТ 11 или Бухгалтерия предприятия 3.0, этот механизм реализован на базе Библиотеки стандартных подсистем (БСП). Разберем подробно, как правильно работать с этими данными программно.

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

Для начала проанализируем, где физически находятся эти данные. Дополнительные реквизиты хранятся в табличной части самого объекта (справочника или документа), которая обычно называется ДополнительныеРеквизиты. Эта табличная часть состоит из двух основных колонок:

  1. Свойство — ссылка на элемент Плана видов характеристик ДополнительныеРеквизитыИСведения.
  2. Значение — конкретные данные, которые могут иметь тип строки, числа, даты или ссылку на справочник (включая специальные «Дополнительные значения»).

Важно помнить: если вы просто добавите строку в табличную часть вручную, это может не учесть настройки видимости, доступности и связей, предусмотренных в БСП — для проверки данных подойдёт инструмент поиска незаполненных дополнительных реквизитов. Поэтому рассмотрим наиболее правильный и безопасный метод.

Использование метода БСП «ЗаписатьСвойстваУОбъекта»

Самый эффективный и правильный способ записи значений — использование процедур общего модуля УправлениеСвойствами. Рассмотрим по шагам, как это реализовать.

Предположим, у нас есть контрагент, и нам нужно программно установить значение дополнительного реквизита с именем ExternalId. Разберем пример кода:


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

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

// 2. Подготовим данные для записи. БСП ожидает таблицу значений или массив структур
ТаблицаСвойств = Новый ТаблицаЗначений;
ТаблицаСвойств.Колонки.Добавить("Свойство");
ТаблицаСвойств.Колонки.Добавить("Значение");

НоваяСтрока = ТаблицаСвойств.Добавить();
НоваяСтрока.Свойство = СвойствоСсылка;
НоваяСтрока.Значение = "123456789"; // Ваше значение

// 3. Вызываем процедуру записи БСП
// ВНИМАНИЕ: СсылкаНаОбъект должна быть именно ССЫЛКОЙ, а не самим объектом
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(СсылкаНаКонтрагента, ТаблицаСвойств);

Важный нюанс: Одной из самых частых ошибок начинающих разработчиков является передача в процедуру ЗаписатьСвойстваУОбъекта переменной типа «Объект» (например, полученной через ПолучитьОбъект()). Это приведет к ошибке блокировки или неверного типа значения. Всегда передавайте Ссылку.

Как программно получить (прочитать) значение доп. реквизита

Выясним, как быстро получить значение, не прибегая к сложным запросам к табличным частям. В БСП для этого также предусмотрены удобные функции. Рассмотрим использование функции ЗначениеСвойства.


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

Если Значение <> Неопределено Тогда
    Сообщить("Значение реквизита: " + Значение);
КонецЕсли;

Если вам нужно получить сразу все дополнительные реквизиты объекта, воспользуйтесь функцией ЗначенияСвойствОбъекта, которая вернет структуру или таблицу со всеми заполненными данными.

Программное создание нового дополнительного реквизита

Иногда возникает задача не просто заполнить значение, а создать сам «слот» (реквизит) для определенного типа объектов. Рассмотрим алгоритм создания нового реквизита для справочника «Контрагенты»:

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

Посмотрим на пример функции создания реквизита:


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

Работа с типом «Дополнительное значение»

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

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

  1. Найдем или создадим элемент в справочнике ЗначенияСвойствОбъектов. Владельцем этого элемента должно быть само Свойство (ПВХ).
  2. Запишем полученную ссылку в табличную часть или через методы БСП.

Обновление интерфейса формы

Если вы изменяете дополнительные реквизиты программно прямо в коде формы (например, при нажатии кнопки), пользователь может не увидеть изменений сразу, так как элементы для доп. реквизитов создаются на форме динамически. Чтобы обновить отображение, используйте следующую конструкцию:


// В контексте серверного вызова формы
ПараметрыСвойств = УправлениеСвойствами.ПараметрыРедактированияСвойств(Объект);
УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтаФорма, Объект, ПараметрыСвойств);

Рекомендации и лучшие практики

Подведем итог и выделим основные правила работы с дополнительными реквизитами:

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

← На главную