При обновлении типовых конфигураций 1С, таких как 1С:Управление торговлей (УТ), разработчики часто сталкиваются с ситуацией, когда ранее работающие внешние обработки или доработки перестают функционировать. Основная причина этого — изменение структуры типового кода: перенос функций и модулей, а также их переименование. В этой статье мы подробно разберем, почему происходят такие изменения, как они влияют на наши доработки и какие существуют методы решения этих проблем.
Рассмотрим типовую ситуацию, описанную пользователями на форуме. После очередного обновления 1С:УТ возникла ошибка: Метод объекта не обнаружен (ПодключитьВнешнююКомпонентуПечатиШтрихкода). Изначально код выглядел так:
Компонент = МенеджерОборудованияВызовСервера.ПодключитьВнешнююКомпонентуПечатиШтрихкода();
После анализа выяснилось, что функция была перенесена в новый модуль и переименована, и теперь для ее вызова необходимо использовать следующий код:
Компонент = ГенерацияШтрихкодаВызовСервера.ПодключитьКомпонентуГенерацииИзображенияШтрихкода();
Аналогичная проблема была замечена с функциями для работы со ставками НДС. Функция УчетНДСУП.СтавкаНДС была удалена, а вместо нее появилась УчетНДСРФ.СтавкаНДС. Такие изменения, хотя и обоснованы с точки зрения архитектуры, создают значительные сложности для поддержки доработанных систем.
Мы выясним, почему фирма "1С" активно перерабатывает свой типовой код, даже если это приводит к временным сложностям для разработчиков и пользователей. Основные причины таких "переездов" связаны с рефакторингом, развитием Библиотеки стандартных подсистем (БСП) и стремлением к универсализации решений.
Рефакторинг кода и борьба с "техническим долгом": По мере развития и усложнения конфигураций, код может становиться менее читаемым, дублироваться и быть нелогично расположенным. Рефакторинг — это процесс изменения внутренней структуры программы без изменения ее внешнего поведения. Целью является улучшение читаемости, поддерживаемости и расширяемости кода. Например, выделение функционала генерации штрихкодов в отдельную подсистему ГенерацияШтрихкода и перенос соответствующей функции из общего модуля МенеджерОборудованияВызовСервера в ГенерацияШтрихкодаВызовСервера является классическим примером рефакторинга. Это делает код более модульным и логичным, поскольку все, что связано со штрихкодами, теперь находится в одном месте.
Как отметили участники форума, это делается для повышения читабельности и борьбы с техническим долгом: "Зато смотри, какая теперь красота нечеловеческая! Генерация штрихкода выделена в отдельные модуля, функция теперь более правильно называется. Борются с техническим долгом!"
Универсализация и международный учет: Пример с функциями НДС (УчетНДСУП.СтавкаНДС на УчетНДСРФ.СтавкаНДС) отлично иллюстрирует стремление 1С к созданию универсальных решений. Фирма "1С" пытается сделать блок учета по НДС универсальным, подходящим для учета в любой стране, а не только в России. Однако специфика российского НДС никуда не делась. Поэтому алгоритмы, специфичные для российского налогообложения, выносят в модули с постфиксом "РФ" в имени (например, УчетНДСРФ).
Это позволяет использовать общие механизмы для базового учета НДС, а для конкретной страны подключать специализированные модули. Это делает продукт более гибким для международного использования, но требует адаптации при переходе на новые версии.
Развитие Библиотеки стандартных подсистем (БСП): Большинство современных конфигураций 1С строятся на базе БСП. Эта библиотека постоянно развивается, добавляются новые подсистемы, оптимизируется существующий функционал. Любые изменения в БСП автоматически влияют на все конфигурации, которые ее используют. Поэтому, если в БСП переименовали или переместили функцию, то же самое произойдет и в УТ, ERP, ЗУП и других.
Мы предлагаем несколько подходов к решению проблем, возникающих из-за изменения API типовых конфигураций 1С. Выбор конкретного метода зависит от сложности доработки и требований к ее поддержке.
Самый очевидный, но не всегда самый лучший способ — это изменить код в вашей внешней обработке или расширении, чтобы он вызывал новую функцию. Этот метод подходит, если изменений не очень много и вы готовы отслеживать их при каждом обновлении.
Поиск новой функции: Если вы столкнулись с ошибкой "Метод объекта не обнаружен", первое, что необходимо сделать, это найти новую функцию или модуль, который ее заменяет. Для этого можно:
news.htm, UpdateSSL.html, которые поставляются с обновлением. В этих документах часто указываются переименованные функции и новые правила их использования. Например, для штрихкодов в документации могли бы найти следующее: "Функционал генерации изображений штрихкода выделены в отдельную подсистему «ГенерацияШтрихкода». В место ранее использованной функции МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода() необходимо использовать новую функция ГенерацияШтрихкодаВызовСервера.ИзображениеШтрихкода()".Замена вызова функции: После того как вы нашли новую функцию, просто замените старый вызов на новый. Рассмотрим пример с НДС, как это было сделано в сообщении 11:
//НоваяСтрока.СтавкаНДС = УчетНДСУП.СтавкаНДС(ВозвратТоваровОтКлиентаОбъект.НалогообложениеНДС,
// ВозвратТоваровОтКлиентаОбъект.Дата,
// ВыборкаПоТоварам.ПодакцизныйТовар,
// ВыборкаПоТоварам.СтавкаНДС);
НоваяСтрока.СтавкаНДС = УчетНДСРФ.СтавкаНДС(ВозвратТоваровОтКлиентаОбъект.НалогообложениеНДС,
ВозвратТоваровОтКлиентаОбъект.Дата,
ВыборкаПоТоварам.ПодакцизныйТовар,
ВыборкаПоТоварам.СтавкаНДС);
Важно: При такой прямой замене вы всегда должны быть уверены, что новая функция имеет тот же набор параметров и возвращает тот же тип результата. В противном случае потребуется более глубокая адаптация логики.
Этот метод является более предпочтительным и устойчивым к будущим обновлениям, особенно если вы используете внешние обработки или расширения. Идея состоит в том, чтобы создать функцию-обертку (совместимости) с тем же именем и параметрами, что и у удаленной функции, но которая внутри себя вызывает новую функцию.
Мы рекомендуем создавать такие обертки именно через расширения, чтобы не вмешиваться в типовой код конфигурации. Это позволяет сохранить возможность легкого обновления самой типовой конфигурации, а все ваши доработки будут управляться в рамках расширения.
Создание расширения и общего модуля: Создайте новое расширение или используйте существующее. В нем создайте новый общий модуль (например, с именем, похожим на старый, или же просто служебный модуль для оберток).
Создание функции-обертки: В этом модуле создайте функцию, которая будет иметь то же имя и сигнатуру (набор параметров), что и удаленная функция. В теле этой функции вызовите новую функцию 1С.
Пример для функции штрихкода:
// В расширении, в новом ОбщемМодуле (например, МоиСовместимыеФункцииВызовСервера)
// с флагами "Сервер", "ВызовСервера"
Функция ПодключитьВнешнююКомпонентуПечатиШтрихкода() Экспорт
// Здесь мы вызываем новую функцию из типовой конфигурации
Возврат ГенерацияШтрихкодаВызовСервера.ПодключитьКомпонентуГенерацииИзображенияШтрихкода();
КонецФункции
Теперь везде, где в ваших старых обработках или доработках вызывалась МенеджерОборудованияВызовСервера.ПодключитьВнешнююКомпонентуПечатиШтрихкода(), вы можете либо заменить вызов на МоиСовместимыеФункцииВызовСервера.ПодключитьВнешнююКомпонентуПечатиШтрихкода(), либо, если это возможно, в самом расширении переопределить старую функцию. Однако более надежным является создание новой функции в расширении и изменение вызовов в ваших доработках на эту новую функцию расширения.
Переопределение функции общего модуля в расширении: В некоторых случаях, если вызов старой функции происходит в типовом коде, который вы не можете изменить напрямую, можно попробовать переопределить старый общий модуль и функцию в расширении. Для этого необходимо добавить в расширение тот же общий модуль, где находилась старая функция, и установить для него свойство "Заимствованный". Затем внутри этого модуля в расширении создать функцию с тем же именем и сигнатурой, но с кодом, который вызывает новую функцию. Однако этот метод не всегда работает идеально и может иметь свои нюансы.
Чтобы минимизировать проблемы в будущем, всегда старайтесь придерживаться стандартов разработки 1С и использовать программный интерфейс. Это означает вызов только тех процедур и функций, которые размещены в области ПрограммныйИнтерфейс общих модулей, а также обращение к документированным объектам метаданных. Функции, не входящие в программный интерфейс, считаются внутренними и могут быть изменены без предупреждения.
Фирма "1С" рекомендует использовать конфигурацию "Автоматизированная проверка конфигураций" (АПК) для автоматического поиска ошибок и отклонений от стандартов. Это помогает выявлять потенциальные проблемы еще на этапе разработки.
Один из самых важных, но часто игнорируемых шагов — это тщательное изучение документации к новым релизам. В файлах news.htm и UpdateSSL.html, которые поставляются с каждым обновлением, 1С описывает все значимые изменения в стандартных библиотеках и подсистемах. Раздел "Изменения для разработчиков" или "Переход между версиями" часто содержит информацию о переименованных функциях, устаревших методах и новых рекомендациях по их использованию.
Обращайте внимание на пометки типа "Старая функция оставлена для совместимости". Как правило, это означает, что у вас есть один-два релиза, чтобы адаптировать свой код, прежде чем старая функция будет удалена окончательно.
Частые изменения в типовых конфигурациях, хоть и направлены на улучшение продукта, создают определенные трудности. Это приводит к:
Тем не менее, стремление 1С к рефакторингу и улучшению архитектуры является позитивным знаком для долгосрочного развития платформы. Наша задача как разработчиков — максимально адаптироваться к этим изменениям, используя лучшие практики и инструменты, такие как расширения и автоматизированное тестирование.
Перемещение и переименование функций в 1С после обновлений — это неизбежный процесс, связанный с развитием платформы и конфигураций. Мы разобрали, что такие изменения являются частью стратегии 1С по рефакторингу кода, борьбе с техническим долгом и универсализации решений.
Чтобы эффективно справляться с этими вызовами, мы должны:
Придерживаясь этих рекомендаций, мы сможем сделать наши доработки более устойчивыми к изменениям и минимизировать время, затрачиваемое на их адаптацию после каждого обновления типовых конфигураций 1С.