Как исправить ошибку «Процедура или функция с указанным именем уже определена» при обновлении 1С

Программист 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При обновлении типовых конфигураций, таких как 1С:Бухгалтерия предприятия 3.0 или 1С:Розница, специалисты часто сталкиваются с критической ошибкой компиляции. Программа внезапно прекращает работу, а в окне сообщений появляется текст вида: Ошибка инициализации модуля: EF_00_00267418 РегистрСведений.ПараметрыРаботыПрограммы.МодульМенеджера. Причиной указывается дублирование функций, например, ВыполнятьОбновлениеБезФоновогоЗадания или ЕстьРолиМодифицированныеРасширениями.

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

Разберем причину возникновения ошибки: механизм патчей EF

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

Проанализируем механику конфликта. Ошибка «Процедура или функция уже определена» возникает в следующей последовательности:

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

Метод 1: Удаление проблемных расширений (патчей)

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

Рассмотрим шаги по ручному удалению через Конфигуратор:

  1. Откроем базу в режиме Конфигуратор.
  2. Перейдем в меню Конфигурация — Расширения конфигурации.
  3. В открывшемся списке найдем все расширения, чье имя начинается на EF_.
  4. Выделим их и нажмем кнопку «Удалить» (или клавишу Del).
  5. После удаления закроем окно расширений и запустим базу в режиме 1С:Предприятие.

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

Метод 2: Правильное обновление через пользовательский режим

Выясним, почему ошибка чаще возникает при обновлении через Конфигуратор файлом .cf или .cfu. При использовании Конфигуратора мы напрямую меняем структуру метаданных, но механизмы управления расширениями при этом не всегда срабатывают автоматически.

Если же выполнять обновление через пользовательский режим (Администрирование — Обслуживание — Обновление программы), система задействует алгоритмы Библиотеки стандартных подсистем (БСП). Эти алгоритмы обучены проверять список установленных патчей перед обновлением и автоматически удалять те из них, которые становятся неактуальными для нового релиза. Поэтому, если вы столкнулись с ошибкой, попробуйте в следующий раз проводить процедуру через встроенный помощник обновления.

Проанализируем ситуацию с данными: стоит ли бояться удаления?

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


// Пример кода в патче EF, вызывающего конфликт
&Вместо("ВыполнятьОбновлениеБезФоновогоЗадания")
Функция EF_ВыполнятьОбновлениеБезФоновогоЗадания()
    // Исправленная логика от разработчиков 1С
    Возврат Истина;
КонецФункции

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

Как предотвратить проблему в будущем

Чтобы минимизировать вероятность появления подобных «сюрпризов» при обновлении, рекомендуем выполнить следующие действия:

  1. Контроль автоматической установки: Если вы предпочитаете полный контроль над системой, зайдите в Администрирование — Обслуживание — Обновление программы и снимите галочку «Устанавливать исправления (патчи) автоматически». В этом случае вам придется устанавливать критические фиксы вручную, но вы будете знать, какие расширения присутствуют в системе.
  2. Очистка кэша: Иногда после удаления патчей ошибка может сохраняться в локальном кэше пользователя. В таком случае необходимо запустить 1С с параметром /ClearCache или вручную очистить содержимое папок в %AppData%\1C\1Cv8\.
  3. Проверка перед обновлением: Сформируем привычку перед каждым серьезным обновлением заходить в список расширений и проверять наличие EF-пакетов. Если они есть, их можно безопасно удалить непосредственно перед запуском сравнения-объединения.

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

← На главную