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

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

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

Причина возникновения конфликта

Разберем механизм работы платформы и появление новых встроенных функций. Начиная с релиза платформы 8.3.6.1977, в глобальный контекст 1С были добавлены встроенные системные функции для эффективной работы со строками, такие как СтрНачинаетсяС, СтрЗаканчиваетсяНа, СтрРазделить, СтрШаблон и другие.

В типовых конфигурациях поколения 8.2 (например, 1С:Зарплата и Управление Персоналом 2.5, УПП 1.3, КА 1.1, УТ 10.3) для реализации подсистем обмена, ЕГАИС или электронного документооборота разработчики создавали собственные функции-обертки с аналогичными именами в глобальных общих модулях.

Поведение платформы напрямую зависит от свойства Режим совместимости корневого узла конфигурации:

  1. Режим совместимости «Версия 8.2.13» (штатный для ЗУП 2.5): встроенные системные функции платформы 8.3.6+ принудительно отключаются, платформа беспрепятственно использует функцию из глобального модуля конфигурации.
  2. Режим совместимости «Версия 8.3.6», «Версия 8.3.7» или выше: платформа подключает встроенную функцию СтрНачинаетсяС в глобальный контекст. При компиляции модуля с одноименной экспортной глобальной функцией возникает конфликт имен, так как переопределять встроенные системные идентификаторы в глобальной области видимости запрещено.

Способ 1. Восстановление штатного режима совместимости конфигурации

Рассмотрим основной и самый безопасный вариант исправления. Для типовых конфигураций на обычных формах (таких как ЗУП 2.5) необоснованное повышение режима совместимости может привести не только к синтаксическим ошибкам, но и к нарушениям в работе транзакционных блокировок, расчете зарплаты и логике форм.

Разберем по шагам, как вернуть корректный режим совместимости:

  1. Откроем конфигуратор 1С.
  2. В дереве метаданных выделим корневой элемент конфигурации (самую верхнюю строчку) и откроем окно свойств (нажатием клавиши F4 или через контекстное меню).
  3. Найдем свойство Режим совместимости.
  4. Установим значение, предусмотренное типовой поставкой: Версия 8.2.13 (или Версия 8.2.16 в зависимости от релиза конфигурации).
  5. Сохраним изменения и обновим конфигурацию базы данных (клавиша F7).

Способ 2. Корректировка свойств общего модуля или удаление дублирующей функции

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

Выполним следующие действия:

  1. Выполним глобальный поиск в конфигурации по имени конфликтной функции: Функция СтрНачинаетсяС.
  2. Если функция находится в общем модуле, у которого установлен флаг Глобальный:

    Снимем флаг Глобальный в свойствах данного модуля. После этого обращение к функциям модуля потребуется выполнять явно через имя модуля (например, ИмяМодуля.СтрНачинаетсяС(...)).

  3. Если в модуле реализован собственный код для платформы 8.2, а конфигурация работает на режиме 8.3.7+, закомментируем или удалим пользовательскую функцию-дубль, так как платформа 1С нативно предоставляет функцию СтрНачинаетсяС в глобальном контексте.

Способ 3. Альтернативная реализация проверки начала строки для режима 8.2

Посмотрим на пример кода, если требуется реализовать логику проверки начала строки в модуле объекта, отчета или внешней обработки универсальным способом без риска конфликта с глобальным контекстом платформы.

В режиме совместимости 8.2 стандартно применяются функции Лев или Найти:


// Вариант 1: Использование функции Лев
Если Лев(ПроверяемаяСтрока, СтрДлина(ИскомыйПрефикс)) = ИскомыйПрефикс Тогда
    // Действие, если строка начинается с указанного префикса
КонецЕсли;

// Вариант 2: Использование функции Найти
Если Найти(ПроверяемаяСтрока, ИскомыйПрефикс) = 1 Тогда
    // Действие, если префикс находится в самой первой позиции строки
КонецЕсли;

Применение этих методов гарантирует корректную работу кода на любых версиях платформы и при любых установленных режимах совместимости.

← На главную