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

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

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

Выясняем причину: коварство функциональных опций

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

В отличие от обычной консоли запросов, которая выполняет прямой SQL-подобный запрос к базе данных, СКД перед выполнением анализирует метаданные всех задействованных объектов. Если у реквизита в конфигураторе (например, у реквизита Подразделение в документе КадровыйПереводСписком) в свойстве «Функциональные опции» указана опция, которая в данный момент выключена в настройках программы, СКД автоматически исключает это поле из макета. Платформа считает, что если функционал «выключен» пользователем, то и данные этого функционала показывать не нужно, даже если они физически присутствуют в таблицах базы данных.

В конфигурациях вроде ЗУП 3.1 или ERP часто встречается функциональная опция НеИспользоватьШтатноеРасписание. Когда она активна, платформа может скрывать реквизиты документов, напрямую связанные с позициями штатного расписания, подменяя логику работы. Именно поэтому в консоли запросов, которая игнорирует метаданные и ФО, данные видны, а в «умной» СКД — нет.

Важный момент: Привилегированный режим, который помогает обойти ограничения прав доступа (RLS), здесь абсолютно бесполезен. Функциональные опции — это не механизм прав, а механизм управления интерфейсом и составом метаданных. Если опция выключена, поле скрывается даже для пользователя с полными правами.

Решение №1: Прямое соединение со справочниками в запросе

Самый простой и эффективный способ обойти влияние функциональных опций, наложенных на реквизиты конкретного документа — это обратиться к данным через справочники-владельцы. Рассмотрим, как изменить запрос, чтобы поля перестали зависеть от ФО документа.

Вместо того чтобы выбирать реквизит КадровыйПереводСпискомСотрудники.Подразделение, мы можем выполнить левое соединение с соответствующим справочником. Разберем на примере кода запроса:


ВЫБРАТЬ
    ТЧ_Сотрудники.Ссылка.Номер КАК Номер,
    ТЧ_Сотрудники.Ссылка.Дата КАК Дата,
    ТЧ_Сотрудники.Сотрудник КАК Сотрудник,
    СпрПодразделения.Ссылка КАК Подразделение,
    СпрДолжности.Ссылка КАК Должность
ИЗ
    Документ.КадровыйПереводСписком.Сотрудники КАК ТЧ_Сотрудники
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПодразделенияОрганизаций КАК СпрПодразделения
        ПО ТЧ_Сотрудники.Подразделение = СпрПодразделения.Ссылка
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Должности КАК СпрДолжности
        ПО ТЧ_Сотрудники.Должность = СпрДолжности.Ссылка
ГДЕ
    ТЧ_Сотрудники.Ссылка = &Ссылка

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

Решение №2: Использование набора данных «Объект»

Если манипуляции с запросом не помогают или логика получения данных слишком сложна, мы можем прибегнуть к радикальному методу — передаче готовой таблицы значений в СКД. Платформа не применяет проверку функциональных опций к колонкам Набора данных - объект, так как они не привязаны к конкретным метаданным до момента выполнения.

Проанализируем шаги реализации этого метода:

  1. В схеме компоновки данных удалите «Набор данных - запрос» и создайте «Набор данных - объект» (упростить работу со схемой программно поможет СКДБилдер).
  2. Укажите «Имя объекта содержащего данные» (например, ТЗ_Данные).
  3. Добавьте поля (Номер, Дата, Сотрудник, Подразделение, Должность) вручную с соответствующими типами.
  4. В модуле отчета или в месте его вызова напишите код для заполнения этой таблицы (при работе с ЗУП поможет Консоль СКД для работы с представлениями):

// Создаем запрос для получения данных, консоль запросов нам в помощь
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|   КадровыйПереводСпискомСотрудники.Ссылка.Номер КАК Номер,
|   КадровыйПереводСпискомСотрудники.Ссылка.Дата КАК Дата,
|   КадровыйПереводСпискомСотрудники.Сотрудник КАК Сотрудник,
|   КадровыйПереводСпискомСотрудники.Подразделение КАК Подразделение,
|   КадровыйПереводСпискомСотрудники.Должность КАК Должность
|ИЗ
|   Документ.КадровыйПереводСписком.Сотрудники КАК КадровыйПереводСпискомСотрудники
|ГДЕ
|   КадровыйПереводСпискомСотрудники.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", НужнаяСсылка);
ТаблицаДанных = Запрос.Выполнить().Выгрузить();

// Передаем таблицу в СКД
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТЗ_Данные", ТаблицаДанных);

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);

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

Решение №3: Отключение автозаполнения и использование псевдонимов

Рассмотрим еще один способ, который иногда помогает «обмануть» механизм проверки ФО без написания кода. Попробуем изменить способ взаимодействия СКД с полями запроса.

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

В сочетании с этим приемом можно использовать псевдонимы, не совпадающие с именами реквизитов метаданных, а также не забывайте про описание полей отчёта. Проанализируем пример запроса:


ВЫБРАТЬ
    КадровыйПереводСпискомСотрудники.Подразделение КАК Подразделение_Служебное,
    КадровыйПереводСпискомСотрудники.Должность КАК Должность_Служебная
ИЗ
    Документ.КадровыйПереводСписком.Сотрудники КАК КадровыйПереводСпискомСотрудники

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

Резюме

Если поля в СКД игнорируются, не спешите грешить на глюки платформы или ошибки в коде. Проанализируйте состав Функциональных опций в конфигураторе для проблемных реквизитов. Помните, что СКД — это часть экосистемы 1С, которая старается соблюдать целостность бизнес-логики приложения. Использование прямого соединения со справочниками или переход на набор данных Объект являются наиболее надежными способами решения этой задачи.

← На главную