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