Как сделать закладки с отбором документов по статусу в журнале 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

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

Архитектурные ограничения встроенных журналов документов в 1С 7.7

Прежде чем приступать к написанию программного кода, выясним фундаментальные ограничения платформы 1С 7.7, касающиеся списков документов:

  1. Невозможность изменения состава колонок на лету. В журнале документов невозможно создать несколько физических табличных частей или динамически скрыть/отобразить отдельные графы журнала для разных страниц. Свойство видимости колонок диалога, привычное по другим элементам управления, для встроенного списка журнала не работает. Журнал всегда отображает один и тот же фиксированный набор граф.
  2. Ограничение множественного отбора. Метод УстановитьОтбор() позволяет выполнять фильтрацию строго по одному критерию — либо по конкретному виду документа, либо по значению одного реквизита. Отфильтровать штатными средствами список так, чтобы одновременно отображались, к примеру, документы только вида «Реализация» и только со статусом «В доставке», встроенный журнал не позволяет.
  3. Требования к реквизиту для отбора. Чтобы метод УстановитьОтбор() корректно работал в общем журнале, фильтруемый реквизит должен быть объявлен в конфигураторе как Общий реквизит документов с обязательным включением признака «Отбор» (или «Сортировка»). Если реквизит является внутренним реквизитом шапки только одного конкретного документа, штатная фильтрация в общем журнале работать не будет.
  4. Поведение документов без реквизита. Если у какого-либо вида документов снят флажок использования этого общего реквизита или значение реквизита не заполнено, такой документ при активном отборе по значению гарантированно не попадет в выборку. Чтобы снова увидеть все документы, потребуется передать пустые параметры для сброса фильтрации.

Решение 1. Реализация отбора через закладки в общем журнале документов

Рассмотрим классический способ решения задачи при условии, что журнал является общим, а реквизит Статус вынесен в общие реквизиты документов с признаком отбора.

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

Посмотрим на пример кода в модуле формы журнала:


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

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

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

  1. При инициализации формы через свойство Форма.Закладки формируется список возможных статусов. Первым элементом рекомендуется добавлять пустое значение для возможности быстрого просмотра всех документов без наложения условий.
  2. В процедуре ПриВыбореЗакладки(Ном, Значен) платформа возвращает номер выбранной вкладки и ассоциированное с ней значение.
  3. Если значение не заполнено, выполняется вызов УстановитьОтбор("", ""), что полностью очищает фильтр журнала. При наличии конкретного значения статуса вызывается УстановитьОтбор("Статус", Значен), мгновенно ограничивая список документов.

Решение 2. Динамическое заполнение закладок из справочника

Проанализируем ситуацию, когда список этапов бизнес-процесса периодически меняется или настраивается администратором без изменения конфигурации. В таком случае вместо жестко заданного Перечисления статус удобнее хранить как Справочник.

Заполним список вкладок динамически при старте формы:


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

Процедура ПриВыбореЗакладки(Ном, Значен)
    Если ПустоеЗначение(Значен) = 1 Тогда
        УстановитьОтбор("", "");
    Иначе
        УстановитьОтбор("Статус", Значен);
    КонецЕсли;
КонецПроцедуры

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

Решение 3. Обход ограничений с помощью Таблицы Значений

Если требуется выводить разные колонки для разных закладок, накладывать составные условия (например, показывать исключительно документ «Реализация» и только с определенным статусом) или раскрашивать строки, возможностей штатного журнала платформы 7.7 недостаточно.

В этом случае разработчики создают произвольную форму (на базе отчета или обработки), где роль списка документов выполняет визуальный элемент ТаблицаЗначений:

  1. На форме размещается диалоговый элемент типа «ТаблицаЗначений» (например, с идентификатором ТабДокументов) и стандартные закладки формы.
  2. При открытии формы или переключении закладки запускается выборка документов через объект Документ методом ВыбратьДокументы() либо выполняется встроенный объект Запрос.
  3. Таблица значений очищается, заполняется только подходящими строками, а видимость и ширина колонок настраиваются программно в зависимости от выбранного слоя или закладки.
  4. Для интерактивной работы назначается процедура обработки двойного клика по строке таблицы значений, где вызывается метод ОткрытьФорму(ТабДокументов.ТекущийДокумент).

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


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

Для масштабных баз данных с интенсивным документооборотом подобная выборка средствами встроенного языка может замедлять работу. В таких сценариях программисты часто задействуют внешние компоненты (например, построение виртуального списка по прямым SQL-запросам), что снимает любые ограничения 1С 7.7 по скорости и гибкости интерфейса.

← На главную