Как правильно разбить текстовый файл на колонки для последующей записи в регистр 1С

Программист 1С v8.3 (Управляемые формы)
← На главную

При импорте данных из текстовых файлов (TXT) программисты часто сталкиваются с проблемой «грязных» разделителей. Типичная ситуация: в файле колонки разделены произвольным количеством пробелов или знаков табуляции. Если использовать обычный пробел как единственный разделитель, то длинные названия (например, наименования отделов или ФИО) разбиваются на несколько колонок, что портит структуру данных. Если же выбрать фиксированную строку из нескольких пробелов, возникают пустые элементы массива.

В этой статье мы подробно разберем, как эффективно обработать такие файлы, превратить их в структурированные данные и подготовить для записи в Регистр сведений.

Метод 1: Использование встроенной функции СтрРазделить

Начиная с версии платформы 8.3.6, в 1С появилась мощная встроенная функция СтрРазделить. Это наиболее быстрый и предпочтительный способ обработки строк. Главная особенность этой функции заключается в третьем параметре, который позволяет автоматически удалять пустые значения из результата.

Проанализируем пример кода, который решает проблему лишних пробелов:


// Предположим, СтрокаИзФайла содержит: "Викторовна    0678    Группа планирования"
Разделитель = " "; // Используем один пробел
МассивКолонок = СтрРазделить(СтрокаИзФайла, Разделитель, Ложь); 

Обратите внимание на параметр Ложь (в контексте ВключатьПустые). Если в строке идет пять пробелов подряд, функция воспримет их как пять разделителей, но благодаря этому параметру она не создаст пустые элементы в массиве. На выходе мы получим только значимые данные.

Важный нюанс: Если название отдела внутри содержит один пробел (например, "Отдел продаж"), а между колонками стоит два и более пробела, то в качестве разделителя в функции СтрРазделить следует указать строку из двух пробелов или использовать предварительную замену.

Метод 2: Использование стандартных функций БСП

Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), вы можете воспользоваться методами общих модулей. Это удобно, так как такие функции часто содержат дополнительные проверки на корректность данных.

Рассмотрим вариант реализации, который в итоге выбрал автор темы:


ТекстовыйДок = Новый ТекстовыйДокумент();
ТекстовыйДок.Прочитать(ПутьКФайлу);
КоличествоСтрок = ТекстовыйДок.КоличествоСтрок();

Для Сч = 1 по КоличествоСтрок Цикл
    СтрокаИзФайла = ТекстовыйДок.ПолучитьСтроку(Сч);
    
    // Используем функцию из общего модуля БСП
    // Параметр Истина в конце отвечает за пропуск пустых строк
    МассивЗначений = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаИзФайла, "  ", Истина);
    
    // Теперь МассивЗначений содержит чистые данные по колонкам
    Если МассивЗначений.Количество() >= 4 Тогда
        ФИО = СокрЛП(МассивЗначений[0]);
        Код = СокрЛП(МассивЗначений[1]);
        Отдел = СокрЛП(МассивЗначений[2]);
        Должность = СокрЛП(МассивЗначений[3]);
        
        // Здесь можно выполнять запись в регистр
    КонецЕсли;
КонецЦикла;

Метод 3: Разбор строки по фиксированной ширине

Иногда текстовые файлы формируются старыми системами, где данные выровнены по колонкам. В этом случае количество пробелов между словами может быть разным, но каждая колонка всегда начинается с определенной позиции (символа).

Если вы заметили, что ФИО всегда занимает первые 30 символов, код — следующие 10, а отдел начинается с 41-го символа, то использование разделителей — не лучший вариант. Выясним, как использовать функцию Сред для этих целей:


ФИО = СокрЛП(Сред(СтрокаИзФайла, 1, 30));
Код = СокрЛП(Сред(СтрокаИзФайла, 31, 10));
Отдел = СокрЛП(Сред(СтрокаИзФайла, 41, 50));

Этот метод является самым надежным, если внутри названий отделов могут встречаться двойные пробелы, которые ошибочно принимаются парсером за разделители колонок.

Метод 4: Регулярные выражения (RegExp) для сложной разрядки

Если пробелы и табуляции перемешаны хаотично, на помощь приходят регулярные выражения. В 1С это реализуется через COM-объект VBScript.RegExp. Мы можем заменить любое количество подряд идущих пробельных символов на один стандартный разделитель (например, точку с запятой), а затем легко разбить строку.


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.MultiLine = Истина;
RegExp.Global = Истина;
RegExp.Pattern = "\s{2,}"; // Ищем 2 и более пробельных символа подряд

ЧистаяСтрока = RegExp.Replace(СтрокаИзФайла, ";");
МассивКолонок = СтрРазделить(ЧистаяСтрока, ";");

Шаблон \s{2,} найдет все места, где стоит больше одного пробела или знака табуляции, и заменит их на один символ ;, что позволит идеально разделить данные даже в самом «кривом» файле.

Важные рекомендации по оптимизации и очистке данных

При работе с внешними текстовыми файлами крайне важно учитывать следующие моменты:

  1. Проблема неразрывных пробелов: Часто в файлах вместо обычного пробела (код 32) встречается неразрывный пробел (код 160). Функции поиска могут его не увидеть. Перед началом обработки рекомендуем выполнить замену: Строка = СтрЗаменить(Строка, Символы.НПП, " ");.
  2. Очистка значений: Всегда используйте функцию СокрЛП() для каждого полученного значения. Это удалит случайные невидимые символы по краям, которые могут помешать поиску в базе или создать дубли в регистре.
  3. Выбор объекта чтения: Если ваш файл весит более 10-20 Мб, использование объекта ТекстовыйДокумент может замедлить систему, так как он загружает файл в память целиком. В таких случаях используйте объект ЧтениеТекста, который позволяет читать файл построчно:
    
    ФайлЧтения = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.ANSI);
    СтрокаИзФайла = ФайлЧтения.ПрочитатьСтроку();
    Пока СтрокаИзФайла <> Неопределено Цикл
        // Обработка...
        СтрокаИзФайла = ФайлЧтения.ПрочитатьСтроку();
    КонецЦикла;
    
  4. Кодировка: Если вместо кириллицы вы видите непонятные символы, проверьте кодировку файла. Чаще всего это либо ANSI (Windows-1251), либо UTF-8. Указывайте ее явно при открытии файла.

Проанализировав ситуацию, мы видим, что наиболее универсальным и простым решением для платформы 1С 8.3 является использование СтрРазделить с отключенным флагом включения пустых строк. Это позволяет быстро получить массив данных и приступить к заполнению Регистра сведений.

← На главную