Почему не выводятся данные в отчете СКД при указании контрагента: разбираем причины и решения

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

При разработке отчетов на системе компоновки данных (СКД), работающих с регистрами бухгалтерии, программисты часто сталкиваются с ситуацией: без отбора по контрагенту отчет формируется корректно, но стоит выбрать конкретное значение в параметрах — и результат становится пустым. Особенно часто это происходит при работе со счетами учета ТМЦ, переданных на сторону (например, счет 10.07 "Материалы, переданные в переработку").

В этой статье мы подробно проанализируем, почему так происходит, и рассмотрим пошаговые инструкции по исправлению этой ошибки.

Разберем исходную ситуацию

Рассмотрим типовой запрос, который часто становится источником проблем:


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

На первый взгляд запрос выглядит логично, однако при его выполнении в СКД данные пропадают. Выясним основные причины.

Причина 1. Несоответствие номеров субконто

Проанализируем структуру счета 10.07 в типовой конфигурации «1С:Бухгалтерия». Порядок субконто на этом счете следующий:

  1. Субконто1 — Контрагенты;
  2. Субконто2 — Номенклатура;
  3. Субконто3 — Договоры.

Важный нюанс: если в пользовательском режиме (в режиме «1С:Предприятие») кто-то из пользователей или администраторов изменил порядок субконто в плане счетов, то обращение Субконто1 в запросе перестанет соответствовать контрагенту. Система будет пытаться сравнить ссылку на справочник Контрагенты с данными другого типа (например, Номенклатура), что приведет к пустому результату.

Решение: всегда проверяйте актуальный порядок субконто непосредственно в плане счетов конкретной информационной базы.

Причина 2. Ошибки разыменования полей через точку

Посмотрим на поле в запросе: ХозрасчетныйОстаткиИОбороты.Субконто3.ДоговорКонтрагента. Если Субконто3 на счете 10.07 — это уже справочник ДоговорыКонтрагентов, то попытка получить у него реквизит ДоговорКонтрагента (обращение к самому себе через несуществующий реквизит) может привести к ошибке исполнения запроса в СКД.

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

ХозрасчетныйОстаткиИОбороты.Субконто3 КАК Договор

Причина 3. Типизация параметра в СКД

Выясним, как настроен параметр &Контрагент на вкладке "Параметры" в схеме компоновки данных. Часто программисты забывают указать конкретный тип данных для параметра.

Проанализируем последствия: если тип параметра оставлен "пустым" или выбран как "Объект", то при передаче значения из формы отчета СКД может неверно сопоставить типы на уровне SQL-запроса. Субконто в регистрах бухгалтерии имеют тип Характеристика.ВидыСубконтоХозрасчетные. Для корректного сравнения система должна четко понимать, что вы передаете СправочникСсылка.Контрагенты.

Что нужно сделать:

  1. Откройте вкладку "Параметры" в СКД.
  2. Найдите параметр Контрагент.
  3. В колонке "Тип" строго укажите СправочникСсылка.Контрагенты.

Причина 4. Ограничение доступности и использование в настройках

Иногда параметр задан в запросе, но не выведен в пользовательские настройки или ограничен флажком "Ограничение доступности". Если вы используете параметр внутри виртуальной таблицы, как в нашем примере (Субконто1 = &Контрагент), убедитесь, что:

Если пользователь выбирает контрагента не через параметр, а через стандартный Отбор СКД, то условие внутри виртуальной таблицы Субконто1 = &Контрагент все равно будет требовать заполнения. Если параметр при этом пуст (равен пустой ссылке), отчет ничего не покажет, так как СКД будет искать движения с пустым контрагентом.

Причина 5. Проблема иерархии

Рассмотрим ситуацию, когда пользователь выбирает в отчете не конкретного контрагента, а папку (группу) контрагентов. В тексте запроса использован оператор = (равно): Субконто1 = &Контрагент.

В 1С оператор сравнения "равно" не включает в себя вложенные элементы групп. Если выбрана группа, запрос будет искать записи, где в поле Субконто1 записана именно эта группа, что для проводок невозможно (в проводках всегда только элементы).

Решение: используйте оператор В ИЕРАРХИИ, чтобы отчет работал корректно как для элементов, так и для групп:

Субконто1 В ИЕРАРХИИ (&Контрагент)

Причина 6. Особенности работы с NULL и пустыми значениями

Если в базе данных есть проводки по счету 10.07, где контрагент по какой-то причине не заполнен (хотя это субконто обычно обязательное), жесткий фильтр в параметрах виртуальной таблицы отсечет такие записи. Чтобы проверить, в этом ли проблема, попробуйте временно убрать фильтр из параметров виртуальной таблицы и наложить его на вкладке "Настройки" - "Отбор". СКД умеет более гибко транслировать такие условия, в том числе оптимизировать их для виртуальных таблиц через механизм "Автозаполнение".

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

Для гарантированного решения проблемы выполните следующие шаги:

  1. Проверьте в конфигураторе или в плане счетов Хозрасчетный, что Контрагент действительно является первым субконто на счете.
  2. В параметрах СКД установите для &Контрагент тип СправочникСсылка.Контрагенты.
  3. Убедитесь, что параметр не является "пустой ссылкой" при формировании.
  4. Вместо жесткого условия в тексте запроса Субконто1 = &Контрагент попробуйте использовать возможности СКД по автоматической передаче отборов в виртуальные таблицы. Для этого достаточно оставить запрос без условия в параметрах ВТ, но включить "Автозаполнение".

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

← На главную