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