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

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

При обновлении типовых решений 1С, особенно интегрированных с отраслевыми конфигурациями от сторонних разработчиков (например, «1С-Рарус: Управление автотранспортом»), технические специалисты часто сталкиваются со специфическими ошибками компиляции программного кода. Одной из наиболее известных проблем конца 2017 – 2018 годов и последующего времени стал конфликт, связанный со встроенной функцией ПроверитьБит().

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

Типичный сценарий возникновения проблемы: база данных «1С:Бухгалтерия предприятия» объединена с «1С:Управление автотранспортом» (УАТ) версии 2.0. После планового обновления конфигурации БП потребовалось повысить режим совместимости (например, с 8.3.10 до 8.3.12 или выше) и обновить версию технологической платформы. При запуске системы база аварийно завершает работу, выдавая в журнал регистрации следующее системное сообщение:


{ВнешняяОбработка.Лицензирование.МодульОбъекта(99)}: Ошибка при вызове метода контекста (Создать): Ошибка инициализации модуля: ВнешняяОбработка.ЗащищеннаяОбработка.МодульОбъекта: {ВнешняяОбработка.ЗащищеннаяОбработка.МодульОбъекта(100,9)}: Процедура или функция с указанным именем уже определена (ПроверитьБит)

---

Выясним причину ошибки («под капотом» платформы 1С)

Для того чтобы понять природу коллизии, проанализируем изменения в технологической платформе «1С:Предприятие 8». Начиная с версии 8.3.11.2867, разработчики фирмы «1С» добавили в глобальный контекст встроенные функции для работы с двоичными данными и выполнения побитовых операций над целыми числами:

До этого момента программисты отраслевых решений (в частности, разработчики систем лицензирования «Катран» и СЛК от «1С-Рарус» и «Первый БИТ») вынуждены были писать собственные алгоритмы для побитовых проверок при расшифровке ключей защиты. В их закрытом программном коде была объявлена экспортная функция с точно таким же именем — ПроверитьБит().

Пока конфигурация работала в режиме совместимости 8.3.10, новые возможности платформы оставались неактивными. Как только режим совместимости был изменен на 8.3.11 или 8.3.12, платформа активировала встроенную функцию ПроверитьБит(). Компилятор 1С обнаружил дублирование имен в глобальной области видимости и заблокировал выполнение кода, выдав критическую ошибку.

---

Почему нельзя просто исправить код в Конфигураторе?

Рассмотрим специфику защиты конфигурации УАТ. Защищенные функции лицензирования и расчета сложных параметров (например, ГСМ и выработки) вынесены разработчиками в специальный закрытый модуль. Физически этот код находится во внешней обработке (например, ЗащищеннаяОбработка.epf), которая зашифрована и сохранена внутри конфигурации как двоичные данные в одном из общих макетов защиты (система Катран).

В процессе запуска системы специальная внешняя компонента (DLL-библиотека) расшифровывает эту обработку непосредственно в оперативной памяти компьютера и передает управление платформе. Поскольку исходный код модуля защиты скрыт от обычного разработчика, мы не можем открыть его в конфигураторе и вручную переименовать конфликтующую функцию ПроверитьБит().

---

Варианты решения проблемы

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

Способ 1. Точечное обновление только макетов защиты (рекомендуется для измененных баз)

Если ваша конфигурация УАТ содержит множество уникальных доработок и вы не можете выполнить полное обновление на новый релиз, оптимальным решением будет обновление исключительно компонентов защиты. Разработчики из «1С-Рарус» оперативно исправили данную ошибку в своих системах лицензирования, переименовав внутреннюю функцию (например, в РР_ПроверитьБит).

Выполним следующие шаги:

  1. Обратитесь в службу технической поддержки компании «1С-Рарус» с запросом обновленных файлов защиты Катран/СЛК для вашего релиза УАТ, совместимых с платформой 1С 8.3.11/8.3.12 и выше.
  2. Получив от разработчиков актуальную внешнюю обработку защиты (или общий макет), откройте вашу базу в режиме «Конфигуратор».
  3. Найдите общий макет, отвечающий за хранение защищенного кода (обычно он имеет отношение к лицензированию или защите Катран/СЛК). Снимите его с поддержки.
  4. Загрузите в этот макет новые двоичные данные, полученные от разработчиков.
  5. Обновите файлы внешних компонент защиты (DLL) на сервере приложений 1С и на рабочих станциях пользователей (при необходимости).

Данный подход позволяет полностью сохранить все ваши доработки в кодовой базе УАТ и запустить программу на современной платформе.

Способ 2. Ручной перенос макета защиты из демо-базы нового релиза

Если у вас есть доступ к обновлениям УАТ, но накатывать их целиком на рабочую базу слишком трудозатратно, вы можете «вытащить» исправленный макет защиты самостоятельно:

  1. Скачайте и разверните в качестве пустой базы актуальный типовой релиз «1С:Управление автотранспортом» (выпущенный после сентября 2018 года, например, ветки 2.2 и выше). В этих релизах конфликт имен уже устранен.
  2. Откройте конфигуратор новой базы и найдите макеты защиты системы лицензирования. Извлеките двоичные данные макета на диск.
  3. Откройте конфигуратор вашей рабочей сильно измененной базы.
  4. Замените содержимое аналогичного макета защиты сохраненным ранее файлом.
  5. Сохраните конфигурацию базы данных (клавиша F7) и запустите систему в режиме «Предприятие» для проверки работоспособности.

Способ 3. Полное обновление конфигурации УАТ

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

Например, в релизе УАТ Стандарт 2.2.1.1 (и последующих) защита полностью адаптирована под требования платформы 8.3.12 и лишена проблемы дублирования функции ПроверитьБит. При выполнении этого обновления режим совместимости конфигурации будет корректно сопоставлен с требованиями обновленной «1С:Бухгалтерии предприятия».

Способ 4. Временный откат версии платформы (крайняя мера)

Если работоспособность системы необходимо восстановить немедленно, а оперативно получить новые файлы защиты нет возможности, можно временно понизить версию используемой технологической платформы.

Установите версию платформы ниже 8.3.11.2867 (например, стабильную 8.3.10.2704) и верните в свойствах конфигурации режим совместимости «8.3.10».

Важное предупреждение: этот способ не подходит, если обновленная конфигурация «1С:Бухгалтерия предприятия» жестко требует использования платформы не ниже 8.3.12. В таком случае понижение версии платформы приведет к неработоспособности бухгалтерского контура системы.

---

Пример работы встроенной функции ПроверитьБит в платформе 1С

Для понимания того, как теперь работает штатный механизм платформы, приведем пример использования новой функции ПроверитьБит(). Данная функция принимает два параметра: проверяемое число и индекс бита (начиная с 0), возвращая булево значение.


// Проверим, установлены ли биты в числе 5 (в двоичной системе: 101)
ЧислоДляПроверки = 5;

// Проверяем нулевой бит (младший)
Бит0 = ПроверитьБит(ЧислоДляПроверки, 0); // Возвратит Истина, так как там "1"

// Проверяем первый бит
Бит1 = ПроверитьБит(ЧислоДляПроверки, 1); // Возвратит Ложь, так как там "0"

// Проверяем второй бит
Бит2 = ПроверитьБит(ЧислоДляПроверки, 2); // Возвратит Истина, так как там "1"

ЗаписьЖурналаРегистрации("ТестБитов", УровеньЖурналаРегистрации.Информация, , , 
    "Бит 0: " + Бит0 + "; Бит 1: " + Бит1 + "; Бит 2: " + Бит2);

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

Используйте предложенные инструкции для точечной замены макетов защиты, и ваша система успешно запустится на актуальной версии платформы 1С!

← На главную