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