Как обрезать строку в 1с
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Нажмите одну из кнопок, чтобы поделиться:
1С — обрезать строку после символа программно, пример
В функцию передаются параметры — текстовая строка и разделитель. Функция возвращает 2 значения: текст до разделителя и оставшуюся часть строки, после разделителя.
Функция ПолучитьСтрокуДоИПослеСимвола(Строка, СимволРазделитель) //строка - текстовая строка //в качестве символа разделителя могут быть символы "/", "." и т.д. ПозицияСимвола = Найти(Строка, СимволРазделитель); СтрокаДоСимволаРазделителя = Лев(Строка, ПозицияСимвола - 1); СтрокаПослеСимволаРазделителя = Сред(Строка, ПозицияСимвола + 1, СтрДлина(Строка)); //запишем результат в структуру Структура = Новый Структура("СтрокаДоРазделителя, СтрокаПослеРазделителя"); Структура.Вставить("СтрокаДоРазделителя", СтрокаДоСимволаРазделителя); Структура.Вставить("СтрокаПослеРазделителя", СтрокаПослеСимволаРазделителя); Сообщить(Структура.СтрокаДоРазделителя); Сообщить(Структура.СтрокаПослеРазделителя); //вернем результат разбиения Возврат Структура; КонецФункции
support 2019-07-13T09:57:18+03:00 Встроенный язык 1С, Программисту |
Как в 1с удалить часть строки используя типовые методы
Рассмотрим на примерах, способы в 1с удалить часть строки. Не смотря на то, что задача кажется простой, есть довольно много вариантов ее постановки и решения. Подробнее о строковых функциях можно прочитать в статье: Строки в 1С 8.3 — строковые функции.
Удаление известной части строки
Есть строка, из которой необходимо удалить все вхождения известной вам подстроки. Для решения необходимо использовать функцию СтрЗаменить.
Пример 1. Из строки «1С:Бухгалтерия 8» удалить подстроку «:Бухгалтерия».
Строка = "1С:Бухгалтерия 8"; Подстрока = ":Бухгалтерия"; НоваяСтрока = СтрЗаменить(Строка, Подстрока, "");
Заменяем «:Бухгалтерия» на пустую строку, и получаем: «1С 8».
Удаление по позиции подстроки
Есть строка, в которой вам известны номер начального и конечного символа подстроки, которую необходимо удалить. Для решения также подойдет функция СтрЗаменить. Но сначала необходимо получить удаляемую подстроку функцией Сред.
Пример 2. Из строки «Обучение программированию на языке 1С» удалить подстроку, которая начинается с девятого символа и заканчивается тридцать пятым.
Строка = "Обучение программированию на языке 1С"; НачальныйНомер = 9; КонечныйНомер = 35; ЧислоСимволов = КонечныйНомер - НачальныйНомер; Подстрока = Сред(Строка, НачальныйНомер, ЧислоСимволов); НоваяСтрока = СтрЗаменить(Строка, Подстрока, "");
Получаем подстроку по номерам символов и заменяем ее на пустую. Получаем: «Обучение 1С».
Удаление начала строки
Есть строка, в которой необходимо удалить ее левую часть. Известно, что новая строка должна начинаться с определенной фразы. Для такого случая можно использовать функцию Прав.
Пример 3. Из строки «Как в 1с удалить символы», необходимо удалить первые символы до фразы «1с».
Строка = "Как в 1с удалить символы"; НачалоСтроки = "1с"; КоличествоУдаляемыхСимволов = СтрНайти(Строка, НачалоСтроки) - 1; ДлинаСтроки = СтрДлина(Строка) - КоличествоУдаляемыхСимволов; НоваяСтрока = Прав(Строка, ДлинаСтроки);
Вычисляем количество нужных символов справа и получаем новую строку: «1с удалить символы».
Удаление окончания строки
Есть строка, в которой необходимо удалить ее правую часть. Известно, что новая строка должна заканчиваться на определенную фразу. Для такого случая можно использовать функцию Лев.
Пример 4. Удалить из строки «Как в 1с удалить часть строки, используя типовые методы» все символы, после фразы » строки».
Строка = "Как в 1с удалить часть строки, используя типовые методы"; СтрокаПоиска = " строки"; ДлинаСтрокиПоиска = СтрДлина(СтрокаПоиска); ПозицияСтрокиПоиска = СтрНайти(Строка, СтрокаПоиска); ДлинаСтроки = ПозицияСтрокиПоиска + ДлинаСтрокиПоиска - 1; НоваяСтрока = Лев(Строка, ДлинаСтроки);
Вычисляем количество нужных символов слева и получаем новую строку: «Как в 1с удалить часть строки».
Удаление одного из вхождений подстроки
В исходной строке некоторая фраза встречается несколько раз. Необходимо удалить только одно ее вхождение по условию. Для решения необходимо:
- Определить номера начального и конечного символа нужного вхождения подстроки, при помощи функции СтрНайти;
- После чего можно «склеить» новую строку функциями Лев и Прав, исключив найденное вхождение.
Обратите внимание на третий и пятый параметры СтрНайти. С их помощью можно осуществлять сложный поиск, указывая направление и номер вхождения подстроки.
СтрНайти(, , , , )
Пример 5. Из строки «1С 8.3 Предприятие 8.3. Обучение на примерах», удалить последнее вхождение подстроки » 8.3″.
Строка = "1С 8.3 Предприятие 8.3. Обучение на примерах"; ДлинаСтроки = СтрДлина(Строка); Подстрока = " 8.3"; НачальныйНомер = СтрНайти(Строка, Подстрока, НаправлениеПоиска.СКонца); ЧислоСимволов = СтрДлина(Подстрока); ДлинаЛевойЧасти = НачальныйНомер - 1; ДлинаПравойЧасти = ДлинаСтроки - ДлинаЛевойЧасти - ЧислоСимволов; НоваяСтрока = Лев(Строка, ДлинаЛевойЧасти) + Прав(Строка, ДлинаПравойЧасти);
Вычисляем позиции левой и правой части строки, после чего «склеиваем». Получается новая строка: «1С 8.3 Предприятие. Обучение на примерах».
Удаление повторяющихся символов
В строке необходимо удалить идущие подряд символы, оставив только первый. Для решения такой задачи необходимо:
- Собрать массив всех вхождений символа;
- Обходить строку и определять, подходит ли текущий символ для новой строки.
Пример 6. Удалить из строки идущие подряд пробелы, оставив только первый в цепочке.
Строка = "Удалить пробелы идущие подряд, кроме первого"; ДлинаСтроки = СтрДлина(Строка); Пробел = " "; МассивУдаления = Новый Массив; НомерВхождения = 1; НомерСимвола = СтрНайти(Строка, Пробел. НомерВхождения); Пока Не НомерСимвола = 0 Цикл МассивУдаления.Добавить(НомерСимвола); НомерВхождения = НомерВхождения + 1; НомерСимвола = СтрНайти(Строка, Пробел. НомерВхождения); КонецЦикла; НоваяСтрока = ""; НомерПредыдущегоПробела = -1; Для НомерСимвола = 1 По ДлинаСтроки Цикл ЭлементМассива = МассивУдаления.Найти(НомерСимвола); ЭтоПробел = Не ЭлементМассива = Неопределено; Если ЭтоПробел Тогда Если НомерПредыдущегоПробела = НомерСимвола - 1 Тогда НомерПредыдущегоПробела = НомерСимвола; Продолжить; КонецЕсли; НомерПредыдущегоПробела = НомерСимвола; КонецЕсли; НоваяСтрока = НоваяСтрока + Сред(Строка, НомерСимвола, 1); КонецЦикла;
После удаления лишних пробелов получаем строку: «Удалить пробелы идущие подряд, кроме первого».
Особенность выполнения функции ПОДСТРОКА() языка запросов
Раздел содержит описание особенности выполнения функции ПОДСТРОКА() языка запросов в клиент-серверном варианте работы и вытекающие из нее рекомендации по построению запросов.
Функция ПОДСТРОКА()
В языке запросов 1С:Предприятия функция ПОДСТРОКА() в формате ПОДСТРОКА(, , ) может применяться к данным строкового типа и позволяет выделить фрагмент , начинающийся с символа номер (символы в строке нумеруются с 1) и длиной символов. Результат вычисления функции ПОДСТРОКА() имеет строковый тип переменной длины, причем длина будет считаться неограниченной, если имеет неограниченную длину и параметр не является константой или превышает 1024.
Вычисление функции ПОДСТРОКА() на SQL сервере
В клиент-серверном варианте работы функция ПОДСТРОКА() реализуется при помощи функции SUBSTRING() соответствующего оператора SQL, передаваемого серверу баз данных SQL Server, который вычисляет тип результата функции SUBSTRING() по сложным правилам в зависимости от типа и значений ее параметров, а так же в зависимости от контекста, в котором она используется.
В большинстве случаев эти правила не оказывают влияния на выполнение запроса 1С:Предприятия, однако есть случаи, когда для исполнения запроса существенна максимальная длина строки результата, вычисленная SQL Server. Важно иметь в виду, что в некоторых контекстах использования функции ПОДСТРОКА() максимальная длина ее результата может оказаться равной максимальной длине строки ограниченной длины, которая в SQL Server равна 4000 символам. Это может привести к неожиданному аварийному завершению выполнения запроса.
ВЫБРАТЬ
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление,
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление1
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
УПОРЯДОЧИТЬ ПО
Представление,
Представление1
завершается аварийно с сообщением:
Ошибка СУБД:
Microsoft OLE DB Provider for SQL Server: Warning: The query processor could not produce a query plan from the optimizer because the total length of all the columns in the GROUP BY or ORDER BY clause exceeds 8000 bytes.
HRESULT=80040E14, SQLSTATE=42000, native=8618
Это происходит потому, что вычисленная Microsoft SQL Server максимальная длина строки, которая является результатом выражения:
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление,
равна 4000 символов. Поэтому длина записи, состоящей из двух таких полей превышает 8000 байт, разрешенные для выполнения операции сортировки.
В связи с описанной особенностью исполнения функции SUBSTRING() на SQL Server использование функции ПОДСТРОКА() с целью приведения строк неограниченной длины к строкам ограниченной длины не рекомендуется. Вместо нее лучше использовать операцию приведения типа ВЫРАЗИТЬ() . В частности, приведенный пример можно переписать в виде:
ВЫБРАТЬ
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ВЫРАЗИТЬ(Представление КАК Строка(200))
ИНАЧЕ NULL
КОНЕЦ КАК Представление,
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ВЫРАЗИТЬ(Представление КАК Строка(200))
ИНАЧЕ NULL
КОНЕЦ КАК Представление1
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
УПОРЯДОЧИТЬ ПО
Представление,
Представление1