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