В типовых конфигурациях 1С:Предприятие 8 на обычных формах (таких как «Управление торговлей, ред. 10.3», «Управление производственным предприятием, ред. 1.3» или «Комплексная автоматизация, ред. 1.1») часто используется обработка УниверсальныйЖурналДокументов. Этот инструмент позволяет выводить в единую таблицу документы различных видов, динамически определяя состав колонок и отборов.
Однако при попытке открыть эту обработку программно с уже предустановленным списком документов и готовыми отборами разработчики сталкиваются с трудностями. Стандартные методы работы с формами списков здесь не подходят, так как логика построения списка в обработке полностью завязана на внутренний объект — Построитель запроса (ПостроительЗапроса).
В этой статье мы подробно разберем, как программно настроить и открыть Универсальный журнал документов по заданным видам документов и с нужными отборами.
Перед тем как перейти к коду, проанализируем, как работает данная обработка изнутри. Она динамически формирует текст запроса к базе данных с помощью объекта ПостроительЗапроса. Процесс происходит следующим образом:
ДоступныеДокументы на форме и определяет, какие виды документов отмечены пользователем.ПолучитьСтруктуруГраф(). Она находит общие реквизиты у выбранных документов (например, Организация, Контрагент, Склад) и формирует колонки табличного поля.ПостроительЗапроса передаются выбранные документы и общие графы, после чего генерируется и выполняется SQL-запрос к базе данных с объединением таблиц (ОБЪЕДИНИТЬ ВСЕ).Таким образом, чтобы программно открыть журнал с нашими параметрами, нам нужно воспроизвести этот алгоритм в коде.
Рассмотрим пошагово весь процесс реализации задачи.
Для начала инициализируем форму обработки в памяти, но пока не открываем ее на экране:
ФормаЖурнала = Обработки.УниверсальныйЖурналДокументов.ПолучитьФорму("ОсновнаяФорма");
В форме обработки есть коллекция ДоступныеДокументы. Нам необходимо обойти ее в цикле и установить признак Пометка в значение Истина только для тех видов документов, которые мы хотим видеть в журнале. Остальные документы нужно отключить.
Для Каждого СтрокаДок Из ФормаЖурнала.ДоступныеДокументы Цикл
// Включаем только нужные виды документов, остальные отключаем
Если СтрокаДок.ИмяДокумента = "РеализацияТоваровУслуг"
Или СтрокаДок.ИмяДокумента = "ПоступлениеТоваровУслуг" Тогда
СтрокаДок.Пометка = Истина;
Иначе
СтрокаДок.Пометка = Ложь;
КонецЕсли;
КонецЦикла;
После изменения состава доступных документов обязательно вызываем экспортный метод формы ПолучитьСтруктуруГраф(). Это перестроит колонки табличного поля и подготовит список полей для настройки отборов в построителе запроса:
ФормаЖурнала.ПолучитьСтруктуруГраф();
Теперь мы можем настроить фильтрацию данных. Отборы настраиваются через стандартную коллекцию Отбор нашего построителя запроса. Перед установкой отбора обязательно проверяем, присутствует ли нужное поле в доступных полях построителя (оно появится там только в том случае, если данный реквизит является общим для выбранных на Шаге 2 документов).
// Получаем коллекцию отборов построителя запроса
ОтборыПостроителя = ФормаЖурнала.ПостроительЗапроса.Отбор;
// 1. Пример установки отбора по Организации
Если ОтборыПостроителя.Найти("Организация") <> Неопределено Тогда
ОтборОрг = ОтборыПостроителя.Организация;
ОтборОрг.Использование = Истина;
ОтборОрг.ВидСравнения = ВидСравнения.Равно;
ОтборОрг.Значение = ВыбраннаяОрганизация; // Передаем ссылку на Организацию
КонецЕсли;
// 2. Пример установки отбора по Контрагенту
Если ОтборыПостроителя.Найти("Контрагент") <> Неопределено Тогда
ОтборКонтр = ОтборыПостроителя.Контрагент;
ОтборКонтр.Использование = Истина;
ОтборКонтр.ВидСравнения = ВидСравнения.Равно;
ОтборКонтр.Значение = ВыбранныйКонтрагент; // Передаем ссылку на Контрагента
КонецЕсли;
Когда все настройки применены, необходимо принудительно заставить построитель перестроить и выполнить запрос к базе данных. Для этого вызываем процедуру обновления списка и затем открываем форму пользователю:
// В зависимости от конфигурации метод может называться ОбновитьСписок или ДействияОбновитьСписок
Попытка
ФормаЖурнала.ОбновитьСписок();
Исключение
ФормаЖурнала.ДействияОбновитьСписок();
КонецПопытки;
// Открываем форму
ФормаЖурнала.Открыть();
---
Для удобства использования в различных частях конфигурации оформим этот алгоритм в виде универсальной процедуры. Ее можно разместить в общем модуле или модуле вызова:
Процедура ПрограммноОткрытьУниверсальныйЖурнал(СтруктураПараметров) Экспорт
// Получаем форму обработки
ФормаЖурнала = Обработки.УниверсальныйЖурналДокументов.ПолучитьФорму("ОсновнаяФорма");
// Заполняем состав документов
СписокДокументов = СтруктураПараметров.СписокДокументов; // Массив имен метаданных документов
Для Каждого СтрокаДок Из ФормаЖурнала.ДоступныеДокументы Цикл
Если СписокДокументов.Найти(СтрокаДок.ИмяДокумента) <> Неопределено Тогда
СтрокаДок.Пометка = Истина;
Иначе
СтрокаДок.Пометка = Ложь;
КонецЕсли;
КонецЦикла;
// Строим структуру колонок
ФормаЖурнала.ПолучитьСтруктуруГраф();
// Настраиваем отборы
ОтборыПостроителя = ФормаЖурнала.ПостроительЗапроса.Отбор;
// Программный отбор по Организации
Если СтруктураПараметров.Свойство("Организация") И ЗначениеЗаполнено(СтруктураПараметров.Организация) Тогда
Если ОтборыПостроителя.Найти("Организация") <> Неопределено Тогда
ОтборОрг = ОтборыПостроителя.Организация;
ОтборОрг.Использование = Истина;
ОтборОрг.ВидСравнения = ВидСравнения.Равно;
ОтборОрг.Значение = СтруктураПараметров.Организация;
КонецЕсли;
КонецЕсли;
// Программный отбор по Контрагенту
Если СтруктураПараметров.Свойство("Контрагент") И ЗначениеЗаполнено(СтруктураПараметров.Контрагент) Тогда
Если ОтборыПостроителя.Найти("Контрагент") <> Неопределено Тогда
ОтборКонтр = ОтборыПостроителя.Контрагент;
ОтборКонтр.Использование = Истина;
ОтборКонтр.ВидСравнения = ВидСравнения.Равно;
ОтборКонтр.Значение = СтруктураПараметров.Контрагент;
КонецЕсли;
КонецЕсли;
// Обновляем и открываем форму
Попытка
ФормаЖурнала.ОбновитьСписок();
Исключение
ФормаЖурнала.ДействияОбновитьСписок();
КонецПопытки;
ФормаЖурнала.Открыть();
КонецПроцедуры
Пример вызова разработанной процедуры:
ПараметрыЖурнала = Новый Структура;
МассивВидовДокументов = Новый Массив;
МассивВидовДокументов.Добавить("РеализацияТоваровУслуг");
МассивВидовДокументов.Добавить("ПоступлениеТоваровУслуг");
ПараметрыЖурнала.Вставить("СписокДокументов", МассивВидовДокументов);
ПараметрыЖурнала.Вставить("Организация", Справочники.Организации.НайтиПоРеквизиту("ИНН", "7700000000"));
ПараметрыЖурнала.Вставить("Контрагент", ВыбранныйКонтрагент);
ПрограммноОткрытьУниверсальныйЖурнал(ПараметрыЖурнала);
Найти() перед обращением к свойству отбора.Попытка ... Исключение для вызова методов ОбновитьСписок() или ДействияОбновитьСписок().ПостроительЗапроса.Текст внутри модуля формы обработки Универсального журнала документов, добавив описание нового поля в секцию выбора запроса.