При разработке отчетов в системе 1С:ERP на базе схемы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда отчет по документам (например, по «Реализации товаров и услуг») успешно выводит информацию, а аналогичный отчет, построенный на виртуальных таблицах остатков регистров накопления, возвращает пустую форму. Рассмотрим детально причины возникновения этой проблемы на примере регистра ТоварыКОтгрузке и разберем способы ее решения.
Одной из самых частых причин отсутствия данных в отчетах по остаткам является некорректная работа с параметрами периода. В СКД для виртуальных таблиц остатков по умолчанию создается параметр Период. Если в настройках отчета вы используете стандартный период (например, СтандартныйПериод с типом «Стандартный период»), необходимо убедиться, что он правильно связан с параметром виртуальной таблицы.
Проанализируем ситуацию: если в конструкторе запроса на закладке «Параметры» не указано выражение для периода виртуальной таблицы, СКД может подставить текущую дату или, в худшем случае, пустую дату. Если в регистре нет остатков на конкретную секунду, указанную в параметре, отчет будет пустым. Разберем по шагам, как это исправить:
Период. В поле «Выражение» для него следует указать границу периода, если используется стандартный интервал, например: &СтандартныйПериод.ДатаОкончания.
ВЫБРАТЬ
ТоварыКОтгрузкеОстатки.Склад,
ТоварыКОтгрузкеОстатки.Номенклатура,
ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток
ИЗ
РегистрНакопления.ТоварыКОтгрузке.Остатки({&Период}, ) КАК ТоварыКОтгрузкеОстатки
Важно понимать бизнес-логику регистра ТоварыКОтгрузке. В конфигурации 1С:ERP этот регистр является оперативным и «транзитным». Остатки в нем появляются в момент оформления распоряжения на отгрузку (например, заказа клиента или реализации товаров), но они существуют только до того момента, пока складская служба не оформит документ «Расходный ордер на товары».
Проанализируем жизненный цикл записи в этом регистре:
Таким образом, если процесс отгрузки по документу полностью завершен, остатков в таблице ТоварыКОтгрузке.Остатки по этой сделке просто не будет. Если вам нужно увидеть данные по уже совершенным отгрузкам, следует использовать таблицу оборотов или другие регистры, такие как «Выручка и себестоимость продаж».
В ERP доступность данных в регистрах часто жестко ограничена функциональными опциями. Если в настройках системы (НСИ и администрирование — Склад и доставка) выключена «Ордерная схема документооборота», то регистр ТоварыКОтгрузке может вообще не заполняться, даже если документы реализации проводятся. Выясним причину через проверку настроек склада:
Даже при наличии полных прав (роль «Полные права»), механизмы RLS (Access Level Security) в ERP могут накладывать ограничения. Посмотрим на ситуацию с точки зрения системы: если в запросе СКД происходит соединение нескольких таблиц, и к одной из них у пользователя нет доступа на уровне записей (например, по группе доступа «Склады»), платформа может «тихо» отсечь эти строки, не выдавая ошибки о недостаточности прав.
Проверьте следующие моменты:
ЛЕВОЕ СОЕДИНЕНИЕ и функцию ЕСТЬNULL(ПолеРегистра, 0). Это поможет увидеть, попадают ли в выборку хотя бы данные из документа.Рассмотрим еще одну техническую особенность СКД. Если флаг «Автозаполнение» в наборе данных включен, система сама пытается определить параметры и отборы. Однако для виртуальных таблиц это не всегда работает прозрачно. Попробуем явно указать параметры в тексте запроса, используя фигурные скобки. Это подскажет СКД, куда именно нужно накладывать пользовательские фильтры:
ВЫБРАТЬ
Регистр.Склад КАК Склад,
Регистр.Номенклатура КАК Номенклатура,
Регистр.КОтгрузкеОстаток КАК Количество
ИЗ
РегистрНакопления.ТоварыКОтгрузке.Остатки(&Период, {Склад.* КАК Склад, Номенклатура.* КАК Номенклатура}) КАК Регистр
Использование конструкции {} позволяет СКД более эффективно управлять условиями в виртуальных таблицах, что напрямую влияет на наличие данных в результирующей выборке.