Почему после обновления 1С:Управление торговлей не найден метод объекта и как исправить проблему с переименованными функциями?

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

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

Рассмотрим типовую ситуацию, описанную пользователями на форуме. После очередного обновления 1С:УТ возникла ошибка: Метод объекта не обнаружен (ПодключитьВнешнююКомпонентуПечатиШтрихкода). Изначально код выглядел так:


Компонент = МенеджерОборудованияВызовСервера.ПодключитьВнешнююКомпонентуПечатиШтрихкода();

После анализа выяснилось, что функция была перенесена в новый модуль и переименована, и теперь для ее вызова необходимо использовать следующий код:


Компонент = ГенерацияШтрихкодаВызовСервера.ПодключитьКомпонентуГенерацииИзображенияШтрихкода();

Аналогичная проблема была замечена с функциями для работы со ставками НДС. Функция УчетНДСУП.СтавкаНДС была удалена, а вместо нее появилась УчетНДСРФ.СтавкаНДС. Такие изменения, хотя и обоснованы с точки зрения архитектуры, создают значительные сложности для поддержки доработанных систем.

Почему 1С производит такие изменения? Разбираем причины

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

  1. Рефакторинг кода и борьба с "техническим долгом": По мере развития и усложнения конфигураций, код может становиться менее читаемым, дублироваться и быть нелогично расположенным. Рефакторинг — это процесс изменения внутренней структуры программы без изменения ее внешнего поведения. Целью является улучшение читаемости, поддерживаемости и расширяемости кода. Например, выделение функционала генерации штрихкодов в отдельную подсистему ГенерацияШтрихкода и перенос соответствующей функции из общего модуля МенеджерОборудованияВызовСервера в ГенерацияШтрихкодаВызовСервера является классическим примером рефакторинга. Это делает код более модульным и логичным, поскольку все, что связано со штрихкодами, теперь находится в одном месте.

    Как отметили участники форума, это делается для повышения читабельности и борьбы с техническим долгом: "Зато смотри, какая теперь красота нечеловеческая! Генерация штрихкода выделена в отдельные модуля, функция теперь более правильно называется. Борются с техническим долгом!"

  2. Универсализация и международный учет: Пример с функциями НДС (УчетНДСУП.СтавкаНДС на УчетНДСРФ.СтавкаНДС) отлично иллюстрирует стремление 1С к созданию универсальных решений. Фирма "1С" пытается сделать блок учета по НДС универсальным, подходящим для учета в любой стране, а не только в России. Однако специфика российского НДС никуда не делась. Поэтому алгоритмы, специфичные для российского налогообложения, выносят в модули с постфиксом "РФ" в имени (например, УчетНДСРФ).

    Это позволяет использовать общие механизмы для базового учета НДС, а для конкретной страны подключать специализированные модули. Это делает продукт более гибким для международного использования, но требует адаптации при переходе на новые версии.

  3. Развитие Библиотеки стандартных подсистем (БСП): Большинство современных конфигураций 1С строятся на базе БСП. Эта библиотека постоянно развивается, добавляются новые подсистемы, оптимизируется существующий функционал. Любые изменения в БСП автоматически влияют на все конфигурации, которые ее используют. Поэтому, если в БСП переименовали или переместили функцию, то же самое произойдет и в УТ, ERP, ЗУП и других.

Методы решения проблемы ненайденных методов после обновления 1С

Мы предлагаем несколько подходов к решению проблем, возникающих из-за изменения API типовых конфигураций 1С. Выбор конкретного метода зависит от сложности доработки и требований к ее поддержке.

1. Прямая адаптация кода в доработке

Самый очевидный, но не всегда самый лучший способ — это изменить код в вашей внешней обработке или расширении, чтобы он вызывал новую функцию. Этот метод подходит, если изменений не очень много и вы готовы отслеживать их при каждом обновлении.

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

    • Использовать поиск по старой функции: Запустите глобальный поиск по названию старой функции в конфигураторе. Часто в комментариях к старому коду или в модуле, где она ранее находилась, указывается новая функция или модуль.
    • Изучить документацию к релизу: 1С публикует описания изменений к каждому релизу на портале 1С:ИТС и в файлах news.htm, UpdateSSL.html, которые поставляются с обновлением. В этих документах часто указываются переименованные функции и новые правила их использования. Например, для штрихкодов в документации могли бы найти следующее: "Функционал генерации изображений штрихкода выделены в отдельную подсистему «ГенерацияШтрихкода». В место ранее использованной функции МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода() необходимо использовать новую функция ГенерацияШтрихкодаВызовСервера.ИзображениеШтрихкода()".
    • Проанализировать типовой код: Если вы знаете, где вызывалась старая функция в типовой конфигурации, посмотрите, как это реализовано в новой версии.
  2. Замена вызова функции: После того как вы нашли новую функцию, просто замените старый вызов на новый. Рассмотрим пример с НДС, как это было сделано в сообщении 11:

    
    //НоваяСтрока.СтавкаНДС = УчетНДСУП.СтавкаНДС(ВозвратТоваровОтКлиентаОбъект.НалогообложениеНДС,
    //                                          ВозвратТоваровОтКлиентаОбъект.Дата,
    //                                          ВыборкаПоТоварам.ПодакцизныйТовар,
    //                                          ВыборкаПоТоварам.СтавкаНДС);
    НоваяСтрока.СтавкаНДС = УчетНДСРФ.СтавкаНДС(ВозвратТоваровОтКлиентаОбъект.НалогообложениеНДС,
                                              ВозвратТоваровОтКлиентаОбъект.Дата,
                                              ВыборкаПоТоварам.ПодакцизныйТовар,
                                              ВыборкаПоТоварам.СтавкаНДС);
    

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

2. Создание функции-обертки через расширение

Этот метод является более предпочтительным и устойчивым к будущим обновлениям, особенно если вы используете внешние обработки или расширения. Идея состоит в том, чтобы создать функцию-обертку (совместимости) с тем же именем и параметрами, что и у удаленной функции, но которая внутри себя вызывает новую функцию.

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

  1. Создание расширения и общего модуля: Создайте новое расширение или используйте существующее. В нем создайте новый общий модуль (например, с именем, похожим на старый, или же просто служебный модуль для оберток).

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

    Пример для функции штрихкода:

    
    // В расширении, в новом ОбщемМодуле (например, МоиСовместимыеФункцииВызовСервера)
    // с флагами "Сервер", "ВызовСервера"
    Функция ПодключитьВнешнююКомпонентуПечатиШтрихкода() Экспорт
        // Здесь мы вызываем новую функцию из типовой конфигурации
        Возврат ГенерацияШтрихкодаВызовСервера.ПодключитьКомпонентуГенерацииИзображенияШтрихкода();
    КонецФункции
    

    Теперь везде, где в ваших старых обработках или доработках вызывалась МенеджерОборудованияВызовСервера.ПодключитьВнешнююКомпонентуПечатиШтрихкода(), вы можете либо заменить вызов на МоиСовместимыеФункцииВызовСервера.ПодключитьВнешнююКомпонентуПечатиШтрихкода(), либо, если это возможно, в самом расширении переопределить старую функцию. Однако более надежным является создание новой функции в расширении и изменение вызовов в ваших доработках на эту новую функцию расширения.

  3. Переопределение функции общего модуля в расширении: В некоторых случаях, если вызов старой функции происходит в типовом коде, который вы не можете изменить напрямую, можно попробовать переопределить старый общий модуль и функцию в расширении. Для этого необходимо добавить в расширение тот же общий модуль, где находилась старая функция, и установить для него свойство "Заимствованный". Затем внутри этого модуля в расширении создать функцию с тем же именем и сигнатурой, но с кодом, который вызывает новую функцию. Однако этот метод не всегда работает идеально и может иметь свои нюансы.

3. Использование программного интерфейса и стандартов разработки

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

Фирма "1С" рекомендует использовать конфигурацию "Автоматизированная проверка конфигураций" (АПК) для автоматического поиска ошибок и отклонений от стандартов. Это помогает выявлять потенциальные проблемы еще на этапе разработки.

4. Внимательное чтение документации к обновлениям

Один из самых важных, но часто игнорируемых шагов — это тщательное изучение документации к новым релизам. В файлах news.htm и UpdateSSL.html, которые поставляются с каждым обновлением, 1С описывает все значимые изменения в стандартных библиотеках и подсистемах. Раздел "Изменения для разработчиков" или "Переход между версиями" часто содержит информацию о переименованных функциях, устаревших методах и новых рекомендациях по их использованию.

Обращайте внимание на пометки типа "Старая функция оставлена для совместимости". Как правило, это означает, что у вас есть один-два релиза, чтобы адаптировать свой код, прежде чем старая функция будет удалена окончательно.

Влияние на разработчиков и бизнес

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

Тем не менее, стремление 1С к рефакторингу и улучшению архитектуры является позитивным знаком для долгосрочного развития платформы. Наша задача как разработчиков — максимально адаптироваться к этим изменениям, используя лучшие практики и инструменты, такие как расширения и автоматизированное тестирование.

Заключение

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

Чтобы эффективно справляться с этими вызовами, мы должны:

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

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

← На главную