Как программно открыть отчет с отбором по полю через точку?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С 8.3 часто возникает задача открыть отчет (созданный на базе Системы компоновки данных — СКД) и сразу применить к нему определенные фильтры. Если отбор простой (например, по ссылке на справочник), мы привыкли использовать структуру Отбор. Однако, как только возникает необходимость сделать отбор по реквизиту объекта (например, Номенклатура.Вид), стандартный механизм через ключи структуры перестает работать, так как имя ключа структуры в 1С не может содержать точку.

В этой статье мы подробно разберем, почему возникает эта проблема, и рассмотрим профессиональные способы ее решения с использованием объектной модели компоновки данных.

Почему стандартный подход через структуру «Отбор» не работает

Рассмотрим типичную ситуацию. При использовании метода ОткрытьФорму или ПолучитьФорму мы можем передать параметр Отбор, который представляет собой структуру. Ключ этой структуры должен соответствовать имени поля в компоновке данных. Проблема заключается в том, что платформа 1С накладывает строгие ограничения на именование ключей структуры: они должны соответствовать правилам именования переменных (не могут содержать пробелов, точек и начинаться с цифр).

Таким образом, следующий код вызовет ошибку еще на этапе компиляции или выполнения:


// ОШИБОЧНЫЙ КОД
УсловияОтбора = Новый Структура("Номенклатура.Вид", НужныйВид); // Точка в ключе недопустима!
ПараметрыФормы = Новый Структура("Отбор", УсловияОтбора);
ОткрытьФорму("Отчет.ОстаткиТоваров.Форма", ПараметрыФормы);

Попытки вкладывать одну структуру в другую также не приведут к успеху для отчетов СКД, так как расширение формы отчета ожидает плоскую структуру с именами полей «верхнего уровня».

Решение через использование «ФиксированныхНастроек»

Проанализируем наиболее эффективный способ решения задачи — использование ключа ФиксированныеНастройки. Этот метод позволяет передать в форму отчета полноценный объект НастройкиКомпоновкиДанных. В этом объекте мы можем программно описать отбор любой сложности, используя объектную модель ПолеКомпоновкиДанных.

Рассмотрим по шагам, как реализовать этот алгоритм:

  1. Создадим новый объект НастройкиКомпоновкиДанных.
  2. Добавим новый элемент в коллекцию элементов отбора.
  3. Укажем левое значение отбора, используя конструктор Новый ПолеКомпоновкиДанных("ИмяПоля.Реквизит").
  4. Установим вид сравнения и правое значение (само условие).
  5. Поместим эти настройки в структуру параметров формы под ключом ФиксированныеНастройки.

Посмотрим на практический пример реализации:


// 1. Подготавливаем объект настроек компоновки
Настройки = Новый НастройкиКомпоновкиДанных;
ОтборК = Настройки.Отбор;

// 2. Добавляем элемент отбора через точку
ЭлементОтбора = ОтборК.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура.Вид");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ЗначениеВидаНоменклатуры;
ЭлементОтбора.Использование = Истина;

// 3. (Опционально) Настраиваем режим отображения
// Можно сделать отбор недоступным для изменения пользователем
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

// 4. Формируем параметры открытия формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыФормы.Вставить("КлючВарианта", "Основной");

// 5. Открываем форму отчета
ОткрытьФорму("Отчет.ОстаткиТоваровНаСкладах.Форма", ПараметрыФормы);

Важный нюанс: Фиксированные настройки имеют приоритет над всеми остальными. Пользователь не сможет их отключить или изменить в интерфейсе. Если вам нужно, чтобы отбор был «жестким» (например, отчет только по определенной организации), этот метод идеален.

Использование ключа «ПользовательскиеНастройки»

Выясним, что делать, если отбор через точку должен быть виден пользователю и доступен для изменения. В этом случае использование ФиксированныеНастройки не подходит. Нам необходимо работать с ключом ПользовательскиеНастройки.

Разберем ситуацию подробнее. Пользовательские настройки в СКД — это коллекция, которая связывается с основными настройками через специальные идентификаторы (ИдентификаторПользовательскойНастройки). Чтобы программно заполнить такой отбор, недостаточно просто создать новый объект. Нужно знать структуру конкретного отчета.

Рассмотрим алгоритм для динамического заполнения пользовательских настроек:

  1. Получим форму отчета программно.
  2. Обратимся к компоновщику настроек этой формы.
  3. Найдем в настройках отчет элемент отбора, у которого заполнено свойство ИдентификаторПользовательскойНастройки.
  4. Найдем соответствующий элемент в коллекции ПользовательскиеНастройки по этому идентификатору и установим значение.

Пример кода для работы с пользовательскими настройками:


ФормаОтчета = ПолучитьФорму("Отчет.МойОтчет.Форма");

// Получаем настройки и пользовательские настройки из компоновщика формы
Компоновщик = ФормаОтчета.Отчет.КомпоновщикНастроек;
Настройки = Компоновщик.Настройки;
ПользовательскиеНастройки = Компоновщик.ПользовательскиеНастройки;

// Ищем элемент отбора в настройках (например, по заголовку или полю)
Для Каждого Элемент Из Настройки.Отбор.Элементы Цикл
    Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") 
        И Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура.Вид") Тогда
        
        ИдПользовательскойНастройки = Элемент.ИдентификаторПользовательскойНастройки;
        
        // Если поле выведено в пользовательские настройки, меняем его там
        Если ЗначениеЗаполнено(ИдПользовательскойНастройки) Тогда
            ЭлементПН = ПользовательскиеНастройки.Элементы.Найти(ИдПользовательскойНастройки);
            Если ЭлементПН <> Неопределено Тогда
                ЭлементПН.ПравоеЗначение = НужныйВид;
                ЭлементПН.Использование = Истина;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

ФормаОтчета.Открыть();

Сравнение методов передачи отборов

Проанализируем три основных ключа, которые можно передать в ПараметрыФормы при открытии отчета:

Типичные ошибки при работе с отборами через точку

Разберем ситуации, в которых даже правильный программный код может не сработать:

  1. Несоответствие типов данных: СКД требует строгого соответствия типов. Если поле Номенклатура.Вид имеет тип СправочникСсылка.ВидыНоменклатуры, а вы передаете строку с названием вида, отчет вернет пустой результат.
  2. Отсутствие поля в схеме: Если вы пытаетесь сделать отбор по полю Склад.Тип, но в Схеме компоновки данных (СКД) у поля Склад не разрешен выбор реквизитов, такой отбор будет проигнорирован. Проверьте настройки «Ограничение поля» в Конфигураторе на вкладке «Наборы данных».
  3. Использование в Динамических списках: Помните, что поведение отчетов и динамических списков различается. В динамических списках (формы списков справочников/документов) структура с ключом-точкой иногда может сработать, но для отчетов СКД всегда следует использовать ФиксированныеНастройки.

Таким образом, использование объекта НастройкиКомпоновкиДанных и класса ПолеКомпоновкиДанных является единственным надежным способом программного управления сложными отборами в отчетах 1С. Рассмотренные методы позволяют гибко управлять поведением формы — от скрытых ограничений до предварительного заполнения пользовательских фильтров.

← На главную