При обновлении конфигураций на платформе 1С:Предприятие или при открытии отчетов разработчики иногда сталкиваются с ошибкой компиляции: «Процедура или функция с указанным именем уже определена (СтрНачинаетсяС)». В результате перестают формироваться отчеты или аварийно завершается запуск конфигурации. Проанализируем, почему возникает этот конфликт и как его быстро устранить.
Разберем механизм работы платформы и появление новых встроенных функций. Начиная с релиза платформы 8.3.6.1977, в глобальный контекст 1С были добавлены встроенные системные функции для эффективной работы со строками, такие как СтрНачинаетсяС, СтрЗаканчиваетсяНа, СтрРазделить, СтрШаблон и другие.
В типовых конфигурациях поколения 8.2 (например, 1С:Зарплата и Управление Персоналом 2.5, УПП 1.3, КА 1.1, УТ 10.3) для реализации подсистем обмена, ЕГАИС или электронного документооборота разработчики создавали собственные функции-обертки с аналогичными именами в глобальных общих модулях.
Поведение платформы напрямую зависит от свойства Режим совместимости корневого узла конфигурации:
СтрНачинаетсяС в глобальный контекст. При компиляции модуля с одноименной экспортной глобальной функцией возникает конфликт имен, так как переопределять встроенные системные идентификаторы в глобальной области видимости запрещено.Рассмотрим основной и самый безопасный вариант исправления. Для типовых конфигураций на обычных формах (таких как ЗУП 2.5) необоснованное повышение режима совместимости может привести не только к синтаксическим ошибкам, но и к нарушениям в работе транзакционных блокировок, расчете зарплаты и логике форм.
Разберем по шагам, как вернуть корректный режим совместимости:
F4 или через контекстное меню).F7).Если режим совместимости конфигурации был осознанно повышен до версии 8.3.6 или выше для внедрения нового функционала, то вызов встроенных функций платформы должен иметь приоритет. Выясним причину дублирования и устраним ее в кодовой базе.
Выполним следующие действия:
Функция СтрНачинаетсяС.Снимем флаг Глобальный в свойствах данного модуля. После этого обращение к функциям модуля потребуется выполнять явно через имя модуля (например, ИмяМодуля.СтрНачинаетсяС(...)).
СтрНачинаетсяС в глобальном контексте.Посмотрим на пример кода, если требуется реализовать логику проверки начала строки в модуле объекта, отчета или внешней обработки универсальным способом без риска конфликта с глобальным контекстом платформы.
В режиме совместимости 8.2 стандартно применяются функции Лев или Найти:
// Вариант 1: Использование функции Лев
Если Лев(ПроверяемаяСтрока, СтрДлина(ИскомыйПрефикс)) = ИскомыйПрефикс Тогда
// Действие, если строка начинается с указанного префикса
КонецЕсли;
// Вариант 2: Использование функции Найти
Если Найти(ПроверяемаяСтрока, ИскомыйПрефикс) = 1 Тогда
// Действие, если префикс находится в самой первой позиции строки
КонецЕсли;
Применение этих методов гарантирует корректную работу кода на любых версиях платформы и при любых установленных режимах совместимости.