При активной разработке типовых решений и расширений часто используется практика создания обработки-заготовки. В такой базовый шаблон заранее закладывают универсальные алгоритмы: чтение файлов Excel, формирование ручных проводок бухгалтерского учета, логирование или отправку почты. Однако при тиражировании такой заготовки в разные расширения разработчики сталкиваются с критической ошибкой платформы: при вызове одной из обработок в режиме 1С:Предприятие система выдает синтаксическую ошибку вида «Процедура или функция с указанным именем уже определена», даже если имена обработок в дереве метаданных полностью различаются.
Разберем подробнее механизм возникновения этой коллизии и рассмотрим все практические способы изменения системных идентификаторов для устранения конфликта.
Проанализируем внутреннее устройство объектов платформы 1С. Каждый объект метаданных, созданный в конфигурации или расширении, помимо видимого разработчику имени (свойства Имя и Синоним), обладает скрытым системным уникальным идентификатором — UUID (Universally Unique Identifier). При этом уникальный идентификатор присваивается не только самой обработке, но и всем ее подчиненным компонентам:
Когда мы копируем файл внешней обработки (.epf) средствами операционной системы или сохраняем копию через меню Конфигуратора, все внутренние UUID подчиненных объектов остаются абсолютно идентичными оригиналу.
В режиме «1С:Предприятие» платформа собирает активные расширения в единую результирующую среду выполнения. Если два разных расширения содержат собственные обработки с разными именами, но с одинаковыми системными UUID форм и модулей, среда выполнения расценивает их как один и тот же модифицируемый контекст. Происходит наложение программного кода одного модуля поверх другого, в результате чего методы компилируются дважды и платформа выдает ошибку о дублировании процедур или конфликт внутренних идентификаторов.
Самый надежный способ, гарантирующий генерацию новой ветки системных идентификаторов на уровне платформы, — создание объекта с нуля.
Разберем по шагам последовательность действий:
Обработки добавляем новый объект через контекстное меню. Платформа автоматически сформирует для него уникальный корневой UUID.Такой подход полностью разрывает связь с исходной заготовкой и предотвращает любые коллизии при параллельной работе нескольких расширений.
Если структура обработки сложная и включает множество реквизитов, команд и макетов, ручной перенос может занять много времени. В этом случае применяют сравнение и объединение конфигураций или обработок.
Рассмотрим, как обновить привязку идентификаторов через механизм объединения:
При таком сценарии платформа переносит состав реквизитов и код в существующий пустой объект с уже выделенным новым UUID, что снижает риск конфликта с исходным шаблоном.
Для разработчиков, использующих версионирование и групповую разработку, наиболее прозрачным методом является выгрузка метаданных в XML-файлы.
Разберем алгоритм пакетной замены идентификаторов:
Конфигурация — Выгрузить конфигурацию в файлы.DataProcessors)..xml в текстовом редакторе.uuid="...".Конфигурация — Загрузить конфигурацию из файлов.Этот способ позволяет гарантированно переопределить идентификаторы без риска потерять верстку сложных управляемых форм или параметры команд.
После корректировки идентификаторов или пересоздания объектов разработчики нередко продолжают наблюдать прежнюю ошибку. Причиной служит кэширование скомпилированных модулей платформой 1С.
Проанализируем обязательные шаги по очистке рабочего окружения:
%LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8).Чтобы избежать регулярного тиражирования тяжелых шаблонов обработок в разные расширения, рассмотрим изменение общей архитектуры:
Сервер и Вызов сервера. Тогда в каждой конкретной обработке будет содержаться только уникальная логика, вызывающая универсальные методы общего модуля.