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