Как исправить ошибку «Метод объекта не найден (СтруктураЗаголовковПолейЕдиницИзмерения)» при переходе на УТ 11.5?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Переход с версии 1С:Управление торговлей 11.4 (или аналогичных редакций ERP и КА) на версию 11.5 часто сопровождается неприятными сюрпризами при попытке сформировать доработанные или внешние отчеты. Одной из самых распространенных ошибок является Метод объекта не найден (СтруктураЗаголовковПолейЕдиницИзмерения). Рассмотрим детально, почему это происходит и как реанимировать ваши отчеты.

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

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

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

Способ 1: Простая замена метода на актуальный

Если ваш отчет практически не менял логику типового вывода, самым быстрым способом решения будет замена имени вызываемого метода. В версии 11.5 вместо старого названия используется ЗаголовкиПолейЕдиницИзмерений.

Разберем по шагам, что нужно изменить в коде модуля объекта отчета:

  1. Найдем функцию, которая отвечает за получение структуры заголовков (обычно она называется ПолучитьСтруктуруЗаголовковПолей).
  2. Заменим старую строку вызова на новую.

Посмотрим на пример кода до и после изменений:


// Было в 11.4:
Функция ПолучитьСтруктуруЗаголовковПолей()
    Возврат КомпоновкаДанныхСервер.СтруктураЗаголовковПолейЕдиницИзмерений(КомпоновщикНастроек);
КонецФункции

// Стало в 11.5:
Функция ПолучитьСтруктуруЗаголовковПолей()
    Возврат КомпоновкаДанныхСервер.ЗаголовкиПолейЕдиницИзмерений(КомпоновщикНастроек);
КонецФункции

Обратите внимание: 1С планомерно избавляется от префиксов «Получить», «Структура», «Таблица». Теперь методы именуются по принципу «что возвращаем» — в данном случае просто ЗаголовкиПолейЕдиницИзмерений.

Способ 2: Перенос логики метода в модуль отчета

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

Воспользуемся следующим алгоритмом:

  1. Откроем модуль объекта вашего отчета.
  2. Добавим в него код функции, которая раньше была в общем модуле.
  3. Исправим вызов внутри отчета, чтобы он обращался к локальной функции, а не к общему модулю.

Проанализируем пример реализации такой функции внутри модуля объекта:


// Возвращает структуру для подмены заголовков полей веса, объема, единиц измерения.
Функция СтруктураЗаголовковПолейЕдиницИзмерений(КомпоновщикНастроек)
    
    СтруктураЗаголовков = Новый Структура;
    
    // Получаем значения из констант
    ЕдиницаВеса = Строка(Константы.ЕдиницаИзмеренияВеса.Получить());
    ЕдиницаОбъема = Строка(Константы.ЕдиницаИзмеренияОбъема.Получить());
    
    // Пытаемся получить параметр ЕдиницыКоличества из настроек СКД
    ПараметрЕдиницыКоличества = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(КомпоновщикНастроек, "ЕдиницыКоличества");
    
    Если ПараметрЕдиницыКоличества <> Неопределено И ПараметрЕдиницыКоличества.Значение = 0 Тогда
        ЗаголовокЕдИзм = НСтр("ru='Итого товаров в единицах хранения'");
    Иначе
        ЗаголовокЕдИзм = НСтр("ru='Итого товаров в единицах для отчетов'");
    КонецЕсли;
    
    СтруктураЗаголовков.Вставить("ЕдиницаВеса", ЕдиницаВеса);
    СтруктураЗаголовков.Вставить("ЕдиницаОбъема", ЕдиницаОбъема);
    СтруктураЗаголовков.Вставить("ЗаголовокГруппировкиЕдИзм", ЗаголовокЕдИзм);
    
    Возврат СтруктураЗаголовков;
    
КонецФункции

После того как мы добавили этот код, изменим основную вызывающую функцию:


Функция ПолучитьСтруктуруЗаголовковПолей()
    // Теперь вызываем локальную функцию модуля объекта вместо общего модуля
    Возврат СтруктураЗаголовковПолейЕдиницИзмерений(КомпоновщикНастроек);
КонецФункции

Важные нюансы и отладка

При использовании Способа 1 (замена на типовой метод 11.5) важно убедиться, что в вашей схеме компоновки данных (СКД) на вкладке «Параметры» присутствует параметр с именем ЕдиницыКоличества. Новый типовой метод КомпоновкаДанныхСервер.ЗаголовкиПолейЕдиницИзмерений опирается на этот параметр для определения текста заголовка. Если параметра нет, вы можете получить пустую строку в заголовках или неожиданный результат.

Рассмотрим также ситуацию, если вы используете расширение. Вы можете создать расширение для общего модуля КомпоновкаДанныхСервер и добавить туда старое имя функции с аннотацией &Вместо или просто как новую экспортную функцию. Однако перенос кода в модуль отчета (Способ 2) считается более безопасным для внешних разработок, так как это не требует изменения серверной части и работает «из коробки» при передаче файла отчета клиенту.

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

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

← На главную