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