При разработке и отладке внешних отчетов программисты часто сталкиваются с досадной ситуацией: при попытке запустить вторую копию отчета (например, сделанную через «Сохранить как») система просто переключает фокус на уже открытое окно первого отчета. Даже если файлы называются по-разному и лежат в разных папках, платформа 1С воспринимает их как один и тот же объект. Рассмотрим подробнее, почему это происходит и какими способами можно добиться одновременного открытия нескольких окон.
Прежде чем переходить к коду, проанализируем внутренние механизмы платформы. Основная причина кроется в GUID (уникальном идентификаторе) объекта метаданных. Когда мы создаем копию внешнего отчета обычным копированием файла в Windows или через команду «Сохранить как» в конфигураторе, внутренний идентификатор отчета остается прежним. Для системы это один и тот же отчет, несмотря на разные физические имена файлов.
Также важную роль играет свойство Имя в корне метаданных. Если у двух внешних файлов в поле Имя указано одинаковое значение (например, ОтчетПоПродажам), платформа регистрирует их в памяти под одним типом. Еще один нюанс связан с кэшированием: при открытии внешнего отчета 1С копирует его во временную директорию. Конфликт имен в кэше приводит к тому, что система использует уже загруженную версию объекта.
Это самый быстрый и эффективный метод, который позволяет открывать неограниченное количество экземпляров одной и той же формы, не меняя структуру самого файла. Разберем по шагам, как это реализовать.
Нам необходимо вмешаться в процесс открытия формы. В модуле формы отчета (или обработки) найдем обработчик события ПередОткрытием (для обычных форм) или ПриСозданииНаСервере (для управляемых форм). Мы должны явно указать платформе, что каждое новое окно должно иметь свой уникальный ключ.
Для обычных форм (8.2 и режим обычного приложения 8.3) используем следующий код:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
// Устанавливаем новый GUID для ключа уникальности текущей формы
ЭтаФорма.КлючУникальности = Новый УникальныйИдентификатор;
КонецПроцедуры
В управляемом приложении принцип похожий, но чаще всего ключ уникальности передается в параметрах при программном открытии формы. Однако, если мы хотим, чтобы отчет «сам себя» умел открывать в новом окне при стандартном запуске через Файл -> Открыть, этот метод остается актуальным.
Если вы не хотите писать код, можно попробовать «обмануть» систему через настройки метаданных. Рассмотрим, что именно нужно изменить:
Имя (например, добавьте индекс _1). Помните, что имя файла на диске и имя объекта внутри 1С — это разные вещи.Файл -> Новый -> Внешний отчет, а затем перенесите (скопируйте) в него схему компоновки данных (СКД), модули и формы. У нового файла будет абсолютно новый уникальный идентификатор.Существует интересный подход, когда одна форма служит «стартером» для других. Это полезно, если вам нужно программно управлять количеством открытых окон. Проанализируем пример кода, где основная форма закрывается сразу после открытия рабочей копии с уникальным ключом:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
// Отменяем стандартное открытие текущего окна
СтандартнаяОбработка = Ложь;
// Получаем форму этого же отчета, но с уникальным ключом
НоваяФорма = ПолучитьФорму("ФормаОтчета");
НоваяФорма.КлючУникальности = Новый УникальныйИдентификатор;
НоваяФорма.Открыть();
// Закрываем текущую форму-инициатор
Отказ = Истина;
КонецПроцедуры
Этот метод гарантирует, что каждое нажатие Файл -> Открыть будет порождать новое независимое окно.
В современных версиях платформы 8.3 работа с формами стала строже. Если вы вызываете отчет программно, крайне важно правильно использовать метод ОткрытьФорму(). Посмотрим на правильную конструкцию:
// Пример программного открытия формы с гарантированной уникальностью
ПараметрыФормы = Новый Структура;
ОткрытьФорму("ВнешнийОтчет.МойОтчет.Форма.ФормаОтчета", ПараметрыФормы, , Истина);
Здесь четвертый параметр (Уникальность) имеет решающее значение. Установив его в значение Истина, мы заставляем 1С игнорировать уже открытые окна с таким же путем к форме и создавать новый экземпляр.
Подводя итог, можно выделить несколько правил, которые помогут избежать проблем с «залипанием» окон:
Имя в корне метаданных.КлючУникальности, если логика вашей задачи подразумевает сравнение данных в двух разных окнах одного и того же внешнего файла.Таким образом, мы выяснили, что проблема не в ошибке платформы, а в механизме идентификации объектов. Применяя программную установку ключа уникальности или пересоздание метаданных, вы сможете эффективно работать с любым количеством копий внешних обработок и отчетов.