Разработка и Конфигурация · 10 мин
Как создать вычисляемое поле в запросе 1С
Разбираем, как создать вычисляемое поле в запросе 1С: синтаксис ВЫБОР, ВЫРАЗИТЬ, агрегатные функции, типичные ошибки и проверка результата в консоли.
Вычисляемое поле в запросе 1С — это колонка результата, значение которой не хранится в базе данных, а рассчитывается на лету из других полей: сумма с НДС, разница дат, признак просрочки, конкатенация строк. Такие поля позволяют перенести часть логики с уровня кода на уровень запроса, что ускоряет выборку и упрощает дальнейшую обработку данных.
Язык запросов 1С поддерживает арифметические операции, строковые функции, работу с датами, конструкцию ВЫБОР (аналог CASE), приведение типов через ВЫРАЗИТЬ и агрегатные функции с группировкой. Всё это комбинируется в секции ВЫБРАТЬ, а результат получает псевдоним через ключевое слово КАК.
Ниже разобраны основные приёмы создания вычисляемых полей с рабочими примерами кода, ограничения платформы, типичные ошибки и способы проверки результата до того, как запрос попадёт в отчёт или обработку.
Базовый синтаксис: выражение и псевдоним
Простейшее вычисляемое поле — арифметическое выражение над существующими полями таблицы. Выражение записывается прямо в списке выборки, а после него через КАК задаётся имя колонки, по которому к ней обращаются в коде или в СКД.
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.Количество КАК Количество,
Продажи.Сумма КАК Сумма,
Продажи.Сумма * 1.2 КАК СуммаСНДС,
Продажи.Сумма / Продажи.Количество КАК ЦенаЗаЕдиницу
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
Псевдоним обязателен, если к полю планируется обращение из кода (Выборка.СуммаСНДС) или из настроек отчёта. Без псевдонима платформа сама сгенерирует имя вида «Поле1», что делает запрос нечитаемым и ломает схему компоновки при изменении порядка полей.
В выражениях допустимы сложение, вычитание, умножение, деление, скобки и литералы. Деление на ноль в запросе 1С не вызывает исключения — результатом будет NULL, поэтому опасные делители стоит оборачивать в проверку через ВЫБОР.
Условная логика через конструкцию ВЫБОР
Конструкция ВЫБОР...КОГДА...ТОГДА...ИНАЧЕ...КОНЕЦ — аналог CASE в SQL. Она нужна, когда значение поля зависит от условия: категория клиента по объёму закупок, текстовый статус вместо числового кода, замена NULL на ноль.
ВЫБРАТЬ
Заказы.Контрагент КАК Контрагент,
ВЫБОР
КОГДА Заказы.Сумма >= 100000
ТОГДА "Крупный"
КОГДА Заказы.Сумма >= 10000
ТОГДА "Средний"
ИНАЧЕ "Мелкий"
КОНЕЦ КАК Категория,
ВЫБОР
КОГДА Заказы.ДатаОтгрузки < &ТекущаяДата
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК Просрочен
ИЗ
Документ.ЗаказКлиента КАК Заказы
Ветка ИНАЧЕ не обязательна, но без неё невыполнение всех условий вернёт NULL. Для числовых полей это часто нежелательно: NULL не участвует корректно в последующих сравнениях и агрегатах. Явно указывайте ИНАЧЕ 0 или ИНАЧЕ "" для строк.
Условия в КОГДА проверяются последовательно, срабатывает первое истинное. Поэтому диапазоны упорядочивайте от большего к меньшему, как в примере выше, иначе часть значений попадёт не в ту ветку.
Работа с NULL и функция ЕСТЬNULL
При левом соединении таблиц отсутствующие данные приходят как NULL. Если такое поле участвует в арифметике, результат тоже станет NULL — и итог по отчёту «потеряет» строку. Функция ЕСТЬNULL заменяет NULL на заданное значение прямо в вычисляемом поле.
ВЫБРАТЬ
Товары.Номенклатура КАК Номенклатура,
ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток,
ЕСТЬNULL(Остатки.КоличествоОстаток, 0) * Товары.Цена КАК СтоимостьОстатка
ИЗ
Справочник.Номенклатура КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
ПО Товары.Ссылка = Остатки.Номенклатура
ЕСТЬNULL принимает ровно два аргумента: проверяемое выражение и значение-замена. Типы должны быть совместимы — нельзя подставить строку вместо числа без предварительного приведения. Для цепочек замен (если первое NULL — взять второе, если и оно NULL — третье) функции вкладывают друг в друга.
Приведение типов и строковые операции
Функция ВЫРАЗИТЬ приводит значение к нужному типу: обрезает неограниченную строку до фиксированной длины, уточняет составной тип, задаёт точность числа. Это критично при группировках и соединениях по строковым полям — неограниченные строки в них участвовать не могут.
ВЫБРАТЬ
ВЫРАЗИТЬ(Товары.НаименованиеПолное КАК СТРОКА(150)) КАК Наименование,
Товары.Код + " / " + Товары.Артикул КАК КодАртикул,
ВЫРАЗИТЬ(Продажи.Сумма КАК ЧИСЛО(15, 2)) КАК СуммаОкругленная
ИЗ
Справочник.Номенклатура КАК Товары
Конкатенация строк выполняется оператором «+». Помните: если любой из операндов — NULL, вся строка станет NULL, поэтому соединяйте через ЕСТЬNULL. Для дат и чисел перед склейкой со строкой может потребоваться представление — в чистом языке запросов его возможности ограничены, поэтому сложное форматирование часто выносят в код после выборки.
Полезные строковые функции языка запросов: ПОДСТРОКА (вырезать часть строки), ДЛИНАСТРОКИ (длина), СОКРЛ/СОКРП/СОКРЛП (удаление пробелов). Они комбинируются с ВЫРАЗИТЬ и ВЫБОР в одном вычисляемом поле.
Даты и агрегатные вычисления
Для дат доступны функции ДОБАВИТЬКДАТЕ и РАЗНОСТЬДАТ, а также извлечение частей: ГОД, МЕСЯЦ, ДЕНЬ, НАЧАЛОПЕРИОДА, КОНЕЦПЕРИОДА. Типичное вычисляемое поле — количество дней просрочки или дата оплаты по условиям договора.
ВЫБРАТЬ
Реализация.Контрагент КАК Контрагент,
РАЗНОСТЬДАТ(Реализация.ДатаОплаты, &ТекущаяДата, ДЕНЬ) КАК ДнейПросрочки,
ДОБАВИТЬКДАТЕ(Реализация.Дата, ДЕНЬ, Реализация.СрокОплаты) КАК ПлановаяДатаОплаты
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
Агрегатные функции СУММА, КОЛИЧЕСТВО, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ тоже образуют вычисляемые поля, но требуют группировки: все неагрегатные поля списка ВЫБРАТЬ должны попасть в СГРУППИРОВАТЬ ПО. Разница СУММА(А) - СУММА(Б) считается корректно прямо в агрегатном выражении.
ВЫБРАТЬ
Продажи.Менеджер КАК Менеджер,
СУММА(Продажи.Сумма) КАК Оборот,
СУММА(Продажи.Сумма) - СУММА(Продажи.Себестоимость) КАК Маржа,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Контрагент) КАК ЧислоКлиентов
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
СГРУППИРОВАТЬ ПО
Продажи.Менеджер
- 1Определите, из каких полей и по какой формуле считается новое значение
- 2Добавьте выражение в секцию ВЫБРАТЬ после исходных полей
- 3Обработайте NULL через ЕСТЬNULL и задайте тип через ВЫРАЗИТЬ при необходимости
- 4Присвойте понятный псевдоним через КАК
- 5Выполните запрос в консоли запросов и проверьте значения на реальных данных
- 6Убедитесь, что итоги и группировки не исказились после добавления поля
Проверка результата и ограничения
Перед переносом запроса в модуль отчёта выполните его в консоли запросов (внешней обработке или встроенной в EDT/конфигуратор). Проверяйте три вещи: вычисляемое поле присутствует в результате, значения соответствуют ручному пересчёту на нескольких строках, итоги по группам не изменились после добавления поля.
Ограничения, о которых стоит помнить. Вычисляемое поле нельзя использовать в секции ГДЕ того же запроса по псевдониму — условие придётся продублировать полным выражением или вынести во временную таблицу. В итогах (ИТОГИ ПО) по вычисляемому полю группировать можно, но производительность на больших объёмах проседает. Не все функции доступны во всех режимах совместимости — проверяйте синтакс-помощник под свою версию платформы.
Если выражение становится громоздким (вложенные ВЫБОР в три-четыре уровня), рассмотрите альтернативу: вычисляемое поле в СКД на закладке «Вычисляемые поля», ресурсы с произвольными выражениями или расчёт уже в коде после выборки. Запрос должен оставаться читаемым — это снижает цену ошибки при доработках.
Где считать значение
Подходит для простой арифметики, ВЫБОР и агрегатов; быстро, но сложная логика загромождает запрос
Подходит для отчётов: выражение задаётся на языке выражений СКД, легко менять без правки запроса; ограничен набор функций
Максимальная гибкость и доступ к любым функциям платформы; медленнее на больших выборках и требует обхода результата
Как проверить результат
Совпадают с ручным пересчётом на контрольных строках
NULL там, где ожидалось число, или значения смещены по веткам ВЫБОР
Суммы по группам и общий итог не изменились после добавления поля
Строки пропали из результата или итоги удвоились
Тип соответствует ожиданию (число с нужной точностью, строка заданной длины)
Составной тип или неограниченная строка мешают группировке и соединениям
Что важно запомнить
Вычисляемое поле — это выражение в секции ВЫБРАТЬ с псевдонимом через КАК. Используйте ВЫБОР для условий, ЕСТЬNULL для защиты от NULL, ВЫРАЗИТЬ для типов и всегда проверяйте результат в консоли запросов на реальных данных до включения в отчёт.
Частые вопросы
Можно ли использовать вычисляемое поле в условии ГДЕ того же запроса?
По псевдониму — нет: секция ГДЕ выполняется до формирования списка выборки. Нужно либо повторить полное выражение в условии, либо поместить выборку с вычисляемым полем во временную таблицу или вложенный запрос и фильтровать уже её.
Почему в вычисляемом поле появляется NULL, хотя исходные данные заполнены?
Чаще всего причина в левом соединении: для строк без пары в присоединяемой таблице поля равны NULL, и любая арифметика с ними даёт NULL. Оберните такие поля в ЕСТЬNULL(Поле, 0). Также проверьте, не сравниваете ли вы значение с NULL через «=» — такое условие всегда ложно.
Как округлить число в вычисляемом поле запроса?
Отдельной функции округления в языке запросов нет. Используйте ВЫРАЗИТЬ(Значение КАК ЧИСЛО(15, 2)) — приведение типа отбросит лишние знаки. Для округления до целого по арифметическим правилам применяют приём с добавлением 0.5 и последующим приведением, либо выполняют округление в коде после выборки.
Чем вычисляемое поле запроса отличается от вычисляемого поля СКД?
Поле запроса считается на сервере СУБД в момент выполнения запроса и доступно в результате выборки. Поле СКД рассчитывается уже при формировании отчёта по формуле на языке выражений компоновки и может использовать итоговые данные. Для отчётов часто удобнее СКД — формулу можно менять без правки текста запроса.
Можно ли сортировать и группировать результат по вычисляемому полю?
Да. В УПОРЯДОЧИТЬ ПО и СГРУППИРОВАТЬ ПО допустимо указывать псевдоним вычисляемого поля. Исключение — агрегатные выражения: группировать по ним нельзя, только упорядочивать. Учтите, что сортировка по сложному выражению без индекса может заметно замедлить выполнение на больших таблицах.
Как вывести «Да/Нет» вместо значения типа Булево?
Через конструкцию ВЫБОР: ВЫБОР КОГДА Поле ТОГДА "Да" ИНАЧЕ "Нет" КОНЕЦ КАК ПризнакТекст. Это удобно для выгрузок и печатных форм, где булево представление «Истина/Ложь» нежелательно. Для отчётов на СКД аналогичный эффект даёт настройка формата поля.