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

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

1С: как заполнить реквизит формы

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

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

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

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

Чем реквизит формы отличается от реквизита объекта

Когда вы открываете форму документа, на ней автоматически создаётся основной реквизит — чаще всего он называется «Объект» и имеет тип «ДанныеФормыСтруктура». Все реквизиты документа доступны через него: Объект.Номенклатура, Объект.Комментарий. Прямого обращения ЭтаФорма.Номенклатура к реквизиту документа не существует.

Реквизиты формы — это дополнительные данные, которые вы добавляете в конфигураторе на закладке «Реквизиты» редактора формы или создаёте программно. Они не сохраняются в базу данных вместе с документом: живут только пока открыта форма, если только вы сами не перенесёте их значения в объект.

Заполнение реквизита формы из модуля формы

Самый частый случай — присвоить значение реквизиту при открытии формы или по нажатию кнопки. В модуле формы обращение выполняется через ЭтаФорма или просто по имени реквизита:

&НаКлиенте

Процедура ЗаполнитьКомментарий(Команда)

ТекстПодсказки = "Заполнено программно";

// или так:

ЭтаФорма.ТекстПодсказки = "Заполнено программно";

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

Если реквизит связан с элементом формы (поле ввода, надпись), новое значение отобразится автоматически — платформа сама обновляет связанные элементы. Дополнительно вызывать перерисовку не требуется.

Для заполнения при открытии используйте обработчики ПриСозданииНаСервере (если нужны серверные данные) или ПриОткрытии (если достаточно клиентского контекста):

&НаСервере

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

ДатаЗаполнения = ТекущаяДатаСеанса();

ЗаголовокИнформации = "Форма открыта пользователем "

+ ПользователиИнформационнойБазы.ТекущийПользователь().Имя;

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

Заполнение реквизитов объекта через основной реквизит формы

Если цель — заполнить реквизит самого документа или справочника, обращайтесь через основной реквизит формы:

&НаКлиенте

Процедура УстановитьСклад(Команда)

Объект.Склад = ПредопределенноеЗначение("Справочник.Склады.Основной");

Модифицированность = Истина;

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

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

Когда нужен РеквизитФормыВЗначение

Преобразование РеквизитФормыВЗначение("Объект") требуется, когда нужно вызвать методы объекта, недоступные у данных формы: например, Заполнить(), проведение, обращение к менеджеру объекта. Типовой шаблон выглядит так:

&НаСервере

Процедура ЗаполнитьПоУмолчаниюНаСервере()

ДокументОбъект = РеквизитФормыВЗначение("Объект");

ДокументОбъект.Заполнить(Неопределено);

ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");

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

Учитывайте: преобразование туда-обратно — дорогая операция, весь объект сериализуется. В циклах и при частых вызовах её лучше не использовать. Если нужно просто присвоить пару полей — работайте с Объект.ИмяРеквизита напрямую.

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

Если реквизита нет в конфигураторе, его можно создать в runtime через метод ИзменитьРеквизиты. Это нужно, например, когда состав полей зависит от настроек пользователя.

&НаСервере

Процедура ДобавитьРеквизитНаСервере()

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

Описание = Новый РеквизитФормы("СлужебныйКомментарий",

Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200)));

Добавляемые.Добавить(Описание);

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

// теперь можно заполнить

ЭтаФорма.СлужебныйКомментарий = "Создан программно";

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

После создания реквизита для отображения на форме нужно программно добавить и элемент: Элементы.Добавить("СлужебныйКомментарий", Тип("ПолеФормы")), затем установить ПутьКДанным. Без элемента значение хранится, но пользователь его не увидит.

Порядок действий при программном добавлении
  1. 1
    Сформируйте массив объектов РеквизитФормы с именем, типом и заголовком
  2. 2
    Вызовите ИзменитьРеквизиты в серверной процедуре
  3. 3
    Присвойте значение через ЭтаФорма.ИмяРеквизита
  4. 4
    Добавьте элемент формы и свяжите его через ПутьКДанным
  5. 5
    Проверьте отображение и сохранение значения при переоткрытии формы

Заполнение табличных реквизитов формы

Реквизит формы типа «ТаблицаЗначений» заполняется построчно через Добавить() или массовой загрузкой через Загрузить(), если источник — другая таблица значений:

&НаСервере

Процедура ЗаполнитьТаблицуНаСервере()

ТаблицаРезультатов.Очистить();

Для Каждого Строка Из ДанныеОтчета Цикл

НоваяСтрока = ТаблицаРезультатов.Добавить();

НоваяСтрока.Наименование = Строка.Наименование;

НоваяСтрока.Сумма = Строка.Итог;

КонецЦикла;

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

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

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

Типичные ошибки и их диагностика

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

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

Ещё одна частая проблема — присваивание значения несовместимого типа, например строки в реквизит типа «Дата». Платформа либо выдаст ошибку преобразования, либо молча запишет пустое значение. Сверяйте тип реквизита с типом присваиваемых данных.

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

Проверка результата и ограничения

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

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

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

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

Отображение на форме
Норма

Значение видно в поле сразу после выполнения кода

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

Поле пустое — проверьте ПутьКДанным элемента

Сохранение в объекте
Норма

После Записать() и переоткрытия значение на месте

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

Значение пропало — заполнялся реквизит формы, а не объекта

Тип значения
Норма

Присвоенное значение совпадает по типу с реквизитом

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

Ошибка преобразования или пустое значение после присваивания

Итог

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

Реквизит формы заполняется через ЭтаФорма.Имя, реквизит объекта — через Объект.Имя. Методы объекта требуют РеквизитФормыВЗначение на сервере. Программные реквизиты создаются через ИзменитьРеквизиты и живут только в рамках открытой формы.

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

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

Передайте значение через параметры при открытии: ОткрытьФорму("Обработка.Моя.Форма", Новый Структура("Ключ", Значение)), а в целевой форме обработайте Параметры.Ключ в ПриСозданииНаСервере. Альтернатива — оповещение через Оповестить() и обработчик ОбработкаОповещения.

Почему присвоенное значение не видно на форме?

Чаще всего элемент формы не связан с реквизитом: проверьте свойство «ПутьКДанным» поля. Также убедитесь, что присваивание выполняется после создания формы, а не до него, и что имя реквизита в коде совпадает с именем в редакторе.

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

Да, если значение вычисляется на клиенте (ввод пользователя, текущая дата клиента, простые расчёты) — присваивайте напрямую в &НаКлиенте. Сервер нужен только для запросов к базе данных и вызова серверных методов.

Чем ИзменитьРеквизиты отличается от добавления реквизита в конфигураторе?

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

Как заполнить реквизит составного типа?

Присваивайте значение любого из типов, входящих в состав — платформа примет его автоматически. Если нужно сбросить значение, присвойте Неопределено. Проверить текущий тип значения можно через ТипЗнч().

Что делать, если реквизит объекта недоступен для редактирования на форме?

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