Как программно установить отборы в отчете СКД при открытии из документа или формы

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

В практике разработки на платформе 1С часто возникает задача: открыть отчет из документа или другой формы с уже установленными фильтрами. При этом важно не просто отфильтровать данные «тихо», но и вывести эти настройки в пользовательский интерфейс, чтобы пользователь видел, по каким критериям сформирован отчет, и мог их изменить. В данной статье мы разберем, как правильно реализовать этот механизм, проанализируем типичные ошибки и рассмотрим лучшие практики работы с КомпоновщикомНастроек.

Проблема: почему отборы не применяются или не отображаются

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

Шаг 1. Создание универсальной процедуры установки отбора

Для начала нам понадобится процедура, которая будет добавлять элемент отбора в настройки компоновки. Важно понимать разницу между основными настройками (с которыми работает алгоритм) и пользовательскими (которые видит человек на экране).

Разберем пример кода, который корректно создает элемент отбора:


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

Шаг 2. Особенности «Левого значения» и типов данных

Проанализируем распространенную ошибку: присвоение ЛевоеЗначение = "ИмяПоля". В системе компоновки данных ЛевоеЗначение должно иметь тип ПолеКомпоновкиДанных. Если передать туда просто строку, система может воспринять её как текст, а не как путь к данным базы. Всегда используйте конструктор Новый ПолеКомпоновкиДанных(ИмяПоля).

Также обратим внимание на Правое значение. Тип передаваемого значения в переменной Значение должен строго совпадать с типом поля в СКД. Если поле «Потребитель» имеет тип СправочникСсылка.Контрагенты, а вы передадите туда строку с наименованием, отбор не сработает.

Шаг 3. Синхронизация с пользовательскими настройками

Просто добавить элемент в КомпоновщикНастроек.Настройки.Отбор недостаточно для того, чтобы он «взлетел» в форме отчета. В 1С существует разделение на общие настройки варианта и пользовательские настройки. Чтобы отбор появился в форме, необходимо:

  1. Установить ИдентификаторПользовательскойНастройки (как показано в коде выше).
  2. При открытии формы передать эти настройки в параметры.

Выясним, как правильно подготовить параметры открытия формы:


&НаСервереБезКонтекста
Функция ПолучитьПараметрыОткрытияОтчета(ИмяОтчета, Потребитель)
    
    ОтчетОбъект = Отчеты[ИмяОтчета].Создать();
    КомпоновщикНастроек = ОтчетОбъект.КомпоновщикНастроек;
    
    // Устанавливаем отбор
    УстановитьЭлементОтбораСКД(КомпоновщикНастроек, ВидСравненияКомпоновкиДанных.Равно, "Потребитель", Потребитель);
    
    // Формируем структуру параметров для функции ОткрытьФорму
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
    
    // Передаем измененные настройки и пользовательские настройки
    ПараметрыОткрытия.Вставить("ПользовательскиеНастройки", КомпоновщикНастроек.ПользовательскиеНастройки);
    
    Возврат ПараметрыОткрытия;
    
КонецФункции

Шаг 4. Почему не видно «Вид сравнения»?

Часто пользователи жалуются, что в отчете видно поле значения, но нельзя поменять «Равно» на «В списке». Рассмотрим причину: это стандартное поведение платформы для режима Быстрого доступа. Если установлен вид сравнения ВидСравненияКомпоновкиДанных.Равно, система скрывает колонку вида сравнения для упрощения интерфейса.

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

Шаг 5. Внимание к деталям (Опечатки)

Как показывает практика, огромная часть проблем решается проверкой правильности написания имен полей. В языке 1С имена полей чувствительны к буквам. Опечатка типа "Портебитель" вместо "Потребитель" не вызовет ошибку компиляции, но приведет к тому, что отбор просто не будет найден в схеме и проигнорируется. Всегда проверяйте соответствие имен в конфигураторе и в коде.

Альтернативный метод: использование ФиксированныхНастроек

Если вы хотите установить отбор, который пользователь не должен иметь возможности отключить, рассмотрим использование ФиксированныеНастройки. Отборы, добавленные в эту коллекцию, суммируются с пользовательскими, но не отображаются в стандартном списке доступных настроек для изменения. Это гарантирует, что отчет будет сформирован строго по нужным данным (например, только по конкретной организации, из которой вызван отчет).


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

Резюме

Для успешной программной настройки отчетов в 1С 8.3 придерживайтесь следующих правил:

  1. Используйте объект ПолеКомпоновкиДанных для задания левой части отбора.
  2. Всегда генерируйте УникальныйИдентификатор для пользовательской настройки, если хотите видеть её на форме.
  3. Тщательно проверяйте имена полей на предмет опечаток.
  4. Передавайте ПользовательскиеНастройки в параметрах формы при вызове ОткрытьФорму.
  5. Учитывайте иерархию данных: если нужно выбрать группу и всех её потомков, используйте ВидСравненияКомпоновкиДанных.ВИерархии.

Соблюдение этих простых шагов позволит вам создавать гибкие и понятные отчеты (включая такие нюансы, как скрытие пустых столбцов), которые будут автоматически настраиваться под контекст работы пользователя.

← На главную