Не редко возникает необходимость загрузить в справочники или документы 1С данные из текстового файла. Приведенный пример внешней обработки позволит преобразовать текстовый файл с известным разделителем данных в поле табличного документа для последующей обработки уже внутри 1С:Предприятия. Обработка содержит функцию разбора строки на массив данных, настраиваемый разделитель строки текста на "столбцы", процедуру чтения данных из текстового файла.
Разбор строки в массив с использованием функций из конфигурации 1С
Для разложения строки в массив в конфигурация 1С:Бухгалтерия, 1С:Торговля и 1С:УПП имеется замечательная функция - Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт. Функция "расщепляет" строку на подстроки, используя заданный разделитель. Разделитель может иметь любую длину. Если в качестве разделителя задан пробел, рядом стоящие пробелы считаются одним разделителем, а ведущие и хвостовые пробелы параметра "Стр" игнорируются. Подробнее можно прочесть внутри конфигурации - "Общие модули" -> "Общего назначения". Функция возвращает массив значений, элементы которого - подстроки.
Чтение текстового файла (txt) в 1С
Операцию импорта - экспорта текстовых файлов (формат тхт или csv, а также htm, html) очень удобно реализовать при помощи конструкции следующего вида:
1. Функция ПолучитьПотокЧтенияСтрок(Файл) - Назначение: Проверить наличие файла (функция Файл()), Создать текстовый документ (Новый ТекстовыйДокумент()), вызвать метод "Прочитать" для открытия потока чтения файла. Возвращает поток, готовый для чтения.
2. Процедура ЧтениеТХТФайла(Элемент) - Назначение: В цикле произвести последовательное чтение строк файла текстового документа, разбирая на массив колонок данных и добавляя значения массива в табличное поле;
Исходный код 1С функции создания текстового потока чтения файла ТХТ:
В данном примере была произведена загрузка из текстового файла в следующем формате:
Регулярные выражения (Regular Expressions) являются известным и мощным средством для поиска, тестирования и замены подстрок. Эта технология доступна и в 1С - через объект VBScript.RegExp. Нужный объект уже встроен в современные версии Windows (начиная с Windows 98), и устанавливать дополнительно ничего не нужно.
Приведенные ниже примеры были протестированы в 1С:Предприятие 7.7; для 1С:Предприятие 8.x изменяется способ создания объекта:
Кроме того, там уже есть логические константы Истина и Ложь - объявлять их не нужно.
Более подробное описание самой технологии RegExp (что означают те или иные значки или скобочки, или какие шаблоны поиска или замены можно использовать в типичных ситуациях) можно найти в специальной литературе (например Бен Форта "Освой самостоятельно регулярные выражения (regexp) за 10 минут") или на сайтах в сети Internet.
Более продвинутый пример разбора HTML использует подвыражения (SubMatches) и позволяет находить как сами теги, так и текст между ними.
Часто регулярные выражения используются для тестирования строк, например пользовательского ввода.
Этот пример позволяет узнать, является ли строка целым числом.
Регулярные выражения поддерживают не только поиск, но и замену текста. При этом найденные подвыражения (в круглых скобках) могут быть представлены в строке замены как $1, $2 и т. д.
(знак доллара используется в VBScript.RegExp; в других средах программирования, например в JavaScript, используемый для этой цели символ может отличаться).
Задача состояла в том, что нужно было из реквизита документа Сответствие выделить две строки и сделать сортировку по ним. Соответствие счета, такого вида: 779000/004599. Как разбить это значение на два?
У функции ПОДСТРОКА три параметра. В качестве первого указывается исходная строка, из которой требуется выделить часть символов — подстроку. Понятно, что тип значения этого параметра — это Строка. Внимание, это очень важное замечание, если использовать тип первого параметра не строку, функция не будет работать, запрос будет выдавать ошибку! Второй параметр определяет позицию символа в исходной строке, с которого начинается выделение части строки, а третий — это длина выделяемой подстроки. Тип значения для второго и третьего параметров — число.
Перейдём к практике:
Результат этого запроса следующий:
Название СчетЗатрат Отдел Март
Платежное поручение исходящее 00000000319 от 01.03.2010 14:42:54 779000 004599 9 000
Платежное поручение исходящее 00000000320 от 02.03.2010 12:07:34 779000 004599 4 721,6
Платежное поручение исходящее 00000000203 от 01.03.2010 12:28:52 786500 004599 987 614,51
Платежное поручение исходящее 00000000227 от 03.03.2010 14:16:00 786500 004599 400 000
Платежное поручение исходящее 00000000238 от 05.03.2010 12:37:57 732000 004600 5 400
Платежное поручение исходящее 00000000197 от 01.03.2010 11:53:11 732500 004600 12 100
Платежное поручение исходящее 00000000198 от 01.03.2010 11:55:39 732500 004600 12 100
Платежное поручение исходящее 00000000279 от 26.03.2010 0:00:00 734100 004600 19 609
Платежное поручение исходящее 00000000287 от 29.03.2010 14:15:36 734100 004600 55 300
Платежное поручение исходящее 00000000291 от 30.03.2010 11:01:10 734100 004600 18 090
Платежное поручение исходящее 00000000268 от 18.03.2010 10:34:25 738000 004600 10 050
Платежное поручение исходящее 00000000276 от 18.03.2010 12:20:20 750400 004600 13 060,98
Платежное поручение исходящее 00000000281 от 29.03.2010 12:33:46 750400 004600 555 645,41
Платежное поручение исходящее 00000000234 от 04.03.2010 12:21:55 754450 004600 24 120
Платежное поручение исходящее 00000000290 от 30.03.2010 10:44:39 754450 004600 100 000
Платежное поручение исходящее 00000000240 от 09.03.2010 10:53:24 786300 004600 20 800
Платежное поручение исходящее 00000000269 от 18.03.2010 10:58:04 786300 004600 61 012
Платежное поручение исходящее 00000000289 от 30.03.2010 9:27:14 786300 004600 6 000
Платежное поручение исходящее 00000000223 от 03.03.2010 12:13:38 786500 004600 36 000
Платежное поручение исходящее 00000000228 от 04.03.2010 9:52:35 786500 004600 378 138,85
Платежное поручение исходящее 00000000229 от 04.03.2010 9:57:50 786503 004600 126 117,75
Платежное поручение исходящее 00000000200 от 01.03.2010 11:58:06 754422 004762 63 000
Платежное поручение исходящее 00000000286 от 29.03.2010 14:10:18 764422 004762 10 000
Платежное поручение исходящее 00000000267 от 17.03.2010 0:00:00 764423 004762 464 370
Платежное поручение исходящее 00000000261 от 15.03.2010 11:16:28 764522 004762 81 357
Итак, если мы берём строку 779000/004599, то ПОДСТРОКА(Типовой.Регистратор.Соотв.Наименование, 1, 6) будет выделять строку "779000". А ПОДСТРОКА(Типовой.Регистратор.Соотв.Наименование, 8, 11) будет выводить "004599".
В этом же запросе, используется выражение:
В этой же задаче необходимо было добавить новые колонки с названиями месяцев и с суммами по ним. Как раз это выражение решает эту задачу. Если Вам нужно использовать другие месяца, например январь, то заменим выражение:
Приведу пример текста запроса, в котором с помощью цикла формируются поля месяцев (выделено жирным), начиная с марта по февраль.
Данные функции позволяют разложить строку в массив, используя заданный разделитель
Например есть строка: абв$dfd$232$-0oj$5
Выполнив код: НашМассив = РазложитьСтрокуВМассив(абв$dfd$232$-0oj$5, "$") ;
Получим: НашМассив = абв
dfd
232
-0oj
5
Пример с использованием предустановленной библиотеки RegExp, т.е. она есть в любом windows.
Плюсы RegExp:
1. Хорошая скорость анализа, т.к. 1С анализ строк (разбор) обычно реализуется циклами и функциями: Лев, Прав, Сред, Найти, а встроенный язык медленный
2. Высокая читаемость и модифицированность (более предсказуем в случае несоответствия строки - разбору)
3. Дополнительный функционал (можно осуществлять анализ, замену и проверку строковых выражений)
Минусы RegExp:
1. Не все задачи можно решить (например рекурсивные разборы тип 1 + (2+3*(2-7)) в случае если нужно разобрать на выражения в скобках) приходится смешивать с кодом.
2. Возможность зависания при использовании сложных шаблонов(редкость, но бывает).
3. RegExp - это дополнительная библиотека и инициализация занимает значительное время.
Функция разбирает строку на подстроки, используя заданный разделитель. Разделитель может иметь любую длину.
Если в качестве разделителя задан пробел, рядом стоящие пробелы считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр игнорируются.
Например,
РазложитьСтрокуВМассивПодстрок(",ку,,,му", ",") возвратит массив значений из пяти элементов, три из которых - пустые строки, а РазложитьСтрокуВМассивПодстрок(" ку му", " ") возвратит массив значений из двух элементов
Параметры:
Стр - строка, которую необходимо разложить на подстроки.
Разделитель - строка-разделитель, по умолчанию - запятая.
Возвращаемое значение - массив значений, элементы которого - подстроки
глРазложить(Стр,Разделитель)
Параметры:
Стр - строка, которую необходимо разложить на подстроки.
Параметр передается по значению.
Разделитель - строка-разделитель, по умолчанию - запятая.
Возвращаемое значение:
список значений, элементы которого - подстроки
Описание:
Функция "расщепляет" строку на подстроки, используя заданный разделитель.
Разделитель может иметь любую длину.
Если в качестве разделителя задан пробел, рядом стоящие пробелы
считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
игнорируются.
Пример:
глРазложить(",ку,,,му", ",") возвратит список значений из пяти элементов,
три из которых - пустые строки, а
глРазложить(" ку му", " ") возвратит список значений из двух элементов