При разработке отчетов в системе «1С:Предприятие» часто возникает задача разделить данные из одной таблицы (например, регистра накопления) на несколько колонок в зависимости от условий: типа документа, вида движения или конкретного реквизита. Рассмотрим ситуацию, когда необходимо получить отчет по взаиморасчетам, где в отдельных столбцах будут отображены «Оплата по кассе», «Безналичная оплата» и «Начисление за проживание».
Разберем по шагам, как правильно составить такой запрос, избежать пустых колонок и оптимизировать производительность системы. Проанализируем типичные ошибки, с которыми сталкиваются как начинающие, так и опытные разработчики.
В исходном варианте запроса используется конструкция ВЫБОР КОГДА ... ТОГДА. Однако при её написании часто забывают о нескольких критически важных моментах, которые приводят к «пустым» результатам в отчете.
Рассмотрим пример логики, которая часто приводит к ошибкам:
ВЫБОР
КОГДА Поступление.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
И Поступление.Основание ССЫЛКА Документ.ПКОпроживание
ТОГДА Поступление.Сумма
КОНЕЦ КАК Касса
Выясним причину, почему этот код может работать некорректно. Если условие КОГДА не выполняется, система возвращает значение NULL. В языке запросов 1С значение NULL не является числом, поэтому любые арифметические операции с ним (например, расчет итогов или сальдо) могут привести к непредсказуемым результатам или пустоте в ячейках отчета.
Решение: Всегда добавляйте конструкцию ИНАЧЕ 0 внутри блока ВЫБОР. Это гарантирует, что в каждой строке будет числовое значение, даже если условие не подошло. Кроме того, рекомендуется оборачивать всё выражение в функцию ЕСТЬNULL, чтобы застраховаться от пустых значений при соединении таблиц.
Если мы просто выберем записи из регистра, то для одного и того же физического лица мы получим столько строк, сколько было движений в регистре. В одной строке будет заполнена колонка «Касса», а в остальных — нули. Чтобы объединить эти данные в одну красивую строку по каждому человеку, необходимо использовать агрегатные функции и группировку.
Разберем, как это реализовать. В секции ВЫБРАТЬ мы должны применить функцию СУММА() ко всем числовым полям, а в конце запроса добавить секцию СГРУППИРОВАТЬ ПО, перечислив в ней все нечисловые поля (ФизЛицо, Контрагент и т.д.).
Посмотрим на пример правильной структуры запроса:
ВЫБРАТЬ
Взаиморасчеты.ФизЛицо КАК ФизЛицо,
СУММА(ВЫБОР
КОГДА Взаиморасчеты.Регистратор ССЫЛКА Документ.ПКОпроживание
ТОГДА Взаиморасчеты.Сумма
ИНАЧЕ 0
КОНЕЦ) КАК Касса,
СУММА(ВЫБОР
КОГДА Взаиморасчеты.Регистратор ССЫЛКА Документ.Оплата
ТОГДА Взаиморасчеты.Сумма
ИНАЧЕ 0
КОНЕЦ) КАК Оплата,
СУММА(ВЫБОР
КОГДА Взаиморасчеты.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ТОГДА Взаиморасчеты.Сумма
ИНАЧЕ 0
КОНЕЦ) КАК Проживание
ИЗ
РегистрНакопления.ВзаиморасчетыПроживание КАК Взаиморасчеты
ГДЕ
Взаиморасчеты.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
СГРУППИРОВАТЬ ПО
Взаиморасчеты.ФизЛицо
Проанализируем производительность. Обращение напрямую к таблице РегистрНакопления.ВзаиморасчетыПроживание (физическая таблица) заставляет сервер базы данных сканировать все записи. Если база данных большая, отчет будет работать крайне медленно.
Для построения отчетов в 1С 8.3 рекомендуется использовать виртуальные таблицы, такие как .Обороты. Платформа рассчитывает их заранее, что значительно ускоряет выборку данных.
Посмотрим, как изменится наш запрос при использовании виртуальной таблицы:
РегистрНакопления.ВзаиморасчетыПроживание.Обороты(&Начало, &Конец, , ).ГДЕ, что гораздо эффективнее.СуммаПриход и СуммаРасход, что упрощает логику разделения на оплату и начисление.В исходном вопросе автор использовал конструкцию ТИПЗНАЧЕНИЯ(Поступление.Основание) = ТИП(Документ.ПКОпроживание). Проанализируем этот подход. Хотя он рабочий, в языке запросов 1С существует более элегантный и быстрый оператор — ССЫЛКА.
Использование ССЫЛКА позволяет серверу БД выполнять проверку типов более оптимально. Кроме того, это сокращает код и делает его более читаемым для других программистов.
Также важно убедиться, что поле, по которому идет проверка (в нашем случае Основание или Регистратор), действительно заполнено в регистре. Если в конфигурации не установлена проверка на заполнение этих реквизитов, пустые значения приведут к тому, что условия КОГДА никогда не сработают.
Если запрос в консоли запросов возвращает правильные цифры, а в самом отчете колонки остаются пустыми, проблема кроется в выводе данных. Рассмотрим основные причины:
Подводя итог, можно составить краткий чек-лист для создания надежного отчета с разделением по колонкам:
СУММА() и СГРУППИРОВАТЬ ПО для объединения данных.ИНАЧЕ 0 в конструкции ВЫБОР.ССЫЛКА для проверки типа документа-регистратора или основания..Обороты для ускорения работы.Соблюдение этих правил позволит вам создавать быстрые и безошибочные отчеты, которые корректно отображают финансовую информацию предприятия.