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

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

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

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

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

Способ записи зависит от типа формы. В управляемых формах (режим «Такси», тонкий и веб-клиент) работа идёт через реквизиты формы и коллекцию «Элементы», а обращение к данным объекта выполняется через «Объект» или преобразование «ДанныеФормыВЗначение». В обычных формах (толстый клиент) доступ к элементам и данным устроен иначе. Ниже разобраны оба подхода с примерами кода.

Как устроено отображение данных в поле формы

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

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

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

Если поле связано с реквизитом формы (например, добавленным вручную реквизитом «Комментарий» типа «Строка»), запись выполняется простым присваиванием в модуле формы:

// Модуль управляемой формы

ЭтаФорма.Комментарий = "Проверено менеджером";

// Или короче, внутри модуля формы:

Комментарий = "Проверено менеджером";

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

// Правильно — присваиваем ссылку

Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

// Неправильно — строка не превратится в ссылку,

// поле останется пустым или возникнет ошибка типа

// Контрагент = "ООО Ромашка";

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

Запись значения в реквизит объекта (документа, справочника)

В форме объекта (например, документа «Реализация товаров») основной реквизит называется «Объект». Чтобы записать значение в поле, связанное с реквизитом документа, обращайтесь через него:

// Модуль формы документа

Объект.СуммаДокумента = 15000;

Объект.Комментарий = "Заполнено программно";

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

Программная запись объекта из формы

Если требуется не только показать значение, но и сразу сохранить его в базе, используйте метод «Записать» формы или преобразование данных формы в объект:

// Вариант 1: записать через форму

Объект.Комментарий = "Новый комментарий";

ЭтаФорма.Записать();

// Вариант 2: через преобразование (например, на сервере)

&НаСервере

Процедура ЗаписатьКомментарийНаСервере()

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

ДокОбъект.Комментарий = "Новый комментарий";

ДокОбъект.Записать();

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

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

Изменение свойств поля через коллекцию «Элементы»

Иногда под «записать значение в поле» понимают другое: сделать поле недоступным, поменять заголовок или подсказку. Это делается через коллекцию «Элементы» формы:

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

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

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

Обращение идёт по имени элемента формы, а не по имени реквизита — они могут совпадать, но это разные сущности. Имя элемента смотрите в дереве элементов формы в конфигураторе. Если элемента с таким именем нет, обращение вернёт «Неопределено», и попытка установить свойство вызовет ошибку — полезно добавлять проверку:

Поле = Элементы.Найти("Комментарий");

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

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

КонецЕсли;

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

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

&НаСервере

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

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

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

КонецЕсли;

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

Проверка «Ссылка.Пустая()» важна: без неё значение будет перезаписываться при каждом открытии уже существующего документа, затирая введённые ранее данные. Это одна из самых неприятных ошибок, потому что проявляется она не сразу, а при повторном открытии объектов.

Запись значения из другой формы или обработки

Чтобы установить значение поля формы извне (например, из обработки), передайте данные через параметры открытия формы или через «Оповестить»:

// Открытие формы с параметром

ПараметрыФормы = Новый Структура("Контрагент", ВыбранныйКонтрагент);

ОткрытьФорму("Документ.ЗаказПокупателя.ФормаОбъекта", ПараметрыФормы);

// В модуле открываемой формы — обработка параметра

&НаСервере

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

Если Параметры.Свойство("Контрагент") Тогда

Объект.Контрагент = Параметры.Контрагент;

КонецЕсли;

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

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

Особенности обычных форм и табличных частей

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

// Модуль обычной формы документа

Комментарий = "Заполнено программно";

ЭлементыФормы.Комментарий.Доступность = Ложь;

Отдельный случай — запись значения в поле строки табличной части. Здесь присваивание выполняется не реквизиту формы, а строке коллекции:

// Управляемая форма: текущая строка табличной части

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

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

ТекСтрока.Цена = 100;

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

КонецЕсли;

Обратите внимание: «ТекущиеДанные» доступны только на клиенте. На сервере работайте с коллекцией «Объект.Товары» по индексу или через поиск строки.

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

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

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

Для быстрой проверки без отладчика используйте «Сообщить»:

Объект.Комментарий = "Тест";

Сообщить("Значение реквизита: " + Объект.Комментарий);

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

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

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

Значение реквизита в отладчике
Норма

Реквизит содержит присвоенное значение нужного типа

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

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

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

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

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

Поле пустое — неверный ПутьКДанным или данные перечитываются

Сохранение в базе
Норма

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

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

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

Итог

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

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

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

Почему поле остаётся пустым после присваивания значения?

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

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

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

Нужно ли обновлять форму после присваивания?

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

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

На клиенте получите строку через «Элементы.ИмяТаблицы.ТекущиеДанные» и присвойте значение её полю. На сервере работайте с коллекцией «Объект.ИмяТабличнойЧасти» — найдите нужную строку по индексу или условию и измените её реквизит.

Почему изменения пропадают после закрытия формы?

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

Можно ли записать значение в поле, у которого установлено «ТолькоПросмотр»?

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