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

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

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

Выясним причину проблемы

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

Помимо рассматриваемой ошибки со СтрШаблон, аналогичный конфликт часто возникает для самописных функций СтрНайти, СтрСоединить, СтрРазделить, СтрНачинаетсяС и СтрЗаканчиваетсяНа. Платформа видит, что в глобальном контексте уже есть такая встроенная функция, и при попытке объявить ее копию в вашем общем модуле (например, ОбщийМодуль.Локализация) выдает ошибку.

Разберем по шагам варианты решения

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

Вариант 1: Переход на встроенный платформенный метод

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

  1. Удалите функцию СтрШаблон из вашего общего модуля.
  2. Используйте механизм «Глобальная замена» (меню «Правка» — «Глобальная замена») в Конфигураторе для поиска старых вызовов.
  3. Замените конструкцию вызова через общий модуль, например Локализация.СтрШаблон(...), на прямой вызов платформенного метода СтрШаблон(...).

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

СтрШаблон(<Шаблон>, <Значение1-Значение10>)

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

  1. Жесткий контроль параметров: встроенный метод строго проверяет соответствие количества маркеров %N количеству переданных значений. Если параметров недостаточно, генерируется исключительная ситуация «Недостаточно фактических параметров». Если параметров слишком много — «Очень много параметров». Если ваша старая функция «прощала» такие ошибки, встроенный метод вызовет падение кода.
  2. Синтаксис маркеров: платформенный метод использует маркеры подстановки вида %1, %2 и т.д. Если в старой функции использовались маркеры вроде [1] или именованные параметры, вам придется переписать сами текстовые строки шаблонов по всей конфигурации. Если в тексте нужен сам символ процента, его нужно экранировать, написав дважды: %%.

Вариант 2: Переименование самописной функции

Если анализ кода покажет, что старая пользовательская функция содержит специфическую логику, от нее отказываться нельзя. Выясним, что это может быть за логика: например, функция умеет принимать параметры в виде единого массива или коллекции, обрабатывает склонения слов, либо работает со сложными именованными макросами (вида [Контрагент]).

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

  1. СформироватьСтрокуПоШаблону
  2. СтрШаблонМассив
  3. ПодставитьПараметрыВСтроку

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

Инструменты для проведения массового рефакторинга

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

Однако более надежным вариантом для подобных задач является использование среды разработки 1C:EDT. В ней встроен продвинутый механизм рефакторинга: он позволяет автоматически и безопасно переименовать метод или изменить его вызовы по всей конфигурации с учетом семантики и контекста, а не просто как плоский текст.

← На главную