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