При обновлении типовых решений 1С, особенно интегрированных с отраслевыми конфигурациями от сторонних разработчиков (например, «1С-Рарус: Управление автотранспортом»), технические специалисты часто сталкиваются со специфическими ошибками компиляции программного кода. Одной из наиболее известных проблем конца 2017 – 2018 годов и последующего времени стал конфликт, связанный со встроенной функцией ПроверитьБит().
В этой статье мы подробно разберем, почему возникает данная ошибка, как устроена система защиты отраслевых решений и какие существуют варианты устранения неисправности, если ваша конфигурация сильно кастомизирована и полное обновление невозможно.
Типичный сценарий возникновения проблемы: база данных «1С:Бухгалтерия предприятия» объединена с «1С:Управление автотранспортом» (УАТ) версии 2.0. После планового обновления конфигурации БП потребовалось повысить режим совместимости (например, с 8.3.10 до 8.3.12 или выше) и обновить версию технологической платформы. При запуске системы база аварийно завершает работу, выдавая в журнал регистрации следующее системное сообщение:
{ВнешняяОбработка.Лицензирование.МодульОбъекта(99)}: Ошибка при вызове метода контекста (Создать): Ошибка инициализации модуля: ВнешняяОбработка.ЗащищеннаяОбработка.МодульОбъекта: {ВнешняяОбработка.ЗащищеннаяОбработка.МодульОбъекта(100,9)}: Процедура или функция с указанным именем уже определена (ПроверитьБит)
---
Для того чтобы понять природу коллизии, проанализируем изменения в технологической платформе «1С:Предприятие 8». Начиная с версии 8.3.11.2867, разработчики фирмы «1С» добавили в глобальный контекст встроенные функции для работы с двоичными данными и выполнения побитовых операций над целыми числами:
ПобитовоеИ()ПобитовоеИли()ПобитовоеНе()ПроверитьБит()УстановитьБит()ПобитовыйСдвигВлево() и др.До этого момента программисты отраслевых решений (в частности, разработчики систем лицензирования «Катран» и СЛК от «1С-Рарус» и «Первый БИТ») вынуждены были писать собственные алгоритмы для побитовых проверок при расшифровке ключей защиты. В их закрытом программном коде была объявлена экспортная функция с точно таким же именем — ПроверитьБит().
Пока конфигурация работала в режиме совместимости 8.3.10, новые возможности платформы оставались неактивными. Как только режим совместимости был изменен на 8.3.11 или 8.3.12, платформа активировала встроенную функцию ПроверитьБит(). Компилятор 1С обнаружил дублирование имен в глобальной области видимости и заблокировал выполнение кода, выдав критическую ошибку.
---
Рассмотрим специфику защиты конфигурации УАТ. Защищенные функции лицензирования и расчета сложных параметров (например, ГСМ и выработки) вынесены разработчиками в специальный закрытый модуль. Физически этот код находится во внешней обработке (например, ЗащищеннаяОбработка.epf), которая зашифрована и сохранена внутри конфигурации как двоичные данные в одном из общих макетов защиты (система Катран).
В процессе запуска системы специальная внешняя компонента (DLL-библиотека) расшифровывает эту обработку непосредственно в оперативной памяти компьютера и передает управление платформе. Поскольку исходный код модуля защиты скрыт от обычного разработчика, мы не можем открыть его в конфигураторе и вручную переименовать конфликтующую функцию ПроверитьБит().
---
В зависимости от степени кастомизации вашей информационной базы и наличия действующей подписки на отраслевое сопровождение, выберите один из следующих способов решения.
Если ваша конфигурация УАТ содержит множество уникальных доработок и вы не можете выполнить полное обновление на новый релиз, оптимальным решением будет обновление исключительно компонентов защиты. Разработчики из «1С-Рарус» оперативно исправили данную ошибку в своих системах лицензирования, переименовав внутреннюю функцию (например, в РР_ПроверитьБит).
Выполним следующие шаги:
Данный подход позволяет полностью сохранить все ваши доработки в кодовой базе УАТ и запустить программу на современной платформе.
Если у вас есть доступ к обновлениям УАТ, но накатывать их целиком на рабочую базу слишком трудозатратно, вы можете «вытащить» исправленный макет защиты самостоятельно:
Если конфигурация УАТ находится на типовой поддержке и не содержит значительных изменений, наиболее правильным решением будет ее обновление до релиза, официально поддерживающего новые требования платформы 1С.
Например, в релизе УАТ Стандарт 2.2.1.1 (и последующих) защита полностью адаптирована под требования платформы 8.3.12 и лишена проблемы дублирования функции ПроверитьБит. При выполнении этого обновления режим совместимости конфигурации будет корректно сопоставлен с требованиями обновленной «1С:Бухгалтерии предприятия».
Если работоспособность системы необходимо восстановить немедленно, а оперативно получить новые файлы защиты нет возможности, можно временно понизить версию используемой технологической платформы.
Установите версию платформы ниже 8.3.11.2867 (например, стабильную 8.3.10.2704) и верните в свойствах конфигурации режим совместимости «8.3.10».
Важное предупреждение: этот способ не подходит, если обновленная конфигурация «1С:Бухгалтерия предприятия» жестко требует использования платформы не ниже 8.3.12. В таком случае понижение версии платформы приведет к неработоспособности бухгалтерского контура системы.
---
Для понимания того, как теперь работает штатный механизм платформы, приведем пример использования новой функции ПроверитьБит(). Данная функция принимает два параметра: проверяемое число и индекс бита (начиная с 0), возвращая булево значение.
// Проверим, установлены ли биты в числе 5 (в двоичной системе: 101)
ЧислоДляПроверки = 5;
// Проверяем нулевой бит (младший)
Бит0 = ПроверитьБит(ЧислоДляПроверки, 0); // Возвратит Истина, так как там "1"
// Проверяем первый бит
Бит1 = ПроверитьБит(ЧислоДляПроверки, 1); // Возвратит Ложь, так как там "0"
// Проверяем второй бит
Бит2 = ПроверитьБит(ЧислоДляПроверки, 2); // Возвратит Истина, так как там "1"
ЗаписьЖурналаРегистрации("ТестБитов", УровеньЖурналаРегистрации.Информация, , ,
"Бит 0: " + Бит0 + "; Бит 1: " + Бит1 + "; Бит 2: " + Бит2);
Этот простой пример наглядно иллюстрирует, почему платформа конфликтует с внешними функциями защиты. Поскольку имя стало зарезервированным на уровне ядра 1С, любые попытки объявить процедуру или функцию с именем ПроверитьБит в глобальном контексте или модулях с признаком Экспорт будут пресекаться системой на этапе компиляции.
Используйте предложенные инструкции для точечной замены макетов защиты, и ваша система успешно запустится на актуальной версии платформы 1С!