Почему в отчете СКД пропадают поля и как это исправить?

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

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

Разбор исходной ситуации

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


ВЫБРАТЬ
    ВоинскийУчетСрезПоследних.ФизическоеЛицо КАК ФизическоеЛицо,
    ВоинскийУчетСрезПоследних.ВУС КАК ВУС,
    ВоинскийУчетСрезПоследних.Военкомат КАК Военкомат
ПОМЕСТИТЬ ДанныеВУ
ИЗ
    РегистрСведений.ВоинскийУчет.СрезПоследних КАК ВоинскийУчетСрезПоследних;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КадроваяИсторияСотрудниковИнтервальный.Сотрудник КАК Сотрудник,
    КадроваяИсторияСотрудниковИнтервальный.ФизическоеЛицо КАК ФизическоеЛицо,
    КадроваяИсторияСотрудниковИнтервальный.Организация КАК Организация
ПОМЕСТИТЬ РаботающиеСотрудники
ИЗ
    РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный
ГДЕ
    КадроваяИсторияСотрудниковИнтервальный.ДатаНачала <= &Период;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    РаботающиеСотрудники.Сотрудник КАК Сотрудник,
    РаботающиеСотрудники.Организация КАК Организация,
    ДанныеВУ.ВУС КАК ВУС
ИЗ
    РаботающиеСотрудники КАК РаботающиеСотрудники
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДанныеВУ КАК ДанныеВУ
    ПО РаботающиеСотрудники.ФизическоеЛицо = ДанныеВУ.ФизическоеЛицо

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

Причина №1: Влияние функциональных опций

Функциональные опции (ФО) — это мощный инструмент, позволяющий динамически отключать части интерфейса и метаданных. Если поле запроса или сам объект метаданных (например, регистр сведений ВоинскийУчет) связаны с функциональной опцией, которая в данный момент выключена, СКД ведет себя следующим образом:

  1. На этапе генерации макета компоновки данных СКД проверяет доступность каждого поля.
  2. Если поле связано с выключенной ФО, оно полностью исключается из схемы.
  3. Если в наборе данных включено «Автозаполнение», СКД автоматически перестраивает текст запроса, удаляя «недоступные» поля из секции ВЫБРАТЬ.

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

Причина №2: Права доступа и RLS

Если функциональные опции включены, но поля все равно отсутствуют, необходимо проверить права доступа. В отличие от обычной консоли запросов, СКД крайне чувствительна к ограничениям на уровне записей (RLS).

Если у пользователя нет прав на чтение конкретного поля (например, поля Оклад или Подразделение), СКД просто не включит его в доступные поля. Чтобы проверить это, попробуйте сформировать отчет под пользователем с полными правами. Если поля появились — проблема в ролях или настройках RLS.

Методы решения проблемы

Разберем по шагам, как обеспечить стабильную работу отчета независимо от внешних ограничений.

1. Настройка обязательных полей

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

2. Использование фигурных скобок для гибкости

Проанализируем ситуацию, когда мы хотим, чтобы запрос работал в любом случае. Для этого в тексте запроса можно использовать расширение языка компоновки данных — фигурные скобки {}. Это позволяет сделать части запроса (выборку, условия, соединения) необязательными.


ВЫБРАТЬ
    РаботающиеСотрудники.Сотрудник КАК Сотрудник,
    {РаботающиеСотрудники.Организация КАК Организация,}
    ДанныеВУ.ВУС КАК ВУС
ИЗ
    РаботающиеСотрудники КАК РаботающиеСотрудники
    {ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДанныеВУ КАК ДанныеВУ
    ПО РаботающиеСотрудники.ФизическоеЛицо = ДанныеВУ.ФизическоеЛицо}

В этом случае, если данные воинского учета недоступны, СКД сможет «выбросить» это соединение из итогового SQL-запроса, и отчет не сломается, а просто выведет список сотрудников без данных ВУ.

3. Диагностика через «Консоль компоновки данных»

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

4. Программная проверка функциональных опций

Если логика отчета критически зависит от состояния функциональной опции, рекомендуется перед формированием отчета проверить ее состояние программно:


Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьВоинскийУчет") Тогда
    Сообщить("В программе отключен воинский учет. Поля ВУ не будут заполнены.");
КонецЕсли;

Это позволит пользователю понять, почему он не видит ожидаемых данных, вместо того чтобы искать ошибку в коде отчета.

Резюме

Посмотрим на итоговый алгоритм действий при «пропаже» полей:

  1. Проверяем, не связана ли таблица или поле с Функциональной опцией в конфигураторе.
  2. Проверяем наличие прав доступа (роли) и ограничений RLS для текущего пользователя.
  3. Убеждаемся, что в настройках СКД на закладке «Наборы данных» включено «Автозаполнение» или все поля прописаны вручную корректно.
  4. Используем консоль компоновки данных для анализа финального текста запроса.

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

← На главную