Как в 1С:Документооборот реализовать форму с деревом подразделений и фильтрацией документов

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

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

Шаг 1: Подготовка структуры формы

Для начала нам необходимо создать форму списка или произвольную форму. Разберем вариант создания новой формы. Нам потребуются два основных реквизита типа ДинамическийСписок:

  1. СтруктураПредприятия — список, отображающий иерархию подразделений (основная таблица Справочник.СтруктураПредприятия).
  2. СписокДокументов — список ваших документов (например, Документ.ЗаявкаУИиС), который мы будем фильтровать.

Разместим их на форме. Для удобства пользователей лучше всего использовать группу типа Группа - Страницы или Группа - Горизонтальная, чтобы разделить экран на две панели. Левую панель со структурой предприятия стоит сделать уже, а правую со списком документов — шире.

Шаг 2: Настройка динамического списка документов через произвольный запрос

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

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


ВЫБРАТЬ
    ТаблицаДокументов.Ссылка,
    ТаблицаДокументов.Дата,
    ТаблицаДокументов.Номер,
    ТаблицаДокументов.Подразделение,
    ТаблицаДокументов.Ответственный
ИЗ
    Документ.ЗаявкаУИиС КАК ТаблицаДокументов
ГДЕ
    (&ВсеПодразделения ИЛИ ТаблицаДокументов.Подразделение В ИЕРАРХИИ (&ВыбранноеПодразделение))

Разберем, что мы добавили в секцию ГДЕ:

Шаг 3: Связь между панелями формы

Теперь нам нужно настроить «общение» между левой и правой панелями. Основным событием здесь является ПриАктивизацииСтроки у таблицы, отображающей структуру предприятия. Однако здесь есть важный нюанс, касающийся производительности.

Проанализируем ситуацию: если пользователь будет быстро перемещаться по дереву подразделений с помощью стрелок на клавиатуре, прямое обращение к серверу для обновления правого списка при каждом нажатии приведет к «зависанию» интерфейса. Чтобы этого избежать, используем обработчик ожидания.

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


&НаКлиенте
Процедура СтруктураПредприятияПриАктивизацииСтроки(Элемент)
    // Отключаем предыдущий вызов, если пользователь нажал кнопку быстрее, чем за 0.2 сек
    ОтключитьОбработчикОжидания("ВыполнитьОбновлениеСпискаДокументов");
    // Взводим новый вызов
    ПодключитьОбработчикОжидания("ВыполнитьОбновлениеСпискаДокументов", 0.2, Истина);
КонецПроцедуры

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


&НаКлиенте
Процедура ВыполнитьОбновлениеСпискаДокументов()
    ТекущиеДанные = Элементы.СтруктураПредприятия.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        ОбновитьСписокНаСервере(ПредопределенноеЗначение("Справочник.СтруктураПредприятия.ПустаяСсылка"), Истина);
    Иначе
        ОбновитьСписокНаСервере(ТекущиеДанные.Ссылка, Ложь);
    КонецЕсли;
КонецПроцедуры

Шаг 4: Программное управление параметрами динамического списка

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


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

Использование метода УстановитьЗначениеПараметра автоматически включает использование этого параметра (свойство Использование = Истина), что инициирует обновление данных в таблице на форме.

Шаг 5: Дополнительная настройка иерархии и отборов

Для того чтобы форма выглядела завершенной и работала корректно, следует учесть еще несколько моментов:

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

Рассмотрим также возможность добавления на форму флага «Показывать документы подчиненных подразделений». В этом случае в запросе динамического списка можно динамически менять условие В ИЕРАРХИИ на обычное =, либо передавать значение этого флага как еще один параметр в запрос, чтобы управлять логикой отбора прямо в SQL-коде 1С.

Таким образом, мы реализовали современный и удобный интерфейс «дерево-список», который полностью соответствует стандартам разработки 1С:Документооборот и обеспечивает высокую скорость работы пользователя.

← На главную