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