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

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

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

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

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

В управляемых формах данные отделены от элементов интерфейса: поле ввода лишь отображает реквизит формы или объекта. Поэтому читать значение нужно из данных формы, а не из элемента. В обычных формах (толстый клиент, старые конфигурации) часть значений доступна через свойства элементов, что меняет подход.

Ниже разобраны основные сценарии: чтение реквизитов объекта, работа с реквизитами формы, преобразование ДанныеФормыВЗначение, получение значений из табличных частей и из элементов обычных форм, а также частые ошибки и способы проверки результата.

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

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

Основные источники значений в управляемой форме:

  • Объект — основной реквизит формы документа, справочника и т.п. Доступен как Объект.ИмяРеквизита;
  • Реквизиты формы — добавленные разработчиком, доступны по имени: ЭтаФорма.КомментарийКСтроке;
  • Параметры формы — переданные при открытии: Параметры.Ключ;
  • Элементы формы — только для управления отображением (видимость, доступность, цвет), а не для чтения значений.

Как получить значение реквизита объекта в управляемой форме

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

&НаКлиенте

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

ТекущийНомер = Объект.Номер;

ТекущийКонтрагент = Объект.Контрагент;

Сообщить("Номер: " + ТекущийНомер + ", контрагент: " + ТекущийКонтрагент);

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

Обращение Объект.ИмяРеквизита работает и на клиенте, и на сервере в контексте формы. Это самый частый и безопасный способ. Важно помнить: на клиенте доступны не все типы значений — например, запросы и менеджеры объектов недоступны, но реквизиты объекта читаются свободно.

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

Как прочитать реквизит формы и передать объект на сервер

Реквизиты формы читаются по имени напрямую: Значение = ЭтаФорма.ИмяРеквизита;. Если реквизит добавлен программно через ИзменитьРеквизиты(), обращение идентично — по имени, указанному при создании.

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

&НаСервере

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

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

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

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

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

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

Как получить значения из табличной части и текущей строки таблицы

Табличная часть объекта доступна как коллекция: Объект.Товары. Перебор строк выполняется циклом, конкретное значение — обращением к полю строки:

&НаКлиенте

Процедура ПосчитатьИтог(Команда)

ИтогоСумма = 0;

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

ИтогоСумма = ИтогоСумма + Строка.Сумма;

КонецЦикла;

Сообщить("Итого: " + ИтогоСумма);

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

Если нужна именно та строка, которую выделил пользователь в таблице формы, её получают через элемент формы — это один из немногих случаев, когда обращение к элементу оправдано:

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

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

Цена = ТекущаяСтрока.Цена;

КонецЕсли;

ТекущиеДанные возвращает строку табличной части, а ТекущаяСтрока — только идентификатор строки, по которому строку ещё нужно найти через Объект.Товары.НайтиПоИдентификатору(). Проверка на Неопределено обязательна: если таблица пуста или фокус не в ней, данных не будет.

Типичные ошибки
01
Чтение значения из элемента формы вместо реквизита — в управляемой форме у поля ввода нет свойства «Значение», код падает с ошибкой
02
Обращение к ТекущиеДанные без проверки на Неопределено — ошибка при пустой таблице
03
Вызов ДанныеФормыВЗначение на клиенте — метод доступен только на сервере
04
Изменение объекта на сервере без ЗначениеВДанныеФормы — форма показывает устаревшие данные

Как получить значения в обычной форме

В обычных формах (толстый клиент, конфигурации на 8.2 и ранее, либо режим обычного приложения) элементы управления сами хранят редактируемое значение. Здесь допустимо читать значение из элемента:

ЗначениеПоля = ЭлементыФормы.Наименование.Значение;

ВыбраннаяДата = ЭлементыФормы.ДатаОтбора.Значение;

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

Сравнение вариантов

Управляемая форма: реквизит формы

Универсальный способ. Значение читается из Объект или ЭтаФорма.ИмяРеквизита. Работает в тонком и веб-клиенте.

Управляемая форма: элемент формы

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

Обычная форма: ЭлементыФормы.Имя.Значение

Стандарт для старых конфигураций на обычных формах. Не работает в управляемом приложении.

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

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

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

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

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

Тип и содержимое совпадают с ожидаемым, ссылка заполнена

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

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

Совпадение с данными на экране
Норма

Полученное значение совпадает с тем, что видит пользователь

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

Код читает старое значение — данные формы не синхронизированы с объектом

Работа на клиенте и сервере
Норма

Код выполняется без ошибок компиляции в обоих контекстах

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

Ошибка «Метод не обнаружен» — серверный метод вызван на клиенте

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

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

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

Чем ТекущиеДанные отличается от ТекущаяСтрока у таблицы формы?

ТекущиеДанные — это сама строка с полями, из которой можно сразу читать значения. ТекущаяСтрока — только числовой идентификатор строки; чтобы получить данные, нужно выполнить Объект.Товары.НайтиПоИдентификатору(ТекущаяСтрока).

Как получить значение из чужой открытой формы?

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

Почему Объект.Реквизит возвращает пустое значение, хотя поле заполнено?

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

Можно ли получить значение из формы без её открытия?

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

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

Используйте событие поля «ИзменениеТекстаРедактирования» — в параметре Текст передаётся вводимая строка до её переноса в реквизит. Либо читайте Элементы.ИмяПоля.ТекстРедактирования.

Итог

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

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