Почему не открывается копия внешнего отчета при открытом оригинале в 1С?

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

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

В этой статье разберем, почему платформа 1С считает два разных файла одним и тем же объектом, как устроен механизм поиска открытых форм и какие способы позволяют быстро исправить эту проблему.

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

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

Идентификация формы опирается не только на физическое имя файла или имя объекта, но и на внутренний уникальный идентификатор (GUID) самой формы. При использовании команды «Сохранить как...» создается точный дубликат файла .erf, в котором сохраняются все внутренние UUID реквизитов, объектов и подчиненных форм.

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

Способ 1. Пересоздание основной формы в отчете-копии

Самый быстрый способ устранить дублирование идентификаторов без создания отчета с нуля — принудительно пересоздать его форму. Разберем по шагам, как это сделать:

  1. Откроем скопированный внешний отчет в Конфигураторе.
  2. В ветке объекта перейдем к разделу Формы.
  3. Добавим новую форму отчета (она получит новый уникальный GUID).
  4. Скопируем или настроим заново элементы управления, реквизиты, команды и обработчики событий со старой формы на новую.
  5. В свойствах отчета назначим созданную форму в качестве Основной формы.
  6. Удалим старую форму из состава отчета.
  7. Сохраним файл отчета.

После этой процедуры у формы отчета будет собственный уникальный идентификатор, и конфликт с оригинальным отчетом будет исчерпан.

Способ 2. Создание нового отчета «с чистого листа»

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

  1. В исходном отчете откроем схему компоновки данных и сохраним ее в файл схемы .xml через меню действий со схемой.
  2. В новом отчете создадим основную схему компоновки и выполним загрузку схемы из сохраненного XML-файла.
  3. При необходимости настроим модули объекта и параметры отчета.

При таком подходе все внутренние идентификаторы метаданных генерируются заново, что полностью исключает коллизии при параллельном открытии.

Способ 3. Программное открытие с управлением уникальностью

Если внешний отчет открывается программно из другой формы или команды, мы можем управлять поведением платформы с помощью параметра КлючУникальности метода ОткрытьФорму().

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


ПараметрыОткрытия = Новый Структура;
// Передаем новый уникальный идентификатор для гарантии создания нового окна формы
УникальныйКлюч = Новый УникальныйИдентификатор;

ОткрытьФорму(
    "ВнешнийОтчет." + ИмяОтчета + ".Форма.ФормаОтчета",
    ПараметрыОткрытия,
    ЭтотОбъект,
    УникальныйКлюч
);

Если в качестве четвертого параметра передать Новый УникальныйИдентификатор или значение Ложь (в зависимости от контекста вызова), платформа проигнорирует уже открытые формы и создаст отдельный независимый экземпляр окна.

Дополнительно: нюансы порядка полей в детальных записях СКД

Нередко при доработке внешних отчетов на СКД разработчики сталкиваются с тем, что порядок колонок в результате не соответствует порядку на вкладке Выбранные поля. Проанализируем основные причины такого поведения:

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