При разработке отчетов, обработок и документов в 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
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Таблица";
В зависимости от сценария работы формы можно использовать и другие методы пересчета данных:
Для Каждого СтрокаДерева Из ДеревоДанных.Строки Цикл
СтрокаДерева.Колонка5 = СтрокаДерева.Колонка3 * Объект.КоэффициентОбщий;
КонецЦикла;
ПараметрыКомпоновкиДанных, а само вычисление настроить на вкладке Вычисляемые поля схемы компоновки, указав выражение вида Колонка3 * &КоэфОбщий.