При запуске современных внешних обработок (например, СкрытиеКонфиденциальнойИнформации.epf) на платформе 1С:Предприятие 8.3 в конфигурациях, работающих в режиме совместимости с версией 8.2, часто возникает ошибка синтаксического контроля: «Процедура или функция с указанным именем не определена». Платформа указывает на функции СтрРазделить, СтрШаблон или СтрНайти.
Разберем подробно причины возникновения этой проблемы и рассмотрим все практические способы её решения.
Функции работы со строками СтрРазделить, СтрШаблон, СтрНайти, СтрСоединить были внесены в глобальный контекст платформы «1С:Предприятие», начиная с версии 8.3.6. Если у вашей конфигурации в свойстве «Режим совместимости» установлено значение «Версия 8.2.16» (или аналогичное 8.2), платформа эмулирует поведение старого движка. В результате эти встроенные функции становятся недоступны, и при вызове кода программа выдает ошибку.
Чтобы не исправлять ошибки по одной по мере их появления во время работы, проанализируем модуль обработки целиком с помощью встроенных средств Конфигуратора.
Платформа сформирует полный список строк, где используются функции, не поддерживаемые выбранным режимом совместимости.
Рассмотрим варианты замены ключевых функций на аналоги, которые корректно исполняются в режиме совместимости 8.2.
Функцию форматирования строк СтрШаблон заменяем на классическую подстановку через СтрЗаменить.
// Было (не работает в 8.2):
ВызватьИсключение СтрШаблон(НСтр("ru = 'Общий модуль ""%1"" не найден.'"), Имя);
// Стало (совместимо с 8.2):
ВызватьИсключение СтрЗаменить(НСтр("ru = 'Общий модуль ""%1"" не найден.'"), "%1", Имя);
Вместо СтрРазделить можно использовать библиотечные функции из состава Библиотеки Стандартных Подсистем (БСП).
// Было (не работает в 8.2):
МассивПолейДоступа = СтрРазделить(ПоляДоступа, ",");
// Стало с использованием БСП:
МассивПолейДоступа = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ПоляДоступа, ",");
// Или через модуль клиент-сервер:
МассивПолейДоступа = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПоляДоступа, ",");
Если в конфигурации отсутствует указанный общий модуль, разбор строки можно выполнить универсальным методом:
Функция РазложитьСтрокуВМассив(Знач СтрокаИсточ, Знач Разделитель = ",")
МассивРезультат = Новый Массив;
ТекущаяСтрока = СтрокаИсточ;
Поз = Найти(ТекущаяСтрока, Разделитель);
Пока Поз > 0 Цикл
Подстрока = Лев(ТекущаяСтрока, Поз - 1);
МассивРезультат.Добавить(СокрЛП(Подстрока));
ТекущаяСтрока = Сред(ТекущаяСтрока, Поз + СтрДлина(Разделитель));
Поз = Найти(ТекущаяСтрока, Разделитель);
КонецЦикла;
Если Не ПустаяСтрока(ТекущаяСтрока) Тогда
МассивРезультат.Добавить(СокрЛП(ТекущаяСтрока));
КонецЕсли;
Возвращать МассивРезультат;
КонецФункции
Вместо функции СтрНайти используем базовую функцию Найти.
// Было (не работает в 8.2):
Если СтрНайти(ОбъектМетаданных.Тип, "Регистры") > 0 Тогда
// Стало (совместимо с 8.2):
Если Найти(ОбъектМетаданных.Тип, "Регистры") > 0 Тогда
Полезный совет: при работе с метаданными корректнее проверять принадлежность объекта к коллекции напрямую через метаданные, не прибегая к текстовому поиску:
Если Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных)
Или Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда
// Логика обработки регистра
КонецЕсли;
Если обработка (например, СкрытиеКонфиденциальнойИнформации) является одноразовой и применяется для подготовки базы к передаче сторонним разработчикам, операция должна выполняться строго на копии информационной базы.
В таком случае дорабатывать код обработки не обязательно. Достаточно выполнить следующие шаги: