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

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке форм в 1С часто возникает задача автоматического заполнения реквизитов на основе выбранных пользователем данных. Для этого в событии формы (например, ПриИзменении) выполняется запрос к базе данных, а полученное значение помещается в нужное поле ввода.

Разберем по шагам, как правильно извлечь значение из результата запроса и выгрузить его в элемент управления или связанный реквизит формы.

Шаг 1. Получение выборки из результата запроса

Метод Запрос.Выполнить() возвращает объект РезультатЗапроса. Чтобы получить доступ к конкретным полям и значениям, необходимо извлечь выборку данных с помощью метода Выбрать() и перейти к первой записи вызовом Следующий().

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |	СотрудникиОрганизаций.Ссылка КАК Ссылка1
    |ИЗ
    |	Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
    |ГДЕ
    |	СотрудникиОрганизаций.Позиция = &Позиция";

Запрос.УстановитьПараметр("Позиция", Руководитель1);

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Если Выборка.Следующий() Тогда
    // Данные успешно получены
    ЗначениеИзЗапроса = Выборка.Ссылка1;
КонецЕсли;

Обратите внимание: Всегда проверяйте результат метода Выборка.Следующий() условием Если ... Тогда. Если запрос не найдет ни одной подходящей записи, попытка сразу прочитать значение поля вернет Неопределено или приведет к ошибке.

Шаг 2. Передача значения в поле ввода формы

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

Проанализируем основные способы записи данных в поле формы:

Способ 1. Запись в реквизит формы (рекомендуемый подход)

Поле ввода на форме обычно связано с конкретным реквизитом (через свойство Данные или ПутьКДанным). Оптимальное решение — присвоить значение напрямую этому реквизиту:


Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    Руководитель3 = Выборка.Ссылка1;
КонецЕсли;

Если поле ввода выведено из состава реквизита Объект (в управляемых формах), запись выполняется в соответствующий реквизит объекта:


Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    Объект.Руководитель3 = Выборка.Ссылка1;
КонецЕсли;

Способ 2. Установка значения через элементы формы (в обычных формах)

Если необходимо обратиться к элементу управления формы напрямую, в обычных формах используется коллекция ЭлементыФормы и свойство Значение соответствующего элемента:


Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    ЭлементыФормы.ПолеВвода1.Значение = Выборка.Ссылка1;
КонецЕсли;

Рекомендации по оптимизации кода и запроса

Посмотрим на важные нюансы, которые помогут избежать ошибок при работе с запросами в формах:

  1. Ограничение выборки: Если логика предусматривает выборку только одного сотрудника или одной позиции, обязательно указывайте в запросе ВЫБРАТЬ ПЕРВЫЕ 1. Это снижает нагрузку на базу данных.
  2. Проверка на пустой результат: Перед вызовом метода Выбрать() можно дополнительно проверить, не пуст ли результат, используя Результат.Пустой().
  3. Упрощение текста запроса: Избегайте избыточных внутренних соединений. Если данные уже есть в реквизитах выбираемого справочника или документа, обращайтесь к ним напрямую без лишних конструкций СОЕДИНЕНИЕ.
← На главную