При обработке данных довольно частой является задача разбора текстовой строки на отдельные поля по разделителю. В таких языках как Java, VBA, PascalABC для этого существует специальная функция Split(Строка, Разделитель). В 1С такой функции нет, хотя было бы полезно для единообразия с упомянутыми языками такую функцию использовать, тем более что набор функций для работы со строками в этих языках, включая 1С, практически совпадает. В 1С еще нет функции Reverse, но на практике она в общем-то не нужна (в учебных задачах по программированию используется довольно часто). | ||
Код для функции Split может быть, например, таким: | ||
Функция Split(Стр, Разделитель) Экспорт
м=Новый Массив; с=СтрЗаменить(СокрЛП(Стр), Разделитель, Символы.ПС); Для к=1 По СтрЧислоСтрок(с) Цикл Слово= СокрЛП(СтрПолучитьСтроку(с,к)); //Заодно // убрать лишние пробелы Если СтрДлина(Слово)>0 Тогда //См. примечание м.Добавить(Слово); КонецЕсли; КонецЦикла; Возврат м; КонецФункции |
||
Примечание: Эта проверка не нужна, если пустые строки тоже нужно возвращать. Например, такая ситуация может быть при преобразовании данных Excel в текстовый формат (это может понадобиться в том случае, когда на клиенте не установлен Microsoft office, например, при удаленном доступе по RDP). Отметим, что в этом случае в качестве разделителя используется значение Символы.Таб. Напомним, что сохранение книги Excel программным способом на VBA может быть выполнено, например, следующим образом | ||
ActiveWorkbook.SaveAs Filename:=ИмяФайла,
FileFormat:=xlText, CreateBackup:=False |
||
Наиболее частым примером использования функции Split может служить разбор даты. | ||
М = Split(СтрокаДаты, «.»);
Попытка Дат = ДАТА(Число(М[2]), Число(М[1]), Число(М[0])); Исключение Дат = ДАТА (1, 1, 1); КонецПопытки; |
||
На практике полезно иметь не одну, а несколько функций Split, в зависимости от задач. Например, для задач типа выделения из строки фамилии, имени и отчества, разделенных одним или несколькими пробелами, можно написать функцию SplitB с пробелом в качестве разделителя. Для этой задачи подойдет функция, код которой приведен выше (только в этом случае не требуется убирать лишние пробелы – они и так будут удалены). Тогда код функции может быть следующим: | ||
Функция SplitB(Стр) Экспорт
м=Новый Массив; с=СтрЗаменить(СокрЛП(Стр), « », Символы.ПС); Для к=1 По СтрЧислоСтрок(с) Цикл Слово= СтрПолучитьСтроку(с,к); Если СтрДлина(Слово)>0 Тогда м.Добавить(Слово); КонецЕсли; КонецЦикла; Возврат м; КонецФункции |
||
Нужно сказать, что в языке Java возвращаемый массив будет содержать пустые строки, если в исходной строке подряд встречаются несколько пробелов. Поэтому наличие собственной функции позволяет более гибко настраивать разбор строки на поля. | ||
Еще один вариант функции Split может потребоваться для выделения полей из строки и преобразования их в числовые значения. Вот код соответствующей функции: | ||
Функция SplitN(Стр, Разделитель) Экспорт
м=Новый Массив; с=СтрЗаменить(СокрЛП(Стр), Разделитель, Символы.ПС); Для к=1 По СтрЧислоСтрок(с) Цикл Слово= СокрЛП(СтрПолучитьСтроку(с,к)); //Заодно // убрать лишние пробелы Если СтрДлина(Слово)>0 Тогда
Если ТипЗнч(Слово) = Тип(«Число») Тогда
КонецЕсли; КонецФункции |
||
Интересным вариантом применения функции SplitN является следующий: допустим, требуется задать начальные значения массива М. Обычно для этого нужно написать, например, |
М = Новый Массив(N);
М[0] = 1; М[1] = 7; . . . . . М[N – 1] = 55; |
||
С помощью функции SplitN это можно сделать следующим образом: | ||
С = «1,7,. . . . .,55»;
М = SplitN(С, «,»); |
||
Такой вариант задания начальных значений более компактен и напоминает способы, применяемые в упомянутых выше языках, когда начальные значения просто перечисляются через запятую. | ||
В примере по заполнению даты мы использовали функцию ДАТА. Заодно покажем способ определения названия месяца по его номеру. Задача не новая, но использование функции ДАТА делает его более компактным и наглядным: | ||
НазваниеМесяца = формат(ДАТА(2, НомерМесяца, 1), «ДФ=MMMM»);
|
Год (или день) должен быть отличным от 1, иначе для января получится пустая дата и название месяца будет пустым. Если есть вопросы по реализации и использованию функции Split в 1С - обращайтесь! |
||
Сергей Семенов, |