При разработке форм в 1С часто возникает задача автоматического заполнения реквизитов на основе выбранных пользователем данных. Для этого в событии формы (например, ПриИзменении) выполняется запрос к базе данных, а полученное значение помещается в нужное поле ввода.
Разберем по шагам, как правильно извлечь значение из результата запроса и выгрузить его в элемент управления или связанный реквизит формы.
Метод Запрос.Выполнить() возвращает объект РезультатЗапроса. Чтобы получить доступ к конкретным полям и значениям, необходимо извлечь выборку данных с помощью метода Выбрать() и перейти к первой записи вызовом Следующий().
Рассмотрим базовый пример получения выборки:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| СотрудникиОрганизаций.Ссылка КАК Ссылка1
|ИЗ
| Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
|ГДЕ
| СотрудникиОрганизаций.Позиция = &Позиция";
Запрос.УстановитьПараметр("Позиция", Руководитель1);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
// Данные успешно получены
ЗначениеИзЗапроса = Выборка.Ссылка1;
КонецЕсли;
Обратите внимание: Всегда проверяйте результат метода Выборка.Следующий() условием Если ... Тогда. Если запрос не найдет ни одной подходящей записи, попытка сразу прочитать значение поля вернет Неопределено или приведет к ошибке.
При попытке напрямую написать ПолеВвода1 = Выборка.Ссылка1 или Объект = Выборка.Ссылка1 платформа выдаст ошибку «Поле объекта недоступно для записи». Это связано с тем, что элемент формы или контекст объекта нельзя перезаписать целиком — работать нужно с конкретным реквизитом или свойством элемента.
Проанализируем основные способы записи данных в поле формы:
Поле ввода на форме обычно связано с конкретным реквизитом (через свойство Данные или ПутьКДанным). Оптимальное решение — присвоить значение напрямую этому реквизиту:
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Руководитель3 = Выборка.Ссылка1;
КонецЕсли;
Если поле ввода выведено из состава реквизита Объект (в управляемых формах), запись выполняется в соответствующий реквизит объекта:
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Объект.Руководитель3 = Выборка.Ссылка1;
КонецЕсли;
Если необходимо обратиться к элементу управления формы напрямую, в обычных формах используется коллекция ЭлементыФормы и свойство Значение соответствующего элемента:
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ЭлементыФормы.ПолеВвода1.Значение = Выборка.Ссылка1;
КонецЕсли;
Посмотрим на важные нюансы, которые помогут избежать ошибок при работе с запросами в формах:
ВЫБРАТЬ ПЕРВЫЕ 1. Это снижает нагрузку на базу данных.Выбрать() можно дополнительно проверить, не пуст ли результат, используя Результат.Пустой().СОЕДИНЕНИЕ.