К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как создать вычисляемое поле в 1С

Как создать вычисляемое поле в 1С: в запросе, СКД, динамическом списке и форме. Пошаговые инструкции, примеры кода, типичные ошибки и ответы на вопросы.

Вычисляемое поле в 1С — это поле, значение которого не хранится в базе данных, а рассчитывается по формуле на основе других данных. Такие поля применяют в запросах, схемах компоновки данных (СКД), динамических списках, отчётах и формах объектов, когда нужно показать сумму с НДС, разницу между датами, итог по строке или любой другой производный показатель.

Способ создания зависит от контекста: в языке запросов вычисляемое поле добавляется выражением в секции выборки, в СКД — на закладке «Вычисляемые поля», а на форме — через реквизит с обработчиком или через данные запроса. Ниже разобраны все основные сценарии с примерами кода.

Важно понимать ограничение: вычисляемое поле нельзя использовать как обычный реквизит объекта — оно не записывается в базу и пересчитывается при каждом обращении. Если значение нужно хранить и использовать в отборах на уровне СУБД, потребуется обычный реквизит с заполнением при записи.

Где в 1С применяются вычисляемые поля

Прежде чем создавать поле, определите, где оно будет использоваться, потому что механизмы различаются. Основные сценарии: произвольный запрос в коде, динамический список с произвольным запросом, отчёт на СКД, форма документа или справочника.

В запросе вычисляемое поле — это любое выражение в списке выборки с псевдонимом через ключевое слово КАК. В СКД вычисляемые поля добавляются отдельным списком и могут участвовать в настройках отчёта наравне с полями данных. На форме вычисляемое значение обычно выводится через реквизит формы, который заполняется программно, либо через колонку динамического списка.

Сравнение способов

Выражение в запросе

Подходит для выборок, динамических списков и источников данных. Ограничение: вычисляется один раз при выполнении запроса.

Вычисляемое поле СКД

Подходит для отчётов, где пользователь сам настраивает состав полей. Ограничение: работает только внутри схемы компоновки.

Реквизит формы с расчётом в коде

Подходит для интерактивных форм с пересчётом при изменении данных. Ограничение: требует программирования обработчиков.

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

Самый частый способ — добавить выражение прямо в текст запроса. Выражение записывается в списке полей выборки, после него ставится ключевое слово КАК и псевдоним, по которому к полю обращаются в коде и в настройках.

Пример: нужно вывести сумму строки товаров как произведение количества на цену.

bsl
ВЫБРАТЬ
	Продажи.Номенклатура КАК Номенклатура,
	Продажи.Количество КАК Количество,
	Продажи.Цена КАК Цена,
	Продажи.Количество * Продажи.Цена КАК Сумма
ИЗ
	Документ.РеализацияТоваров.Товары КАК Продажи

В выражениях допустимы арифметические операции, встроенные функции языка запросов (РАЗНОСТЬДАТ, СУММА, ЕСТЬNULL, ВЫРАЗИТЬ, ПОДСТРОКА и другие), а также конструкция ВЫБОР — аналог условного оператора. Например, поле статуса оплаты можно вычислить так: ВЫБОР КОГДА Оплачено >= Сумма ТОГДА \"Оплачен\" ИНАЧЕ \"Не оплачен\" КОНЕЦ КАК СтатусОплаты.

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

Как добавить вычисляемое поле в СКД

В схеме компоновки данных вычисляемые поля создаются на отдельной закладке и доступны пользователю при настройке отчёта. Это удобно, когда формулу нужно менять без правки запроса или когда поле должно быть необязательным.

Выражения в СКД пишутся на языке выражений компоновки данных — он похож на язык запросов, но имеет свои функции и ограничения. Например, доступны функции Сумма, Минимум, Максимум, ВычислитьВыражение для итогов, но нельзя обращаться к таблицам напрямую — только к полям набора данных.

Если формула сложная и требует логики на встроенном языке, используйте выражение через функцию общего модуля: в поле «Выражение представления» или через Вычислить() в событиях компоновщика. Однако чаще достаточно стандартных операторов и конструкции ВЫБОР.

Вычисляемое поле в динамическом списке

Динамический список с произвольным запросом поддерживает вычисляемые поля так же, как обычный запрос: добавьте выражение с псевдонимом в текст запроса списка. Поле появится в доступных колонках, его можно вывести в таблицу формы.

Ограничение: по вычисляемому полю динамического списка обычно нельзя выполнять стандартный отбор и сортировку, если выражение сложное. Если отбор по этому значению обязателен, выносите условие в секцию ГДЕ запроса или используйте параметры виртуальных таблиц.

Вычисляемое поле на форме объекта

Если значение нужно показать на форме документа или справочника и пересчитывать при вводе, создайте реквизит формы и заполняйте его программно. Например, поле «Сумма документа» пересчитывается в обработчиках ПриИзменении количества и цены.

bsl
&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
	Строка = Элементы.Товары.ТекущиеДанные;
	Строка.Сумма = Строка.Количество * Строка.Цена;
КонецПроцедуры

Для табличных частей самая удобная альтернатива — добавить реальный реквизит табличной части (например, «Сумма») и рассчитывать его в обработчиках. Это не «вычисляемое поле» в строгом смысле, но именно так в типовых конфигурациях реализуется интерактивный пересчёт: значение хранится, участвует в проведении и не требует пересчёта при каждом чтении.

Если хранить значение нельзя (например, оно должно всегда отражать актуальный курс), рассчитывайте его в обработчике ПриСозданииНаСервере и при изменении исходных данных, а реквизит формы сделайте доступным только для чтения.

Проверка результата и типичные ошибки

После создания поля проверьте его на реальных данных: выполните запрос в консоли запросов или откройте отчёт и сравните вычисленные значения с ручным расчётом на нескольких строках. Особое внимание уделите строкам с пустыми и нулевыми значениями.

Типичные ошибки
01
Отсутствие псевдонима КАК — поле получает системное имя, и к нему нельзя обратиться из кода или настроек.
02
Деление на ноль в выражении Цена / Количество — запрос падает с ошибкой; используйте ВЫБОР КОГДА Количество = 0 ТОГДА 0 ИНАЧЕ ... КОНЕЦ.
03
Игнорирование NULL из соединений — арифметика с NULL даёт NULL, итоги занижаются.
04
Попытка отбора в ГДЕ по псевдониму вычисляемого поля — в языке запросов 1С псевдонимы недоступны в секции ГДЕ, повторите выражение или вложите запрос.
05
Использование вычисляемого поля СКД в итогах без указания агрегатного выражения — в итогах поле остаётся пустым.
Контрольные точки

Как проверить результат

Значения в строках
Норма

Совпадают с ручным расчётом на контрольных примерах

Тревожный признак

Пустые значения или расхождения на строках с NULL/нулями

Итоги по полю в отчёте
Норма

Итог равен сумме значений строк

Тревожный признак

Итог пустой или не равен сумме — не задано агрегатное выражение

Отбор и сортировка
Норма

Отбор по значению работает через условие в запросе

Тревожный признак

Ошибка «поле не найдено» — псевдоним использован в секции ГДЕ

Часто задаваемые вопросы

Можно ли использовать вычисляемое поле в отборе запроса?

Напрямую по псевдониму — нет: в секции ГДЕ псевдонимы полей выборки недоступны. Повторите само выражение в условии (ГДЕ Количество * Цена > 1000) или оберните запрос во вложенный и накладывайте отбор на внешнем уровне. В СКД отбор по вычисляемому полю доступен в настройках отчёта.

Чем вычисляемое поле отличается от ресурса или реквизита?

Реквизит и ресурс хранятся в базе данных и заполняются при записи объекта. Вычисляемое поле не хранится — оно рассчитывается формулой при каждом выполнении запроса или построении отчёта и не требует изменения структуры данных.

Как вычислить разницу между датами в днях?

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

Почему вычисляемое поле пустое в итогах отчёта СКД?

Для вычисляемого поля нужно задать выражение итогов в колонке «Выражение» на закладке «Ресурсы» или указать агрегатную функцию. Без этого компоновщик не знает, как рассчитывать значение для группировок, и оставляет итоги пустыми.

Можно ли вызывать функцию общего модуля в вычисляемом поле?

В языке запросов — нет, доступны только встроенные функции запросов. В СКД вызов функций общих модулей возможен в выражениях, если модуль серверный и функция экспортная, но это замедляет формирование отчёта, так как функция вызывается для каждой строки.

Что быстрее: вычисляемое поле в запросе или расчёт в цикле после выборки?

Вычисление в запросе выполняется на сервере СУБД и обычно быстрее, чем обход выборки в цикле с расчётом в коде. Расчёт в коде оправдан только когда формула требует логики, недоступной в языке запросов.

Итог

Что важно запомнить

Вычисляемое поле создаётся выражением с псевдонимом КАК в запросе, на закладке «Вычисляемые поля» в СКД или программно на форме. Всегда обрабатывайте NULL и деление на ноль, помните: псевдоним недоступен в секции ГДЕ, а для итогов СКД нужно отдельное агрегатное выражение.