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

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

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

Разбираем, как создать вычисляемое поле в запросе 1С: синтаксис ВЫБОР, ВЫРАЗИТЬ, агрегатные функции, типичные ошибки и проверка результата в консоли.

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

Язык запросов 1С поддерживает арифметические операции, строковые функции, работу с датами, конструкцию ВЫБОР (аналог CASE), приведение типов через ВЫРАЗИТЬ и агрегатные функции с группировкой. Всё это комбинируется в секции ВЫБРАТЬ, а результат получает псевдоним через ключевое слово КАК.

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

Базовый синтаксис: выражение и псевдоним

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

ВЫБРАТЬ

Продажи.Номенклатура КАК Номенклатура,

Продажи.Количество КАК Количество,

Продажи.Сумма КАК Сумма,

Продажи.Сумма * 1.2 КАК СуммаСНДС,

Продажи.Сумма / Продажи.Количество КАК ЦенаЗаЕдиницу

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

Псевдоним обязателен, если к полю планируется обращение из кода (Выборка.СуммаСНДС) или из настроек отчёта. Без псевдонима платформа сама сгенерирует имя вида «Поле1», что делает запрос нечитаемым и ломает схему компоновки при изменении порядка полей.

В выражениях допустимы сложение, вычитание, умножение, деление, скобки и литералы. Деление на ноль в запросе 1С не вызывает исключения — результатом будет NULL, поэтому опасные делители стоит оборачивать в проверку через ВЫБОР.

Условная логика через конструкцию ВЫБОР

Конструкция ВЫБОР...КОГДА...ТОГДА...ИНАЧЕ...КОНЕЦ — аналог CASE в SQL. Она нужна, когда значение поля зависит от условия: категория клиента по объёму закупок, текстовый статус вместо числового кода, замена NULL на ноль.

ВЫБРАТЬ

Заказы.Контрагент КАК Контрагент,

ВЫБОР

КОГДА Заказы.Сумма >= 100000

ТОГДА "Крупный"

КОГДА Заказы.Сумма >= 10000

ТОГДА "Средний"

ИНАЧЕ "Мелкий"

КОНЕЦ КАК Категория,

ВЫБОР

КОГДА Заказы.ДатаОтгрузки < &ТекущаяДата

ТОГДА ИСТИНА

ИНАЧЕ ЛОЖЬ

КОНЕЦ КАК Просрочен

ИЗ

Документ.ЗаказКлиента КАК Заказы

Ветка ИНАЧЕ не обязательна, но без неё невыполнение всех условий вернёт NULL. Для числовых полей это часто нежелательно: NULL не участвует корректно в последующих сравнениях и агрегатах. Явно указывайте ИНАЧЕ 0 или ИНАЧЕ "" для строк.

Условия в КОГДА проверяются последовательно, срабатывает первое истинное. Поэтому диапазоны упорядочивайте от большего к меньшему, как в примере выше, иначе часть значений попадёт не в ту ветку.

Типичные ошибки
01
Отсутствует ИНАЧЕ — вместо ожидаемого нуля или пустой строки в поле появляется NULL, что ломает итоги и сравнения
02
Неверный порядок условий КОГДА: более широкое условие стоит первым и перехватывает значения узкого
03
Сравнение с NULL через обычное равенство: условие «Поле = NULL» всегда ложно, нужно использовать ЕСТЬ NULL или функцию ЕСТЬNULL

Работа с NULL и функция ЕСТЬNULL

При левом соединении таблиц отсутствующие данные приходят как NULL. Если такое поле участвует в арифметике, результат тоже станет NULL — и итог по отчёту «потеряет» строку. Функция ЕСТЬNULL заменяет NULL на заданное значение прямо в вычисляемом поле.

ВЫБРАТЬ

Товары.Номенклатура КАК Номенклатура,

ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток,

ЕСТЬNULL(Остатки.КоличествоОстаток, 0) * Товары.Цена КАК СтоимостьОстатка

ИЗ

Справочник.Номенклатура КАК Товары

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки

ПО Товары.Ссылка = Остатки.Номенклатура

ЕСТЬNULL принимает ровно два аргумента: проверяемое выражение и значение-замена. Типы должны быть совместимы — нельзя подставить строку вместо числа без предварительного приведения. Для цепочек замен (если первое NULL — взять второе, если и оно NULL — третье) функции вкладывают друг в друга.

Приведение типов и строковые операции

Функция ВЫРАЗИТЬ приводит значение к нужному типу: обрезает неограниченную строку до фиксированной длины, уточняет составной тип, задаёт точность числа. Это критично при группировках и соединениях по строковым полям — неограниченные строки в них участвовать не могут.

ВЫБРАТЬ

ВЫРАЗИТЬ(Товары.НаименованиеПолное КАК СТРОКА(150)) КАК Наименование,

Товары.Код + " / " + Товары.Артикул КАК КодАртикул,

ВЫРАЗИТЬ(Продажи.Сумма КАК ЧИСЛО(15, 2)) КАК СуммаОкругленная

ИЗ

Справочник.Номенклатура КАК Товары

Конкатенация строк выполняется оператором «+». Помните: если любой из операндов — NULL, вся строка станет NULL, поэтому соединяйте через ЕСТЬNULL. Для дат и чисел перед склейкой со строкой может потребоваться представление — в чистом языке запросов его возможности ограничены, поэтому сложное форматирование часто выносят в код после выборки.

Полезные строковые функции языка запросов: ПОДСТРОКА (вырезать часть строки), ДЛИНАСТРОКИ (длина), СОКРЛ/СОКРП/СОКРЛП (удаление пробелов). Они комбинируются с ВЫРАЗИТЬ и ВЫБОР в одном вычисляемом поле.

Даты и агрегатные вычисления

Для дат доступны функции ДОБАВИТЬКДАТЕ и РАЗНОСТЬДАТ, а также извлечение частей: ГОД, МЕСЯЦ, ДЕНЬ, НАЧАЛОПЕРИОДА, КОНЕЦПЕРИОДА. Типичное вычисляемое поле — количество дней просрочки или дата оплаты по условиям договора.

ВЫБРАТЬ

Реализация.Контрагент КАК Контрагент,

РАЗНОСТЬДАТ(Реализация.ДатаОплаты, &ТекущаяДата, ДЕНЬ) КАК ДнейПросрочки,

ДОБАВИТЬКДАТЕ(Реализация.Дата, ДЕНЬ, Реализация.СрокОплаты) КАК ПлановаяДатаОплаты

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

Агрегатные функции СУММА, КОЛИЧЕСТВО, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ тоже образуют вычисляемые поля, но требуют группировки: все неагрегатные поля списка ВЫБРАТЬ должны попасть в СГРУППИРОВАТЬ ПО. Разница СУММА(А) - СУММА(Б) считается корректно прямо в агрегатном выражении.

ВЫБРАТЬ

Продажи.Менеджер КАК Менеджер,

СУММА(Продажи.Сумма) КАК Оборот,

СУММА(Продажи.Сумма) - СУММА(Продажи.Себестоимость) КАК Маржа,

КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Контрагент) КАК ЧислоКлиентов

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

СГРУППИРОВАТЬ ПО

Продажи.Менеджер

Порядок создания вычисляемого поля
  1. 1
    Определите, из каких полей и по какой формуле считается новое значение
  2. 2
    Добавьте выражение в секцию ВЫБРАТЬ после исходных полей
  3. 3
    Обработайте NULL через ЕСТЬNULL и задайте тип через ВЫРАЗИТЬ при необходимости
  4. 4
    Присвойте понятный псевдоним через КАК
  5. 5
    Выполните запрос в консоли запросов и проверьте значения на реальных данных
  6. 6
    Убедитесь, что итоги и группировки не исказились после добавления поля

Проверка результата и ограничения

Перед переносом запроса в модуль отчёта выполните его в консоли запросов (внешней обработке или встроенной в EDT/конфигуратор). Проверяйте три вещи: вычисляемое поле присутствует в результате, значения соответствуют ручному пересчёту на нескольких строках, итоги по группам не изменились после добавления поля.

Ограничения, о которых стоит помнить. Вычисляемое поле нельзя использовать в секции ГДЕ того же запроса по псевдониму — условие придётся продублировать полным выражением или вынести во временную таблицу. В итогах (ИТОГИ ПО) по вычисляемому полю группировать можно, но производительность на больших объёмах проседает. Не все функции доступны во всех режимах совместимости — проверяйте синтакс-помощник под свою версию платформы.

Если выражение становится громоздким (вложенные ВЫБОР в три-четыре уровня), рассмотрите альтернативу: вычисляемое поле в СКД на закладке «Вычисляемые поля», ресурсы с произвольными выражениями или расчёт уже в коде после выборки. Запрос должен оставаться читаемым — это снижает цену ошибки при доработках.

Где считать значение

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

Подходит для простой арифметики, ВЫБОР и агрегатов; быстро, но сложная логика загромождает запрос

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

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

Расчёт в коде после выборки

Максимальная гибкость и доступ к любым функциям платформы; медленнее на больших выборках и требует обхода результата

Контрольные точки

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

Значения вычисляемого поля
Норма

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

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

NULL там, где ожидалось число, или значения смещены по веткам ВЫБОР

Итоги по группам
Норма

Суммы по группам и общий итог не изменились после добавления поля

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

Строки пропали из результата или итоги удвоились

Тип поля в результате
Норма

Тип соответствует ожиданию (число с нужной точностью, строка заданной длины)

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

Составной тип или неограниченная строка мешают группировке и соединениям

Итог

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

Вычисляемое поле — это выражение в секции ВЫБРАТЬ с псевдонимом через КАК. Используйте ВЫБОР для условий, ЕСТЬNULL для защиты от NULL, ВЫРАЗИТЬ для типов и всегда проверяйте результат в консоли запросов на реальных данных до включения в отчёт.

Частые вопросы

Можно ли использовать вычисляемое поле в условии ГДЕ того же запроса?

По псевдониму — нет: секция ГДЕ выполняется до формирования списка выборки. Нужно либо повторить полное выражение в условии, либо поместить выборку с вычисляемым полем во временную таблицу или вложенный запрос и фильтровать уже её.

Почему в вычисляемом поле появляется NULL, хотя исходные данные заполнены?

Чаще всего причина в левом соединении: для строк без пары в присоединяемой таблице поля равны NULL, и любая арифметика с ними даёт NULL. Оберните такие поля в ЕСТЬNULL(Поле, 0). Также проверьте, не сравниваете ли вы значение с NULL через «=» — такое условие всегда ложно.

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

Отдельной функции округления в языке запросов нет. Используйте ВЫРАЗИТЬ(Значение КАК ЧИСЛО(15, 2)) — приведение типа отбросит лишние знаки. Для округления до целого по арифметическим правилам применяют приём с добавлением 0.5 и последующим приведением, либо выполняют округление в коде после выборки.

Чем вычисляемое поле запроса отличается от вычисляемого поля СКД?

Поле запроса считается на сервере СУБД в момент выполнения запроса и доступно в результате выборки. Поле СКД рассчитывается уже при формировании отчёта по формуле на языке выражений компоновки и может использовать итоговые данные. Для отчётов часто удобнее СКД — формулу можно менять без правки текста запроса.

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

Да. В УПОРЯДОЧИТЬ ПО и СГРУППИРОВАТЬ ПО допустимо указывать псевдоним вычисляемого поля. Исключение — агрегатные выражения: группировать по ним нельзя, только упорядочивать. Учтите, что сортировка по сложному выражению без индекса может заметно замедлить выполнение на больших таблицах.

Как вывести «Да/Нет» вместо значения типа Булево?

Через конструкцию ВЫБОР: ВЫБОР КОГДА Поле ТОГДА "Да" ИНАЧЕ "Нет" КОНЕЦ КАК ПризнакТекст. Это удобно для выгрузок и печатных форм, где булево представление «Истина/Ложь» нежелательно. Для отчётов на СКД аналогичный эффект даёт настройка формата поля.