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