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

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

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

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

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

Механизм работает только на сервере: изменить состав реквизитов формы из клиентского контекста нельзя. Поэтому вся логика размещается в серверных процедурах, чаще всего — в обработчике ПриСозданииНаСервере или в отдельной серверной процедуре, вызываемой по команде.

Ниже разобран полный цикл: создание реквизита, добавление колонки таблицы, связывание реквизита с элементом формы, удаление динамических данных и типовые ошибки, из-за которых код падает или «молча» не работает.

Когда нужен программный реквизит формы, а когда — нет

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

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

Отдельный случай — обработки, где структура данных зависит от метаданных выбранного объекта (например, универсальная консоль редактирования справочников). Здесь без ИзменитьРеквизиты не обойтись.

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

Как выбрать подход

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

Базовый синтаксис: метод ИзменитьРеквизиты

Метод ИзменитьРеквизиты принимает два параметра: массив добавляемых реквизитов и массив имён удаляемых. Каждый добавляемый реквизит — это объект типа ОписаниеРеквизитаФормы, который создаётся конструктором Новый РеквизитФормы(Имя, ОписаниеТипов, Путь, Заголовок, СохраняемыеДанные).

&НаСервере

Процедура СоздатьРеквизитНаСервере()

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

Добавляемые = Новый Массив;

Добавляемые.Добавить(Новый РеквизитФормы("КомментарийДинамический", ОписаниеТипов, "", "Комментарий"));

ЭтаФорма.ИзменитьРеквизиты(Добавляемые);

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

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

После выполнения метода реквизит появляется в данных формы, к нему можно обращаться как ЭтаФорма.КомментарийДинамический или ЭтаФорма["КомментарийДинамический"] — второй вариант удобен, когда имя хранится в переменной.

Добавление колонки в динамическую таблицу значений

Таблица значений как реквизит формы создаётся в два шага: сначала сам реквизит таблицы, затем её колонки с указанием пути — имени таблицы. Это самый частый сценарий в практике.

&НаСервере

Процедура СоздатьТаблицуНаСервере()

Добавляемые = Новый Массив;

// Сама таблица

Добавляемые.Добавить(Новый РеквизитФормы("ТаблицаДанных",

Новый ОписаниеТипов("ТаблицаЗначений"), "", "Данные"));

// Колонки таблицы — четвёртый параметр конструктора не используется,

// путь передаётся третьим параметром

Добавляемые.Добавить(Новый РеквизитФормы("Номенклатура",

Новый ОписаниеТипов("СправочникСсылка.Номенклатура"), "ТаблицаДанных", "Номенклатура"));

Добавляемые.Добавить(Новый РеквизитФормы("Количество",

Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)), "ТаблицаДанных", "Количество"));

ЭтаФорма.ИзменитьРеквизиты(Добавляемые);

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

Обратите внимание: у колонок третий параметр конструктора — это путь, то есть имя родительской таблицы. Если путь указать неверно или таблица ещё не добавлена в том же вызове, платформа выдаст ошибку о неверном пути реквизита.

Для заполнения созданной таблицы данными используется обычный обход: НоваяСтрока = ЭтаФорма.ТаблицаДанных.Добавить(); — дальше работа идёт как с любой таблицей значений.

Связывание реквизита с элементом формы

Созданный реквизит не появится на форме сам — его нужно вывести. Элемент формы добавляется программно методом Элементы.Добавить(ИмяЭлемента, ТипЭлемента, Родитель), после чего устанавливается свойство ПутьКДанным.

НовыйЭлемент = ЭтаФорма.Элементы.Добавить("ПолеКомментария", Тип("ПолеФормы"));

НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;

НовыйЭлемент.ПутьКДанным = "КомментарийДинамический";

НовыйЭлемент.Заголовок = "Комментарий";

Для таблицы добавляется элемент с видом ВидГруппыФормы не нужен — таблица создаётся как элемент типа ПолеФормы с видом ПолеТаблицы точнее — используется Тип("ПолеФормы") и вид таблицы определяется автоматически по типу реквизита, но колонки придётся добавить вручную как дочерние элементы с путями вида ТаблицаДанных.Номенклатура.

Третий параметр метода Добавить — родительский элемент (группа формы). Если его не указать, элемент попадёт в корень формы. Порядок следования внутри родителя управляется методом Элементы.Переместить.

Порядок действий для полного сценария
  1. 1
    В серверной процедуре сформируйте массив объектов РеквизитФормы с корректными типами и путями
  2. 2
    Вызовите ЭтаФорма.ИзменитьРеквизиты(Добавляемые, Удаляемые)
  3. 3
    Программно добавьте элементы формы через Элементы.Добавить и задайте им ПутьКДанным
  4. 4
    Заполните реквизит данными и проверьте отображение в режиме предприятия
  5. 5
    При повторном открытии или смене контекста удаляйте старые реквизиты перед созданием новых

Удаление и пересоздание реквизитов

Второй параметр ИзменитьРеквизиты — массив строк с именами удаляемых реквизитов. Удаление обязательно, если процедура создания может вызываться повторно: попытка добавить реквизит с уже существующим именем вызовет ошибку.

Удаляемые = Новый Массив;

Удаляемые.Добавить("КомментарийДинамический");

ЭтаФорма.ИзменитьРеквизиты(Новый Массив, Удаляемые);

Перед удалением полезно проверить существование реквизита: перебрать ЭтаФорма.ПолучитьРеквизиты() и сравнить имена. Это защищает от ошибок при первом вызове, когда удалять ещё нечего.

Учтите: удаление реквизита уничтожает его данные без возможности восстановления. Если значения нужны — сохраните их заранее в переменную, хранилище или объект, к которому привязана форма.

Типовые ошибки и их диагностика

Наиболее частая проблема — ошибка «Реквизит с указанным именем уже существует». Причина — повторный вызов создания без предварительного удаления. Решение: флаг в реквизите формы или проверка через ПолучитьРеквизиты.

Вторая по распространённости — «Неверный путь к данным» при связывании элемента. Она возникает, когда ПутьКДанным элемента не совпадает с именем реквизита (с учётом регистра не проверяется, но точность написания обязательна) или когда для колонки таблицы путь указан без имени таблицы.

Третья группа ошибок — попытка обратиться к реквизиту на клиенте до того, как серверная процедура отработала. Динамические реквизиты видны на клиенте после возврата из серверного вызова, но не раньше.

Типичные ошибки
01
Повторное создание реквизита без удаления — ошибка «имя уже существует», форма перестаёт открываться корректно
02
Путь колонки указан без имени таблицы — ошибка неверного пути при ИзменитьРеквизиты
03
Вызов ИзменитьРеквизиты в клиентской процедуре — ошибка «метод не обнаружен»
04
Элемент формы создан, но ПутьКДанным не задан — поле отображается пустым и не связано с данными
05
Создание реквизитов при каждом серверном вызове — деградация производительности формы

Проверка результата

После внедрения кода откройте форму в режиме предприятия и убедитесь, что реквизит отображается, редактируется и сохраняет введённое значение при переключении между элементами. Для таблицы проверьте добавление строк и корректность типов колонок — например, что в колонку со ссылкой подставляется выбор из справочника.

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

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

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

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

Поле видно, заголовок соответствует заданному, ввод доступен

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

Поле отсутствует или недоступно — проверьте ПутьКДанным и родительскую группу

Повторный вызов процедуры создания
Норма

Ошибок нет, старые реквизиты удаляются, новые создаются

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

Ошибка «имя уже существует» — добавьте удаление или проверку существования

Типы колонок таблицы
Норма

В ссылочной колонке работает выбор из справочника, числа форматируются корректно

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

Поле принимает любой текст — проверьте ОписаниеТипов в конструкторе

FAQ

Можно ли создать реквизит формы в обычном приложении (обычные формы)?

Нет, метод ИзменитьРеквизиты и объект РеквизитФормы относятся к управляемым формам. В обычных формах состав реквизитов фиксируется в конфигураторе, а динамическое поведение реализуется через видимость элементов или табличные поля с программно заполняемыми таблицами значений.

Как узнать, существует ли реквизит с нужным именем?

Вызовите ЭтаФорма.ПолучитьРеквизиты() — метод вернёт массив описаний реквизитов верхнего уровня. Переберите его и сравните свойство Имя каждого элемента с искомым. Для колонок таблицы используйте ПолучитьРеквизиты("ИмяТаблицы").

Сохраняются ли данные динамических реквизитов между сеансами?

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

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

Чаще всего не совпадает ПутьКДанным элемента с именем реквизита или элемент добавлен до вызова ИзменитьРеквизиты на момент, когда реквизита ещё не было. Правильный порядок: сначала ИзменитьРеквизиты, затем создание элементов с привязкой.

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

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

Где лучше размещать код создания реквизитов?

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

Итог

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

Динамический реквизит формы создаётся связкой: массив объектов РеквизитФормы → вызов ИзменитьРеквизиты на сервере → добавление элемента формы с корректным ПутьКДанным. Перед повторным созданием удаляйте старые реквизиты, а все изменения состава собирайте в один вызов метода.