Разработка и Конфигурация · 14 мин
Как программно создать дополнительные реквизиты в 1С 8.3
Программное создание дополнительных реквизитов и сведений в 1С 8.3: работа с планом видов характеристик, наборами свойств, заполнение значений. Примеры кода на встроенном языке.
Дополнительные реквизиты и сведения — механизм Библиотеки стандартных подсистем (БСП), который позволяет расширять состав полей справочников и документов без изменения конфигурации. В типовых решениях вроде «Управление торговлей», «ERP» или «Бухгалтерии предприятия» пользователь добавляет их через интерфейс «Администрирование → Общие настройки → Дополнительные реквизиты и сведения». Но при автоматизации — миграции данных, настройке обменов, развёртывании отраслевых решений — возникает задача создать такие реквизиты программно, из кода на встроенном языке.
Механизм построен на двух объектах метаданных: план видов характеристик ДополнительныеРеквизитыИСведения хранит сами свойства (их имена, типы, заголовки), а справочник НаборыДополнительныхРеквизитовИСведений определяет, к каким объектам какие свойства привязаны. Чтобы реквизит появился в карточке номенклатуры или контрагента, недостаточно создать элемент ПВХ — нужно ещё включить его в соответствующий набор.
Ниже разобран полный цикл: создание свойства, привязка к набору, заполнение значений в объектах, проверка результата и типичные ошибки. Примеры кода ориентированы на конфигурации с БСП актуальных версий, где используется общий модуль УправлениеСвойствами (в старых версиях — Свойства или УправлениеСвойствамиСлужебный).
Как устроен механизм дополнительных реквизитов
Прежде чем писать код, важно понимать структуру хранения. Каждое свойство — это предопределённый по смыслу, но создаваемый в режиме Предприятия элемент плана видов характеристик. У него есть наименование, заголовок (то, что видит пользователь), тип значения и признак «Это дополнительное сведение». Разница между реквизитом и сведением принципиальна: реквизиты хранятся в табличной части самого объекта и видны на его форме, а сведения — в регистре сведений ДополнительныеСведения и выводятся отдельной командой.
Наборы свойств — это элементы справочника, связанные с конкретным видом объектов: «Справочник Номенклатура», «Документ ЗаказКлиента» и т.д. У набора есть табличные части ДополнительныеРеквизиты и ДополнительныеСведения, куда и включаются свойства. Один и тот же реквизит может входить в несколько наборов — например, «Цвет» может быть и у номенклатуры, и у характеристик.
Создание свойства в плане видов характеристик
Первый шаг — создать сам элемент ПВХ. Рекомендуется перед созданием проверять, нет ли уже свойства с таким именем, иначе при повторном запуске обработки появятся дубли. Поиск выполняется по наименованию или по реквизиту Имя, который БСП формирует автоматически (удобен для программного обращения без пробелов и кириллицы).
Функция СоздатьСвойство(Наименование, ТипСтрокой)
СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения
.НайтиПоНаименованию(Наименование, Истина);
Если Не СвойствоСсылка.Пустая() Тогда
Возврат СвойствоСсылка;
КонецЕсли;
НовоеСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения
.СоздатьЭлемент();
НовоеСвойство.Наименование = Наименование;
НовоеСвойство.Заголовок = Наименование;
НовоеСвойство.ТипЗначения = Новый ОписаниеТипов(ТипСтрокой);
НовоеСвойство.ЭтоДополнительноеСведение = Ложь;
НовоеСвойство.Записать();
Возврат НовоеСвойство.Ссылка;
КонецФункции
Обратите внимание на тип значения. Если реквизит должен хранить ссылку на справочник, укажите соответствующий тип, например "СправочникСсылка.ЗначенияСвойствОбъектов" — это стандартный справочник для списковых значений свойств. Для строки с ограничением длины формируйте описание типов через конструктор с квалификаторами строки, иначе получите неограниченную строку, которая в некоторых сценариях отображается некорректно.
Поле Заголовок заполняйте осознанно: именно его увидит пользователь в карточке объекта. Если оставить его пустым, платформа подставит наименование, но при дальнейшем переименовании свойства через интерфейс заголовок и наименование могут разойтись — это нормально, но программный поиск лучше вести по стабильному признаку.
Привязка свойства к набору
Созданное свойство само по себе нигде не отображается. Чтобы оно появилось у номенклатуры, его нужно добавить в набор. Наборы имеют предопределённые имена вида Справочник_Номенклатура, Документ_ЗаказКлиента и т.п. Получить ссылку на набор можно через метод НайтиПоИмени или через функцию БСП УправлениеСвойствами.НаборСвойствПоИмени(), если она доступна в вашей версии библиотеки.
Процедура ДобавитьСвойствоВНабор(СвойствоСсылка, ИмяНабора)
НаборСсылка = Справочники.НаборыДополнительныхРеквизитовИСведений
.НайтиПоНаименованию("Номенклатура", Истина);
// Надёжнее искать по предопределённому имени:
// НаборСсылка = Справочники.НаборыДополнительныхРеквизитовИСведений[
// "Справочник_Номенклатура"];
НаборОбъект = НаборСсылка.ПолучитьОбъект();
ПараметрыОтбора = Новый Структура("Свойство", СвойствоСсылка);
Если НаборОбъект.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыОтбора).Количество() > 0 Тогда
Возврат; // уже добавлено
КонецЕсли;
НоваяСтрока = НаборОбъект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = СвойствоСсылка;
НаборОбъект.Записать();
КонецПроцедуры
Поиск набора по наименованию ненадёжен: название может быть изменено пользователем или отличаться в локализованной конфигурации. Правильный путь — обращение через квадратные скобки к предопределённому элементу по имени, как показано в комментарии к коду. Если набор по какой-то причине отсутствует (например, механизм дополнительных реквизитов для этого объекта не включён в конфигураторе), обращение вызовет исключение — это сигнал проверить настройки объекта метаданных.
- 1Убедитесь, что у целевого объекта метаданных включена поддержка дополнительных реквизитов (есть табличная часть «ДополнительныеРеквизиты» и команда панели навигации)
- 2Создайте или найдите элемент ПВХ «ДополнительныеРеквизитыИСведения» с нужным типом значения
- 3Получите ссылку на набор по предопределённому имени, например Справочник_Номенклатура
- 4Проверьте, нет ли свойства в табличной части набора, и добавьте строку при отсутствии
- 5Откройте карточку объекта и убедитесь, что реквизит появился на форме
Заполнение значений реквизитов в объектах
После привязки свойства значения хранятся в табличной части ДополнительныеРеквизиты самого объекта: каждая строка содержит ссылку на свойство и значение. Программное заполнение выглядит так:
Процедура УстановитьЗначениеСвойства(Объект, СвойствоСсылка, Значение)
ПараметрыОтбора = Новый Структура("Свойство", СвойствоСсылка);
НайденныеСтроки = Объект.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() = 0 Тогда
Строка = Объект.ДополнительныеРеквизиты.Добавить();
Строка.Свойство = СвойствоСсылка;
Иначе
Строка = НайденныеСтроки[0];
КонецЕсли;
Строка.Значение = Значение;
// Для строковых значений полезно заполнить текстовое представление:
Строка.ТекстоваяСтрока = Строка(Значение);
КонецПроцедуры
В типовых конфигурациях есть сервисные процедуры, упрощающие массовую запись, — например, функции общего модуля УправлениеСвойствами для чтения значений свойств без обращения к табличной части напрямую. Для чтения значения одного свойства удобно использовать УправлениеСвойствами.ЗначениеСвойства(ОбъектСсылка, Свойство), если такая функция присутствует в вашей версии БСП — это снижает объём кода и устойчивее к изменениям структуры хранения.
Для дополнительных сведений механика другая: значения пишутся в регистр сведений ДополнительныеСведения с измерениями «Объект» и «Свойство». Запись выполняется через набор записей регистра с отбором по этим двум измерениям. Не смешивайте подходы — попытка записать сведение в табличную часть объекта окончится ошибкой, потому что такой табличной части для сведений у объекта нет.
НаборЗаписей = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(ОбъектСсылка);
НаборЗаписей.Отбор.Свойство.Установить(СвойствоСсылка);
Запись = НаборЗаписей.Добавить();
Запись.Объект = ОбъектСсылка;
Запись.Свойство = СвойствоСсылка;
Запись.Значение = Значение;
НаборЗаписей.Записать();Особые случаи: списковые значения и обязательность
Свойство со списком значений
Если реквизит должен выбираться из списка, его тип — СправочникСсылка.ЗначенияСвойствОбъектов (или ЗначенияСвойствОбъектовИерархия в новых версиях БСП). Сами варианты значений создаются как элементы этого справочника с владельцем — ссылкой на свойство. Создавать их нужно программно тем же способом: найти по наименованию с отбором по владельцу, при отсутствии — создать. Без предварительного создания элементов списка пользователь увидит пустой выпадающий список.
Обязательность и доступность
В строке набора есть поле ЗаполнятьОбязательно — установка его в Истина заставит платформу требовать заполнения реквизита при записи объекта. Будьте осторожны: включение обязательности для уже существующих объектов без значений приведёт к невозможности их перезаписи, пока пользователь не заполнит поле. Для массовых баз это может заблокировать регламентные обработки и обмены.
Проверка результата и типичные ошибки
После выполнения кода откройте карточку целевого объекта в режиме Предприятия: новый реквизит должен отображаться в группе дополнительных реквизитов. Если его нет, проверьте три вещи: свойство реально записано в ПВХ, строка добавлена именно в табличную часть ДополнительныеРеквизиты (а не ДополнительныеСведения) нужного набора, и у текущего пользователя есть права на просмотр дополнительных реквизитов.
Ещё одна частая проблема — кэширование. После программного изменения набора формы уже открытых объектов могут не показывать новый реквизит до переоткрытия. В клиент-серверном режиме иногда требуется обновить интерфейс или перезапустить сеанс, чтобы подтянулись изменённые настройки свойств.
Как проверить результат
Элемент найден по наименованию, тип значения соответствует задуманному
Несколько элементов с одинаковым наименованием или пустой тип значения
Свойство присутствует в табличной части «ДополнительныеРеквизиты» нужного набора
Свойство добавлено в «ДополнительныеСведения» или в набор другого объекта
Реквизит виден на форме объекта и сохраняет введённое значение
Поле отсутствует на форме или значение пропадает после записи
Когда программный способ не нужен
Если реквизит добавляется один раз и вручную, интерфейсный путь проще и безопаснее: «Администрирование → Общие настройки → Дополнительные реквизиты», кнопка «Добавить → Новый». Программное создание оправдано при миграции данных из других систем, при автоматическом развёртывании одинаковой структуры свойств на нескольких базах, при обменах, где состав реквизитов должен синхронизироваться, и при поставке отраслевых решений, требующих предопределённого набора полей.
Сравнение вариантов
Подходит для разового добавления. Не требует кода, но не масштабируется и не переносится между базами автоматически
Подходит для миграций и тиражирования. Требует аккуратности с поиском наборов и проверкой дублей
Подходит, когда поле участвует в индексах, движениях или сложной логике. Требует обновления конфигурации и монопольного доступа, ломает полную поддержку типовой конфигурации
Часто задаваемые вопросы
Чем дополнительный реквизит отличается от дополнительного сведения?
Реквизит хранится в табличной части самого объекта, отображается на его форме и учитывается при записи объекта. Сведение хранится в отдельном регистре сведений, открывается отдельной командой и не влияет на запись объекта. Программно они заполняются по-разному: реквизит — через табличную часть, сведение — через набор записей регистра «ДополнительныеСведения».
Почему созданный программно реквизит не виден в карточке объекта?
Наиболее вероятная причина — свойство не добавлено в набор или добавлено не в ту табличную часть набора. Также проверьте, что набор соответствует именно тому виду объектов, карточку которого вы открываете, и переоткройте форму — открытые формы кэшируют состав реквизитов.
Можно ли создать свойство один раз и использовать для разных объектов?
Да. Одно свойство можно включить в несколько наборов — например, «Цвет» для номенклатуры и для контрагентов. Для этого добавьте строку с одной и той же ссылкой на свойство в табличные части обоих наборов.
Как перенести созданные реквизиты из тестовой базы в рабочую?
Свойства и наборы — это данные, а не конфигурация, поэтому обновление конфигурации их не перенесёт. Варианты: повторное выполнение кода создания в рабочей базе, выгрузка через универсальный обмен данными в XML или средства конвертации данных. Значения реквизитов в объектах переносятся вместе с самими объектами.
Безопасно ли удалять дополнительный реквизит программно?
Удаление элемента ПВХ, по которому есть заполненные значения, приведёт к потере этих значений при записи объектов. Перед удалением проверьте наличие строк со ссылкой на свойство в табличных частях объектов и в регистре сведений, при необходимости сначала очистите значения, затем удалите строки из наборов и только потом — сам элемент.
Работает ли этот подход в конфигурациях без БСП?
Нет. Описанный механизм — часть Библиотеки стандартных подсистем и присутствует только в конфигурациях, где она внедрена: ПВХ «ДополнительныеРеквизитыИСведения», справочник наборов и регистр сведений должны существовать в метаданных. В самописной конфигурации без БСП придётся либо внедрять подсистему свойств, либо добавлять обычные реквизиты через конфигуратор.
Что важно запомнить
Программное создание дополнительного реквизита — это два обязательных шага: запись элемента в ПВХ «ДополнительныеРеквизитыИСведения» и добавление его в нужный набор по предопределённому имени. Значения реквизитов хранятся в табличной части объекта, сведений — в регистре. Всегда проверяйте существование свойства перед созданием, работайте сначала на копии базы и осторожно относитесь к обязательному заполнению.