1С: список реквизитов формы и программное добавление поля
В 1С список реквизитов формы возвращает серверный метод ПолучитьРеквизиты().
Реквизиты содержат данные формы, а коллекция Элементы описывает поля, таблицы,
группы и кнопки интерфейса. Для нового вычисляемого значения создайте
РеквизитФормы, передайте его в ИзменитьРеквизиты(), затем добавьте
поле и задайте ему ПутьКДанным.
Реквизиты управляемой формы и элементы: в чём разница
В управляемой форме есть два связанных, но разных набора объектов. Реквизиты формы составляют модель данных: в них находятся значения, доступные модулю формы. Элементы формируют интерфейс: поле ввода, таблицу, группу, кнопку или декорацию. Один реквизит может не иметь элемента и оставаться невидимым, а группа или кнопка вообще не обязаны иметь путь к данным.
Поэтому запрос «1С управляемые формы реквизиты формы» нельзя решать перебором
Элементы: он покажет интерфейс, но не полный состав данных. Для данных используйте
ПолучитьРеквизиты(), для интерфейса — коллекцию Элементы.
Как получить в 1С список реквизитов формы
Метод ПолучитьРеквизиты() вызывается на сервере. Без параметра он возвращает массив
реквизитов верхнего уровня. У каждого объекта можно прочитать имя, тип, путь и заголовок:
&НаСервере
Процедура ПоказатьРеквизитыНаСервере()
РеквизитыФормы = ПолучитьРеквизиты();
Для Каждого Реквизит Из РеквизитыФормы Цикл
Сообщить(СтрШаблон("%1: %2", Реквизит.Имя, Реквизит.Тип));
КонецЦикла;
КонецПроцедуры
Чтобы получить колонки таблицы формы, передайте путь к её данным, например
ПолучитьРеквизиты("Объект.Товары"). Проверять наличие реквизита удобнее одним проходом
по полученному массиву до вызова ИзменитьРеквизиты(): повторное добавление имени
СуммаСНДС завершится ошибкой.
Реквизит формы программно в 1С 8.3: ИзменитьРеквизиты
Новый реквизит описывают конструктором РеквизитФормы, помещают в массив и одним вызовом
передают в ИзменитьРеквизиты(). Операцию выполняют на сервере, обычно при создании формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если РеквизитФормыСуществует("СуммаСНДС") Тогда
Возврат;
КонецЕсли;
Добавляемые = Новый Массив;
ТипСуммы = Новый ОписаниеТипов(
"Число", , , Новый КвалификаторыЧисла(15, 2));
Добавляемые.Добавить(
Новый РеквизитФормы("СуммаСНДС", ТипСуммы, , "Сумма с НДС", Ложь));
ИзменитьРеквизиты(Добавляемые);
КонецПроцедуры
&НаСервере
Функция РеквизитФормыСуществует(ИмяРеквизита)
Для Каждого Реквизит Из ПолучитьРеквизиты() Цикл
Если Реквизит.Имя = ИмяРеквизита Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
ИзменитьРеквизиты() перестраивает данные формы, поэтому не вызывайте его отдельно для
каждого поля. Сначала соберите весь массив. Так сценарий «1С реквизит на форму программно» работает
быстрее и не создаёт промежуточных состояний формы.
Новый РеквизитФормы: параметры конструктора
ТипСуммы = Новый ОписаниеТипов(
"Число", , , Новый КвалификаторыЧисла(15, 2));
РеквизитСуммы = Новый РеквизитФормы(
"СуммаСНДС", // Имя
ТипСуммы, // Тип
, // Путь
"Сумма с НДС", // Заголовок
Ложь); // СохраняемыеДанные
Имя задают без точек. Для колонки табличного реквизита имя колонки передают первым параметром, а
путь к владельцу — параметром Путь. Признак СохраняемыеДанные относится к
сохранению данных формы платформой и не превращает временный реквизит в поле базы данных.
Как добавить поле формы программно и задать ПутьКДанным
После добавления реквизита создайте элемент типа ПолеФормы. Имя элемента должно быть
уникальным, а ПутьКДанным — указывать на реквизит, значение которого поле показывает:
// Выполняется на сервере после ИзменитьРеквизиты()
ПолеСуммы = Элементы.Добавить(
"ПолеСуммаСНДС",
Тип("ПолеФормы"),
Элементы.ГруппаИтоги);
ПолеСуммы.Вид = ВидПоляФормы.ПолеВвода;
ПолеСуммы.ПутьКДанным = "СуммаСНДС";
ПолеСуммы.ТолькоПросмотр = Истина;
СуммаСНДС = РассчитатьСуммуСНДС();
Если родитель не нужен, третий параметр можно не указывать. Для колонки таблицы путь будет составным,
например Объект.Товары.СуммаСНДС. Неверный путь приводит к полю без данных или к ошибке
привязки при создании формы.
СуммаСНДС и поле с правильным ПутьКДанным.
Удалить реквизит формы и сохранить значение
Перед удалением реквизита сначала удалите связанный элемент интерфейса, затем передайте имя реквизита
вторым параметром ИзменитьРеквизиты(). Удалять таким способом следует реквизиты, добавленные
программно:
&НаСервере
Процедура УдалитьСуммуСНДС()
Если Элементы.Найти("ПолеСуммаСНДС") <> Неопределено Тогда
Элементы.Удалить(Элементы.ПолеСуммаСНДС);
КонецЕсли;
Удаляемые = Новый Массив;
Удаляемые.Добавить("СуммаСНДС");
ИзменитьРеквизиты(Новый Массив, Удаляемые);
КонецПроцедуры
Значение обычного реквизита формы живёт в экземпляре формы. Оно не записывается в документ или
справочник автоматически и исчезает после закрытия формы. Для постоянного хранения перенесите значение
в реквизит объекта перед записью либо используйте предназначенный для задачи регистр. Параметр
СохраняемыеДанные конструктора не добавляет колонку в таблицу объекта.
Реквизит формы и реквизит объекта: клиент, сервер и данные
- Реквизит формы принадлежит конкретной форме, может быть вычисляемым и не меняет метаданные объекта.
- Реквизит объекта описан в конфигураторе, входит в структуру документа или справочника и сохраняется при записи объекта.
ПолучитьРеквизиты(),ИзменитьРеквизиты()и изменение коллекцииЭлементыдоступны на сервере.- Значение уже созданного реквизита формы можно читать и менять в клиентских обработчиках, если его тип доступен на клиенте.
Не передавайте на клиент серверные типы, недоступные в тонком или веб-клиенте. Расчёт, требующий чтения базы, выполняйте в серверной функции, а в реквизит формы возвращайте число, строку, дату, ссылку или другой доступный клиенту результат.
Частые ошибки со списком реквизитов формы в 1С
- Перебирают Элементы вместо реквизитов. Коллекция интерфейса не заменяет результат
ПолучитьРеквизиты(). - Вызывают серверные методы на клиенте. Получение структуры, её изменение и добавление элементов выполняйте в серверном контексте.
- Добавляют уже существующее имя. Сначала проверьте массив из
ПолучитьРеквизиты(), включая нужный путь владельца. - Не задают ПутьКДанным. Элемент появляется, но не отображает и не изменяет значение реквизита.
- Путают имя элемента и путь к данным. Имя элемента уникально в коллекции
Элементы, путь указывает на реквизит. - Вызывают ИзменитьРеквизиты в цикле. Соберите добавляемые и удаляемые реквизиты в массивы и перестройте форму один раз.
- Ожидают запись значения в базу. Временный реквизит формы нужно явно перенести в объект или другую структуру хранения.
Частые вопросы о реквизитах управляемой формы
Как получить в 1С список существующих реквизитов формы?
На сервере вызовите ПолучитьРеквизиты(). Метод вернёт массив реквизитов верхнего уровня; для вложенной структуры передайте её путь параметром.
Почему реквизит формы программно добавлен, но поле не видно?
Реквизит — это данные, а не интерфейс. После ИзменитьРеквизиты() добавьте ПолеФормы в коллекцию Элементы и задайте его ПутьКДанным.
Сохранится ли программно добавленный реквизит формы в базе?
Нет, сам по себе реквизит формы не является реквизитом объекта. Для постоянного хранения явно перенесите значение в реквизит документа, справочника или регистр.
ИИ Консоль кода 1С
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Старт
Для индивидуального использования
- До 5 конфигураций
- Встроенный агент запросов 1С
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Популярный выборДля интенсивного использования или команд
- До 15 конфигураций
- Встроенный агент запросов 1С
-
≈ 300 задач Подробнее про лимиты
-
Свои подписки Codex, Claude и любые OpenAI-совместимые
-
Внешние обработки без Конфигуратора
- Приоритетная техническая поддержка