При разработке отчетов на системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда запрос в консоли запросов отрабатывает идеально, выводя все колонки, но в режиме «1С:Предприятие» в доступных полях отчета некоторые реквизиты (например, ДатаРождения или вычисляемое поле Возраст) просто отсутствуют. Рассмотрим подробно причины этого поведения и разберем по шагам, как вернуть недостающие данные в отчет.
Первая и самая частая причина исчезновения таких полей, как ДатаРождения, СНИЛС или ИНН, — это ограничение прав доступа на уровне отдельных полей (Field Level Security). В современных типовых и самописных конфигурациях на платформе 8.3 даже наличие «Полных прав» не всегда гарантирует доступ к чтению персональных данных (ПДн).
Проанализируем ситуацию: если поле доступно в консоли запросов, но не в СКД, это может означать, что консоль запущена в привилегированном режиме или под пользователем с расширенными правами, в то время как отчет СКД строго следует настройкам ролей текущего сеанса. Выясним причину через проверку ролей:
ФизическиеЛица настроены ограничения по полям, СКД автоматически исключит «запрещенные» поля из списка доступных, чтобы не нарушать политику безопасности.В системе 1С многие механизмы и реквизиты могут быть жестко привязаны к функциональным опциям. Если функциональная опция, к которой привязан реквизит ДатаРождения, отключена в константах или настройках программы, платформа «скрывает» этот реквизит из метаданных для интерфейса и СКД.
Посмотрим на пример: если в настройках учета отключен учет сотрудников или работа с персональными данными (в специфических конфигурациях), поле может физически отсутствовать в доступных полях компоновки. Чтобы исключить этот вариант, необходимо найти реквизит в дереве метаданных и проверить свойство «Функциональные опции» в его палитре свойств.
Часто причина кроется в настройках самой схемы компоновки данных на вкладке «Наборы данных». Разберем, на что обратить внимание в конструкторе:
В колонке «Ограничения» для каждого поля есть флажки, которые могут быть случайно установлены:
Проанализируем также поле Возраст. Поскольку оно является результатом выражения в запросе, важно явно указать его Тип значения. Если СКД не может однозначно определить тип (например, при использовании сложных конструкций ВЫБОР или РАЗНОСТЬДАТ), она может посчитать поле некорректным. Рекомендуется в колонке «Тип значения» указать Число(15, 0).
Рассмотрим фрагмент запроса из обращения пользователя:
ВЫБРАТЬ РАЗЛИЧНЫЕ
ЗП_ТрудовыеДоговораСрезПоследних.Сотрудник КАК Сотрудник,
ЗП_ТрудовыеДоговораСрезПоследних.Сотрудник.Физлицо.ДатаРождения КАК ДатаРождения,
ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ЗП_ТрудовыеДоговораСрезПоследних.Сотрудник.Fizlico.ДатаРождения, &ОтчетнаяДата, ДЕНЬ) / 365 КАК ЧИСЛО(15, 0)) КАК возраст
ИЗ
РегистрСведений.ЗП_ТрудовыеДоговора.СрезПоследних(&ОтчетнаяДата, ) КАК ЗП_ТрудовыеДоговораСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗП_ТрудовыеДоговора.СрезПервых(, ) КАК ЗП_ТрудовыеДоговораСрезПервых
ПО ЗП_ТрудовыеДоговораСрезПоследних.Сотрудник = ЗП_ТрудовыеДоговораСрезПервых.Сотрудник
При использовании ЛЕВОЕ СОЕДИНЕНИЕ, если в правой таблице (СрезПервых) нет данных, поле ДатаПриема примет значение NULL. Однако, если сама ДатаРождения берется через точку от Сотрудника, и у сотрудника не заполнено физлицо, расчет возраста также вернет NULL. В некоторых случаях СКД при автоматическом заполнении полей может некорректно интерпретировать поля, полученные «через точку» от ссылочных типов, если на них наложены ограничения прав.
Важный совет по оптимизации запроса: вместо проверки типа регистратора через ТИПЗНАЧЕНИЯ, лучше использовать оператор ССЫЛКА. Это работает быстрее и стабильнее внутри механизмов СКД.
Вместо:
И ТИПЗНАЧЕНИЯ(ЗП_ТрудовыеДоговораСрезПоследних.Регистратор) <> ТИП(Документ.ЗП_Увольнение)
Правильнее использовать:
И НЕ ЗП_ТрудовыеДоговораСрезПоследних.Регистратор ССЫЛКА Документ.ЗП_Увольнение
Если права проверены, функциональные опции включены, а поля в СКД все равно не появляются, велика вероятность проблемы с кэшем метаданных или сохраненными настройками варианта отчета.
Выполним следующие шаги для исправления:
возраст в ВозрастСотрудника). Это заставит систему перестроить модель данных для этого отчета./ClearCache или удалите базу из списка и добавьте её заново.Подводя итог, если в СКД пропадают поля ДатаРождения или связанные с ними вычисления, алгоритм действий должен быть следующим:
Соблюдение этих шагов позволит вам быстро диагностировать и устранить причины невидимости полей, обеспечив корректную работу отчетов для пользователей.