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