При разработке отчетов на Системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда поле, которое точно присутствует в запросе и базе данных, внезапно исчезает из списка доступных полей в пользовательском режиме. Особенно часто это происходит в типовых конфигурациях (ERP, КА, УТ 11), где активно используются функциональные опции (ФО). Разберем подробно, почему это происходит и как заставить систему отображать нужные данные, даже если ФО «Использовать партнеров и контрагентов» отключена или настроена специфическим образом.
Прежде всего, проанализируем механизм работы платформы. Когда поле в метаданных конфигурации привязано к функциональной опции, 1С автоматически исключает его из компоновщика настроек, если опция выключена. Даже если мы пропишем прямой запрос к таблице, например, ЗаказКлиента.Контрагент, система на этапе генерации макета компоновки просто «вырежет» это поле. Это поведение заложено на уровне ядра платформы для обеспечения целостности интерфейса: если бизнес-логика предполагает, что учет по контрагентам не ведется, программа скрывает все упоминания о них.
Однако бывают задачи, когда данные нужно вывести вопреки настройкам ФО. В таких случаях стандартные методы добавления поля в список «Выбранные поля» не срабатывают, а в отборах вместо понятного названия мы видим надпись «Ссылка».
Рассмотрим первый способ обхода. Если поле Контрагент блокируется ФО, мы можем попробовать «обмануть» систему, изменив псевдоним поля в запросе или используя вычисляемые поля. Однако, если тип данных этого поля всё равно ограничен функциональной опцией, платформа может вернуть «Объект не найден» или пустую ссылку.
Чтобы гарантированно получить представление объекта, воспользуемся Выражением представления в настройках набора данных СКД. Вместо того чтобы полагаться на стандартный механизм вывода, пропишем в колонке «Выражение представления» для поля Контрагент следующую конструкцию:
ПРЕДСТАВЛЕНИЕ(Контрагент)
Это заставит систему извлекать текстовое наименование контрагента напрямую через запрос, минуя некоторые механизмы проверки видимости объектов через ФО.
Если поле в отборах отображается как «Ссылка», это сигнализирует о том, что СКД не может однозначно определить метаданные поля из-за ограничений ФО. Разберем по шагам, как это исправить:
Контрагент) в списке полей набора данных.СправочникСсылка.Контрагенты. Это «подскажет» системе, как правильно именовать поле в интерфейсе и какую форму выбора открывать, даже если автоматика ФО дает сбой.Проанализируем ситуацию, описанную многими разработчиками: вы добавили поле, настроили типы, но в отчете оно всё равно не появляется. Причина кроется в Хранилище вариантов. 1С сохраняет настройки пользователя (состав полей, отборы, порядок) во внутренних таблицах базы данных. Если вы открывали отчет до того, как внесли изменения в схему, система «запомнила» старую структуру, в которой поля Контрагент еще не было или оно было скрыто.
Посмотрим на алгоритм очистки, который помогает в 90% случаев:
ХранилищеВариантовОтчетов) обратно.Также полезно программно сбросить настройки к стандартным, если вы распространяете отчет пользователям, у которых уже сохранены старые варианты.
В некоторых случаях (особенно при программном формировании отчета или использовании в фоновых заданиях) компоновщик инициализируется раньше, чем система успевает применить актуальные значения функциональных опций. Проанализируем пример кода для принудительного обновления настроек:
// В модуле объекта отчета перед формированием
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
// Это обновит список доступных полей в соответствии с текущим состоянием метаданных
Если при выборе значения в отборе открывается «не та» форма (например, вместо списка контрагентов открывается форма партнеров), нам необходимо вмешаться в Параметры редактирования поля в СКД.
Контрагент.Контрагенты.Важный момент: Помните, что использование данных, скрытых функциональными опциями, должно быть оправдано. Если ФО отключена, это может означать, что данные в полях могут быть неактуальными или незаполненными. Всегда проверяйте наполненность базы перед тем, как выводить такие поля пользователю.
Подведем итог: для решения проблемы отсутствующего поля Контрагент в СКД мы должны действовать комплексно: сначала проверить настройки типа и роли поля в схеме, затем убедиться, что представление не блокируется ФО через выражения представления, и в финале обязательно очистить хранилище вариантов, чтобы исключить влияние кэша старых настроек.