Встречается довольно неприятная и нелогичная на первый взгляд ситуация: мы создаем отчет на Системе Компоновки Данных (СКД) на основе регистра накопления, выводим в него поле Регистратор, но вместо красивого названия документа видим пустую ячейку. Самое интересное, что если кликнуть по этой пустоте, система корректно открывает нужный документ-регистратор. Это означает, что ссылка на документ в данных есть, но ее текстовое представление по какой-то причине не отображается.
Такое поведение может сбить с толку, ведь кажется, что и данные на месте, и настройки отчета верны. Давайте вместе разберемся в возможных причинах этой проблемы и найдем решение, двигаясь от самых простых проверок к более сложным.
Прежде чем углубляться в дебри настроек СКД, нужно понять, где именно возникает проблема: на уровне получения данных или на уровне их отображения в отчете. Лучший способ это сделать — выполнить "чистый" запрос к базе данных, минуя СКД.
Для этого воспользуемся консолью запросов. Сформируем простейший запрос к виртуальной таблице ОстаткиИОбороты нашего регистра накопления, чтобы получить те же данные, что и в отчете.
Посмотрим на пример:
ВЫБРАТЬ
МойРегистрОстаткиИОбороты.Номенклатура КАК Номенклатура,
МойРегистрОстаткиИОбороты.Регистратор КАК Регистратор,
МойРегистрОстаткиИОбороты.КоличествоНачальныйОстаток,
МойРегистрОстаткиИОбороты.КоличествоПриход,
МойРегистрОстаткиИОбороты.КоличествоРасход,
МойРегистрОстаткиИОбороты.КоличествоКонечныйОстаток
ИЗ
РегистрНакопления.МойРегистр.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК МойРегистрОстаткиИОбороты
Выполняем этот запрос в консоли и смотрим на результат в колонке Регистратор.
Регистратор пустое, значит, проблема не в настройках СКД. Нужно копать глубже — в сторону данных или механизма формирования представления объекта. Переходим к шагу 3.Если запрос в консоли отработал верно, значит, "сырые" данные в порядке, и проблема кроется в том, как СКД их обрабатывает и выводит. Проанализируем основные точки, на которые стоит обратить внимание в настройках отчета.
Регистратор установите флаг в колонке "Роль" и поставьте галочку "Игнорировать значения NULL". Это поможет избежать вывода пустых строк в итогах, где регистратор не определен.Номенклатура, Склад) полезно установить роль "Измерение".ОстаткиИОбороты. У нее есть параметр "Периодичность". Часто там стоит значение Авто. В некоторых случаях, для более явного управления группировкой, попробуйте изменить его на Регистратор. Это заставит систему формировать обороты в разрезе каждого документа.
ОстаткиИОбороты возвращает не только обороты, но и строки с начальным/конечным остатком. В этих строках регистратор по определению пустой. Если они вам не нужны или мешают, их можно скрыть. Перейдите на вкладку "Настройки", добавьте отбор по полю Регистратор с условием "Заполнено".
Регистратор или для группировки по нему свой макет оформления. Иногда в макете может быть указан параметр расшифровки, но не указан параметр текстового представления, что и приводит к пустому значению в ячейке.
Это самая частая и неочевидная причина. Если даже в консоли запросов регистратор пуст, скорее всего, дело не в данных как таковых, а в том, как платформа формирует их текстовое представление.
Как это работает? Когда система выводит в отчет поле ссылочного типа (например, ДокументСсылка), она не показывает внутренний идентификатор, а запрашивает у объекта его строковое представление. Это представление может быть задано стандартно (в свойствах объекта метаданных) или формироваться программно в общем модуле.
Рассмотрим реальный пример, который и стал причиной обсуждения. В конфигурации "Управление торговлей 11.1" был доработан документ Ввод начальных остатков: в него добавили новый тип операции для ввода остатков по новому, самописному регистру.
В этой конфигурации представление документа Ввод начальных остатков формируется специальной функцией в одном из общих модулей. Эта функция анализирует тип операции документа и на его основе строит текст, например, "Ввод остатков (товары на складах)". Проблема была в том, что разработчик, добавив новый тип операции, забыл внести изменения в эту функцию. В итоге, когда функция получала документ с новым типом операции, она не находила нужной ветки в коде и возвращала пустую строку. Именно эту пустую строку и видели в отчете.
Как найти и исправить такую ошибку?
Это ключевой момент: ссылка на документ есть, но ее "текстовая обертка" — пустая.
Это крайний случай, но его тоже стоит проверить. Иногда из-за ошибок в коде проведения документа в движениях регистра в поле Регистратор может быть записано значение NULL или Неопределено. То есть ссылка на документ физически отсутствует в записи регистра.
Чтобы это проверить:
Регистратор.Если поле действительно пустое, значит, проблема в модуле объекта документа, в процедуре ОбработкаПроведения. Необходимо найти место, где формируются движения (объект Движения.МойРегистр), и убедиться, что документ записывает себя в качестве регистратора.
Таким образом, для решения проблемы с пустым регистратором в СКД важен последовательный подход. Начните с простого (проверка запроса), перейдите к настройкам отчета и, если это не помогло, будьте готовы к анализу программного кода, ведь часто дьявол кроется именно в таких деталях, как логика формирования представления объекта.