Переход с версии 1С:Управление торговлей 11.4 (или аналогичных редакций ERP и КА) на версию 11.5 часто сопровождается неприятными сюрпризами при попытке сформировать доработанные или внешние отчеты. Одной из самых распространенных ошибок является Метод объекта не найден (СтруктураЗаголовковПолейЕдиницИзмерения). Рассмотрим детально, почему это происходит и как реанимировать ваши отчеты.
Проанализируем ситуацию: в версии 11.5 разработчики фирмы «1С» провели масштабный рефакторинг программного кода. В частности, это коснулось соблюдения новых стандартов разработки, согласно которым имена функций должны быть лаконичными и описывать суть возвращаемых данных без лишних префиксов. В общем модуле КомпоновкаДанныхСервер старый метод СтруктураЗаголовковПолейЕдиницИзмерений был переименован или удален в пользу более короткого названия.
Ситуация осложняется тем, что в консоли запросов код может отрабатывать корректно, так как проблема кроется не в самом запросе, а в постобработке результата в процедуре ПриКомпоновкеРезультата модуля объекта отчета. Именно там происходит обращение к общему модулю для формирования красивых заголовков полей веса, объема и количества.
Если ваш отчет практически не менял логику типового вывода, самым быстрым способом решения будет замена имени вызываемого метода. В версии 11.5 вместо старого названия используется ЗаголовкиПолейЕдиницИзмерений.
Разберем по шагам, что нужно изменить в коде модуля объекта отчета:
ПолучитьСтруктуруЗаголовковПолей).Посмотрим на пример кода до и после изменений:
// Было в 11.4:
Функция ПолучитьСтруктуруЗаголовковПолей()
Возврат КомпоновкаДанныхСервер.СтруктураЗаголовковПолейЕдиницИзмерений(КомпоновщикНастроек);
КонецФункции
// Стало в 11.5:
Функция ПолучитьСтруктуруЗаголовковПолей()
Возврат КомпоновкаДанныхСервер.ЗаголовкиПолейЕдиницИзмерений(КомпоновщикНастроек);
КонецФункции
Обратите внимание: 1С планомерно избавляется от префиксов «Получить», «Структура», «Таблица». Теперь методы именуются по принципу «что возвращаем» — в данном случае просто ЗаголовкиПолейЕдиницИзмерений.
Если вы хотите обеспечить максимальную независимость внешнего отчета от обновлений типовой конфигурации или если новый метод в 11.5 ведет себя не совсем так, как вам нужно, мы можем «вернуть» старый код непосредственно в отчет. Рассмотрим подробнее, как это реализовать.
Воспользуемся следующим алгоритмом:
Проанализируем пример реализации такой функции внутри модуля объекта:
// Возвращает структуру для подмены заголовков полей веса, объема, единиц измерения.
Функция СтруктураЗаголовковПолейЕдиницИзмерений(КомпоновщикНастроек)
СтруктураЗаголовков = Новый Структура;
// Получаем значения из констант
ЕдиницаВеса = Строка(Константы.ЕдиницаИзмеренияВеса.Получить());
ЕдиницаОбъема = Строка(Константы.ЕдиницаИзмеренияОбъема.Получить());
// Пытаемся получить параметр ЕдиницыКоличества из настроек СКД
ПараметрЕдиницыКоличества = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(КомпоновщикНастроек, "ЕдиницыКоличества");
Если ПараметрЕдиницыКоличества <> Неопределено И ПараметрЕдиницыКоличества.Значение = 0 Тогда
ЗаголовокЕдИзм = НСтр("ru='Итого товаров в единицах хранения'");
Иначе
ЗаголовокЕдИзм = НСтр("ru='Итого товаров в единицах для отчетов'");
КонецЕсли;
СтруктураЗаголовков.Вставить("ЕдиницаВеса", ЕдиницаВеса);
СтруктураЗаголовков.Вставить("ЕдиницаОбъема", ЕдиницаОбъема);
СтруктураЗаголовков.Вставить("ЗаголовокГруппировкиЕдИзм", ЗаголовокЕдИзм);
Возврат СтруктураЗаголовков;
КонецФункции
После того как мы добавили этот код, изменим основную вызывающую функцию:
Функция ПолучитьСтруктуруЗаголовковПолей()
// Теперь вызываем локальную функцию модуля объекта вместо общего модуля
Возврат СтруктураЗаголовковПолейЕдиницИзмерений(КомпоновщикНастроек);
КонецФункции
При использовании Способа 1 (замена на типовой метод 11.5) важно убедиться, что в вашей схеме компоновки данных (СКД) на вкладке «Параметры» присутствует параметр с именем ЕдиницыКоличества. Новый типовой метод КомпоновкаДанныхСервер.ЗаголовкиПолейЕдиницИзмерений опирается на этот параметр для определения текста заголовка. Если параметра нет, вы можете получить пустую строку в заголовках или неожиданный результат.
Рассмотрим также ситуацию, если вы используете расширение. Вы можете создать расширение для общего модуля КомпоновкаДанныхСервер и добавить туда старое имя функции с аннотацией &Вместо или просто как новую экспортную функцию. Однако перенос кода в модуль отчета (Способ 2) считается более безопасным для внешних разработок, так как это не требует изменения серверной части и работает «из коробки» при передаче файла отчета клиенту.
Для проверки правильности работы заголовков рекомендуем поставить точку останова в процедуре ПриКомпоновкеРезультата. Найдите строку, где вызывается подмена заголовков (обычно это вызов КомпоновкаДанныхСервер.УстановитьПараметрыЗаголовкаОтчета), и проверьте, что структура, возвращаемая вашей обновленной функцией, содержит корректные ключи: ЕдиницаВеса, ЕдиницаОбъема и ЗаголовокГруппировкиЕдИзм.
Выполнив эти действия, мы успешно адаптируем отчет под требования УТ 11.5 и избавимся от ошибки отсутствующего метода.