Как программно открыть Универсальный журнал документов с отборами и заданным списком документов?

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

В типовых конфигурациях 1С:Предприятие 8 на обычных формах (таких как «Управление торговлей, ред. 10.3», «Управление производственным предприятием, ред. 1.3» или «Комплексная автоматизация, ред. 1.1») часто используется обработка УниверсальныйЖурналДокументов. Этот инструмент позволяет выводить в единую таблицу документы различных видов, динамически определяя состав колонок и отборов.

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

В этой статье мы подробно разберем, как программно настроить и открыть Универсальный журнал документов по заданным видам документов и с нужными отборами.

Архитектура Универсального журнала документов

Перед тем как перейти к коду, проанализируем, как работает данная обработка изнутри. Она динамически формирует текст запроса к базе данных с помощью объекта ПостроительЗапроса. Процесс происходит следующим образом:

  1. Программа обращается к коллекции ДоступныеДокументы на форме и определяет, какие виды документов отмечены пользователем.
  2. На основе выбранных документов вызывается метод инициализации граф (колонок) — процедура ПолучитьСтруктуруГраф(). Она находит общие реквизиты у выбранных документов (например, Организация, Контрагент, Склад) и формирует колонки табличного поля.
  3. В ПостроительЗапроса передаются выбранные документы и общие графы, после чего генерируется и выполняется SQL-запрос к базе данных с объединением таблиц (ОБЪЕДИНИТЬ ВСЕ).

Таким образом, чтобы программно открыть журнал с нашими параметрами, нам нужно воспроизвести этот алгоритм в коде.

Пошаговая инструкция по программной настройке и открытию

Рассмотрим пошагово весь процесс реализации задачи.

Шаг 1. Получение формы обработки

Для начала инициализируем форму обработки в памяти, но пока не открываем ее на экране:


ФормаЖурнала = Обработки.УниверсальныйЖурналДокументов.ПолучитьФорму("ОсновнаяФорма");

Шаг 2. Заполнение состава документов

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


Для Каждого СтрокаДок Из ФормаЖурнала.ДоступныеДокументы Цикл
    // Включаем только нужные виды документов, остальные отключаем
    Если СтрокаДок.ИмяДокумента = "РеализацияТоваровУслуг" 
       Или СтрокаДок.ИмяДокумента = "ПоступлениеТоваровУслуг" Тогда
        СтрокаДок.Пометка = Истина;
    Иначе
        СтрокаДок.Пометка = Ложь;
    КонецЕсли;
КонецЦикла;

Шаг 3. Инициализация структуры колонок

После изменения состава доступных документов обязательно вызываем экспортный метод формы ПолучитьСтруктуруГраф(). Это перестроит колонки табличного поля и подготовит список полей для настройки отборов в построителе запроса:

ФормаЖурнала.ПолучитьСтруктуруГраф();

Шаг 4. Установка отборов в Построителе запроса

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


// Получаем коллекцию отборов построителя запроса
ОтборыПостроителя = ФормаЖурнала.ПостроительЗапроса.Отбор;

// 1. Пример установки отбора по Организации
Если ОтборыПостроителя.Найти("Организация") <> Неопределено Тогда
    ОтборОрг = ОтборыПостроителя.Организация;
    ОтборОрг.Использование = Истина;
    ОтборОрг.ВидСравнения = ВидСравнения.Равно;
    ОтборОрг.Значение = ВыбраннаяОрганизация; // Передаем ссылку на Организацию
КонецЕсли;

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

Шаг 5. Обновление запроса и вывод формы

Когда все настройки применены, необходимо принудительно заставить построитель перестроить и выполнить запрос к базе данных. Для этого вызываем процедуру обновления списка и затем открываем форму пользователю:


// В зависимости от конфигурации метод может называться ОбновитьСписок или ДействияОбновитьСписок
Попытка
    ФормаЖурнала.ОбновитьСписок();
Исключение
    ФормаЖурнала.ДействияОбновитьСписок();
КонецПопытки;

// Открываем форму
ФормаЖурнала.Открыть();

---

Универсальный шаблон процедуры программного открытия

Для удобства использования в различных частях конфигурации оформим этот алгоритм в виде универсальной процедуры. Ее можно разместить в общем модуле или модуле вызова:


Процедура ПрограммноОткрытьУниверсальныйЖурнал(СтруктураПараметров) Экспорт

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

КонецПроцедуры

Пример вызова разработанной процедуры:


ПараметрыЖурнала = Новый Структура;

МассивВидовДокументов = Новый Массив;
МассивВидовДокументов.Добавить("РеализацияТоваровУслуг");
МассивВидовДокументов.Добавить("ПоступлениеТоваровУслуг");

ПараметрыЖурнала.Вставить("СписокДокументов", МассивВидовДокументов);
ПараметрыЖурнала.Вставить("Организация", Справочники.Организации.НайтиПоРеквизиту("ИНН", "7700000000"));
ПараметрыЖурнала.Вставить("Контрагент", ВыбранныйКонтрагент);

ПрограммноОткрытьУниверсальныйЖурнал(ПараметрыЖурнала);

Важные особенности, о которых стоит помнить

← На главную