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