Разработка и Конфигурация · 9 мин
Как получить значение реквизита формы в 1С
Как получить значение реквизита формы в 1С: обращение через ЭтаФорма, РеквизитФормыВЗначение, работа с реквизитами объекта. Примеры кода, ошибки и FAQ.
Реквизит формы в 1С — это данные, которые существуют только в контексте открытой формы и не сохраняются напрямую в базу данных. Получить его значение нужно, когда требуется прочитать введённые пользователем данные, передать их в процедуру обработки или использовать в расчётах. Способ обращения зависит от того, где выполняется код: в клиентском или серверном контексте, в модуле самой формы или извне.
Главная сложность для начинающих разработчиков — различие между реквизитом формы и реквизитом объекта (например, документа или справочника). Реквизиты объекта доступны через системное свойство Объект, а реквизиты самой формы — напрямую по имени в контексте модуля формы или через коллекцию формы при обращении извне.
Ниже разобраны все рабочие сценарии: от простого обращения внутри модуля формы до получения значения из другой формы и преобразования реквизитов в прикладные объекты.
Обращение к реквизиту внутри модуля формы
Самый простой случай — код выполняется в модуле той же формы, где объявлен реквизит. В этом контексте реквизит доступен напрямую по имени, как обычная переменная:
&НаКлиенте
Процедура КомандаРассчитать(Команда)
СуммаИтог = Количество * Цена; // Количество, Цена, СуммаИтог — реквизиты формы
КонецПроцедуры
Если нужно обратиться к реквизиту объекта (например, документа, для которого открыта форма), используется свойство Объект:
НомерДокумента = Объект.Номер;
ДатаДокумента = Объект.Дата;
Важно понимать разницу: Объект.Контрагент — это реквизит документа, хранящийся в базе, а Контрагент без префикса — реквизит формы, который существует только пока форма открыта. Если в форме есть и то и другое, обращение без префикса вернёт именно реквизит формы.
Обращение через ЭтаФорма и ЭлементыФормы
В управляемых формах доступна системная переменная ЭтаФорма. Через неё можно обратиться к реквизиту по строковому имени — это полезно, когда имя реквизита формируется динамически:
ИмяРеквизита = "Поле" + НомерСтроки;
Значение = ЭтаФорма[ИмяРеквизита];
Не путайте реквизит формы и элемент формы. Элемент формы — это визуальный объект (поле ввода, надпись, таблица), а реквизит — данные. Элемент формы лишь отображает реквизит, если связан с ним через свойство ПутьКДанным. Получить значение через элемент напрямую нельзя — читать нужно именно реквизит.
В обычных (неуправляемых) формах применяется коллекция ЭлементыФормы, но и там значение хранится в реквизите, а элемент лишь связан с ним через Данные или ИсточникДанных.
Получение значения через РеквизитФормыВЗначение
На сервере часто требуется преобразовать реквизит формы в прикладной объект — например, чтобы вызвать его методы или записать в базу. Для этого служит метод РеквизитФормыВЗначение():
&НаСервере
Процедура СохранитьНастройкиНаСервере()
ДокументОбъект = РеквизитФормыВЗначение("Объект");
ДокументОбъект.Комментарий = "Проведён обработкой";
ДокументОбъект.Записать();
ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
КонецПроцедуры
Метод работает только в серверном контексте и только для реквизитов, тип которых допускает преобразование (ДанныеФормыСтруктура, ДанныеФормыКоллекция и подобные). После изменения объекта его нужно вернуть обратно в форму методом ЗначениеВРеквизитФормы(), иначе пользователь не увидит изменений.
Получение значения реквизита из другой формы
Когда нужно прочитать реквизит чужой формы — например, из формы-владельца или родительской формы, — сначала получают ссылку на саму форму. Типовые сценарии:
- Из формы-владельца: в управляемых формах доступно свойство
ВладелецФормы(в ряде случаев передаётся через параметры). Обращение:ВладелецФормы.ИмяРеквизита. - Через ПолучитьФорму(): метод возвращает объект формы, после чего реквизит читается по имени:
ФормаСписка = ПолучитьФорму("Справочник.Номенклатура.ФормаСписка"); Значение = ФормаСписка.ТекущийОтбор;. - Через параметры формы: самый надёжный способ — передать значение при открытии через структуру параметров в
ОткрытьФорму().
&НаКлиенте
Процедура ОткрытьПодбор(Команда)
ПараметрыФормы = Новый Структура("ТекущийСклад", Склад);
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаПодбора", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры
Прямое чтение реквизитов чужой формы работает, только пока та форма открыта. После закрытия обращение вызовет ошибку, поэтому для обмена данными предпочтительнее оповещения (Оповестить / ОбработкаОповещения) или возврат значения из модальной формы.
Как выбрать действие
Работа с табличными частями и динамическими списками
Табличная часть на форме — это тоже реквизит (типа ДанныеФормыКоллекция). Обратиться к ней можно по имени, а к строкам — через индекс или перебор:
Для Каждого Строка Из Объект.Товары Цикл
СуммаСтроки = Строка.Количество * Строка.Цена;
КонецЦикла;
ПерваяСтрока = Объект.Товары[0];
КоличествоСтрок = Объект.Товары.Количество();
Текущую строку таблицы на форме получают через элемент формы: Элементы.Товары.ТекущиеДанные. Это удобно в обработчиках событий таблицы — например, при изменении ячейки.
Динамический список — особый реквизит: его значение нельзя прочитать как массив данных напрямую. Чтобы получить данные динамического списка программно, нужно построить запрос с тем же текстом и отбором либо использовать схему компоновки данных списка.
Проверка результата и отладка
Перед использованием значения реквизита полезно проверить его заполненность. Стандартный способ — функция ЗначениеЗаполнено(), которая корректно обрабатывает пустые ссылки, пустые строки, нули и неопределённые значения:
Если ЗначениеЗаполнено(Контрагент) Тогда
// работаем со значением
Иначе
Сообщить("Реквизит не заполнен");
КонецЕсли;
Для отладки удобно вывести значение через Сообщить() или поставить точку останова и посмотреть реквизиты формы в табло конфигуратора. В табло реквизиты формы видны как свойства объекта формы.
Как проверить результат
Переменная содержит ожидаемые данные нужного типа
Неопределено или ошибка «Поле объекта не обнаружено»
После серверной процедуры поля формы обновились
Форма показывает старые данные — не выполнен ЗначениеВРеквизитФормы
Объект записан, форма отражает актуальное состояние
Данные в базе и на форме разошлись
FAQ
Чем реквизит формы отличается от реквизита объекта?
Реквизит объекта (документа, справочника) хранится в базе данных и доступен через свойство Объект. Реквизит формы существует только в памяти, пока форма открыта, и при закрытии теряется. Он нужен для промежуточных данных, настроек отображения и служебных значений.
Почему возникает ошибка «Поле объекта не обнаружено»?
Чаще всего обращение идёт к несуществующему имени: реквизит не создан в форме, опечатка в имени или реквизит объекта запрошен без префикса «Объект.». Проверьте список реквизитов формы в конфигураторе и точное написание имени.
Можно ли получить реквизит формы из общего модуля?
Напрямую нет — общий модуль не имеет контекста формы. Нужно передать в процедуру общего модуля саму форму или конкретное значение реквизита как параметр. Передача всей формы допустима только в серверных вызовах и увеличивает объём передаваемых данных.
Как получить значение текущей строки таблицы на форме?
Через элемент формы: Элементы.ИмяТаблицы.ТекущиеДанные. Вернётся структура данных строки, из которой читаются поля по именам колонок. Для идентификатора строки используется Элементы.ИмяТаблицы.ТекущаяСтрока.
Работает ли РеквизитФормыВЗначение на клиенте?
Нет, метод доступен только в серверном контексте. Если преобразование нужно по действию пользователя, вызывайте серверную процедуру с директивой &НаСервере из клиентского обработчика.
Как передать значение реквизита при открытии другой формы?
Сформируйте структуру параметров и передайте её вторым аргументом в ОткрытьФорму(). В открываемой форме значение будет доступно через объект Параметры в обработчике ПриСозданииНаСервере.
Что важно запомнить
Внутри модуля формы реквизит читается напрямую по имени, реквизит объекта — через «Объект.». Для серверной записи используйте пару РеквизитФормыВЗначение / ЗначениеВРеквизитФормы. Между формами данные передавайте параметрами или оповещениями, а не прямым чтением чужих реквизитов.