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

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке и сопровождении конфигураций 1С часто возникает задача импорта данных из внешних текстовых файлов (форматов .txt или .csv) в табличные части документов. Разберем по шагам, как правильно прочитать текстовый файл, разобрать полученные строки на отдельные значения, найти соответствующие элементы в справочнике и корректно заполнить табличную часть документа, избегая распространенных ошибок.

Типичные ошибки при реализации загрузки

Начинающие разработчики часто сталкиваются со следующими проблемами при написании алгоритма загрузки:

  1. Неправильное обращение к данным документа: попытка вызвать проверку Пустая() у объекта метаданных или менеджера документа вместо проверки конкретной ссылки или реквизита.
  2. Присвоение строки ссылочному реквизиту: реквизит табличной части Номенклатура имеет ссылочный тип (например, СправочникСсылка.Номенклатура), поэтому в него нельзя напрямую записать текстовое наименование — сначала необходимо найти или создать соответствующий элемент справочника.
  3. Ошибки преобразования типов: вызов функции Число() падает с ошибкой, если в текстовой строке с ценой присутствуют пробелы, неразрывные пробелы, буквы или нестандартные разделители дробной части.
  4. Неоптимальное чтение файла: использование объекта ТекстовыйДокумент для огромных файлов может приводить к повышенному потреблению оперативной памяти, так как файл считывается целиком.

Построчное чтение файла через объект ЧтениеТекста

Рассмотрим наиболее производительный и правильный способ чтения данных из файла с помощью объекта ЧтениеТекста. Этот объект считывает файл последовательно строка за строкой, что позволяет экономить память даже при обработке больших массивов данных.

Посмотрим на базовую конструкцию цикла чтения:


ПутьКФайлу = "C:\Users\User\Desktop\Продажи.txt";
Текст = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.ANSI);

Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
    // Обработка прочитанной строки
    Стр = Текст.ПрочитатьСтроку();
КонецЦикла;

Текст.Закрыть();

Важно: Всегда вызывайте метод Текст.Закрыть() после завершения цикла, чтобы освободить дескриптор файла в операционной системе.

Разбор строки и заполнение табличной части

Проанализируем процесс извлечения данных из каждой строки. Если данные разделены точкой с запятой (;), в современных версиях платформы 1С:Предприятие 8.3 рекомендуется использовать функцию СтрРазделить, которая сразу возвращает массив подстрок.

Разберем пример кода для модуля обычной формы документа:


ПутьКФайлу = "C:\Users\User\Desktop\Продажи.txt";
Текст = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.ANSI);

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

Текст.Закрыть();

Особенности работы и рекомендации

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

  1. Точный поиск по наименованию: Метод Справочники.Номенклатура.НайтиПоНаименованию(ИмяНоменклатуры, Истина) со вторым параметром Истина предотвращает ошибочное сопоставление похожих позиций (например, поиск позиции «Лук» не вернет «Лук репчатый»).
  2. Обработка разделителей дробной части: В текстовых файлах дробная часть может быть разделена как точкой, так и запятой. Стандартная функция Число() требует соответствия системным региональным настройкам, поэтому замена запятых на точки или использование блока Попытка ... Исключение защищает систему от аварийного завершения.
  3. Контекст выполнения в формах: В обычных формах обращение к табличной части происходит напрямую по ее имени (например, ПереченьНоменклатуры.Добавить()). В управляемых формах обращение выполняется через основной реквизит формы: Объект.ПереченьНоменклатуры.Добавить() на стороне клиента или сервера.
  4. Интерактивный выбор файла: Чтобы не прописывать путь к файлу жестко в коде программы, используйте объект ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие), позволяющий пользователю самостоятельно выбрать документ на диске.
← На главную