31.03.2016 Сергей Семенов 13878
Реализация и использование функции Split в 1С
  При обработке данных довольно частой является задача разбора текстовой строки на отдельные поля по разделителю. В таких языках как 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С - обращайтесь!  
 
 

Сергей Семенов,
     разработчик 1С ООО «Кодерлайн»

 
 

Наши проекты

ООО "АСК ИНЖИНИРИНГ"
ООО "АСК ИНЖИНИРИНГ"

Отрасль:
Машиностроение, приборостроение

Внедренное типовое решение:
1С:Документооборот ПРОФ

Делопроизводство
Учет и хранение документов
Ведение номенклатуры дел
...

Внедрение ПП "1С:Корпоративный инструментальный пакет 8" в ООО «Торговый Дом Факел»
ООО «Торговый Дом Факел»

Отрасль:
Производство

Внедренное типовое решение:
1С:Предприятие 8. ERP Управление предприятием 2

Различная отраслевая специфика:
- Переработка давальческого сырья
- Уче...

ООО «ДАФ Тракс Рус» (DAF Trucks Rus)
ООО «ДАФ Тракс Рус» (DAF Trucks Rus)

Отрасль:
Машиностроение

Внедренное типовое решение:
«1С:Управление корпоративными финансами»

- Осуществлена разработка матрицы прав и ролей для финансового подразделени...

СТС-Медиа
СТС-Медиа

Отрасль:
Медиаиндустрия

Внедренное типовое решение:
1С:Управление холдингом

- Бухгалтерский учет;
- Налоговый учет;
- МСФО (GAAP/управленческий учет);
- ...

ООО "АСТАРМЕДИКА КЛИНИКА МИКРОХИРУРГИИ ГЛАЗА"
ООО "АСТАРМЕДИКА КЛИНИКА МИКРОХИРУРГИИ ГЛАЗА"

Отрасль:
Деятельность больничных организаций

Внедренное типовое решение:
БИТ:Управление медицинским центром 8

- Управление отношениями с клиентами (CRM)
- Делопроизводство
- Ведение но...

Автоматизация складских операций на базе «1С:Предприятие 8. WMS Логистика. Управление складом»
ОАО «Фрейт Линк»

Отрасль:
Логистика и грузоперевозки

Внедренное типовое решение:
1С:Управление холдингом

Реализовали разработку уникального модуля «Интернет-магазины» на базе прог...

МИР ХОББИ
МИР ХОББИ

Отрасль:
Торговля. Интернет магазин

Внедренное типовое решение:
1С:ERP Управление предприятием 2.0

Оформление заказов поставщикам
Взаиморасчеты с покупателями
Оформление...

АО «Вертолетная сервисная компания»
АО «Вертолетная сервисная компания»

Отрасль:
МТО эксплуатации вертолетной техники

Внедренное типовое решение:
1С:Бухгалтерия КОРП

- Консультации по сложным вопросам налогового и бухгалтерского учета;
- Ра...

ООО «Стейдж Энтертейнмент Россия»
ООО «Стейдж Энтертейнмент Россия»

Отрасль:
Театральная деятельность

Внедренное типовое решение:
Платформа 1С:Предприятие 8

Реализован процесс трансформации данных бухгалтерского учета по РСБУ в дан...

ООО "Эскорт-Центр"
ООО "Эскорт-Центр"

Отрасль:
Профессиональные услуги

Внедренное типовое решение:
1С:ERP Управление предприятием 2.0

- Сквозной учет затрат по объектам
- Бухгалтерский учет
- Расчет зарплаты...

Автоматизация торгового учета на базе "1С:Управление торговлей"
ООО «ТЕЛЕВЕС РУСС»

Отрасль:
Торговля

Внедренное типовое решение:
1С:Управление торговлей

- Управление складскими запасами;
- Оформление заказов покупателей;
- Пла...

ООО «ЛукБелОйл»
ООО «ЛукБелОйл»

Отрасль:
Нефтегазовая отрасль

Внедренное типовое решение:

- Обследовании бизнес-процессов «Документооборот», «Казначейство и Бюджети...

Наши соц. сети

Telegram-канал «Koderline 1С» Группа в Вконтакте «Кодерлайн КОРП» Rutube

Остались вопросы - обратитесь к нам!

Впишите свои Имя и Телефон, чтобы мы ответили на все интересующие Вас вопросы.
ФИО*
E-mail*
Телефон*
Сообщение