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

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

Как добавить реквизит формы в 1С

Как добавить реквизит формы в 1С через конфигуратор и программно. Типы реквизитов, вывод на форму, обращение из кода, типичные ошибки и проверка результата.

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

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

Ниже разобраны оба подхода, правила вывода реквизита на форму, обращение к нему из кода и ошибки, которые чаще всего мешают получить рабочий результат.

Что такое реквизит формы и когда он нужен

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

Типичные задачи, которые решаются реквизитами формы:

  • хранение таблицы значений или динамического списка, отображаемой в табличном поле;
  • служебные флаги — например, признак того, что данные изменены, но не записаны;
  • параметры отбора и настройки, которые пользователь меняет на форме, не записывая объект;
  • промежуточные итоги, счётчики, текущие выбранные значения.

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

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

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

  1. Откройте конфигуратор и найдите нужный объект (справочник, документ, обработка, отчёт).
  2. Откройте нужную форму объекта двойным щелчком или через контекстное меню «Формы».
  3. В окне редактора формы перейдите на вкладку с панелью «Реквизиты формы» — обычно она расположена в правой части окна рядом с деревом элементов.
  4. Нажмите кнопку «Добавить» (зелёный плюс) в командной панели списка реквизитов.
  5. Задайте имя реквизита (латиницей, без пробелов, по правилам идентификаторов 1С), выберите тип данных и при необходимости укажите заголовок — он будет подписью поля на форме.
  6. Нажмите «ОК» или Enter — реквизит появится в списке.

Имя реквизита должно быть уникальным в пределах формы и не совпадать с именами реквизитов основного объекта формы. Если форма документа уже содержит реквизит объекта «Комментарий», создать реквизит формы с таким же именем не получится.

Порядок действий
  1. 1
    Откройте форму в конфигураторе
  2. 2
    Перейдите на панель «Реквизиты формы»
  3. 3
    Нажмите «Добавить» и задайте имя, тип, заголовок
  4. 4
    Перетащите реквизит в дерево элементов формы
  5. 5
    Обновите конфигурацию базы данных и проверьте в режиме Предприятия

Выбор типа данных реквизита

Тип реквизита определяет, какие данные он может хранить и как будет выглядеть поле ввода. В палитре свойств доступны примитивные типы (Строка, Число, Дата, Булево), ссылочные типы (СправочникСсылка, ДокументСсылка и другие) и коллекции.

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

Отдельный случай — реквизиты-коллекции: ТаблицаЗначений, ДеревоЗначений, ДинамическийСписок. У таблицы значений после создания нужно добавить колонки: выделите реквизит в списке и нажмите «Добавить колонку реквизита», задав имя и тип каждой колонки. Без колонок таблица на форме отобразится пустой.

Сравнение вариантов

Примитивный тип (Строка, Число, Дата)

Подходит для одиночных значений: комментариев, сумм, флагов. Прост в использовании, но хранит только одно значение.

Ссылочный тип (СправочникСсылка и др.)

Нужен для выбора объекта базы данных. На форме появится поле с кнопкой выбора и выпадающим списком.

ТаблицаЗначений

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

ДинамическийСписок

Для отображения данных запроса с автоматическим обновлением. Настраивается через произвольный запрос и отборы.

Как вывести реквизит на форму

Создание реквизита в списке не делает его видимым для пользователя. Реквизит — это только данные; чтобы отобразить их, нужен элемент формы, связанный с этим реквизитом.

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

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

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

Программное добавление реквизита формы

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

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

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

ДобавляемыеРеквизиты.Добавить(

Новый РеквизитФормы("СуммаИтого",

Новый ОписаниеТипов("Число",

Новый КвалификаторыЧисла(15, 2)),

"", "Сумма итого"));

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

НовыйЭлемент = Элементы.Добавить("СуммаИтого",

Тип("ПолеФормы"), Элементы.ГруппаИтоги);

НовыйЭлемент.ПутьКДанным = "СуммаИтого";

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

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

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

Обращение к реквизиту формы из кода

В модуле формы реквизиты доступны напрямую по имени как свойства объекта формы. В серверных и клиентских процедурах обращение выглядит одинаково: ЭтаФорма.ИмяРеквизита или просто ИмяРеквизита внутри модуля формы (для управляемых форм корректнее использовать ЭтаФорма или контекст формы явно).

Пример присваивания и чтения значения:

&НаКлиенте

Процедура РассчитатьИтог(Команда)

ЭтаФорма.СуммаИтого = 0;

Для Каждого Строка Из ЭтаФорма.Товары Цикл

ЭтаФорма.СуммаИтого = ЭтаФорма.СуммаИтого + Строка.Сумма;

КонецЦикла;

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

Для реквизита типа ТаблицаЗначений обращение к строкам идёт через индекс или перебор коллекции: ЭтаФорма.Товары[0].Количество. Помните, что на клиенте и на сервере данные формы синхронизируются платформой автоматически, но передача больших таблиц между клиентом и сервером стоит ресурсов — тяжёлые вычисления выносите в серверные процедуры с директивой &НаСервере или &НаСервереБезКонтекста с передачей данных параметром.

Типичные ошибки и как их проверить

Большинство проблем при работе с реквизитами формы сводится к нескольким повторяющимся сценариям. Знание их признаков экономит время на отладке.

Типичные ошибки
01
Реквизит создан, но не перетащён в дерево элементов — пользователь не видит поле на форме
02
Имя реквизита совпадает с реквизитом объекта — конфигуратор выдаёт ошибку дублирования или поле показывает не те данные
03
У ТаблицыЗначений не добавлены колонки — табличное поле отображается пустым
04
ИзменитьРеквизиты() вызывается в клиентской процедуре — метод доступен только на сервере
05
Ожидание, что значение реквизита формы сохранится после закрытия — данные теряются, нужен реквизит объекта

Если при открытии формы возникает ошибка «Поле объекта не обнаружено», проверьте, что имя в свойстве «ПутьКДанным» элемента формы точно совпадает с именем реквизита, включая регистр букв. Если ошибка появляется после программного изменения реквизитов — убедитесь, что элементы создаются после вызова ИзменитьРеквизиты(), а не до.

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

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

Реквизит в списке реквизитов формы
Норма

Присутствует с нужным именем и типом

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

Отсутствует или тип не соответствует замыслу

Элемент на форме
Норма

Поле отображается в нужной группе и доступно для ввода

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

Поля нет в дереве элементов или оно недоступно

Работа в режиме Предприятия
Норма

Значение вводится, читается и используется в коде без ошибок

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

Ошибка «Поле объекта не обнаружено» или значение сбрасывается

Ограничения и альтернативы

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

Для значений, которые должны сохраняться между сеансами, но не относятся к конкретному объекту, подходят хранилища настроек (ХранилищеОбщихНастроек) или константы. Для временных данных, общих на весь сеанс, иногда используют параметры сеанса, но их изменение требует прав и влияет на весь сеанс пользователя.

В обычных (неуправляемых) формах механика похожа, но редактор формы выглядит иначе: реквизиты добавляются через окно «Реквизиты» в конструкторе формы, а программное изменение состава реквизитов в обычных формах не поддерживается так же гибко, как в управляемых.

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

Как выбрать действие

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

Частые вопросы

Можно ли добавить реквизит формы без изменения конфигурации, в режиме Предприятия?

Нет, состав реквизитов формы задаётся только в конфигураторе или программно из модуля формы. Пользователь в режиме Предприятия может лишь менять значения существующих реквизитов и настраивать видимость элементов через «Изменить форму», если это разрешено правами.

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

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

Как добавить колонку в реквизит типа ТаблицаЗначений?

В конфигураторе выделите реквизит-таблицу в списке реквизитов формы и нажмите «Добавить колонку реквизита». Программно колонки добавляются как реквизиты с указанием пути: Новый РеквизитФормы("Количество", ОписаниеТипов, "Товары").

В чём разница между реквизитом формы и параметром формы?

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

Почему ИзменитьРеквизиты() выдаёт ошибку в клиентской процедуре?

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

Можно ли удалить реквизит формы программно?

Да, метод ИзменитьРеквизиты() принимает вторым параметром массив имён удаляемых реквизитов. Удаление возможно только для реквизитов, добавленных программно в текущем сеансе работы формы, — реквизиты, созданные в конфигураторе, так удалить нельзя.

Итог

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

Реквизит формы добавляется в конфигураторе через панель «Реквизиты формы» или программно методом ИзменитьРеквизиты() на сервере. Чтобы реквизит был виден пользователю, его нужно перетащить в дерево элементов формы. Данные реквизита существуют только пока открыта форма — для хранения в базе используйте реквизиты объекта.