При переносе отчетов из старых редакций (например, Бухгалтерии предприятия 2.0) в новую версию 3.0 на базе управляемых форм и Системы компоновки данных (СКД), разработчики часто сталкиваются с загадочной ситуацией: запрос в консоли отрабатывает идеально и возвращает данные, но сам отчет в пользовательском режиме остается абсолютно пустым. Рассмотрим подробно причины этого поведения и разберем по шагам, как привести отчет в рабочее состояние.
Первое, что мы должны сделать, — это понять разницу между выполнением запроса в консоли и в механизме СКД. В консоли запросов мы вручную устанавливаем все параметры, и они жестко передаются в СУБД. В СКД же существует несколько уровней управления данными: сама схема (с ее параметрами), настройки пользователя и программный код в модуле отчета или формы. Если отчет пуст, значит, на одном из этих уровней происходит «потеря» или некорректная фильтрация данных.
Проанализируем типичный запрос, который используется для получения остатков по расчетам с контрагентами:
ВЫБРАТЬ
Хозрасчетный.Счет КАК Счет,
Хозрасчетный.Субконто1 КАК Контрагент,
Хозрасчетный.Субконто2 КАК Договор,
Хозрасчетный.СуммаОстаток КАК СуммаОстаток
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, , &ВидыСубконто, ) КАК Хозрасчетный
ГДЕ
ВЫБОР
КОГДА &Организация <> ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
ТОГДА Хозрасчетный.Организация = &Организация
ИНАЧЕ ИСТИНА
КОНЕЦ
Выясним причину, по которой параметры могут не передаваться в запрос. Перейдем на закладку Параметры в схеме компоновки данных. Обратим внимание на колонку Ограничение доступности. Если этот флаг установлен для таких параметров, как &Дата, &Организация или &Счет62, то эти параметры становятся невидимыми для пользователя в настройках отчета.
Если при этом значения параметров не заданы программно или по умолчанию в самой схеме, СКД передает в запрос значение NULL или Неопределено. В результате условие в блоке ГДЕ или в параметрах виртуальной таблицы не выполняется, и выборка оказывается пустой. Чтобы исправить это, снимем ограничения доступности для тех полей, которые пользователь должен заполнять на форме, либо жестко зададим их значения в колонке Значение.
В конфигурации 1С:Бухгалтерия 3.0 счета учета являются предопределенными элементами плана счетов. В запросах часто используются условия типа Счет В ИЕРАРХИИ (&Счет60). Рассмотрим ситуацию: если вы не передали в параметр &Счет60 конкретную ссылку на счет из плана счетов, СКД не поймет, по какой иерархии делать отбор.
Для решения этой проблемы рекомендуется использовать литералы прямо в тексте запроса или в выражениях параметров СКД. Вместо внешней передачи параметра можно написать так:
ВЫБОР
КОГДА Хозрасчетный.Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками))
ТОГДА Хозрасчетный.СуммаОстатокКт
ИНАЧЕ 0
КОНЕЦ КАК Кредит
Это делает отчет более автономным и исключает ошибки, связанные с тем, что программист забыл проинициализировать параметр &Счет60 при открытии формы или в процедуре ПриКомпоновкеРезультата.
Разберем важный нюанс работы с виртуальными таблицами бухгалтерских регистров. В сообщении форума было верно отмечено, что фильтрация по организации в блоке ГДЕ крайне неэффективна. Посмотрим на правильный способ передачи параметров в виртуальную таблицу:
РегистрБухгалтерии.Хозрасчетный.Остатки(
&Дата,
,
&ВидыСубконто,
Организация = &Организация
) КАК Хозрасчетный
Когда условие находится внутри скобок (в параметрах виртуальной таблицы), платформа 1С формирует SQL-запрос таким образом, что отбор происходит на уровне базы данных еще до получения промежуточных итогов. Если же условие стоит после слова ГДЕ, система сначала получит все остатки по всем организациям, и только потом начнет их фильтровать, что может привести к превышению времени ожидания или получению пустого результата из-за внутренних таймаутов на больших базах.
Проанализируем ситуацию с параметром &ВидыСубконто. В СКД при работе с бухгалтерскими регистрами этот параметр является массивом. Если вы обращаетесь к полям Субконто1 или Субконто2, их содержимое напрямую зависит от того, в каком порядке виды субконто переданы в параметр виртуальной таблицы.
Посмотрим на пример правильной настройки:
ВидыСубконто.Субконто1) и Договоры (будет Субконто2).Если порядок будет нарушен или параметр не будет заполнен, обращение Хозрасчетный.Субконто1 вернет пустое значение, так как система не будет знать, из какого измерения регистра брать данные.
Выясним причину «пустоты» отчета, связанную с периодом. В управляемом приложении часто используется стандартный период. Если в качестве параметра &Дата передается просто дата (например, 31.08.2018), то 1С трактует это как начало дня (00:00:00). Все документы, проведенные в течение этого дня, не попадут в остатки.
Чтобы отчет показывал корректные данные на конец дня, в СКД на закладке Параметры для поля &Дата в колонке Выражение следует прописать:
КонецПериода(&Дата, "День")
При переходе на БП 3.0 важно помнить о типизации. Поля Субконто имеют составной тип данных. При выполнении сложных запросов это может приводить к замедлению и ошибкам. Рекомендуем всегда явно приводить типы:
ВЫБРАТЬ
ВЫРАЗИТЬ(Хозрасчетный.Субконто1 КАК Справочник.Контрагенты) КАК Контрагент,
ВЫРАЗИТЬ(Хозрасчетный.Субконто2 КАК Справочник.Договоры) КАК Договор,
Хозрасчетный.СуммаОстаток КАК СуммаОстаток
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, , , ) КАК Хозрасчетный
Этот подход гарантирует, что СКД будет корректно извлекать реквизиты объектов (например, ИНН контрагента или дату договора) и отчет не «упадет» с ошибкой пустого значения при разыменовании полей через точку.
Подведем итог нашему исследованию. Если ваш отчет в БП 3.0 пустой, выполните следующие действия:
ГДЕ в параметры виртуальной таблицы.ВидыСубконто.КонецПериода.Соблюдение этих правил позволит вам быстро диагностировать и устранять проблемы с отображением данных в отчетах на базе СКД при миграции между конфигурациями.