При разработке и сопровождении конфигураций 1С часто возникает задача импорта данных из внешних текстовых файлов (форматов .txt или .csv) в табличные части документов. Разберем по шагам, как правильно прочитать текстовый файл, разобрать полученные строки на отдельные значения, найти соответствующие элементы в справочнике и корректно заполнить табличную часть документа, избегая распространенных ошибок.
Начинающие разработчики часто сталкиваются со следующими проблемами при написании алгоритма загрузки:
Пустая() у объекта метаданных или менеджера документа вместо проверки конкретной ссылки или реквизита.Номенклатура имеет ссылочный тип (например, СправочникСсылка.Номенклатура), поэтому в него нельзя напрямую записать текстовое наименование — сначала необходимо найти или создать соответствующий элемент справочника.Число() падает с ошибкой, если в текстовой строке с ценой присутствуют пробелы, неразрывные пробелы, буквы или нестандартные разделители дробной части.ТекстовыйДокумент для огромных файлов может приводить к повышенному потреблению оперативной памяти, так как файл считывается целиком.Рассмотрим наиболее производительный и правильный способ чтения данных из файла с помощью объекта ЧтениеТекста. Этот объект считывает файл последовательно строка за строкой, что позволяет экономить память даже при обработке больших массивов данных.
Посмотрим на базовую конструкцию цикла чтения:
ПутьКФайлу = "C:\Users\User\Desktop\Продажи.txt";
Текст = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.ANSI);
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
// Обработка прочитанной строки
Стр = Текст.ПрочитатьСтроку();
КонецЦикла;
Текст.Закрыть();
Важно: Всегда вызывайте метод Текст.Закрыть() после завершения цикла, чтобы освободить дескриптор файла в операционной системе.
Проанализируем процесс извлечения данных из каждой строки. Если данные разделены точкой с запятой (;), в современных версиях платформы 1С:Предприятие 8.3 рекомендуется использовать функцию СтрРазделить, которая сразу возвращает массив подстрок.
Разберем пример кода для модуля обычной формы документа:
ПутьКФайлу = "C:\Users\User\Desktop\Продажи.txt";
Текст = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.ANSI);
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
// Пропускаем пустые строки
Если ПустаяСтрока(СокрЛП(Стр)) Тогда
Стр = Текст.ПрочитатьСтроку();
Продолжить;
КонецЕсли;
ЧастиСтроки = СтрРазделить(Стр, ";", Ложь);
Если ЧастиСтроки.Количество() >= 2 Тогда
ИмяНоменклатуры = СокрЛП(ЧастиСтроки[0]);
ЦенаСтрокой = СокрЛП(ЧастиСтроки[1]);
// Выполняем точный поиск номенклатуры по наименованию
СсылкаНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(ИмяНоменклатуры, Истина);
Если НЕ СсылкаНоменклатура.Пустая() Тогда
// Добавляем строку в табличную часть документа
НоваяСтрока = ПереченьНоменклатуры.Добавить();
НоваяСтрока.Номенклатура = СсылкаНоменклатура;
// Очищаем строку цены от пробелов и корректируем разделитель
ЦенаСтрокой = СтрЗаменить(ЦенаСтрокой, " ", "");
ЦенаСтрокой = СтрЗаменить(ЦенаСтрокой, Символы.НПП, "");
ЦенаСтрокой = СтрЗаменить(ЦенаСтрокой, ",", ".");
// Безопасное преобразование цены
Попытка
НоваяСтрока.Цена = Число(ЦенаСтрокой);
Исключение
НоваяСтрока.Цена = 0;
Сообщить("Ошибка приведения цены для позиции: " + ИмяНоменклатуры);
КонецПопытки;
Иначе
Сообщить("Номенклатура не найдена в базе: " + ИмяНоменклатуры);
КонецЕсли;
КонецЕсли;
Стр = Текст.ПрочитатьСтроку();
КонецЦикла;
Текст.Закрыть();
Выясним важные детали, которые позволят сделать загрузку данных надежной и удобной:
Справочники.Номенклатура.НайтиПоНаименованию(ИмяНоменклатуры, Истина) со вторым параметром Истина предотвращает ошибочное сопоставление похожих позиций (например, поиск позиции «Лук» не вернет «Лук репчатый»).Число() требует соответствия системным региональным настройкам, поэтому замена запятых на точки или использование блока Попытка ... Исключение защищает систему от аварийного завершения.ПереченьНоменклатуры.Добавить()). В управляемых формах обращение выполняется через основной реквизит формы: Объект.ПереченьНоменклатуры.Добавить() на стороне клиента или сервера.ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие), позволяющий пользователю самостоятельно выбрать документ на диске.