Часто при разработке отчетов в конфигурации 1С:Бухгалтерия 3.0 мы сталкиваемся с ситуацией, когда нужно получить информацию о движениях товаров (по складам и номенклатуре), но напрямую из документов мы это сделать не можем из-за ограничений прав доступа пользователей (RLS). Посмотрим на регистры накопления и обнаружим, что нужных данных там может не оказаться, так как основная жизнь в БП 3.0 протекает в регистре бухгалтерии Хозрасчетный. Однако, открыв его, мы не увидим привычных измерений Склад или Номенклатура. Разберем по шагам, как правильно извлекать эти данные для построения отчетов.
В отличие от регистров накопления, где измерения жестко заданы в структуре метаданных, в регистре бухгалтерии аналитика хранится в виде субконто. Чтобы понять, где именно лежат данные, рассмотрим план счетов (например, счета 10 "Материалы" или 41 "Товары"). Мы увидим, что на этих счетах настроены виды субконто: Номенклатура, Склад, Партии.
Для получения этих данных в запросе проанализируем виртуальные таблицы регистра бухгалтерии. Система предоставляет нам таблицы Остатки, Обороты, ОстаткиИОбороты и ДвиженияССубконто. В них присутствуют поля Субконто1, Субконто2, Субконто3.
Чтобы отчет работал корректно и колонки имели понятные названия (а также для оптимизации запроса), в параметрах виртуальной таблицы настоятельно рекомендуется явно указывать массив видов субконто. Выясним, как это выглядит на практике:
// Пример передачи массива видов субконто в параметры виртуальной таблицы
ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура),
ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады)
Рассмотрим ситуацию, когда необходимо вывести информацию о количестве и сумме товара с излишком или недостачей по результатам инвентаризации, причем документы пользователю недоступны.
Поскольку мы опираемся на проводки, проанализируем, как отражаются эти операции:
Для построения отчета применим виртуальную таблицу Хозрасчетный.Обороты. В качестве условия зададим фильтр по корреспондирующим счетам (поле КорСчет). Это позволит четко отделить результаты инвентаризации (списания и оприходования) от обычных продаж, перемещений между складами или производственных списаний.
Разберем подробнее задачу, где нужно вывести информацию обо всех поступлениях топлива на выбранной заправке, их цены, а также вычислить среднюю цену на дату поступления и цену ближайшего предыдущего поступления.
Хозрасчетный.Обороты. Задаем условие: Дебет счета 10.03 ("Топливо") и Кредит счета 60 ("Расчеты с поставщиками"). Это даст нам список всех партий, пришедших от контрагентов.Хозрасчетный.Остатки. Соединение производим на дату каждой конкретной операции (поле Период). Средняя цена вычисляется как отношение ресурса СуммаОстаток к ресурсу КоличествоОстаток.Период < ПериодТекущегоПоступления. Затем группируем результат, находим МАКСИМУМ(Период) и по этой дате подтягиваем цену прошлого поступления.Мы выяснили, как собрать данные из регистра, но критически важно учесть права доступа пользователей. Если у роли стоит запрет на чтение документов поступления или списания, то при выводе регистратора в отчет пользователь увидит "Объект не найден" или получит ошибку прав доступа.
Рассмотрим два пути решения этой проблемы:
ВЫБРАТЬ РАЗРЕШЕННЫЕ в самом начале текста запроса. Это предотвратит ошибки при формировании отчета, отсекая недоступные записи.УстановитьПривилегированныйРежим(Истина). В этом режиме платформа проигнорирует RLS, соберет нужные данные. Важно: выводите документ в макет отчета не как ссылку, а как строку (например, "Поступление №5 от 10.10.2023"), чтобы исключить попытки кликнуть и открыть недоступный объект.В качестве альтернативы для простых задач без сложной логики (где права все же позволяют видеть документы) можно рассмотреть типовой функционал Универсальный отчет, где можно гибко настроить группировки прямо по реквизитам документов, не прибегая к программированию.