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