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