Как сделать, чтобы структура подчиненности документа выводилась в отдельном окне в УПП

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

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

Анализ механизма работы форм в 1С

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

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

Решение 1: Использование Уникального Идентификатора

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


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

В данном примере мы передаем Новый УникальныйИдентификатор в третий параметр метода ПолучитьОбщуюФорму. Это гарантирует, что при каждом вызове процедуры система будет генерировать абсолютно новый ключ, не найдет «старую» форму в памяти и создаст новое окно.

Решение 2: Оптимизированное открытие (одно окно на один документ)

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

Выясним, как это реализовать на практике:


// Вместо генерации случайного GUID используем идентификатор ссылки
КлючУникальности = ДокументСсылка.УникальныйИдентификатор();
ФормаСтруктурыПодчиненности = ПолучитьОбщуюФорму("ФормаСтруктурыПодчиненности", , КлючУникальности);

ФормаСтруктурыПодчиненности.ДокументСсылка = ДокументСсылка;
ФормаСтруктурыПодчиненности.Открыть();

В этом случае поведение системы будет следующим:

  1. Если пользователь открывает структуру для «Заказа покупателя №1», открывается новое окно.
  2. Если затем он открывает структуру для «Реализации №5», открывается еще одно (второе) окно.
  3. Если пользователь снова нажмет кнопку в «Заказе покупателя №1», система найдет уже открытое окно именно для этого заказа по его GUID и просто выведет его на передний план.

Управление владельцем формы

Проанализируем еще один важный аспект — параметр Владелец. Это второй параметр в методе ПолучитьОбщуюФорму. Если мы хотим, чтобы окно структуры подчиненности автоматически закрывалось при закрытии самого документа, из которого оно было вызвано, нам нужно передать форму документа в качестве владельца.

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


// В контексте формы документа
Ключ = ДокументОбъект.Ссылка.УникальныйИдентификатор();
// ЭтаФорма — это форма документа, которая станет владельцем
ФормаСтруктуры = ПолучитьОбщуюФорму("ФормаСтруктурыПодчиненности", ЭтаФорма, Ключ);
ФормаСтруктуры.ДокументСсылка = ДокументОбъект.Ссылка;
ФормаСтруктуры.Открыть();

Особенности для управляемых форм в УПП

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

Разберем пример для управляемого интерфейса:


ПараметрыФормы = Новый Структура("ТекущийОбъект", ДокументСсылка);
// В методе ОткрытьФорму ключ уникальности — это четвертый параметр
ОткрытьФорму("ОбщаяФорма.ФормаСтруктурыПодчиненности", ПараметрыФормы, ЭтаФорма, ДокументСсылка.УникальныйИдентификатор());

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

Важные замечания по производительности

Важно понимать, что каждое открытое окно в 1С потребляет оперативную память. Если пользователь будет открывать десятки окон структур подчиненности и не закрывать их, это может привести к замедлению работы клиентского приложения. Поэтому рекомендуется использовать подход с GUID документа (Решение 2), так как он ограничивает количество окон разумными пределами.

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

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

← На главную