При разработке отчетов в системе 1С:Предприятие 8.3 (особенно в сложных конфигурациях типа БГУ 2) программисты часто сталкиваются с парадоксальной ситуацией: один и тот же запрос в «Консоли запросов» выводит корректные данные с заполненным полем Регистратор, а при запуске в виде внешнего отчета или программного кода это же поле оказывается пустым или содержит значение Неопределено. При этом числовые показатели (остатки и обороты) отображаются правильно.
В данной статье мы подробно разберем, почему так происходит, проанализируем влияние механизмов платформы на выборку данных и определим последовательность действий для исправления этой ошибки.
Рассмотрим пример запроса, который вызывает затруднения. Обычно это обращение к виртуальной таблице ОстаткиИОбороты регистра накопления с детализацией по периоду Регистратор. Проблема выглядит так: данные по суммам есть, связь по аналитике (например, по справочнику Иски) отрабатывает, но само поле регистратора не заполнено.
ВЫБРАТЬ
ЕСТЬNULL(ИскиФ.НачальныйОстаток, 0) КАК НачальныйОстаток,
ЕСТЬNULL(ИскиФ.КонечныйОстаток, 0) КАК КонечныйОстаток,
ЕСТЬNULL(ИскиФ.УдержаноПриход, 0) КАК Приход,
Иски.Контрагент КАК Контрагент,
ИскиФ.Регистратор КАК Регистратор
ИЗ
Справочник.Иски КАК Иски
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ИскиФ.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Регистратор, , ) КАК ИскиФ
ПО Иски.Ссылка = ИскиФ.Иск
Если при выполнении такого запроса вы видите пустые значения в колонке регистратора, хотя записи в регистре точно есть, стоит проверить несколько критических факторов.
Это самая частая причина «исчезновения» регистратора. Даже если у пользователя назначена роль Полные права, в конфигурациях на базе БСП (Библиотека стандартных подсистем) могут быть задействованы механизмы разграничения доступа, которые работают «поверх» стандартных прав платформы.
Проанализируем механику: когда платформа строит виртуальную таблицу ОстаткиИОбороты, она собирает данные из физических таблиц итогов и движений. Если у текущего пользователя нет прав на Чтение или Просмотр конкретных типов документов, которые являются регистраторами для данного регистра, поле Регистратор будет содержать NULL или Неопределено. При этом суммы будут показаны, так как право на чтение самого регистра накопления у пользователя есть.
Что нужно сделать:
Иногда проблема кроется в настройках самого объекта метаданных. Обратим внимание на свойство Стандартные команды. Хотя формально это свойство отвечает за отображение объекта в интерфейсе (команды открытия списков и т.д.), его изменение инициирует обновление внутренней структуры метаданных в базе данных.
Если поле Регистратор не выводится, попробуйте включить флаг Стандартные команды для регистра накопления и выполнить обновление конфигурации базы данных. В некоторых случаях это помогает платформе корректно перестроить связи в виртуальных таблицах.
Если в консоли запросов данные есть, а в отчете — нет, мы имеем дело с разницей в контексте выполнения. Консоль запросов часто работает в контексте сервера без лишних оберток, в то время как отчет может использовать механизмы СКД или программную обработку, где кэш играет большую роль.
Рассмотрим понятие динамического обновления (так называемого «демонического обновления»). Если структура регистра или его регистраторов менялась, а пользователи не перезапускали сеансы, сервер 1С может хранить старые описания типов. Это приводит к тому, что система «не понимает», какой тип данных должен быть в поле Регистратор, и возвращает пустоту.
Решение проблемы кэша:
Поле Регистратор является составным типом данных. Если в регистр могут писать десятки разных документов, платформе иногда требуется подсказка для корректного приведения типов, особенно если вы используете временные таблицы.
Попробуем принудительно типизировать поле в запросе. Это поможет выяснить, есть ли в поле хоть какие-то данные. Рассмотрим пример использования оператора ВЫРАЗИТЬ:
ВЫБРАТЬ
ИскиФ.НачальныйОстаток КАК НачальныйОстаток,
ВЫРАЗИТЬ(ИскиФ.Регистратор КАК Документ.ПриходныйКассовыйОрдер) КАК РегистраторПКО
ИЗ
РегистрНакопления.ИскиФ.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Регистратор, , ) КАК ИскиФ
Если после применения ВЫРАЗИТЬ данные по конкретному типу документа появились, значит, проблема в разыменовании составного типа. Если же по-прежнему Неопределено — значит, данные физически отсекаются на уровне доступа или фильтрации по периоду.
Выясним причину, связанную с параметрами виртуальной таблицы. В функции ОстаткиИОбороты третий параметр — это периодичность. Если вы указали Регистратор, платформа обязана выдать движения в разрезе документов. Однако, если период запроса (&ДатаНач и &ДатаКон) установлен некорректно (например, начало периода позже конца), или если за этот период нет именно движений (оборотов), а есть только остатки, то поле Регистратор для строк с остатками может быть пустым.
Совет: Проверьте, есть ли записи в физической таблице движений регистра за указанный период. Если там пусто — регистратору просто не откуда взяться в выборке ОстаткиИОбороты.
Если вы столкнулись с «исчезающим» регистратором, пройдите по следующим шагам:
%AppData%\1C\1cv8.Регистратор портят всю выборку).Как показывает практика, в большинстве случаев проблема решается либо настройкой прав RLS, либо простым ожиданием обновления серверного кэша (как и произошло в описанном случае на форуме).