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

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

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

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

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

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

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

Как устроена связь элемента формы и данных

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

Из этого следует главное правило: чтобы изменить то, что видит пользователь в поле, нужно изменить данные по пути, указанному в свойстве элемента. Если поле ввода связано с Объект.Контрагент, то присваивание Объект.Контрагент = НовыйКонтрагент; немедленно отразится на форме. Пытаться «записать в элемент» напрямую — значит идти против архитектуры платформы.

У самого элемента тоже есть изменяемые свойства: Заголовок, Видимость, Доступность, ТолькоПросмотр, ЦветТекста. Они управляют внешним видом и поведением, но не данными. Доступ к ним выполняется через коллекцию Элементы формы.

Установка значения через реквизит формы в управляемом приложении

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

&НаКлиенте

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

Комментарий = "Согласовано с руководителем";

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

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

&НаКлиенте

Процедура ЗаполнитьОрганизацию(Команда)

Объект.Организация = ПолучитьОрганизациюПоУмолчанию();

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

Обратите внимание на контекст выполнения. В директиве &НаКлиенте доступны реквизиты формы и объект, но нельзя выполнять запросы к базе данных. Если для вычисления значения нужны данные из ИБ (например, найти контрагента по ИНН), потребуется серверная процедура &НаСервере, которая вернёт готовое значение, а клиентская процедура присвоит его реквизиту.

Порядок установки значения в управляемой форме
  1. 1
    Откройте редактор формы и найдите нужный элемент
  2. 2
    Посмотрите свойство «ПутьКДанным» — это реквизит, который нужно менять
  3. 3
    В модуле формы присвойте новое значение этому реквизиту
  4. 4
    Если значение вычисляется на сервере, вынесите вычисление в серверную функцию
  5. 5
    Проверьте результат в режиме предприятия: поле должно обновиться автоматически

Обращение к элементу по имени и изменение его свойств

Когда нужно изменить не данные, а поведение элемента — скрыть поле, заблокировать редактирование, поменять заголовок — работа идёт с коллекцией Элементы. Каждый элемент доступен по имени, заданному в редакторе формы:

&НаКлиенте

Процедура НастроитьВидимость()

Элементы.ПолеКомментарий.Видимость = Ложь;

Элементы.ПолеОрганизация.Доступность = Ложь;

Элементы.ПолеКомментарий.Заголовок = "Причина отказа";

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

Частая задача — управлять доступностью в зависимости от значения другого поля. Например, поле «Сумма оплаты» активно только когда установлен флажок «Оплачено». Такую логику размещают в обработчике события ПриИзменении флажка:

&НаКлиенте

Процедура ОплаченоПриИзменении(Элемент)

Элементы.СуммаОплаты.Доступность = Объект.Оплачено;

Если НЕ Объект.Оплачено Тогда

Объект.СуммаОплаты = 0;

КонецЕсли;

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

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

Установка значения в обычных формах

В обычном приложении (режим, который используют старые конфигурации на 8.1–8.3) механизм другой: элементы диалога сами хранят значения, и обращение идёт через коллекцию ЭлементыФормы:

Процедура КнопкаЗаполнитьНажатие(Элемент)

ЭлементыФормы.Комментарий.Значение = "Заполнено автоматически";

ЭлементыФормы.Оплачено.Значение = Истина;

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

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

Табличные поля в обычных формах заполняются через источник данных — табличную часть или таблицу значений, указанную в свойстве «Данные». Добавление строки в источник автоматически отображается в табличном поле.

Управляемая и обычная форма

Управляемая форма

Значение хранится в реквизите формы или объекта; элемент только отображает. Установка: Объект.Поле = Значение. Свойства элемента: через Элементы.Имя.

Обычная форма

Элемент сам хранит значение. Установка: ЭлементыФормы.Имя.Значение = Значение. Код не переносится в управляемые формы без переработки.

Работа с табличными частями и списками на форме

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

&НаКлиенте

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

Для Каждого Строка Из Объект.Товары Цикл

Строка.Цена = ПолучитьЦену(Строка.Номенклатура);

КонецЦикла;

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

Для текущей (выделенной) строки таблицы используется свойство ТекущиеДанные элемента-таблицы:

&НаКлиенте

Процедура ТоварыПриИзменении(Элемент)

Строка = Элементы.Товары.ТекущиеДанные;

Если Строка <> Неопределено Тогда

Строка.Сумма = Строка.Цена * Строка.Количество;

КонецЕсли;

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

Проверка на Неопределено обязательна: если таблица пуста или фокус не установлен, ТекущиеДанные вернёт Неопределено, и обращение к реквизиту вызовет ошибку выполнения. Это одна из самых частых причин «падения» обработчиков в реальной работе.

Установка значений полей выбора и списков

Для поля со списком выбора значение должно присутствовать в списке, иначе поведение зависит от настройки «РежимВыбораИзСписка». Программно список заполняется через свойство СписокВыбора элемента:

&НаКлиенте

Процедура ЗаполнитьСписокСтатусов()

Элементы.Статус.СписокВыбора.Очистить();

Элементы.Статус.СписокВыбора.Добавить("Новый");

Элементы.Статус.СписокВыбора.Добавить("В работе");

Элементы.Статус.СписокВыбора.Добавить("Завершён");

Статус = "Новый";

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

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

Типичные ошибки
01
Присваивание значения элементу вместо реквизита в управляемой форме — код не компилируется или не даёт эффекта
02
Обращение к Элементы.Имя на серверной процедуре без контекста формы — ошибка доступа
03
Работа с ТекущиеДанные таблицы без проверки на Неопределено — падение при пустой таблице
04
Попытка получить ссылку на объект базы данных в клиентской процедуре — нужен серверный вызов
05
Опечатка в имени элемента: платформа сообщает «Поле объекта не обнаружено»

Проверка результата и отладка

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

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

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

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

Значение в поле на форме
Норма

После выполнения кода поле показывает новое значение

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

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

Сохранение значения
Норма

После записи объекта значение сохраняется в базе

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

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

Работа обработчиков
Норма

ПриИзменении срабатывает и пересчитывает зависимые поля

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

Зависимые поля не обновляются — обработчик не назначен или ошибка в нём

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

Как установить значение поля, которое не связано с реквизитом?

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

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

Вы изменили реквизит формы, а не реквизит объекта. При записи сохраняются только данные объекта (документа, справочника). Либо перенесите поле в реквизиты объекта, либо в обработчике «ПередЗаписью» скопируйте значение из реквизита формы в объект.

Как установить значение элемента на форме другого объекта?

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

Можно ли установить значение в поле динамического списка?

Нет, динамический список отображает результат запроса и не редактируется напрямую. Чтобы «изменить» строку, нужно изменить данные в базе (записать объект) — список обновится автоматически или по команде обновления.

Чем отличается Элементы от ЭлементыФормы?

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

Как программно вызвать обработчик ПриИзменении после установки значения?

Программное присваивание реквизиту не вызывает событие ПриИзменении — оно срабатывает только при интерактивном вводе. Вызовите процедуру-обработчик явно, передав нужный элемент или Неопределено, если параметр не используется.

Итог

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

В управляемой форме значение элемента меняется через реквизит, указанный в его «ПутьКДанным», свойства элемента — через Элементы.Имя. В обычной форме используется ЭлементыФормы.Имя.Значение. Ссылочные значения получайте на сервере, а при работе с таблицами проверяйте ТекущиеДанные на Неопределено.