Как исправить ошибку «Пересечение ключей источника и приемника: "Выполнять замеры"» в отчетах 1С после обновления?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

При обновлении типовых конфигураций 1С (таких как 1С:Бухгалтерия предприятия 3.0, ERP или Комплексная автоматизация) программисты и администраторы часто сталкиваются с неприятной ситуацией: отчеты, которые годами работали в расширениях или были заимствованы из других решений, внезапно перестают открываться. Программа выдает критическую ошибку: «Пересечение ключей источника и приемника: "Выполнять замеры"». Рассмотрим подробно, почему возникает этот сбой и как его устранить несколькими способами.

Выясним причину возникновения ошибки

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

Конфликт происходит в общем модуле ОбщегоНазначенияКлиентСервер в процедуре ДополнитьСтруктуру. Посмотрим на логику работы этого метода:


// Дополняет структуру значениями из другой структуры.
// Приемник - Структура, в которую добавляем.
// Источник - Структура, из которой берем данные.
// Заменять - Булево (Истина, Ложь или Неопределено).
Процедура ДополнитьСтруктуру(Приемник, Источник, Заменять = Неопределено) Экспорт
    Для Каждого Элемент Из Источник Цикл
        Если Заменять <> Истина И Приемник.Свойство(Элемент.Ключ) Тогда
            Если Заменять = Ложь Тогда
                Продолжить;
            Иначе
                ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                    НСтр("ru = 'Пересечение ключей источника и приемника: ""%1"".'"), Элемент.Ключ);
            КонецЕсли;
        КонецЕсли;
        Приемник.Вставить(Элемент.Ключ, Элемент.Значение);
    КонецЦикла;
КонецПроцедуры

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

Способ 1. Быстрое решение: комментирование конфликтного участка

Если вам нужно восстановить работоспособность отчета максимально оперативно, разберем самый простой путь. Чаще всего в модуле формы отчета (обычно в процедурах инициализации или при формировании настроек на клиенте) встречается строка, объединяющая настройки отчета с параметрами системы. Нам нужно найти этот участок кода.

Пошаговый план действий (предварительно можно выполнить поиск ошибок во внешних отчетах):

  1. Откроем конфигуратор и найдем отчет, который выдает ошибку.
  2. Перейдем в Модуль формы этого отчета.
  3. Воспользуемся глобальным поиском (Ctrl+F) по фразе ДополнитьСтруктуру или ПараметрыКлиента.
  4. Найдем строку, похожую на следующую:

ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(НастройкиОтчета, ВариантыОтчетов.ПараметрыКлиента());

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


// ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(НастройкиОтчета, ВариантыОтчетов.ПараметрыКлиента());

Важно: Этот способ поможет быстро запустить отчет, но он не является «чистым» с точки зрения архитектуры 1С, так как мы лишаем отчет части системных параметров.

Способ 2. Правильное исправление: изменение логики объединения

Рассмотрим более профессиональный подход. Вместо того чтобы удалять вызов функции, мы изменим поведение процедуры ДополнитьСтруктуру. Мы укажем системе, что при обнаружении дубликатов ключей значение из Источника должно просто перезаписать значение в Приемнике.

Для этого добавим третий параметр Истина в вызов процедуры:


// Было:
ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(НастройкиОтчета, ВариантыОтчетов.ПараметрыКлиента());

// Стало:
ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(НастройкиОтчета, ВариантыОтчетов.ПараметрыКлиента(), Истина);

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

Способ 3. Превентивное удаление дубликата

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


// Проверяем наличие конфликтного ключа и удаляем его перед дополнением
Если НастройкиОтчета.Свойство("ВыполнятьЗамеры") Тогда
    НастройкиОтчета.Удалить("ВыполнятьЗамеры");
КонецЕсли;

// Теперь пересечения не будет
ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(НастройкиОтчета, ВариантыОтчетов.ПараметрыКлиента());

Обратите внимание: имя ключа может быть написано как "ВыполнятьЗамеры" (слитно), так и "Выполнять замеры" (с пробелом), в зависимости от конкретной версии БСП и того, как он был определен ранее в вашем коде. Рекомендуется проверить точное написание в отладчике, остановившись на строке с ошибкой.

Способ 4. Обновление кода из типового решения (для отраслевых баз)

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

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

  1. Найдите аналогичный отчет в свежем релизе типовой конфигурации (например, в актуальной демо-базе БСО).
  2. Откройте модуль формы этого отчета.
  3. Скопируйте целиком процедуры, связанные с инициализацией настроек и работой с параметрами клиента.
  4. Замените старый код в своем расширении на новый, в чем поможет ИИ помощник обновления расширений.

Этот метод хорош тем, что вы получаете не только исправление конкретной ошибки с замерами, но и все остальные актуальные доработки от вендора, которые могли появиться в новом релизе (поддержка новых фильтров, прав доступа или оптимизация СКД).

Резюме

Мы разобрали, что ошибка «Пересечение ключей источника и приемника» — это следствие ужесточения контроля целостности структур в БСП при внедрении подсистемы замера производительности. Для решения проблемы достаточно обеспечить отсутствие дублей ключей при вызове функции ДополнитьСтруктуру. Рекомендуемым способом является добавление параметра Истина в вызов процедуры, что позволяет системе корректно обрабатывать повторяющиеся параметры без остановки работы пользователя.

← На главную