Работа с дополнительными реквизитами (удобно через загрузка дополнительных реквизитов из внешних файлов) — одна из самых частых задач при автоматизации бизнес-процессов в 1С. Поскольку дополнительные реквизиты не являются жестко заданными полями в конфигураторе, обращение к ним через «точку» (например, Объект.ИмяРеквизита) невозможно. В типовых конфигурациях, таких как УНФ, ERP, УТ 11 или Бухгалтерия предприятия 3.0, этот механизм реализован на базе Библиотеки стандартных подсистем (БСП). Разберем подробно, как правильно работать с этими данными программно.
Для начала проанализируем, где физически находятся эти данные. Дополнительные реквизиты хранятся в табличной части самого объекта (справочника или документа), которая обычно называется ДополнительныеРеквизиты. Эта табличная часть состоит из двух основных колонок:
ДополнительныеРеквизитыИСведения.Важно помнить: если вы просто добавите строку в табличную часть вручную, это может не учесть настройки видимости, доступности и связей, предусмотренных в БСП — для проверки данных подойдёт инструмент поиска незаполненных дополнительных реквизитов. Поэтому рассмотрим наиболее правильный и безопасный метод.
Самый эффективный и правильный способ записи значений — использование процедур общего модуля УправлениеСвойствами. Рассмотрим по шагам, как это реализовать.
Предположим, у нас есть контрагент, и нам нужно программно установить значение дополнительного реквизита с именем ExternalId. Разберем пример кода:
// 1. Сначала найдем само свойство (реквизит) в Плане видов характеристик
// Рекомендуется искать по полю "Имя", так как наименование может измениться пользователем
СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ExternalId");
Если СвойствоСсылка.Пустая() Тогда
// Если по имени не нашли, можно попробовать по наименованию (менее надежно)
СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ExternalId");
КонецЕсли;
// 2. Подготовим данные для записи. БСП ожидает таблицу значений или массив структур
ТаблицаСвойств = Новый ТаблицаЗначений;
ТаблицаСвойств.Колонки.Добавить("Свойство");
ТаблицаСвойств.Колонки.Добавить("Значение");
НоваяСтрока = ТаблицаСвойств.Добавить();
НоваяСтрока.Свойство = СвойствоСсылка;
НоваяСтрока.Значение = "123456789"; // Ваше значение
// 3. Вызываем процедуру записи БСП
// ВНИМАНИЕ: СсылкаНаОбъект должна быть именно ССЫЛКОЙ, а не самим объектом
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(СсылкаНаКонтрагента, ТаблицаСвойств);
Важный нюанс: Одной из самых частых ошибок начинающих разработчиков является передача в процедуру ЗаписатьСвойстваУОбъекта переменной типа «Объект» (например, полученной через ПолучитьОбъект()). Это приведет к ошибке блокировки или неверного типа значения. Всегда передавайте Ссылку.
Выясним, как быстро получить значение, не прибегая к сложным запросам к табличным частям. В БСП для этого также предусмотрены удобные функции. Рассмотрим использование функции ЗначениеСвойства.
// Получаем значение конкретного свойства для объекта
Значение = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаОбъект, "ExternalId");
Если Значение <> Неопределено Тогда
Сообщить("Значение реквизита: " + Значение);
КонецЕсли;
Если вам нужно получить сразу все дополнительные реквизиты объекта, воспользуйтесь функцией ЗначенияСвойствОбъекта, которая вернет структуру или таблицу со всеми заполненными данными.
Иногда возникает задача не просто заполнить значение, а создать сам «слот» (реквизит) для определенного типа объектов. Рассмотрим алгоритм создания нового реквизита для справочника «Контрагенты»:
ДополнительныеРеквизитыИСведения.НаборыДополнительныхРеквизитовИСведений.Посмотрим на пример функции создания реквизита:
Процедура СоздатьНовыйДопРеквизит(Идентификатор, Заголовок)
// 1. Создаем свойство
НовоеСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
НовоеСвойство.Заголовок = Заголовок;
НовоеСвойство.Имя = Идентификатор;
НовоеСвойство.ТипЗначения = Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(100));
НовоеСвойство.Записать();
// 2. Привязываем к набору (например, для Контрагентов)
НаборСсылка = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Контрагенты;
НаборОбъект = НаборСсылка.ПолучитьОбъект();
НоваяСтрока = НаборОбъект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = НовоеСвойство.Ссылка;
НаборОбъект.Записать();
КонецПроцедуры
Проанализируем ситуацию, когда доп. реквизит имеет тип «Дополнительное значение». В этом случае значением является не просто текст, а ссылка на справочник ЗначенияСвойствОбъектов. Если вы попытаетесь записать в такое поле строку, система выдаст ошибку.
Разберем, как правильно установить такое значение:
ЗначенияСвойствОбъектов. Владельцем этого элемента должно быть само Свойство (ПВХ).Если вы изменяете дополнительные реквизиты программно прямо в коде формы (например, при нажатии кнопки), пользователь может не увидеть изменений сразу, так как элементы для доп. реквизитов создаются на форме динамически. Чтобы обновить отображение, используйте следующую конструкцию:
// В контексте серверного вызова формы
ПараметрыСвойств = УправлениеСвойствами.ПараметрыРедактированияСвойств(Объект);
УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтаФорма, Объект, ПараметрыСвойств);
Подведем итог и выделим основные правила работы с дополнительными реквизитами:
УправлениеСвойствами. Это гарантирует корректную запись данных и соблюдение бизнес-логики системы.ЗаписатьСвойстваУОбъекта выполняет запись объекта и все сопутствующие проверки. В целях оптимизации иногда эффективнее работать напрямую с табличной частью объекта, но это требует глубокого понимания структуры данных БСП.Рассмотренные инструменты позволяют гибко управлять данными в 1С, не изменяя структуру метаданных, что крайне важно для поддержки и обновления типовых конфигураций.