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

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

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

Причина проблемы и архитектурные ограничения

Проанализируем, почему нельзя напрямую обратиться к элементу формы в тексте запроса:

  1. Разделение контекстов исполнения: Запросы в платформе 1С:Предприятие выполняются исключительно на сервере базы данных или на сервере 1С. Элементы интерфейса (коллекция Элементы) существуют на клиенте, поэтому серверный код не имеет к ним прямого доступа.
  2. Синтаксис языка запросов: Язык запросов 1С работает только с таблицами базы данных, временными таблицами и переданными из встроенного языка параметрами. Напрямую прочитать переменные формы через текст запроса невозможно.

Основное решение: передача значения через параметры запроса

Для того чтобы использовать число, указанное на форме, в расчете колонки запроса, необходимо передать его в объект Запрос с помощью метода УстановитьПараметр(). Разберем по шагам, как это реализовать.

Шаг 1. Получение значения и установка параметра в коде

В серверной процедуре получаем значение числового реквизита и передаем его в запрос:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Таблица.Колонка1 КАК Колонка1,
    |	Таблица.Колонка2 КАК Колонка2,
    |	Таблица.Колонка3 КАК Колонка3,
    |	Таблица.Колонка4 КАК Колонка4,
    |	Таблица.Колонка3 * &КоэфОбщий КАК Колонка5
    |ИЗ
    |	Справочник.Номенклатура КАК Таблица";

// Передаем значение числового реквизита в параметр запроса
Запрос.УстановитьПараметр("КоэфОбщий", Объект.КоэффициентОбщий);

РезультатЗапроса = Запрос.Выполнить();
ДеревоРезультат = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

Шаг 2. Безопасная обработка NULL и приведение типов в запросе

Рассмотрим подробнее важные нюансы вычислений в тексте запроса. Если в исходной колонке могут встретиться пустые значения (например, при использовании левых соединений), результатом умножения станет NULL. Кроме того, при операциях умножения может измениться разрядность итогового числа. Чтобы избежать ошибок, используем функции ЕСТЬNULL и ВЫРАЗИТЬ:


Запрос.Текст = 
    "ВЫБРАТЬ
    |	Таблица.Колонка1 КАК Колонка1,
    |	Таблица.Колонка2 КАК Колонка2,
    |	Таблица.Колонка3 КАК Колонка3,
    |	Таблица.Колонка4 КАК Колонка4,
    |	ВЫРАЗИТЬ(ЕСТЬNULL(Таблица.Колонка3, 0) * &КоэфОбщий КАК ЧИСЛО(15, 2)) КАК Колонка5
    |ИЗ
    |	Документ.РеализацияТоваровУслуг.Товары КАК Таблица";

Альтернативные способы решения задачи

В зависимости от сценария работы формы можно использовать и другие методы пересчета данных:

  1. Пересчет в существующей коллекции без повторного запроса: Если таблица или дерево значений уже выведены на форму, а пользователь лишь поменял коэффициент, не обязательно заново обращаться к базе данных. Достаточно обойти строки дерева в цикле и пересчитать значение:
    
    Для Каждого СтрокаДерева Из ДеревоДанных.Строки Цикл
        СтрокаДерева.Колонка5 = СтрокаДерева.Колонка3 * Объект.КоэффициентОбщий;
    КонецЦикла;
    
  2. Использование Системы компоновки данных (СКД): Если вывод строится через СКД, числовое поле с формы можно передать в ПараметрыКомпоновкиДанных, а само вычисление настроить на вкладке Вычисляемые поля схемы компоновки, указав выражение вида Колонка3 * &КоэфОбщий.
← На главную