При чтении и написании запросов в платформе 1С:Предприятие часто встречается конструкция вида 0 КАК Поле. Разберем детально, как работает эта синтаксическая конструкция, в каких сценариях она необходима и какие нюансы следует учитывать при ее использовании.
В языке запросов 1С выборка формируется путем перечисления необходимых полей через запятую. Если в списке полей указать литерал (например, число или строку), то для каждой строки результата запроса платформа вернет фиксированное значение.
Конструкция 0 КАК СвободныйОстаток означает следующее:
Посмотрим на простой пример выборки:
ВЫБРАТЬ
РазмещениеЗаказовПокупателейОстатки.КоличествоОстаток КАК КоличествоОстаток,
0 КАК СвободныйОстаток
ИЗ
РегистрНакопления.РазмещениеЗаказовПокупателей.Остатки КАК РазмещениеЗаказовПокупателейОстатки
В результате выполнения такого запроса колонка СвободныйОстаток во всех строках будет заполнена числом 0.
Рассмотрим практические сценарии, в которых программисты 1С добавляют подобные фиктивные поля в запросы.
1. Выравнивание структуры колонок при объединении запросов (ОБЪЕДИНИТЬ / ОБЪЕДИНИТЬ ВСЕ)
Чаще всего этот прием применяется, когда данные собираются из нескольких разнородных источников (например, из разных регистров или таблиц), где в одной таблице показатель существует, а в другой его нет. Для корректной работы оператора ОБЪЕДИНИТЬ необходимо, чтобы количество и порядок колонок во всех объединяемых ветках запроса совпадали.
Проанализируем пример объединения остатков из двух разных источников:
ВЫБРАТЬ
Номенклатура,
КоличествоОстаток КАК Количество,
0 КАК Резерв
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Номенклатура,
0 КАК Количество,
КоличествоОстаток КАК Резерв
ИЗ
РегистрНакопления.ТоварыВРезерве.Остатки
В первой ветке запроса данные по резервам отсутствуют, поэтому подставляется 0. Во второй ветке отсутствуют данные по общему количеству, и туда также передается 0. После объединения и последующей группировки можно легко получить итоговые суммы по каждому показателю с помощью агрегатной функции СУММА().
2. Корректность арифметических операций: разница между 0 и NULL
Использование нуля вместо отсутствующего значения или NULL принципиально важно при выполнении последующих математических действий. Если сложить число со значением NULL, результатом всегда будет NULL, что приведет к искажению данных в отчетах. При использовании 0 сложение выполняется корректно без необходимости вызывать дополнительную функцию ЕСТЬNULL().
Выясним причину возможной проблемы при простом указании литерала 0. При неявном задании нуля платформа 1С и СУБД могут автоматически определить тип колонки с минимальной разрядностью — Число(1, 0).
Это может повлечь за собой следующие ошибки:
0 КАК Поле помещается во временную таблицу (ПОМЕСТИТЬ), тип поля зафиксируется как Число(1, 0). При попытке записать в эту таблицу число больше 9 или дробное число возникнет ошибка либо произойдет потеря точности.ОБЪЕДИНИТЬ ВСЕ: если в первой ветке объединения указан литерал 0, а во второй — реальное дробное число, итоговый тип колонки может урезаться по первой ветке.Чтобы избежать проблем с разрядностью и точностью данных, рекомендуется явно указывать тип и длину числа с помощью оператора ВЫРАЗИТЬ.
Посмотрим на пример правильного оформления нулевого числового поля:
ВЫБРАТЬ
ВЫРАЗИТЬ(0 КАК ЧИСЛО(15, 2)) КАК СвободныйОстаток
Для количественных показателей, где требуется три знака после запятой, задаем соответствующую точность:
ВЫБРАТЬ
ВЫРАЗИТЬ(0 КАК ЧИСЛО(15, 3)) КАК КоличествоОстаток
Явное указание типа гарантирует корректную разрядность во временных таблицах, предотвращает потерю дробной части и исключает ошибки при объединении выборок.