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

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

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

Как программно добавить реквизит в 1С: метод ИзменитьСтруктуруОбъекта, расширения конфигурации, дополнительные реквизиты БСП. Примеры кода и типичные ошибки.

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

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

Выбор метода определяется ответом на два вопроса: снята ли конфигурация с поддержки и нужно ли, чтобы реквизит был виден пользователю в стандартных формах и отчётах. Ниже разобраны все три способа с примерами кода, проверкой результата и типичными ошибками.

Какие способы программного создания реквизита существуют

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

Поэтому на практике применяются три обходных и полноценных пути:

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

Сравнение подходов

Расширение конфигурации

Полноценный реквизит метаданных, работает в запросах и СКД. Требует развёртывания расширения и прав на его подключение.

Дополнительные реквизиты БСП

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

Изменение основной конфигурации

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

Создание дополнительного реквизита через БСП

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

Пример создания дополнительного реквизита «Серийный номер поставщика» для справочника «Номенклатура»:

Процедура СоздатьДополнительныйРеквизит()

УстановитьПривилегированныйРежим(Истина);

// 1. Находим набор дополнительных реквизитов объекта

НаборСсылка = УправлениеСвойствами.НаборСвойствПоИмени("Справочник_Номенклатура");

Если НаборСсылка = Неопределено Тогда

ВызватьИсключение "Набор свойств для объекта не найден";

КонецЕсли;

// 2. Создаём свойство в плане видов характеристик

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

НовоеСвойство.Наименование = "Серийный номер поставщика";

НовоеСвойство.Заголовок = "Серийный номер поставщика";

ОписаниеТипа = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));

УправлениеСвойствамиСлужебный.УстановитьОписаниеТипа(НовоеСвойство, ОписаниеТипа);

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

// 3. Привязываем свойство к набору

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

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

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

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

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

После выполнения кода реквизит появляется в форме элемента номенклатуры на закладке «Дополнительно» (или в группе дополнительных реквизитов) автоматически — БСП динамически строит интерфейс. Имя набора для конкретного объекта смотрят в справочнике наборов: оно формируется по шаблону «ВидОбъекта_ИмяОбъекта», например «Документ_РеализацияТоваровУслуг».

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

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

Программно расширение создаётся и подключается через менеджер расширений конфигурации. Типовой сценарий — загрузка заранее подготовленного файла расширения (.cfe):

Расширение = РасширенияКонфигураций.Создать();

Расширение.БезопасныйРежим = Ложь;

Расширение.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = Ложь;

ДвоичныеДанные = Новый ДвоичныеДанные("C:\Distrib\МоеРасширение.cfe");

Расширение.Записать(ДвоичныеДанные);

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

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

Чтение и запись значений созданных реквизитов

Работа со значениями зависит от выбранного способа. Для реквизита из расширения обращение стандартное — как к обычному реквизиту объекта:

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

ДокументОбъект.КомментарийПоставщика = "Проверено";

ДокументОбъект.Записать();

Для дополнительного реквизита БСП значения хранятся в табличной части «ДополнительныеРеквизиты» объекта. Запись выполняется так:

// Найти свойство по имени

Свойство = УправлениеСвойствами.СвойствоПоДополнительнойИнформации(

"Серийный номер поставщика");

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

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

Новый Структура("Свойство", Свойство));

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

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

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

Иначе

Строка = СтрокиСвойства[0];

КонецЕсли;

Строка.Значение = "SN-12345";

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

В запросах дополнительные реквизиты выбираются соединением с табличной частью объекта по ссылке на свойство. Это медленнее обращения к обычному реквизиту и усложняет произвольные отчёты — учитывайте при выборе подхода.

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

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

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

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

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

Элемент с нужным наименованием существует в единственном экземпляре

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

Дубликаты свойств с одинаковым именем — код запускался повторно без проверки

Привязка к набору
Норма

Свойство есть в табличной части набора объекта

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

Свойство создано, но в форме объекта не отображается — нет строки в наборе

Запись значения
Норма

Значение сохраняется и читается после повторного открытия объекта

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

Значение пропадает — запись объекта выполняется вне транзакции или объект перезаписывается другим кодом

Реквизит из расширения
Норма

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

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

Расширение подключено, но реквизита нет — сеанс не перезапущен или расширение отключено проверкой безопасности

Типичные ошибки и ограничения

Типичные ошибки
01
Повторный запуск кода создания свойства без проверки на существование — появляются дубли реквизитов, пользователи видят два одинаковых поля.
02
Обращение к УправлениеСвойствами без привилегированного режима — ошибка доступа у пользователей без прав на служебные справочники.
03
Попытка добавить реквизит в метаданные основной конфигурации из встроенного языка — такого API не существует, время тратится на поиск несуществующего метода.
04
Использование дополнительных реквизитов для данных, по которым строятся отчёты и отборы — запросы становятся тяжёлыми, отчёты приходится дорабатывать.
05
Забытый перезапуск сеанса после подключения расширения — код падает с ошибкой «Поле не найдено», хотя реквизит уже существует.

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

Как выбрать подход под свою задачу

Маршрут решения

Как выбрать действие

Конфигурация типовая на поддержке, реквизит нужен для справочной информации и редких отборовИспользуйте дополнительные реквизиты БСП — полностью программно и безопасно для обновлений
Нужен полноценный реквизит в запросах, отчётах СКД и проведении, конфигурация на поддержкеСоздайте расширение конфигурации с заимствованным объектом и добавьте реквизит туда
Конфигурация собственная или уже снята с поддержкиДобавляйте реквизит напрямую в конфигураторе — это проще и быстрее любых обходных путей
Данные имеют сложную структуру или большой объёмПроектируйте отдельный регистр сведений или справочник вместо реквизита

Если сомневаетесь между дополнительным реквизитом и расширением, ориентируйтесь на частоту использования в отчётах: чем чаще поле участвует в отборах и группировках, тем сильнее аргумент в пользу расширения.

Итог

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

Прямого API для добавления реквизитов в метаданные основной конфигурации нет. На практике применяют дополнительные реквизиты БСП (полностью кодом, без изменения конфигурации) или расширение конфигурации (настоящий реквизит метаданных). Всегда проверяйте существование свойства перед созданием и тестируйте на копии базы.

Частые вопросы

Можно ли программно добавить реквизит в табличную часть документа?

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

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

Чаще всего свойство создано в плане видов характеристик, но не добавлено в табличную часть набора дополнительных реквизитов конкретного объекта. Проверьте набор через справочник «Наборы дополнительных реквизитов и сведений» и убедитесь, что в нём есть строка с вашим свойством.

Нарушит ли создание дополнительных реквизитов обновление типовой конфигурации?

Нет. Дополнительные реквизиты и сведения — это данные, а не изменение метаданных. Обновления проходят штатно. Риск появляется только при изменении самих объектов конфигурации или при конфликтах расширений с новой версией типового решения.

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

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

Работает ли этот подход в файловой и клиент-серверной базе одинаково?

Код создания дополнительных реквизитов идентичен в обоих режимах. Различия касаются только подключения расширений: в клиент-серверном варианте после записи расширения нужно перезапустить сеансы всех пользователей, а при большом числе активных соединений удобнее выполнять подключение в монопольном окне обслуживания.

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

Дополнительные реквизиты переносят обработкой выгрузки-загрузки данных (например, через универсальный обмен XML) вместе с наборами и элементами плана видов характеристик. Расширения переносятся выгрузкой в файл .cfe и загрузкой в целевую базу. Значения реквизитов переносятся отдельно, вместе с самими объектами.