К статье
Практический материал

Разработка и Конфигурация · 14 мин

Как программно создать дополнительные реквизиты в 1С 8.3

Программное создание дополнительных реквизитов и сведений в 1С 8.3: работа с планом видов характеристик, наборами свойств, заполнение значений. Примеры кода на встроенном языке.

Дополнительные реквизиты и сведения — механизм Библиотеки стандартных подсистем (БСП), который позволяет расширять состав полей справочников и документов без изменения конфигурации. В типовых решениях вроде «Управление торговлей», «ERP» или «Бухгалтерии предприятия» пользователь добавляет их через интерфейс «Администрирование → Общие настройки → Дополнительные реквизиты и сведения». Но при автоматизации — миграции данных, настройке обменов, развёртывании отраслевых решений — возникает задача создать такие реквизиты программно, из кода на встроенном языке.

Механизм построен на двух объектах метаданных: план видов характеристик ДополнительныеРеквизитыИСведения хранит сами свойства (их имена, типы, заголовки), а справочник НаборыДополнительныхРеквизитовИСведений определяет, к каким объектам какие свойства привязаны. Чтобы реквизит появился в карточке номенклатуры или контрагента, недостаточно создать элемент ПВХ — нужно ещё включить его в соответствующий набор.

Ниже разобран полный цикл: создание свойства, привязка к набору, заполнение значений в объектах, проверка результата и типичные ошибки. Примеры кода ориентированы на конфигурации с БСП актуальных версий, где используется общий модуль УправлениеСвойствами (в старых версиях — Свойства или УправлениеСвойствамиСлужебный).

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

Прежде чем писать код, важно понимать структуру хранения. Каждое свойство — это предопределённый по смыслу, но создаваемый в режиме Предприятия элемент плана видов характеристик. У него есть наименование, заголовок (то, что видит пользователь), тип значения и признак «Это дополнительное сведение». Разница между реквизитом и сведением принципиальна: реквизиты хранятся в табличной части самого объекта и видны на его форме, а сведения — в регистре сведений ДополнительныеСведения и выводятся отдельной командой.

Наборы свойств — это элементы справочника, связанные с конкретным видом объектов: «Справочник Номенклатура», «Документ ЗаказКлиента» и т.д. У набора есть табличные части ДополнительныеРеквизиты и ДополнительныеСведения, куда и включаются свойства. Один и тот же реквизит может входить в несколько наборов — например, «Цвет» может быть и у номенклатуры, и у характеристик.

Создание свойства в плане видов характеристик

Первый шаг — создать сам элемент ПВХ. Рекомендуется перед созданием проверять, нет ли уже свойства с таким именем, иначе при повторном запуске обработки появятся дубли. Поиск выполняется по наименованию или по реквизиту Имя, который БСП формирует автоматически (удобен для программного обращения без пробелов и кириллицы).

Функция СоздатьСвойство(Наименование, ТипСтрокой)

СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения

.НайтиПоНаименованию(Наименование, Истина);

Если Не СвойствоСсылка.Пустая() Тогда

Возврат СвойствоСсылка;

КонецЕсли;

НовоеСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения

.СоздатьЭлемент();

НовоеСвойство.Наименование = Наименование;

НовоеСвойство.Заголовок = Наименование;

НовоеСвойство.ТипЗначения = Новый ОписаниеТипов(ТипСтрокой);

НовоеСвойство.ЭтоДополнительноеСведение = Ложь;

НовоеСвойство.Записать();

Возврат НовоеСвойство.Ссылка;

КонецФункции

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

Поле Заголовок заполняйте осознанно: именно его увидит пользователь в карточке объекта. Если оставить его пустым, платформа подставит наименование, но при дальнейшем переименовании свойства через интерфейс заголовок и наименование могут разойтись — это нормально, но программный поиск лучше вести по стабильному признаку.

Привязка свойства к набору

Созданное свойство само по себе нигде не отображается. Чтобы оно появилось у номенклатуры, его нужно добавить в набор. Наборы имеют предопределённые имена вида Справочник_Номенклатура, Документ_ЗаказКлиента и т.п. Получить ссылку на набор можно через метод НайтиПоИмени или через функцию БСП УправлениеСвойствами.НаборСвойствПоИмени(), если она доступна в вашей версии библиотеки.

Процедура ДобавитьСвойствоВНабор(СвойствоСсылка, ИмяНабора)

НаборСсылка = Справочники.НаборыДополнительныхРеквизитовИСведений

.НайтиПоНаименованию("Номенклатура", Истина);

// Надёжнее искать по предопределённому имени:

// НаборСсылка = Справочники.НаборыДополнительныхРеквизитовИСведений[

// "Справочник_Номенклатура"];

НаборОбъект = НаборСсылка.ПолучитьОбъект();

ПараметрыОтбора = Новый Структура("Свойство", СвойствоСсылка);

Если НаборОбъект.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыОтбора).Количество() > 0 Тогда

Возврат; // уже добавлено

КонецЕсли;

НоваяСтрока = НаборОбъект.ДополнительныеРеквизиты.Добавить();

НоваяСтрока.Свойство = СвойствоСсылка;

НаборОбъект.Записать();

КонецПроцедуры

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

Порядок действий
  1. 1
    Убедитесь, что у целевого объекта метаданных включена поддержка дополнительных реквизитов (есть табличная часть «ДополнительныеРеквизиты» и команда панели навигации)
  2. 2
    Создайте или найдите элемент ПВХ «ДополнительныеРеквизитыИСведения» с нужным типом значения
  3. 3
    Получите ссылку на набор по предопределённому имени, например Справочник_Номенклатура
  4. 4
    Проверьте, нет ли свойства в табличной части набора, и добавьте строку при отсутствии
  5. 5
    Откройте карточку объекта и убедитесь, что реквизит появился на форме

Заполнение значений реквизитов в объектах

После привязки свойства значения хранятся в табличной части ДополнительныеРеквизиты самого объекта: каждая строка содержит ссылку на свойство и значение. Программное заполнение выглядит так:

Процедура УстановитьЗначениеСвойства(Объект, СвойствоСсылка, Значение)

ПараметрыОтбора = Новый Структура("Свойство", СвойствоСсылка);

НайденныеСтроки = Объект.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыОтбора);

Если НайденныеСтроки.Количество() = 0 Тогда

Строка = Объект.ДополнительныеРеквизиты.Добавить();

Строка.Свойство = СвойствоСсылка;

Иначе

Строка = НайденныеСтроки[0];

КонецЕсли;

Строка.Значение = Значение;

// Для строковых значений полезно заполнить текстовое представление:

Строка.ТекстоваяСтрока = Строка(Значение);

КонецПроцедуры

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

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

bsl
НаборЗаписей = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(ОбъектСсылка);
НаборЗаписей.Отбор.Свойство.Установить(СвойствоСсылка);
Запись = НаборЗаписей.Добавить();
Запись.Объект = ОбъектСсылка;
Запись.Свойство = СвойствоСсылка;
Запись.Значение = Значение;
НаборЗаписей.Записать();

Особые случаи: списковые значения и обязательность

Свойство со списком значений

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

Обязательность и доступность

В строке набора есть поле ЗаполнятьОбязательно — установка его в Истина заставит платформу требовать заполнения реквизита при записи объекта. Будьте осторожны: включение обязательности для уже существующих объектов без значений приведёт к невозможности их перезаписи, пока пользователь не заполнит поле. Для массовых баз это может заблокировать регламентные обработки и обмены.

Проверка результата и типичные ошибки

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

Типичные ошибки
01
Создание свойства без добавления в набор — реквизит существует в базе, но нигде не отображается
02
Поиск набора по наименованию вместо предопределённого имени — код ломается после переименования набора или в другой конфигурации
03
Дубли свойств при повторном запуске обработки из-за отсутствия проверки существования
04
Запись сведения в табличную часть объекта или реквизита в регистр сведений — смешение двух разных механизмов хранения
05
Неограниченная строка в типе значения — проблемы с отображением и сравнением значений в отчётах
06
Включение обязательного заполнения без предварительного заполнения значений у существующих объектов

Ещё одна частая проблема — кэширование. После программного изменения набора формы уже открытых объектов могут не показывать новый реквизит до переоткрытия. В клиент-серверном режиме иногда требуется обновить интерфейс или перезапустить сеанс, чтобы подтянулись изменённые настройки свойств.

Контрольные точки

Как проверить результат

Свойство в ПВХ
Норма

Элемент найден по наименованию, тип значения соответствует задуманному

Тревожный признак

Несколько элементов с одинаковым наименованием или пустой тип значения

Строка в наборе
Норма

Свойство присутствует в табличной части «ДополнительныеРеквизиты» нужного набора

Тревожный признак

Свойство добавлено в «ДополнительныеСведения» или в набор другого объекта

Отображение в карточке
Норма

Реквизит виден на форме объекта и сохраняет введённое значение

Тревожный признак

Поле отсутствует на форме или значение пропадает после записи

Когда программный способ не нужен

Если реквизит добавляется один раз и вручную, интерфейсный путь проще и безопаснее: «Администрирование → Общие настройки → Дополнительные реквизиты», кнопка «Добавить → Новый». Программное создание оправдано при миграции данных из других систем, при автоматическом развёртывании одинаковой структуры свойств на нескольких базах, при обменах, где состав реквизитов должен синхронизироваться, и при поставке отраслевых решений, требующих предопределённого набора полей.

Сравнение вариантов

Интерактивное создание через интерфейс

Подходит для разового добавления. Не требует кода, но не масштабируется и не переносится между базами автоматически

Программное создание через ПВХ и наборы

Подходит для миграций и тиражирования. Требует аккуратности с поиском наборов и проверкой дублей

Добавление реквизита в конфигураторе

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

Часто задаваемые вопросы

Чем дополнительный реквизит отличается от дополнительного сведения?

Реквизит хранится в табличной части самого объекта, отображается на его форме и учитывается при записи объекта. Сведение хранится в отдельном регистре сведений, открывается отдельной командой и не влияет на запись объекта. Программно они заполняются по-разному: реквизит — через табличную часть, сведение — через набор записей регистра «ДополнительныеСведения».

Почему созданный программно реквизит не виден в карточке объекта?

Наиболее вероятная причина — свойство не добавлено в набор или добавлено не в ту табличную часть набора. Также проверьте, что набор соответствует именно тому виду объектов, карточку которого вы открываете, и переоткройте форму — открытые формы кэшируют состав реквизитов.

Можно ли создать свойство один раз и использовать для разных объектов?

Да. Одно свойство можно включить в несколько наборов — например, «Цвет» для номенклатуры и для контрагентов. Для этого добавьте строку с одной и той же ссылкой на свойство в табличные части обоих наборов.

Как перенести созданные реквизиты из тестовой базы в рабочую?

Свойства и наборы — это данные, а не конфигурация, поэтому обновление конфигурации их не перенесёт. Варианты: повторное выполнение кода создания в рабочей базе, выгрузка через универсальный обмен данными в XML или средства конвертации данных. Значения реквизитов в объектах переносятся вместе с самими объектами.

Безопасно ли удалять дополнительный реквизит программно?

Удаление элемента ПВХ, по которому есть заполненные значения, приведёт к потере этих значений при записи объектов. Перед удалением проверьте наличие строк со ссылкой на свойство в табличных частях объектов и в регистре сведений, при необходимости сначала очистите значения, затем удалите строки из наборов и только потом — сам элемент.

Работает ли этот подход в конфигурациях без БСП?

Нет. Описанный механизм — часть Библиотеки стандартных подсистем и присутствует только в конфигурациях, где она внедрена: ПВХ «ДополнительныеРеквизитыИСведения», справочник наборов и регистр сведений должны существовать в метаданных. В самописной конфигурации без БСП придётся либо внедрять подсистему свойств, либо добавлять обычные реквизиты через конфигуратор.

Итог

Что важно запомнить

Программное создание дополнительного реквизита — это два обязательных шага: запись элемента в ПВХ «ДополнительныеРеквизитыИСведения» и добавление его в нужный набор по предопределённому имени. Значения реквизитов хранятся в табличной части объекта, сведений — в регистре. Всегда проверяйте существование свойства перед созданием, работайте сначала на копии базы и осторожно относитесь к обязательному заполнению.