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