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