До и после
Этот материал из разряда "баян", просто с некоторой порцией дополнительной информации. Вот существующие материалы на эту тему (отдельное спасибо JSON, в свое время материал очень помог):
-
Строковые функции для совместимости с платформой 8.3.5 и ниже от JSON
-
6 новых функций, которые не следует использовать в режиме совместимости от denis_aka_wolf
После выхода платформы 8.3.6 и постепенным отказом конфигураций от совместимости ниже 8.3.6 был актуальным вопрос обновление программного кода в части работы со строками. Хоть это и было 5 лет назад, до сих пор можно встретить решения с совместимостью 8.3.5 и ниже. И это нормально. Сколько еще решений на 7.7, что уж говорить.
В общем, с выходом 8.3.6 жизнь разделилась на до и после, т.к. появились новые методы работы со строками.
При отказе от совместимости существующий код может работать без особых проблем, кроме случаев, когда название Ваших функций совпадают с глобальными методами платформы 1С.
А вот если нужно использовать новый код (из БСП, с Инфостарта, с GitHub и т.д.) написанный на новых версиях платформы в рамках решения с совместимостью 8.3.5 и ниже, то могут быть проблемы. Новые возможности работы со строками просто будут недоступны. Важно понимать, что даже если у вас платформа 8.3.16, а совместимость конфигурации все равно 8.3.5 и ниже, то новые методы работы со строками в любом случае будут недоступны. Но можно использовать их аналоги.
Рассмотрим простые варианты их реализации.
СтрНайти
Новая функция для поиска вхождения искомой строки.
СтрНайти(<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>)
Вариант реализации для платформы 1C версии < 8.3.6 (или режима совместимости < 8.3.6):
Функция _СтрНайти(Знач Строка, Знач СтрокаПоиска, Знач НаправлениеПоискаСтроки = Неопределено, Знач НачальнаяПозиция = 1, Знач НомерВхождения = 1)
Если НаправлениеПоискаСтроки = Неопределено Тогда
НаправлениеПоискаСтроки = НаправлениеПоискСНачала();
КонецЕсли;
Если НаправлениеПоискаСтроки <> НаправлениеПоискСНачала()
И НаправлениеПоискаСтроки <> НаправлениеПоискаСКонца() Тогда
ВызватьИсключение "Неверное значение параметра";
КонецЕсли;
ИсходнаяДлинаСтроки = СтрДлина(Строка);
ИсходнаяДлинаСтрокиПоиска = СтрДлина(СтрокаПоиска);
Если НачальнаяПозиция = 0 ИЛИ НомерВхождения = 0 Тогда
Возврат 0;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(СтрокаПоиска) Тогда
ИсходнаяСтрокаБезБоковыхПробелов = СокрЛП(Строка);
Если СтрДлина(ИсходнаяСтрокаБезБоковыхПробелов) = 0 Тогда
Возврат 1;
КонецЕсли;
КонецЕсли;
Если НаправлениеПоискаСтроки = НаправлениеПоискаСКонца() Тогда
Строка = СтрокаЗадомНаперед(Строка);
СтрокаПоиска = СтрокаЗадомНаперед(СтрокаПоиска);
КонецЕсли;
Если НачальнаяПозиция = 1 Тогда
ДлинаПройденнойЧастиСтроки = 0;
НеобработаннаяСтрока = Строка;
Иначе
ДлинаПройденнойЧастиСтроки = НачальнаяПозиция - 1;
НеобработаннаяСтрока = Прав(Строка, ИсходнаяДлинаСтроки - НачальнаяПозиция + 1);
КонецЕсли;
Если НомерВхождения > СтрЧислоВхождений(НеобработаннаяСтрока, СтрокаПоиска) Тогда
Возврат 0;
КонецЕсли;
НомерНайденногоВхождения = 0;
Пока НомерНайденногоВхождения < НомерВхождения Цикл
ИндексВхождения = Найти(НеобработаннаяСтрока, СтрокаПоиска);
ДлинаПройденнойЧастиСтроки = ДлинаПройденнойЧастиСтроки
+ СтрДлина(Лев(НеобработаннаяСтрока, ИндексВхождения + ИсходнаяДлинаСтрокиПоиска - 1));
НеобработаннаяСтрока = Прав(НеобработаннаяСтрока, СтрДлина(НеобработаннаяСтрока)
- (ИндексВхождения + ИсходнаяДлинаСтрокиПоиска - 1));
НомерНайденногоВхождения = НомерНайденногоВхождения + 1;
КонецЦикла;
РезультатПоиска = 0;
Если НаправлениеПоискаСтроки = НаправлениеПоискаСКонца() Тогда
РезультатПоиска = ИсходнаяДлинаСтроки
- ДлинаПройденнойЧастиСтроки
+ ИсходнаяДлинаСтрокиПоиска;
Иначе
РезультатПоиска = ДлинаПройденнойЧастиСтроки + 1
- ИсходнаяДлинаСтрокиПоиска;
КонецЕсли;
Возврат РезультатПоиска;
КонецФункции
Поведение практически такое же, как и у платформенного метода. Особенностью также является то, что 3-й параметр "НаправлениеПоискаСтроки" отличается от того, что передается в "родную" функцию платформы. Т.к. в 8.3.6 направление поиска задается значением типа "НаправлениеПоиска", который до 8.3.6 не был доступен, то в этом варианте значение задается строкой. Для удобства это значения сокрыто в двух функциях:
В остальном явных отличий нет.
СтрСравнить
Новая функция для сравнения строк без учета регистра.
СтрСравнить(<Строка1>, <Строка2>)
Вариант реализации для платформы 1C версии < 8.3.6 (или режима совместимости < 8.3.6):
Всего гораздо проще, чем с "СтрНайти".
СтрНачинаетсяС
Функция для определения того, что строка начинается на указанную подстроку.
СтрНачинаетсяС(<Строка>, <СтрокаПоиска>)
Вариант реализации для платформы 1C версии < 8.3.6 (или режима совместимости < 8.3.6):
Здесь все еще проще, чем в предыдущих вариантах.
СтрЗаканчиваетсяНа
Функция для определения, что строка заканчивается на указанную подстроку.
СтрЗаканчиваетсяНа(<Строка>, <СтрокаПоиска>)
Вариант реализации для платформы 1C версии < 8.3.6 (или режима совместимости < 8.3.6):
Функция очень простая.
СтрРазделить
Функция разделяем строку на части.
СтрРазделить(<Строка>, <Разделитель>, <ВключатьПустые>)
Вариант реализации для платформы 1C версии < 8.3.6 (или режима совместимости < 8.3.6):
Для разбиения исходной строки на массив подстрок используется функция БСП "РазложитьСтрокуВМассивПодстрок". С ней Вы можете ознакомиться в большинстве типовых конфигураций.
СтрСоединить
Функция для соединения массива строк в одну строку.
СтрСоединить(<Строки>, <Разделитель>)
Вариант реализации для платформы 1C версии < 8.3.6 (или режима совместимости < 8.3.6):
Как и в предыдущем случае, здесь мы используем функцию "РазложитьСтрокуВМассивПодстрок" из общего модуля "СтроковыеФункцииКлиентСервер" БСП.
СтрШаблон
Это функция относится больше к форматированию, чем изменению строк. Предназначена для подстановки параметров в строку шаблона.
СтрШаблон(<Шаблон>, <Значение1-Значение10>)
Вариант реализации для платформы 1C версии < 8.3.6 (или режима совместимости < 8.3.6):
Все проще некуда. Также вместо "СтрШаблон()" можно использовать функции БСП:
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтрокуИзМассива(ШаблонСтроки, Параметры)
// ИЛИ
СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(ШаблонСтроки, Параметры)
// Последний можно использовать только с некоторыми оговорками.
// Читайте описание функции.
Есть выбор что и как использовать.
Вспомогательные функции
Часть предложенных функций ссылаются на общий модуль "СтроковыеФункцииКлиентСервер" из БСП. Также есть функция для "переворачивания" строки задом наперед.
Функция СтрокаЗадомНаперед(Знач Строка) Экспорт
Результат = "";
ДлинаСтроки = СтрДлина(Строка);
Для Счетчик = 0 По ДлинаСтроки - 1 Цикл
Индекс = ДлинаСтроки - Счетчик;
Символ = Сред(Строка, Индекс, 1);
Результат = Результат + Символ;
КонецЦикла;
Возврат Результат;
КонецФункции
Плюс для упрощения указания направления поиска добавлены функции с соответствующими значениями.
Функция НаправлениеПоискСНачала() Экспорт
Возврат "СНачала";
КонецФункции
Функция НаправлениеПоискаСКонца() Экспорт
Возврат "СКонца";
КонецФункции
С работой функций БСП Вы можете ознакомиться практически в любых типовых конфигурациях.
Не все так хорошо
Да, это решение может помочь в какой-то мере, но рано или поздно все же придется обновлять платформу 1С и отключать совместимость, т.к. предложенное решение имеет существенный недостаток. Это - производительность. Иногда в десятки раз, если обрабатывается большое количество строк.
Также поведение не полностью совпадает с поведением платформенных функций, но все эти ситуации достаточно специфические.
Старый код!
Вы можете вставить эти функции в глобальный общий модуль с контекстом выполнения на клиенте и на сервере, а можно создать отдельный общий модуль и вызывать их оттуда напрямую. Тут уже по обстоятельствам.
А у Вас еще есть такой устаревший код?
Другие ссылки
-
Строковые функции для совместимости с платформой 8.3.5 и ниже
-
6 новых функций, которые не следует использовать в режиме совместимости
Авторские разработки
-
Транслятор запросов 1С в SQL - инструмент для трансляции запросов платформы 1С в SQL, а также их диагностики.
-
Помощник работы с идентификаторами объектов - инструмент для расширенного анализа идентификаторов объектов.
-
Анализ производительности APDEX - отчет для просмотра и анализа замеров производительности в конфигурациях на базе БСП.
-
Путеводитель по истории релизов - отчет по истории выпуска релизов продуктов фирмы "1С" и анализа информации по обновлениям.
-
Просмотр и анализ структуры базы данных (отчет на СКД) - отчет для просмотра и анализа структуры базы данных с поддержкой файловых баз (ограниченный режим), а также баз на SQL Server и PostgreSQL.
-
Просмотр и анализ журнала регистрации (отчет на СКД) - отчет на базе системы компоновки данных (СКД) для просмотра записей журнала регистрации.
-
Обозреватель криптографии - отчет для просмотра доступных провайдеров и сертификатов криптографии на сервере и клиенте.
-
Пакетная выгрузка / загрузка внешних отчетов и обработок - пакетная выгрузка / загрузка внешних отчетов и обработок для массовый манипуляций с ними.
-
Мастер полнотекстового поиска - набор инструментов для работы с полнотекстовым индексом платформы 1С. Стандартные и расширенные возможности.
-
Командный интерпретатор для 1С - инструмент для выполнения команд CMD / PowerShell из 1С.