Как адаптировать обработку 1С для работы в режиме совместимости 8.2 при ошибках СтрРазделить, СтрШаблон и СтрНайти?

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

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

Разберем подробно причины возникновения этой проблемы и рассмотрим все практические способы её решения.

Выясним причину возникновения ошибки

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

Способ 1. Быстрый поиск всех несовместимых функций (Синтаксический контроль)

Чтобы не исправлять ошибки по одной по мере их появления во время работы, проанализируем модуль обработки целиком с помощью встроенных средств Конфигуратора.

  1. Откроем внешнюю обработку в режиме Конфигуратор.
  2. Перейдем в главное меню: Сервис — Параметры.
  3. В появившемся окне выберем вкладку Проверка (или Синтаксический контроль).
  4. Установим флажки проверки для нужного режима приложения (например, Управляемое приложение и Обычное приложение).
  5. Откроем модуль формы или модуль объекта обработки и нажмем комбинацию клавиш Ctrl + F7.

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

Способ 2. Замена функций на методы, совместимые с 8.2

Рассмотрим варианты замены ключевых функций на аналоги, которые корректно исполняются в режиме совместимости 8.2.

Замена функции СтрШаблон

Функцию форматирования строк СтрШаблон заменяем на классическую подстановку через СтрЗаменить.


// Было (не работает в 8.2):
ВызватьИсключение СтрШаблон(НСтр("ru = 'Общий модуль ""%1"" не найден.'"), Имя);

// Стало (совместимо с 8.2):
ВызватьИсключение СтрЗаменить(НСтр("ru = 'Общий модуль ""%1"" не найден.'"), "%1", Имя);

Замена функции СтрРазделить

Вместо СтрРазделить можно использовать библиотечные функции из состава Библиотеки Стандартных Подсистем (БСП).


// Было (не работает в 8.2):
МассивПолейДоступа = СтрРазделить(ПоляДоступа, ",");

// Стало с использованием БСП:
МассивПолейДоступа = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ПоляДоступа, ",");
// Или через модуль клиент-сервер:
МассивПолейДоступа = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПоляДоступа, ",");

Если в конфигурации отсутствует указанный общий модуль, разбор строки можно выполнить универсальным методом:


Функция РазложитьСтрокуВМассив(Знач СтрокаИсточ, Знач Разделитель = ",")
	МассивРезультат = Новый Массив;
	ТекущаяСтрока = СтрокаИсточ;
	Поз = Найти(ТекущаяСтрока, Разделитель);
	Пока Поз > 0 Цикл
		Подстрока = Лев(ТекущаяСтрока, Поз - 1);
		МассивРезультат.Добавить(СокрЛП(Подстрока));
		ТекущаяСтрока = Сред(ТекущаяСтрока, Поз + СтрДлина(Разделитель));
		Поз = Найти(ТекущаяСтрока, Разделитель);
	КонецЦикла;
	Если Не ПустаяСтрока(ТекущаяСтрока) Тогда
		МассивРезультат.Добавить(СокрЛП(ТекущаяСтрока));
	КонецЕсли;
	Возвращать МассивРезультат;
КонецФункции

Замена функции СтрНайти

Вместо функции СтрНайти используем базовую функцию Найти.


// Было (не работает в 8.2):
Если СтрНайти(ОбъектМетаданных.Тип, "Регистры") > 0 Тогда

// Стало (совместимо с 8.2):
Если Найти(ОбъектМетаданных.Тип, "Регистры") > 0 Тогда

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


Если Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) 
Или Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда
    // Логика обработки регистра
КонецЕсли;

Способ 3. Отключение режима совместимости на копии базы

Если обработка (например, СкрытиеКонфиденциальнойИнформации) является одноразовой и применяется для подготовки базы к передаче сторонним разработчикам, операция должна выполняться строго на копии информационной базы.

В таком случае дорабатывать код обработки не обязательно. Достаточно выполнить следующие шаги:

  1. Создать копию информационной базы и открыть ее в режиме Конфигуратор.
  2. В дереве метаданных кликнуть правой кнопкой мыши по самому верхнему узлу (название конфигурации) и открыть Свойства.
  3. В палитре свойств найти параметр Режим совместимости.
  4. Установить значение «Не использовать» или выбрать версию не ниже «Версия 8.3.6».
  5. Сохранить конфигурацию базы данных (клавиша F7).
  6. Запустить базу в режиме 1С:Предприятие и выполнить внешнюю обработку без ошибок.
← На главную