В процессе работы с устаревшими конфигурациями, такими как 1С:Управление производственным предприятием (УПП), разработчики часто сталкиваются с парадоксальной ситуацией: код, который успешно работает в одной базе, вызывает критические ошибки при проверке синтаксиса в другой, абсолютно идентичной по версии платформы базе. Одной из самых частых «виновниц» таких проблем становится функция СтрНачинаетсяС. В этой статье мы подробно разберем, почему платформа «забывает» стандартные функции и как восстановить работоспособность системы.
Для начала проанализируем техническую сторону вопроса. Функция СтрНачинаетсяС (как и ее «коллеги» СтрЗаканчиваетсяС, СтрРазделить, СтрСоединить) официально появилась в платформе «1С:Предприятие» только начиная с версии 8.3.6.1977. Однако многие крупные конфигурации, включая УПП, продолжают работать в режиме совместимости «Версия 8.2.13» или «Версия 8.2.16».
Когда в свойствах конфигурации установлен режим совместимости ниже 8.3.6, платформа намеренно блокирует доступ к новым встроенным функциям. Это делается для того, чтобы поведение системы было предсказуемым и соответствовало старым алгоритмам работы. Таким образом, в «чистом» режиме 8.2.13 функции СтрНачинаетсяС просто не существует для компилятора.
Рассмотрим ситуацию: если в режиме совместимости 8.2.13 встроенной функции нет, почему же «боевая» база не выдает ошибку? Ответ кроется в механизме переопределения через глобальные модули.
Разработчики типовых решений (1С) часто внедряют в старые конфигурации современные подсистемы (например, интеграцию с ЕГАИС, маркировку или обмен с банками). Эти подсистемы написаны на современном языке и требуют строковых функций. Чтобы они работали в режиме совместимости 8.2.13, 1С создает «функции-заглушки» в общих модулях и делает эти модули Глобальными.
Проанализируем типичные места, где могут быть спрятаны эти функции в УПП:
ИнтеграцияЕГАИСУТКлиентСерверГлобальныйИнтеграцияЕГАИСКлиентСерверГлобальныйОбщегоНазначенияКлиентСервер (если используется БСП)Если в конфигурации есть глобальный модуль с кодом, подобным приведенному ниже, то система будет воспринимать СтрНачинаетсяС не как встроенную функцию платформы, а как пользовательскую функцию из этого модуля:
Функция СтрНачинаетсяС(Строка, Подстрока) Экспорт
Возврат Лев(Строка, СтрДлина(Подстрока)) = Подстрока;
КонецФункции
Если при переносе конфигурации или обновлении бэкапа функция «пропала» и начала выдавать ошибку «Процедура или функция не определена», необходимо проверить три основных фактора:
МойМодуль.СтрНачинаетсяС()), и синтакс-проверка в других местах выдаст ошибку.СтрНачинаетсяС, и вашу функцию в общем модуле. Возникает ошибка дублирования имен. Многие разработчики, чтобы «протолкнуть» обновление, временно комментируют код в общем модуле, а потом забывают его раскомментировать.Клиент (обычное приложение), Сервер и Внешнее соединение. Если функция определена в модуле, который доступен только на сервере, а вызов происходит в модуле формы (на клиенте), компилятор ее не увидит.Рассмотрим, как правильно решить проблему, если вам необходимо использовать СтрНачинаетсяС в старой базе:
Способ 1. Использование универсальных функций БСП (если она есть)
Вместо использования функции, которая может конфликтовать с платформой, лучше использовать вызов из стандартных библиотек. В БСП аналог выглядит так:
ОбщегоНазначенияКлиентСервер.НачинаетсяС(Строка, Подстрока)
Способ 2. Восстановление глобального модуля
Если вы обнаружили, что в боевой базе функция есть, а в новой — нет, выполните глобальный поиск (Ctrl+Shift+F) по всей конфигурации в боевой базе по строке "Функция СтрНачинаетсяС". Найдите модуль-донор и убедитесь, что в вашей новой базе:
Способ 3. Переход на классические методы 1С 8.2
Если вы хотите, чтобы ваш код был максимально отказоустойчивым и не зависел от наличия «заглушек» в общих модулях, используйте классический метод проверки вхождения подстроки с начала строки:
// Вместо СтрНачинаетсяС(Текст, "Префикс")
Если Найти(Текст, "Префикс") = 1 Тогда
// Ваша логика
КонецЕсли;
Или через функцию Лев():
Если Лев(Текст, СтрДлина("Префикс")) = "Префикс" Тогда
// Ваша логика
КонецЕсли;
Подводя итог, можно сказать, что ошибка «Процедура или функция не определена (СтрНачинаетсяС)» — это классический симптом работы современной конфигурации на старом режиме совместимости. Главный подвох заключается в том, что в типовых решениях эта функция добавлена разработчиками 1С искусственно. При любых манипуляциях с базой (обновление, перенос кода, загрузка конфигурации) в первую очередь проверяйте настройки глобальных общих модулей и наличие в них соответствующих функций-эмуляторов.