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

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

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

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

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

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

Ниже разобраны основные способы с примерами кода на встроенном языке 1С, ограничения каждого подхода и типичные ошибки, из-за которых значение «не присваивается».

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

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

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

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

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

Самый частый случай — реквизит формы создан в конфигураторе или добавлен программно, а элемент связан с ним. В модуле формы значение присваивается напрямую по имени реквизита:

&НаКлиенте

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

Комментарий = "Создано автоматически";

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

Если реквизит принадлежит объекту (например, форма документа), обращение идёт через «Объект»:

&НаКлиенте

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

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

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

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

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

Присвоение значения при открытии формы

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

&НаСервере

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

Если Объект.Ссылка.Пустая() Тогда

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

КонецЕсли;

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

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

Программное изменение по событию другого поля

Когда значение одного поля должно зависеть от другого, используется обработчик «ПриИзменении». Например, при выборе договора автоматически подставляется валюта, или при изменении количества пересчитывается сумма.

&НаКлиенте

Процедура КонтрагентПриИзменении(Элемент)

Если ЗначениеЗаполнено(Объект.Контрагент) Тогда

Объект.Договор = ПолучитьОсновнойДоговор(Объект.Контрагент);

КонецЕсли;

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

&НаСервереБезКонтекста

Функция ПолучитьОсновнойДоговор(Контрагент)

// запрос к данным справочника

Возврат Неопределено;

КонецФункции

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

Изменение свойств элемента: когда присваивают самому элементу

Хотя значение хранится в данных, к самому элементу тоже обращаются, когда нужно изменить представление: заголовок, видимость, доступность, цвет, список выбора. Для этого используется коллекция «Элементы» формы:

&НаКлиенте

Процедура ПереключитьРежим(Команда)

Элементы.ГруппаОплата.Видимость = Не Элементы.ГруппаОплата.Видимость;

Элементы.Контрагент.Заголовок = "Покупатель";

Элементы.Сумма.ТолькоПросмотр = Истина;

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

Отдельный практический случай — заполнение списка выбора поля: Элементы.Поле.СписокВыбора.Добавить(Значение, "Представление"). Это не присваивание значения полю, а настройка вариантов, которые пользователь сможет выбрать.

Что менять: данные или элемент

Реквизит формы / объекта

Подходит для изменения значения, которое видит и редактирует пользователь. Значение сохраняется при записи объекта.

Свойства элемента

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

ОбработкаЗаполнения в модуле объекта

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

Присвоение значения форме, открытой программно

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

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("ЗначенияЗаполнения", Новый Структура("Организация,Склад", Орг, Склад));

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);

Параметр «ЗначенияЗаполнения» обрабатывается стандартным механизмом заполнения, поэтому реквизиты объекта заполнятся автоматически. Для произвольных реквизитов формы передают собственные параметры и читают их в «ПриСозданииНаСервере» через коллекцию «Параметры».

bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("КомментарийПоУмолчанию") Тогда
        Комментарий = Параметры.КомментарийПоУмолчанию;
    КонецЕсли;
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

Сохранение при записи
Норма

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

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

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

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

Реквизит принимает значение без ошибки приведения типа

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

Ошибка или пустое значение — типы не совпадают

FAQ

Можно ли присвоить значение напрямую через Элементы.ИмяПоля?

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

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

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

Как присвоить значение полю табличной части?

Обратитесь к строке табличной части как к элементу коллекции: Объект.Товары[0].Цена = 100; либо через Элементы.Товары.ТекущиеДанные для текущей строки. Для добавления новой строки сначала вызовите Объект.Товары.Добавить(), затем заполните поля полученной строки.

Где правильнее задавать значения по умолчанию для новых документов?

В процедуре «ОбработкаЗаполнения» модуля объекта — она срабатывает при любом способе создания документа, включая программный и ввод на основании. Заполнение в «ПриСозданииНаСервере» сработает только при интерактивном открытии формы.

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

Через структуру параметров в ОткрытьФорму: для реквизитов объекта используйте стандартный параметр «ЗначенияЗаполнения», для любых других данных — произвольные ключи структуры, которые читаются через коллекцию «Параметры» в обработчике «ПриСозданииНаСервере».

Что делать, если реквизит ссылочного типа не принимает значение?

Присваивать нужно ссылку, а не строку или код. Найдите элемент справочника методами НайтиПоКоду, НайтиПоНаименованию или создайте новый, получите его Ссылку и присвойте именно её. Также убедитесь, что тип значения входит в состав типов реквизита.

Итог

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

Значение присваивается реквизиту формы или объекта, а не элементу. Элемент связан с данными через ПутьКДанным и обновляется автоматически. Значения по умолчанию размещайте в ОбработкаЗаполнения, начальные данные передавайте через параметры формы, а свойства элемента меняйте только для оформления.