Почему отчет в 1С:Бухгалтерия 3.0 на СКД получается пустым и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При переносе отчетов из старых редакций (например, Бухгалтерии предприятия 2.0) в новую версию 3.0 на базе управляемых форм и Системы компоновки данных (СКД), разработчики часто сталкиваются с загадочной ситуацией: запрос в консоли отрабатывает идеально и возвращает данные, но сам отчет в пользовательском режиме остается абсолютно пустым. Рассмотрим подробно причины этого поведения и разберем по шагам, как привести отчет в рабочее состояние.

Анализ проблемы: Консоль запросов vs СКД

Первое, что мы должны сделать, — это понять разницу между выполнением запроса в консоли и в механизме СКД. В консоли запросов мы вручную устанавливаем все параметры, и они жестко передаются в СУБД. В СКД же существует несколько уровней управления данными: сама схема (с ее параметрами), настройки пользователя и программный код в модуле отчета или формы. Если отчет пуст, значит, на одном из этих уровней происходит «потеря» или некорректная фильтрация данных.

Проанализируем типичный запрос, который используется для получения остатков по расчетам с контрагентами:


ВЫБРАТЬ
    Хозрасчетный.Счет КАК Счет,
    Хозрасчетный.Субконто1 КАК Контрагент,
    Хозрасчетный.Субконто2 КАК Договор,
    Хозрасчетный.СуммаОстаток КАК СуммаОстаток
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, , &ВидыСубконто, ) КАК Хозрасчетный
ГДЕ
    ВЫБОР
        КОГДА &Организация <> ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
            ТОГДА Хозрасчетный.Организация = &Организация
        ИНАЧЕ ИСТИНА
    КОНЕЦ

Причина №1: Флаг «Ограничение доступности» в параметрах

Выясним причину, по которой параметры могут не передаваться в запрос. Перейдем на закладку Параметры в схеме компоновки данных. Обратим внимание на колонку Ограничение доступности. Если этот флаг установлен для таких параметров, как &Дата, &Организация или &Счет62, то эти параметры становятся невидимыми для пользователя в настройках отчета.

Если при этом значения параметров не заданы программно или по умолчанию в самой схеме, СКД передает в запрос значение NULL или Неопределено. В результате условие в блоке ГДЕ или в параметрах виртуальной таблицы не выполняется, и выборка оказывается пустой. Чтобы исправить это, снимем ограничения доступности для тех полей, которые пользователь должен заполнять на форме, либо жестко зададим их значения в колонке Значение.

Причина №2: Отсутствие инициализации предопределенных счетов

В конфигурации 1С:Бухгалтерия 3.0 счета учета являются предопределенными элементами плана счетов. В запросах часто используются условия типа Счет В ИЕРАРХИИ (&Счет60). Рассмотрим ситуацию: если вы не передали в параметр &Счет60 конкретную ссылку на счет из плана счетов, СКД не поймет, по какой иерархии делать отбор.

Для решения этой проблемы рекомендуется использовать литералы прямо в тексте запроса или в выражениях параметров СКД. Вместо внешней передачи параметра можно написать так:


ВЫБОР
    КОГДА Хозрасчетный.Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками))
        ТОГДА Хозрасчетный.СуммаОстатокКт
    ИНАЧЕ 0
КОНЕЦ КАК Кредит

Это делает отчет более автономным и исключает ошибки, связанные с тем, что программист забыл проинициализировать параметр &Счет60 при открытии формы или в процедуре ПриКомпоновкеРезультата.

Причина №3: Параметры виртуальной таблицы и оптимизация

Разберем важный нюанс работы с виртуальными таблицами бухгалтерских регистров. В сообщении форума было верно отмечено, что фильтрация по организации в блоке ГДЕ крайне неэффективна. Посмотрим на правильный способ передачи параметров в виртуальную таблицу:


РегистрБухгалтерии.Хозрасчетный.Остатки(
    &Дата, 
    , 
    &ВидыСубконто, 
    Организация = &Организация
) КАК Хозрасчетный

Когда условие находится внутри скобок (в параметрах виртуальной таблицы), платформа 1С формирует SQL-запрос таким образом, что отбор происходит на уровне базы данных еще до получения промежуточных итогов. Если же условие стоит после слова ГДЕ, система сначала получит все остатки по всем организациям, и только потом начнет их фильтровать, что может привести к превышению времени ожидания или получению пустого результата из-за внутренних таймаутов на больших базах.

Причина №4: Работа с параметром «Виды субконто»

Проанализируем ситуацию с параметром &ВидыСубконто. В СКД при работе с бухгалтерскими регистрами этот параметр является массивом. Если вы обращаетесь к полям Субконто1 или Субконто2, их содержимое напрямую зависит от того, в каком порядке виды субконто переданы в параметр виртуальной таблицы.

Посмотрим на пример правильной настройки:

  1. В параметрах СКД создаем параметр ВидыСубконто.
  2. Устанавливаем тип значения ПланВидовХарактеристикСсылка.ВидыСубконтоХозрасчетные и включаем флаг Доступен список значений.
  3. В списке значений добавляем Контрагенты (будет Субконто1) и Договоры (будет Субконто2).

Если порядок будет нарушен или параметр не будет заполнен, обращение Хозрасчетный.Субконто1 вернет пустое значение, так как система не будет знать, из какого измерения регистра брать данные.

Причина №5: Особенности работы с датой в БП 3.0

Выясним причину «пустоты» отчета, связанную с периодом. В управляемом приложении часто используется стандартный период. Если в качестве параметра &Дата передается просто дата (например, 31.08.2018), то 1С трактует это как начало дня (00:00:00). Все документы, проведенные в течение этого дня, не попадут в остатки.

Чтобы отчет показывал корректные данные на конец дня, в СКД на закладке Параметры для поля &Дата в колонке Выражение следует прописать:

КонецПериода(&Дата, "День")

Использование оператора ВЫРАЗИТЬ

При переходе на БП 3.0 важно помнить о типизации. Поля Субконто имеют составной тип данных. При выполнении сложных запросов это может приводить к замедлению и ошибкам. Рекомендуем всегда явно приводить типы:


ВЫБРАТЬ
    ВЫРАЗИТЬ(Хозрасчетный.Субконто1 КАК Справочник.Контрагенты) КАК Контрагент,
    ВЫРАЗИТЬ(Хозрасчетный.Субконто2 КАК Справочник.Договоры) КАК Договор,
    Хозрасчетный.СуммаОстаток КАК СуммаОстаток
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, , , ) КАК Хозрасчетный

Этот подход гарантирует, что СКД будет корректно извлекать реквизиты объектов (например, ИНН контрагента или дату договора) и отчет не «упадет» с ошибкой пустого значения при разыменовании полей через точку.

Итоги и рекомендации

Подведем итог нашему исследованию. Если ваш отчет в БП 3.0 пустой, выполните следующие действия:

  1. Проверьте ограничения доступности в параметрах СКД и убедитесь, что все необходимые параметры (Организация, Дата, Счета) заполнены.
  2. Используйте ЗНАЧЕНИЕ(...) для предопределенных счетов прямо в запросе, чтобы избежать пустых параметров.
  3. Перенесите фильтры (по Организации, Счету) из секции ГДЕ в параметры виртуальной таблицы.
  4. Проверьте состав и порядок параметра ВидыСубконто.
  5. Убедитесь в правильности границы периода, используя функцию КонецПериода.

Соблюдение этих правил позволит вам быстро диагностировать и устранять проблемы с отображением данных в отчетах на базе СКД при миграции между конфигурациями.

← На главную