Почему в отчете на СКД поле "Регистратор" пустое, хотя сам документ есть?

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

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

Такое поведение может сбить с толку, ведь кажется, что и данные на месте, и настройки отчета верны. Давайте вместе разберемся в возможных причинах этой проблемы и найдем решение, двигаясь от самых простых проверок к более сложным.

Шаг 1: Изолируем проблему — проверяем запрос

Прежде чем углубляться в дебри настроек СКД, нужно понять, где именно возникает проблема: на уровне получения данных или на уровне их отображения в отчете. Лучший способ это сделать — выполнить "чистый" запрос к базе данных, минуя СКД.

Для этого воспользуемся консолью запросов. Сформируем простейший запрос к виртуальной таблице ОстаткиИОбороты нашего регистра накопления, чтобы получить те же данные, что и в отчете.

Посмотрим на пример:


ВЫБРАТЬ
    МойРегистрОстаткиИОбороты.Номенклатура КАК Номенклатура,
    МойРегистрОстаткиИОбороты.Регистратор КАК Регистратор,
    МойРегистрОстаткиИОбороты.КоличествоНачальныйОстаток,
    МойРегистрОстаткиИОбороты.КоличествоПриход,
    МойРегистрОстаткиИОбороты.КоличествоРасход,
    МойРегистрОстаткиИОбороты.КоличествоКонечныйОстаток
ИЗ
    РегистрНакопления.МойРегистр.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК МойРегистрОстаткиИОбороты

Выполняем этот запрос в консоли и смотрим на результат в колонке Регистратор.

Шаг 2: Проверяем настройки отчета в СКД

Если запрос в консоли отработал верно, значит, "сырые" данные в порядке, и проблема кроется в том, как СКД их обрабатывает и выводит. Проанализируем основные точки, на которые стоит обратить внимание в настройках отчета.

  1. Роли полей. В настройках набора данных СКД для каждого поля можно задать роль. Это помогает системе лучше понимать, как обращаться с данными, особенно при расчете итогов.
    • Для поля Регистратор установите флаг в колонке "Роль" и поставьте галочку "Игнорировать значения NULL". Это поможет избежать вывода пустых строк в итогах, где регистратор не определен.
    • Для полей-измерений (например, Номенклатура, Склад) полезно установить роль "Измерение".
  2. Параметры виртуальной таблицы. В запросе СКД используется виртуальная таблица ОстаткиИОбороты. У нее есть параметр "Периодичность". Часто там стоит значение Авто. В некоторых случаях, для более явного управления группировкой, попробуйте изменить его на Регистратор. Это заставит систему формировать обороты в разрезе каждого документа.
  3. Отбор для исключения итоговых строк. Виртуальная таблица ОстаткиИОбороты возвращает не только обороты, но и строки с начальным/конечным остатком. В этих строках регистратор по определению пустой. Если они вам не нужны или мешают, их можно скрыть. Перейдите на вкладку "Настройки", добавьте отбор по полю Регистратор с условием "Заполнено".
  4. Пользовательские макеты. Проверьте, не задан ли для поля Регистратор или для группировки по нему свой макет оформления. Иногда в макете может быть указан параметр расшифровки, но не указан параметр текстового представления, что и приводит к пустому значению в ячейке.

Шаг 3: Ищем корень зла — проблема в программном представлении документа

Это самая частая и неочевидная причина. Если даже в консоли запросов регистратор пуст, скорее всего, дело не в данных как таковых, а в том, как платформа формирует их текстовое представление.

Как это работает? Когда система выводит в отчет поле ссылочного типа (например, ДокументСсылка), она не показывает внутренний идентификатор, а запрашивает у объекта его строковое представление. Это представление может быть задано стандартно (в свойствах объекта метаданных) или формироваться программно в общем модуле.

Рассмотрим реальный пример, который и стал причиной обсуждения. В конфигурации "Управление торговлей 11.1" был доработан документ Ввод начальных остатков: в него добавили новый тип операции для ввода остатков по новому, самописному регистру.

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

Как найти и исправить такую ошибку?

  1. Определите точный тип документа, который выступает регистратором в проблемных строках.
  2. Откройте конфигуратор и найдите этот документ в дереве метаданных.
  3. Используйте глобальный поиск по конфигурации, чтобы найти, где формируется его представление. Ищите по названию документа и ключевым словам, таким как "Представление", "ПолучитьПредставление". Часто такой код находится в общих серверных модулях, отвечающих за работу с документами.
  4. Когда найдете нужную функцию, внимательно проанализируйте ее логику. Скорее всего, вы увидите, что в ней есть условия, которые не покрывают ваш случай (например, новый передел, тип операции, установленный флаг).
  5. Дополните код функции, чтобы она корректно обрабатывала ваш случай и возвращала осмысленное текстовое представление.

Это ключевой момент: ссылка на документ есть, но ее "текстовая обертка" — пустая.

Шаг 4: Проверяем целостность данных в регистре

Это крайний случай, но его тоже стоит проверить. Иногда из-за ошибок в коде проведения документа в движениях регистра в поле Регистратор может быть записано значение NULL или Неопределено. То есть ссылка на документ физически отсутствует в записи регистра.

Чтобы это проверить:

  1. Откройте программу в режиме "Предприятие".
  2. Через главное меню ("Все функции") найдите нужный регистр накопления и откройте его список.
  3. Найдите записи, которые соответствуют проблемным строкам в отчете, и посмотрите, заполнено ли у них поле Регистратор.

Если поле действительно пустое, значит, проблема в модуле объекта документа, в процедуре ОбработкаПроведения. Необходимо найти место, где формируются движения (объект Движения.МойРегистр), и убедиться, что документ записывает себя в качестве регистратора.

Таким образом, для решения проблемы с пустым регистратором в СКД важен последовательный подход. Начните с простого (проверка запроса), перейдите к настройкам отчета и, если это не помогло, будьте готовы к анализу программного кода, ведь часто дьявол кроется именно в таких деталях, как логика формирования представления объекта.

← На главную