31.03.2016 Сергей Семенов 13825
Реализация и использование функции 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с-РАРУС МСК

Отрасль:
Разработка компьютерного программного обеспечения

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

- Финансово-бухгалтерский блок
- Казначейство ...

ООО "Смена"
ООО "Смена"

Отрасль:
Торговля, склад, логистика, транспорт

Внедренное типовое решение:
1С:Комплексная автоматизация

Банк и касса
Расчеты с контрагентами
Торговые операции
Взаиморасчеты с...

Внедрение 1С:Управление торговлей в оптово-розничной компании «Много Плитки»
ООО «Много Плитки»

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

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

Закупки (снабжение) и управление отношениями с поставщиками:
- Оформление ...

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

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

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

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

ООО «Мир Аксиомы»
ООО «Мир Аксиомы»

Отрасль:
Аудиторские и консалтинговые услуги

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

- Бухгалтерский учет:
Банк и касса
Завершение периода
Нематериальные ...

Внедрение ПП "1С:Управление небольшой фирмой 8 ПРОФ" в
ИП Любо Виктория Александровна (ООО «Рекреация»)

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

Внедренное типовое решение:
1С:Управление небольшой фирмой 8 ПРОФ

Осуществлены разработки:
– отчета по спецификации Заказа;
– загрузки сп...

ООО «ЛИГА-ТРАНС»
ООО «ЛИГА-ТРАНС»

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

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

- Сделано ТЗ по автоматизации учета МСФО: - Разработана карта бюджета доходо...

ООО «Лаборатория успеха»
ООО «Лаборатория успеха»

Отрасль:
Общественное и плановое питание, гостиничный бизнес, туризм

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

Бухгалтерский учет;
Расчет зарплаты и кадровый учет;...

ООО «Аэроэкспресс»
ООО «Аэроэкспресс»

Отрасль:

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

· Планирование закупок · Управление закупочными процедурами, включая 223 ФЗ ...

АО «Аэроклуб»
АО «Аэроклуб»

Отрасль:
Услуги в области делового туризма

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

Проведение серии интервью с руководством и ключевыми специалистами Разраб...

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

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

Внедренное типовое решение:
«1С:Предприятие 8. WMS Логистика. Управление складом»

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

Группа компаний АО «Киномакс»
Группа компаний АО «Киномакс»

Отрасль:
Культура, шоу-бизнес

Внедренное типовое решение:
БИТ.Финанс

- Разработка Положения о Казначействе группы компаний
- Разработка Положе...

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

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

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

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