Как реализовать вывод структуры подчиненности в форме списка заказов покупателя

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

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

Выбор элемента управления для отображения структуры

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

  1. Поле табличного документа: Это наиболее естественный вариант для УПП. Он позволяет программно сформировать отчет, аналогичный стандартной обработке СтруктураПодчиненности, с сохранением гиперссылок. Пользователь сможет нажать на номер документа в этой панели и сразу открыть его.
  2. Табличное поле с типом значения ДеревоЗначений: Этот вариант более интерактивен. Мы можем вывести колонки с пиктограммами типов документов, суммами и датами. Это выглядит более современно и позволяет легко управлять разворачиванием узлов дерева.

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

Решение проблемы производительности: использование обработчика ожидания

Основная ошибка начинающих разработчиков — попытка вызвать формирование структуры напрямую в событии ПриАктивизацииСтроки. Поскольку формирование дерева подчиненности требует запросов к базе данных (иногда рекурсивных), при быстром пролистывании списка стрелками на клавиатуре интерфейс начнет «заикаться» или вовсе зависнет.

Разберем правильный алгоритм работы с событием активации строки:

  1. В событии ПриАктивизацииСтроки мы не выполняем никаких расчетов.
  2. Мы подключаем обработчик ожидания с небольшой задержкой (например, 0.5 – 0.8 секунды).
  3. Если пользователь переместил курсор на следующую строку до истечения этого времени, старый обработчик переподключается, и запрос не выполняется.
  4. Запрос сработает только тогда, когда пользователь остановится на конкретном заказе.

Рассмотрим пример кода для реализации этой логики:


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

Процедура ОбновитьПанельСтруктуры()
    ТекущийЗаказ = ЭлементыФормы.Список.ТекущиеДанные.Ссылка;
    СформироватьДеревоНаФорме(ТекущийЗаказ);
КонецПроцедуры

Методы получения данных о связанных документах

Для того чтобы быстро получить список подчиненных документов в УПП, не обязательно перебирать все метаданные. Выясним наиболее эффективные способы:

1. Использование критерия отбора: В большинстве конфигураций существует критерий отбора СвязанныеДокументы. Запрос к нему работает значительно быстрее, чем ручной поиск по реквизитам ДокументОснование во всех таблицах.


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	СвязанныеДокументы.Ссылка КАК Ссылка
    |ИЗ
    |	КритерийОтбора.СвязанныеДокументы(&Основание) КАК СвязанныеДокументы";

Запрос.УстановитьПараметр("Основание", ТекущийЗаказ);
Результат = Запрос.Выполнить().Выгрузить();

2. Использование штатной обработки: Мы можем программно создать экземпляр обработки СтруктураПодчиненности, передать ей ссылку на документ и попросить ее вывести результат в наше поле на форме. Это позволит избежать дублирования кода логики поиска.

Оптимизация и кэширование

Чтобы сделать работу еще более плавной, проанализируем возможность кэширования результатов. Если менеджер постоянно переключается между двумя-тремя заказами, нет смысла каждый раз обращаться к СУБД. Можно создать переменную модуля формы с типом Соответствие, где ключом будет ссылка на документ, а значением — структура данных для отображения. Перед выполнением запроса проверяем наличие ссылки в кэше.

Также важно помнить об ограничениях глубины поиска. Для панели быстрого просмотра в списке заказов обычно достаточно отображать только прямых потомков (счета, реализации, возвраты) и прямых предков (события, сделки), не углубляясь на 5-10 уровней иерархии, что может быть критично для крупных производственных цепочек.

Дополнительные возможности визуализации

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

Важное замечание: При работе в режиме обычного приложения (толстый клиент) помните, что избыточное количество элементов на одной форме может привести к повышенному потреблению памяти. Старайтесь делать панель структуры максимально лаконичной и скрываемой (через ЭлементыФормы.ПанельСтруктуры.Видимость), чтобы она не занимала место, когда в ней нет необходимости.

← На главную