Программирование в 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-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Выбрать тариф