Программирование в 1С

1С: список реквизитов формы и программное добавление поля

Коротко

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

Реквизиты управляемой формы и элементы: в чём разница

В управляемой форме есть два связанных, но разных набора объектов. Реквизиты формы составляют модель данных: в них находятся значения, доступные модулю формы. Элементы формируют интерфейс: поле ввода, таблицу, группу, кнопку или декорацию. Один реквизит может не иметь элемента и оставаться невидимым, а группа или кнопка вообще не обязаны иметь путь к данным.

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

Как получить в 1С список реквизитов формы

Метод ПолучитьРеквизиты() вызывается на сервере. Без параметра он возвращает массив реквизитов верхнего уровня. У каждого объекта можно прочитать имя, тип, путь и заголовок:

&НаСервере
Процедура ПоказатьРеквизитыНаСервере()
    РеквизитыФормы = ПолучитьРеквизиты();

    Для Каждого Реквизит Из РеквизитыФормы Цикл
        Сообщить(СтрШаблон("%1: %2", Реквизит.Имя, Реквизит.Тип));
    КонецЦикла;
КонецПроцедуры
ПолучитьРеквизиты
Путьпуть к составному реквизиту формы
Массив

Чтобы получить колонки таблицы формы, передайте путь к её данным, например ПолучитьРеквизиты("Объект.Товары"). Проверять наличие реквизита удобнее одним проходом по полученному массиву до вызова ИзменитьРеквизиты(): повторное добавление имени СуммаСНДС завершится ошибкой.

В Консоли кода можно попросить агента вывести имена, типы и пути всех реквизитов конкретной управляемой формы, а затем подготовить код только для отсутствующих полей.

Реквизит формы программно в 1С 8.3: ИзменитьРеквизиты

Новый реквизит описывают конструктором РеквизитФормы, помещают в массив и одним вызовом передают в ИзменитьРеквизиты(). Операцию выполняют на сервере, обычно при создании формы:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если РеквизитФормыСуществует("СуммаСНДС") Тогда
        Возврат;
    КонецЕсли;

    Добавляемые = Новый Массив;
    ТипСуммы = Новый ОписаниеТипов(
        "Число", , , Новый КвалификаторыЧисла(15, 2));
    Добавляемые.Добавить(
        Новый РеквизитФормы("СуммаСНДС", ТипСуммы, , "Сумма с НДС", Ложь));

    ИзменитьРеквизиты(Добавляемые);
КонецПроцедуры

&НаСервере
Функция РеквизитФормыСуществует(ИмяРеквизита)
    Для Каждого Реквизит Из ПолучитьРеквизиты() Цикл
        Если Реквизит.Имя = ИмяРеквизита Тогда
            Возврат Истина;
        КонецЕсли;
    КонецЦикла;
    Возврат Ложь;
КонецФункции
ИзменитьРеквизиты
ДобавляемыеРеквизитымассив объектов РеквизитФормы
УдаляемыеРеквизитымассив имён удаляемых реквизитов
не возвращает значение

ИзменитьРеквизиты() перестраивает данные формы, поэтому не вызывайте его отдельно для каждого поля. Сначала соберите весь массив. Так сценарий «1С реквизит на форму программно» работает быстрее и не создаёт промежуточных состояний формы.

Новый РеквизитФормы: параметры конструктора

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

РеквизитСуммы = Новый РеквизитФормы(
    "СуммаСНДС",   // Имя
    ТипСуммы,       // Тип
    ,               // Путь
    "Сумма с НДС", // Заголовок
    Ложь);          // СохраняемыеДанные
Новый РеквизитФормы
Имяимя реквизита без точек
Типобъект ОписаниеТипов
Путьпуть к реквизиту-владельцу
Заголовокпредставление реквизита
СохраняемыеДанныепризнак сохраняемых данных формы
РеквизитФормы

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

Как добавить поле формы программно и задать ПутьКДанным

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

// Выполняется на сервере после ИзменитьРеквизиты()
ПолеСуммы = Элементы.Добавить(
    "ПолеСуммаСНДС",
    Тип("ПолеФормы"),
    Элементы.ГруппаИтоги);
ПолеСуммы.Вид = ВидПоляФормы.ПолеВвода;
ПолеСуммы.ПутьКДанным = "СуммаСНДС";
ПолеСуммы.ТолькоПросмотр = Истина;

СуммаСНДС = РассчитатьСуммуСНДС();
Добавить
Имяуникальное имя нового элемента
ТипЭлементатип добавляемого элемента формы
Родительгруппа или другой родитель элемента
ДекорацияФормы, ГруппаФормы, КнопкаФормы, ТаблицаФормы или ПолеФормы

Если родитель не нужен, третий параметр можно не указывать. Для колонки таблицы путь будет составным, например Объект.Товары.СуммаСНДС. Неверный путь приводит к полю без данных или к ошибке привязки при создании формы.

Агент Консоли может получить структуру формы, подобрать существующую группу-родителя и сформировать согласованную пару: реквизит СуммаСНДС и поле с правильным ПутьКДанным.

Удалить реквизит формы и сохранить значение

Перед удалением реквизита сначала удалите связанный элемент интерфейса, затем передайте имя реквизита вторым параметром ИзменитьРеквизиты(). Удалять таким способом следует реквизиты, добавленные программно:

&НаСервере
Процедура УдалитьСуммуСНДС()
    Если Элементы.Найти("ПолеСуммаСНДС") <> Неопределено Тогда
        Элементы.Удалить(Элементы.ПолеСуммаСНДС);
    КонецЕсли;

    Удаляемые = Новый Массив;
    Удаляемые.Добавить("СуммаСНДС");
    ИзменитьРеквизиты(Новый Массив, Удаляемые);
КонецПроцедуры

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

Реквизит формы и реквизит объекта: клиент, сервер и данные

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

Не передавайте на клиент серверные типы, недоступные в тонком или веб-клиенте. Расчёт, требующий чтения базы, выполняйте в серверной функции, а в реквизит формы возвращайте число, строку, дату, ссылку или другой доступный клиенту результат.

Частые ошибки со списком реквизитов формы в 1С

  • Перебирают Элементы вместо реквизитов. Коллекция интерфейса не заменяет результат ПолучитьРеквизиты().
  • Вызывают серверные методы на клиенте. Получение структуры, её изменение и добавление элементов выполняйте в серверном контексте.
  • Добавляют уже существующее имя. Сначала проверьте массив из ПолучитьРеквизиты(), включая нужный путь владельца.
  • Не задают ПутьКДанным. Элемент появляется, но не отображает и не изменяет значение реквизита.
  • Путают имя элемента и путь к данным. Имя элемента уникально в коллекции Элементы, путь указывает на реквизит.
  • Вызывают ИзменитьРеквизиты в цикле. Соберите добавляемые и удаляемые реквизиты в массивы и перестройте форму один раз.
  • Ожидают запись значения в базу. Временный реквизит формы нужно явно перенести в объект или другую структуру хранения.

Частые вопросы о реквизитах управляемой формы

Как получить в 1С список существующих реквизитов формы?

На сервере вызовите ПолучитьРеквизиты(). Метод вернёт массив реквизитов верхнего уровня; для вложенной структуры передайте её путь параметром.

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

Реквизит — это данные, а не интерфейс. После ИзменитьРеквизиты() добавьте ПолеФормы в коллекцию Элементы и задайте его ПутьКДанным.

Сохранится ли программно добавленный реквизит формы в базе?

Нет, сам по себе реквизит формы не является реквизитом объекта. Для постоянного хранения явно перенесите значение в реквизит документа, справочника или регистр.

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 1,5 млн токенов

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Выбрать тариф