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

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

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

Разбираем, как получить значение из формы 1С: обращение к реквизитам, элементам и данным объекта, примеры кода для управляемых и обычных форм.

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

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

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

Откуда форма берёт значения: объект, реквизиты формы, элементы

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

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

Получение значения реквизита объекта

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

&НаКлиенте

Процедура РассчитатьСкидку(Команда)

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

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

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

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

Нюанс: тип переменной Объект на клиенте — ДанныеФормыСтруктура, а не ссылка на объект базы. Через него доступны реквизиты и табличные части, но нельзя вызвать объектные методы вроде Записать() или получить значение через точку от ссылки. Если нужен запрос к связанным данным (например, узнать договор контрагента по умолчанию), выполняйте это в серверной процедуре.

Если реквизит может быть не заполнен, проверяйте значение перед использованием, чтобы избежать ошибок в расчётах и обращений к пустой ссылке:

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

// работаем с организацией

КонецЕсли;

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

Реквизиты формы читаются напрямую по имени в модуле формы. Для наглядности можно использовать обращение через ЭтаФорма:

&НаКлиенте

Процедура ПриНажатииКнопки(Команда)

ПроцентСкидки = ЭтаФорма.ПроцентСкидки; // реквизит формы

Объект.СуммаДокумента = Объект.СуммаДокумента * (100 - ПроцентСкидки) / 100;

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

Чтобы узнать, какие реквизиты есть у формы, откройте её в конфигураторе: в редакторе формы справа вверху находится панель «Реквизиты». Там же видно тип каждого реквизита. В режиме предприятия состав реквизитов можно посмотреть через «Ещё → Изменить форму» или инструменты разработчика.

Чтение значений из табличной части и текущей строки

Табличная часть объекта доступна как коллекция: Объект.Товары. Обойти её и собрать значения можно циклом:

ИтогоКоличество = 0;

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

ИтогоКоличество = ИтогоКоличество + Строка.Количество;

КонецЦикла;

Если нужно получить значения именно из той строки, которую пользователь выделил в таблице на форме, используйте свойство ТекущиеДанные элемента формы:

&НаКлиенте

Процедура ПоказатьТекущуюСтроку(Команда)

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

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

Возврат; // строка не выбрана

КонецЕсли;

Сообщить("Номенклатура: " + ТекСтрока.Номенклатура);

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

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

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

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

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

Типичные ошибки
01
Чтение Элементы.ИмяПоля.Значение в управляемой форме — свойства нет, код падает с ошибкой; читайте реквизит из ПутьКДанным
02
Обращение к Объект в общем модуле или вне формы — переменная Объект существует только в модуле формы
03
Вызов серверных методов объекта (Записать, ПолучитьОбъект) в клиентской процедуре — переносите такой код в &НаСервере
04
Отсутствие проверки ТекущиеДанные на Неопределено — ошибка, когда строка таблицы не выбрана

Передача и получение значений между формами

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

&НаКлиенте

Процедура ВыбратьКонтрагента(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеВыбораКонтрагента", ЭтотОбъект);

ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", , ЭтотОбъект, , , , Оповещение);

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

&НаКлиенте

Процедура ПослеВыбораКонтрагента(Результат, ДопПараметры) Экспорт

Если Результат <> Неопределено Тогда

Объект.Контрагент = Результат;

КонецЕсли;

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

Обратный путь — передать значение в открываемую форму — делается через параметры: второй аргумент ОткрытьФорму принимает структуру, а в открываемой форме значения доступны через Параметры.ИмяКлюча в обработчике ПриСозданииНаСервере.

Порядок действий: прочитать значение из формы
  1. 1
    Откройте форму в конфигураторе и найдите нужное поле в дереве элементов
  2. 2
    Посмотрите свойство ПутьКДанным — оно указывает реквизит, где хранится значение
  3. 3
    В модуле формы обратитесь к реквизиту: Объект.Имя или ЭтаФорма.Имя
  4. 4
    Для таблицы используйте Элементы.ИмяТаблицы.ТекущиеДанные с проверкой на Неопределено
  5. 5
    Проверьте результат отладчиком или выводом через Сообщить

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

Быстрый способ убедиться, что значение читается правильно, — вывести его через Сообщить() или поставить точку останова и посмотреть значение в табло отладчика (Ctrl+Shift+F9 для вычисления выражения). Для ссылочных типов выводите строковое представление, для проверки заполненности используйте ЗначениеЗаполнено().

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

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

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

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

Совпадает с введённым в поле значением

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

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

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

Ожидаемый тип: ссылка, число, строка

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

Неопределено или строка вместо ссылки — ошибка в имени реквизита

Код в клиентской процедуре
Норма

Читаются только реквизиты формы и объекта

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

Попытка запроса к базе или объектным методам — вынести на сервер

FAQ: частые вопросы о получении значений из формы 1С

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

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

Почему в клиентской процедуре недоступен Объект?

Переменная Объект существует только в формах объектов (документов, справочников). В формах обработок, отчётов и произвольных формах её нет — там работайте с реквизитами формы, которые добавил разработчик.

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

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

Чем отличается Элементы.Товары.ТекущиеДанные от ТекущаяСтрока?

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

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

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

Работает ли ЭлементыФормы.Имя.Значение в управляемом приложении?

Нет. Коллекция ЭлементыФормы и свойство Значение у элементов — механика обычных форм. В управляемых формах используются Элементы (без «Формы») и чтение значений только через реквизиты.

Итог

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

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