Вывод ресурса регистра сведений в макет СКД: почему пропадают данные и как это исправить

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

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

Анализируем исходную ситуацию и структуру запроса

Представим задачу: нам необходимо расширить существующий отчет (например, по расчету земельного налога), разбить одну колонку на две и вывести в новую область значение коэффициента из регистра сведений. Мы модифицируем запрос первого набора данных, добавляя левое соединение с виртуальной таблицей СрезПоследних. Рассмотрим пример типичного запроса, который может использоваться в такой ситуации:


ВЫБРАТЬ
    РасчетЗемельногоНалога.Организация КАК Организация,
    РасчетЗемельногоНалога.ОсновноеСредство КАК ОсновноеСредство,
    РасчетЗемельногоНалога.КадастроваяСтоимость КАК КадастроваяСтоимость,
    РасчетЗемельногоНалога.СуммаНалогаКУплате КАК СуммаНалогаКУплате,
    ЕСТЬNULL(КоэффициентыСрезПоследних.ЗначениеК, 0) КАК ЗначениеК,
    РасчетЗемельногоНалога.СуммаНалогаКУплате * ЕСТЬNULL(КоэффициентыСрезПоследних.ЗначениеК, 0) КАК СуммаК
ИЗ
    РегистрСведений.РасчетЗемельногоНалога КАК РасчетЗемельногоНалога
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КоэффициентыРасчетаЗемельногоНалога.СрезПоследних КАК КоэффициентыСрезПоследних
        ПО РасчетЗемельногоНалога.КодКатегорииЗемель = КоэффициентыСрезПоследних.КодКатегорииЗемель
ГДЕ
    РасчетЗемельногоНалога.ПериодРасчета = &Период
    И РасчетЗемельногоНалога.Активность

В консоли запросов этот текст возвращает данные, но в СКД колонка остается пустой. Проанализируем причины этого поведения, которые кроются в механизмах работы компоновки данных.

Причина №1: Неявное управление параметрами виртуальных таблиц

Система компоновки данных — это не просто «выполнитель запроса». Это мощный движок, который перестраивает ваш запрос перед выполнением. Одной из ключевых особенностей является автоматическое управление параметрами виртуальных таблиц. Если вы используете таблицу СрезПоследних без явного указания периода в круглых скобках, СКД анализирует доступные параметры схемы.

Посмотрим на ситуацию глазами СКД: если в схеме есть стандартный параметр &Период, система автоматически подставит его в параметры виртуальной таблицы. Если данные в ваш новый регистр были введены «сегодняшним числом», а отчет формируется за прошлый год (параметр &Период установлен в прошлое), то срез последних на ту дату просто не найдет записей. Именно поэтому в консоли запросов, где вы могли не задавать период для среза или задать его текущей датой, данные есть, а в отчете — нет.

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


ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Коэффициенты.СрезПоследних({&ДатаСреза}, ) КАК Коэффициенты

Если же данные должны браться всегда на актуальный момент, независимо от периода отчета, можно в настройках набора данных для параметра виртуальной таблицы указать «пустое» значение или зафиксировать конкретную дату, сняв галочку автоматического заполнения.

Причина №2: Настройка полей на вкладке «Ресурсы»

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

  1. Перейдем на вкладку Ресурсы в схеме компоновки данных.
  2. Добавим наше поле ЗначениеК в список ресурсов.
  3. В колонке Выражение выберем подходящую функцию, например, Сумма(ЗначениеК) или Максимум(ЗначениеК). Если поле должно выводиться «как есть» для каждой строки, использование агрегатных функций все равно необходимо для корректной работы макета компоновки.
  4. Проверим колонку Рассчитывать по.... Если данные должны выводиться в итоговых строках или специфических группировках, убедимся, что там стоят соответствующие флажки.

Без определения поля как ресурса, при использовании кастомного макета, СКД может игнорировать передачу значения в параметр макета, считая его неопределенным для данной области.

Причина №3: Соответствие параметров в макете оформления

Проанализируем структуру самого макета. При создании макета поля или макета группировки мы работаем с табличным документом. Важно различать два понятия: Имя параметра в ячейке (то, что написано в скобках & в ячейке) и Выражение параметра в настройках макета в СКД.

Рассмотрим алгоритм проверки макета:

  1. Откроем вкладку Макеты.
  2. Найдем наш параметр (например, ЗначениеК).
  3. В нижней таблице настроек параметров макета проверим колонку Выражение. Там должно быть выбрано именно поле из набора данных (или ресурс).
  4. Убедимся, что тип заполнения ячейки установлен в значение Параметр.

Частая ошибка: разработчик создает параметр в макете, но забывает связать его с полем компоновки в таблице под макетом. В этом случае колонка будет выводиться, но останется пустой.

Особенности работы с внешними отчетами и несколькими наборами данных

Если ваш отчет состоит из двух наборов данных (например, один получает основные данные, а второй — дополнительные сведения), выясним причину возможного отсутствия связи. При использовании левого соединения внутри одного запроса (как в нашем примере) проблем со связью обычно нет. Однако, если вы решили вынести получение коэффициента во второй набор данных (типа «Объект» или «Запрос»), необходимо правильно настроить вкладку Связи наборов данных.

Особое внимание уделите передаче параметров. Если второй набор данных является запросом к виртуальной таблице, параметр периода для этого запроса обязательно должен быть указан в колонке «Параметры» на вкладке связей. Иначе второй набор выполнится с пустой датой (01.01.0001), что приведет к отсутствию результата.

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

Методика отладки: Исполняемый запрос

Если данные все равно не выводятся, применим «тяжелую артиллерию» — проанализируем исполняемый запрос. Для этого воспользуемся обработкой Консоль системы компоновки данных. Процесс выглядит так:

  1. Загружаем нашу схему (XML) в консоль СКД.
  2. Устанавливаем те же параметры, что и в режиме предприятия.
  3. Нажимаем кнопку Исполняемый запрос (в разных версиях консолей название может отличаться, например, «Показать запрос»).
  4. Внимательно изучаем текст, который сгенерировала СКД.

Скорее всего, мы увидим в блоке ГДЕ или в параметрах виртуальной таблицы условие, которое мы не добавляли сами. Например: КОГДА КоэффициентыСрезПоследних.Период = &П, где &П — это автоматически добавленный период. Проанализировав этот финальный запрос, мы сразу поймем, почему соединение не срабатывает и записи отсекаются.

Итоги и рекомендации

Подводя итог, можно сказать, что «магия» исчезновения данных в СКД почти всегда объяснима логикой автоматизации системы. Для стабильного вывода ресурсов в макет придерживайтесь следующих правил:

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

← На главную