Разработка и Конфигурация · 11 мин
Как установить значение элемента формы в 1С
Как программно установить значение элемента формы в 1С: обычные и управляемые формы, работа с реквизитами, доступ по имени и пути, типичные ошибки.
Задача установить значение элемента формы в 1С возникает в двух разных ситуациях. Первая — нужно изменить данные, которые элемент отображает: текст поля ввода, состояние флажка, выбранное значение в списке. Вторая — изменить свойства самого элемента: заголовок, видимость, доступность, цвет. Путаница между этими сценариями — главный источник ошибок у начинающих разработчиков, потому что механизмы в обоих случаях принципиально разные.
В управляемых формах (режим «Такси» и обычные управляемые приложения) элемент формы — это только «отображение» данных. Реальное значение хранится в реквизите формы или в реквизите объекта, связанного с элементом через свойство «ПутьКДанным». Поэтому корректный способ «установить значение элемента» — записать значение в реквизит, а платформа сама обновит элемент на экране.
В обычных формах (режим обычного приложения, платформа 8.2–8.3) элементы диалога хранят значения внутри себя, и обращение к ним идёт через коллекцию ЭлементыФормы. Синтаксис отличается, и переносить код из одного режима в другой без адаптации нельзя — он просто не скомпилируется или будет обращаться к несуществующим объектам.
Как устроена связь элемента формы и данных
Каждый элемент управляемой формы, отображающий данные (поле ввода, флажок, поле надписи), привязан к источнику через свойство «ПутьКДанным» (DataPath). Источником может быть реквизит формы, реквизит основного объекта (например, документа или справочника, чья форма открыта) или колонка таблицы значений. Платформа автоматически синхронизирует содержимое элемента с источником при открытии формы, после записи объекта и при изменении данных программно.
Из этого следует главное правило: чтобы изменить то, что видит пользователь в поле, нужно изменить данные по пути, указанному в свойстве элемента. Если поле ввода связано с Объект.Контрагент, то присваивание Объект.Контрагент = НовыйКонтрагент; немедленно отразится на форме. Пытаться «записать в элемент» напрямую — значит идти против архитектуры платформы.
У самого элемента тоже есть изменяемые свойства: Заголовок, Видимость, Доступность, ТолькоПросмотр, ЦветТекста. Они управляют внешним видом и поведением, но не данными. Доступ к ним выполняется через коллекцию Элементы формы.
Установка значения через реквизит формы в управляемом приложении
Стандартный сценарий: на форме есть поле ввода, связанное с реквизитом формы Комментарий (строка). Чтобы установить значение программно, в модуле формы достаточно присвоить значение реквизиту:
&НаКлиенте
Процедура УстановитьКомментарий(Команда)
Комментарий = "Согласовано с руководителем";
КонецПроцедуры
После выполнения присваивания платформа сама обновит поле на экране — никаких дополнительных вызовов «обновить форму» не требуется. Если реквизит является реквизитом основного объекта формы (документа, справочника), обращение идёт через Объект:
&НаКлиенте
Процедура ЗаполнитьОрганизацию(Команда)
Объект.Организация = ПолучитьОрганизациюПоУмолчанию();
КонецПроцедуры
Обратите внимание на контекст выполнения. В директиве &НаКлиенте доступны реквизиты формы и объект, но нельзя выполнять запросы к базе данных. Если для вычисления значения нужны данные из ИБ (например, найти контрагента по ИНН), потребуется серверная процедура &НаСервере, которая вернёт готовое значение, а клиентская процедура присвоит его реквизиту.
- 1Откройте редактор формы и найдите нужный элемент
- 2Посмотрите свойство «ПутьКДанным» — это реквизит, который нужно менять
- 3В модуле формы присвойте новое значение этому реквизиту
- 4Если значение вычисляется на сервере, вынесите вычисление в серверную функцию
- 5Проверьте результат в режиме предприятия: поле должно обновиться автоматически
Обращение к элементу по имени и изменение его свойств
Когда нужно изменить не данные, а поведение элемента — скрыть поле, заблокировать редактирование, поменять заголовок — работа идёт с коллекцией Элементы. Каждый элемент доступен по имени, заданному в редакторе формы:
&НаКлиенте
Процедура НастроитьВидимость()
Элементы.ПолеКомментарий.Видимость = Ложь;
Элементы.ПолеОрганизация.Доступность = Ложь;
Элементы.ПолеКомментарий.Заголовок = "Причина отказа";
КонецПроцедуры
Частая задача — управлять доступностью в зависимости от значения другого поля. Например, поле «Сумма оплаты» активно только когда установлен флажок «Оплачено». Такую логику размещают в обработчике события ПриИзменении флажка:
&НаКлиенте
Процедура ОплаченоПриИзменении(Элемент)
Элементы.СуммаОплаты.Доступность = Объект.Оплачено;
Если НЕ Объект.Оплачено Тогда
Объект.СуммаОплаты = 0;
КонецЕсли;
КонецПроцедуры
Имя элемента и имя реквизита — разные вещи, хотя при перетаскивании реквизита на форму они часто совпадают. Если код выдаёт ошибку «Поле объекта не обнаружено», первым делом сверьте имя в редакторе формы: возможно, элемент называется Организация1 или ПолеОрганизация.
Установка значения в обычных формах
В обычном приложении (режим, который используют старые конфигурации на 8.1–8.3) механизм другой: элементы диалога сами хранят значения, и обращение идёт через коллекцию ЭлементыФормы:
Процедура КнопкаЗаполнитьНажатие(Элемент)
ЭлементыФормы.Комментарий.Значение = "Заполнено автоматически";
ЭлементыФормы.Оплачено.Значение = Истина;
КонецПроцедуры
Если элемент связан с данными объекта через свойство «Данные», то изменение Значение элемента не всегда сразу попадает в реквизит объекта — зависит от настройки связи. Надёжнее менять данные объекта напрямую (Контрагент = ... в модуле формы объекта), а элемент обновится через механизм связи.
Табличные поля в обычных формах заполняются через источник данных — табличную часть или таблицу значений, указанную в свойстве «Данные». Добавление строки в источник автоматически отображается в табличном поле.
Управляемая и обычная форма
Значение хранится в реквизите формы или объекта; элемент только отображает. Установка: Объект.Поле = Значение. Свойства элемента: через Элементы.Имя.
Элемент сам хранит значение. Установка: ЭлементыФормы.Имя.Значение = Значение. Код не переносится в управляемые формы без переработки.
Работа с табличными частями и списками на форме
Установить значение в ячейке табличной части — значит изменить соответствующий реквизит строки коллекции. В управляемой форме документа с табличной частью «Товары» это выглядит так:
&НаКлиенте
Процедура ЗаполнитьЦены(Команда)
Для Каждого Строка Из Объект.Товары Цикл
Строка.Цена = ПолучитьЦену(Строка.Номенклатура);
КонецЦикла;
КонецПроцедуры
Для текущей (выделенной) строки таблицы используется свойство ТекущиеДанные элемента-таблицы:
&НаКлиенте
Процедура ТоварыПриИзменении(Элемент)
Строка = Элементы.Товары.ТекущиеДанные;
Если Строка <> Неопределено Тогда
Строка.Сумма = Строка.Цена * Строка.Количество;
КонецЕсли;
КонецПроцедуры
Проверка на Неопределено обязательна: если таблица пуста или фокус не установлен, ТекущиеДанные вернёт Неопределено, и обращение к реквизиту вызовет ошибку выполнения. Это одна из самых частых причин «падения» обработчиков в реальной работе.
Установка значений полей выбора и списков
Для поля со списком выбора значение должно присутствовать в списке, иначе поведение зависит от настройки «РежимВыбораИзСписка». Программно список заполняется через свойство СписокВыбора элемента:
&НаКлиенте
Процедура ЗаполнитьСписокСтатусов()
Элементы.Статус.СписокВыбора.Очистить();
Элементы.Статус.СписокВыбора.Добавить("Новый");
Элементы.Статус.СписокВыбора.Добавить("В работе");
Элементы.Статус.СписокВыбора.Добавить("Завершён");
Статус = "Новый";
КонецПроцедуры
Для полей ссылочного типа (выбор контрагента, номенклатуры) значение устанавливается присваиванием ссылки реквизиту. Получить ссылку можно только на сервере — через запрос или методы менеджера объекта. Попытка сформировать ссылку строкой или «найти по имени» на клиенте не сработает.
Проверка результата и отладка
После изменения кода проверяйте результат в режиме предприятия, а не только в конфигураторе. Откройте форму, выполните действие (нажмите кнопку, измените поле) и убедитесь, что значение появилось, а связанные элементы (доступность, итоги) пересчитались. Если значение установлено, но на экране не видно — проверьте, тот ли реквизит указан в «ПутьКДанным» элемента.
Для отладки удобно использовать точки останова в конфигураторе: поставьте останов на строке присваивания и в табло проверьте текущее значение реквизита до и после. Также полезна команда Сообщить() для вывода промежуточных значений при отладке серверных процедур.
Как проверить результат
После выполнения кода поле показывает новое значение
Поле пустое или старое — проверьте ПутьКДанным элемента
После записи объекта значение сохраняется в базе
Значение пропадает — изменён реквизит формы, а не реквизит объекта
ПриИзменении срабатывает и пересчитывает зависимые поля
Зависимые поля не обновляются — обработчик не назначен или ошибка в нём
Частые вопросы
Как установить значение поля, которое не связано с реквизитом?
В управляемой форме поле ввода без привязки к данным практически не используется — создайте реквизит формы нужного типа и свяжите элемент с ним через «ПутьКДанным». Это штатный и единственный надёжный способ хранить значение между вызовами сервера.
Почему присвоение работает, но после записи объекта значение пропадает?
Вы изменили реквизит формы, а не реквизит объекта. При записи сохраняются только данные объекта (документа, справочника). Либо перенесите поле в реквизиты объекта, либо в обработчике «ПередЗаписью» скопируйте значение из реквизита формы в объект.
Как установить значение элемента на форме другого объекта?
Напрямую извне менять реквизиты чужой формы нельзя. Передайте значение при открытии через параметры (Параметры формы), либо используйте Оповестить() и обработку оповещения в целевой форме.
Можно ли установить значение в поле динамического списка?
Нет, динамический список отображает результат запроса и не редактируется напрямую. Чтобы «изменить» строку, нужно изменить данные в базе (записать объект) — список обновится автоматически или по команде обновления.
Чем отличается Элементы от ЭлементыФормы?
Элементы — коллекция элементов управляемой формы, ЭлементыФормы — обычной. Они существуют в разных режимах работы и несовместимы. Определить режим можно по типу формы в конфигураторе или по директивам компиляции в модуле.
Как программно вызвать обработчик ПриИзменении после установки значения?
Программное присваивание реквизиту не вызывает событие ПриИзменении — оно срабатывает только при интерактивном вводе. Вызовите процедуру-обработчик явно, передав нужный элемент или Неопределено, если параметр не используется.
Что важно запомнить
В управляемой форме значение элемента меняется через реквизит, указанный в его «ПутьКДанным», свойства элемента — через Элементы.Имя. В обычной форме используется ЭлементыФормы.Имя.Значение. Ссылочные значения получайте на сервере, а при работе с таблицами проверяйте ТекущиеДанные на Неопределено.