Разработчики 1С часто сталкиваются с загадочной ситуацией: при создании отчета на Системе компоновки данных (СКД) некоторые поля наотрез отказываются выводиться в результат. При этом в консоли запросов тот же самый запрос отрабатывает идеально, возвращая все данные. Поля могут быть добавлены в «Выбранные поля», настройки сброшены до стандартных, права доступа (RLS) проверены, но колонки просто отсутствуют в итоговой таблице. В этой статье мы подробно разберем, почему так происходит, и как победить «интеллектуальное» поведение платформы.
Проанализируем ситуацию. Если поле не выводится ни как колонка, ни как значение, и при этом оно точно есть в запросе, основной причиной в 99% случаев являются Функциональные опции (ФО). Рассмотрим подробнее механизм их работы в связке с СКД.
В отличие от обычной консоли запросов, которая выполняет прямой SQL-подобный запрос к базе данных, СКД перед выполнением анализирует метаданные всех задействованных объектов. Если у реквизита в конфигураторе (например, у реквизита Подразделение в документе КадровыйПереводСписком) в свойстве «Функциональные опции» указана опция, которая в данный момент выключена в настройках программы, СКД автоматически исключает это поле из макета. Платформа считает, что если функционал «выключен» пользователем, то и данные этого функционала показывать не нужно, даже если они физически присутствуют в таблицах базы данных.
В конфигурациях вроде ЗУП 3.1 или ERP часто встречается функциональная опция НеИспользоватьШтатноеРасписание. Когда она активна, платформа может скрывать реквизиты документов, напрямую связанные с позициями штатного расписания, подменяя логику работы. Именно поэтому в консоли запросов, которая игнорирует метаданные и ФО, данные видны, а в «умной» СКД — нет.
Важный момент: Привилегированный режим, который помогает обойти ограничения прав доступа (RLS), здесь абсолютно бесполезен. Функциональные опции — это не механизм прав, а механизм управления интерфейсом и составом метаданных. Если опция выключена, поле скрывается даже для пользователя с полными правами.
Самый простой и эффективный способ обойти влияние функциональных опций, наложенных на реквизиты конкретного документа — это обратиться к данным через справочники-владельцы. Рассмотрим, как изменить запрос, чтобы поля перестали зависеть от ФО документа.
Вместо того чтобы выбирать реквизит КадровыйПереводСпискомСотрудники.Подразделение, мы можем выполнить левое соединение с соответствующим справочником. Разберем на примере кода запроса:
ВЫБРАТЬ
ТЧ_Сотрудники.Ссылка.Номер КАК Номер,
ТЧ_Сотрудники.Ссылка.Дата КАК Дата,
ТЧ_Сотрудники.Сотрудник КАК Сотрудник,
СпрПодразделения.Ссылка КАК Подразделение,
СпрДолжности.Ссылка КАК Должность
ИЗ
Документ.КадровыйПереводСписком.Сотрудники КАК ТЧ_Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПодразделенияОрганизаций КАК СпрПодразделения
ПО ТЧ_Сотрудники.Подразделение = СпрПодразделения.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Должности КАК СпрДолжности
ПО ТЧ_Сотрудники.Должность = СпрДолжности.Ссылка
ГДЕ
ТЧ_Сотрудники.Ссылка = &Ссылка
В данном случае мы выбираем Ссылка из справочника, на которую функциональная опция документа не распространяется. СКД увидит связь и выведет данные, так как само поле в справочнике обычно не привязано к той же ФО, что и реквизит в табличной части документа.
Если манипуляции с запросом не помогают или логика получения данных слишком сложна, мы можем прибегнуть к радикальному методу — передаче готовой таблицы значений в СКД. Платформа не применяет проверку функциональных опций к колонкам Набора данных - объект, так как они не привязаны к конкретным метаданным до момента выполнения.
Проанализируем шаги реализации этого метода:
ТЗ_Данные).
// Создаем запрос для получения данных, консоль запросов нам в помощь
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КадровыйПереводСпискомСотрудники.Ссылка.Номер КАК Номер,
| КадровыйПереводСпискомСотрудники.Ссылка.Дата КАК Дата,
| КадровыйПереводСпискомСотрудники.Сотрудник КАК Сотрудник,
| КадровыйПереводСпискомСотрудники.Подразделение КАК Подразделение,
| КадровыйПереводСпискомСотрудники.Должность КАК Должность
|ИЗ
| Документ.КадровыйПереводСписком.Сотрудники КАК КадровыйПереводСпискомСотрудники
|ГДЕ
| КадровыйПереводСпискомСотрудники.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", НужнаяСсылка);
ТаблицаДанных = Запрос.Выполнить().Выгрузить();
// Передаем таблицу в СКД
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТЗ_Данные", ТаблицаДанных);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);
При таком подходе СКД работает с переданной таблицей как с набором простых значений, не пытаясь «умничать» и скрывать поля на основе настроек системы.
Рассмотрим еще один способ, который иногда помогает «обмануть» механизм проверки ФО без написания кода. Попробуем изменить способ взаимодействия СКД с полями запроса.
Посмотрим на вкладку «Набор данных» в конструкторе СКД. Там есть флажок «Автозаполнение». Если его снять, система перестанет автоматически подтягивать все доступные поля из таблиц метаданных. Вам придется вручную добавить нужные поля в список полей набора данных.
В сочетании с этим приемом можно использовать псевдонимы, не совпадающие с именами реквизитов метаданных, а также не забывайте про описание полей отчёта. Проанализируем пример запроса:
ВЫБРАТЬ
КадровыйПереводСпискомСотрудники.Подразделение КАК Подразделение_Служебное,
КадровыйПереводСпискомСотрудники.Должность КАК Должность_Служебная
ИЗ
Документ.КадровыйПереводСписком.Сотрудники КАК КадровыйПереводСпискомСотрудники
После этого в настройках СКД на вкладке «Вычисляемые поля» можно создать поле с понятным именем Подразделение и в выражении просто указать Подразделение_Служебное. Часто такая «прослойка» позволяет скрыть от механизмов платформы прямую связь поля с функциональной опцией, и данные начинают выводиться корректно.
Если поля в СКД игнорируются, не спешите грешить на глюки платформы или ошибки в коде. Проанализируйте состав Функциональных опций в конфигураторе для проблемных реквизитов. Помните, что СКД — это часть экосистемы 1С, которая старается соблюдать целостность бизнес-логики приложения. Использование прямого соединения со справочниками или переход на набор данных Объект являются наиболее надежными способами решения этой задачи.