Не редко возникает необходимость загрузить в справочники или документы 1С данные из текстового файла. Приведенный пример внешней обработки позволит преобразовать текстовый файл с известным разделителем данных в поле табличного документа для последующей обработки уже внутри 1С:Предприятия. Обработка содержит функцию разбора строки на массив данных, настраиваемый разделитель строки текста на "столбцы", процедуру чтения данных из текстового файла.
Разбор строки в массив с использованием функций из конфигурации 1С
Для разложения строки в массив в конфигурация 1С:Бухгалтерия, 1С:Торговля и 1С:УПП имеется замечательная функция - Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт. Функция "расщепляет" строку на подстроки, используя заданный разделитель. Разделитель может иметь любую длину. Если в качестве разделителя задан пробел, рядом стоящие пробелы считаются одним разделителем, а ведущие и хвостовые пробелы параметра "Стр" игнорируются. Подробнее можно прочесть внутри конфигурации - "Общие модули" -> "Общего назначения". Функция возвращает массив значений, элементы которого - подстроки.
Чтение текстового файла (txt) в 1С
Операцию импорта - экспорта текстовых файлов (формат тхт или csv, а также htm, html) очень удобно реализовать при помощи конструкции следующего вида:
1. Функция ПолучитьПотокЧтенияСтрок(Файл) - Назначение: Проверить наличие файла (функция Файл()), Создать текстовый документ (Новый ТекстовыйДокумент()), вызвать метод "Прочитать" для открытия потока чтения файла. Возвращает поток, готовый для чтения.
2. Процедура ЧтениеТХТФайла(Элемент) - Назначение: В цикле произвести последовательное чтение строк файла текстового документа, разбирая на массив колонок данных и добавляя значения массива в табличное поле;
Исходный код 1С функции создания текстового потока чтения файла ТХТ:
Код 1C v 8.х Функция ПолучитьПотокЧтенияСтрок(Файл)
Попытка
ТекстовыйФайл = Новый Файл( Файл) ;
Если ТекстовыйФайл. Существует( ) = Ложь Тогда
Сообщить( "Файла " + Файл+ " не существует!" ) ;
Возврат Неопределено ;
КонецЕсли ;
ПотокЧтенияСтрок = Новый ТекстовыйДокумент( ) ;
ПотокЧтенияСтрок. Прочитать( ТекстовыйФайл) ;
Исключение
Сообщить( "Файл не прочитан." , СтатусСообщения. Внимание) ;
Сообщить( ОписаниеОшибки( ) ) ;
Возврат Неопределено ;
КонецПопытки ;
Возврат ПотокЧтенияСтрок;
КонецФункции
Процедура ЧтениеТХТФайла(Элемент)
Если ПустаяСтрока( ИмяФайла) Тогда
Предупреждение( "Для запуска обработки необходимо предварительно выбрать файл данных." ) ;
Возврат ;
КонецЕсли ;
ПотокСтрок = ПолучитьПотокЧтенияСтрок( ИмяФайла) ;
ТаблицаДокумента. Очистить( ) ;
ТаблицаДокумента. Колонки. Очистить( ) ;
ТаблицаДокумента. Колонки. Добавить( "Номер" , , "Номер" , 5 ) ;
ТаблицаДокумента. Колонки. Добавить( "Артикул" , , "Артикул" , 11 ) ;
ТаблицаДокумента. Колонки. Добавить( "Номенклатура" , , "Номенклатура" , 25 ) ;
ТаблицаДокумента. Колонки. Добавить( "Цена" , , "Цена" , 6 ) ;
КоличествоСтрок = ПотокСтрок. КоличествоСтрок( ) ;
Для Строка = 1 По КоличествоСтрок Цикл
ОбработкаПрерыванияПользователя( ) ;
СтрокаИзФайла = ПотокСтрок. ПолучитьСтроку( Строка) ;
МассивСтрок = ОбщегоНазначения. РазложитьСтрокуВМассивПодстрок( СтрокаИзФайла, "|" ) ;
Стр= ТаблицаДокумента. Добавить( ) ;
Стр. Номер = Строка;
Стр. Артикул = МассивСтрок[0 ];
Стр. Номенклатура = МассивСтрок[1 ];
Стр. Цена = МассивСтрок[2 ];
Состояние( "Обработка строки файла : "
+ "строка " + Строка + " из " + КоличествоСтрок) ;
КонецЦикла ;
ЭлементыФормы. ТаблицаДокумента. Значение = ТаблицаДокумента;
ЭлементыФормы. ТаблицаДокумента. СоздатьКолонки( ) ;
КонецПроцедуры
В данном примере была произведена загрузка из текстового файла в следующем формате:
Код 7754|Процессор Atom 1.7|10,00
5054|Процессор AMD x64|8,99
7546|Мышь Microsoft|45,88
Код 1C v 8.2 УП
Процедура ПроверимДублиСтрок(ДокументСсылка,ИмяТабЧасти,ПроверяемыеРеквизиты,Отказ)
ТаблицаДокумента = ДокументСсылка[ИмяТабЧасти]. Выгрузить( ) ;
ТаблицаДокумента. Колонки. Добавить( "КвоПроверкаДублей" ) ;
ТаблицаДокумента. ЗаполнитьЗначения( 1 , "КвоПроверкаДублей" ) ;
ТаблицаДокумента. Свернуть( ПроверяемыеРеквизиты, "КвоПроверкаДублей" ) ;
Для Каждого ТекущаяСтрока Из ТаблицаДокумента Цикл
Если ТекущаяСтрока. КвоПроверкаДублей > 1 Тогда
РеквизитыДляСообщения = "" ;
Стр = СокрЛП( ПроверяемыеРеквизиты) ;
Пока Найти( Стр, "," ) > 0 Цикл
НаимРеквизита = СокрЛП( Лев( Стр, Найти( Стр, "," ) - 1 ) ) ;
Стр = Прав( Стр, СтрДлина( Стр) - Найти( Стр, "," ) ) ;
РеквизитыДляСообщения = РеквизитыДляСообщения+ ТекущаяСтрока[НаимРеквизита]+ ", " ;
КонецЦикла ;
РеквизитыДляСообщения = РеквизитыДляСообщения+ ТекущаяСтрока[СокрЛП( Стр) ];
Сообщить( "Информация " + РеквизитыДляСообщения+ " введена несколько раз в табличную часть, проведение невозможно!" ) ;
Отказ = Истина ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Пример обращения к процедуре проверки
Код 1C v 8.2 УП
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если Запасы. Количество( ) = 0 Тогда
Возврат ;
КонецЕсли ;
ПроверимДублиСтрок( Ссылка, "Запасы" , "Номенклатура, АлгоритмФормированияШК,Регион" , Отказ) ;
КонецПроцедуры
Да, в списке реквизитов добавленные случайно пробелы игнорируются
Процедуру можно добавить в общий модуль и обращаться к ней из любого документа
Экспорт
Процедура ОсновныеДействияФормыЭкспорт(Кнопка) - выгружает из указанного справочника данные в режиме экспорта в файл в формате Microsoft Excel с указанным именем, используя преобразование данных к типу число и типу строка;
Код 1C v 8.х Процедура ОсновныеДействияФормыЭкспорт (Кнопка)
Попытка
Попытка
Состояние( "Выгрузка данных из 1С в Microsoft Excel..." ) ;
ExcelПриложение = Новый COMОбъект( "Excel.Application" ) ;
Исключение
Сообщить( "Ошибка при запуске Microsoft Excel."
+ Символы. ПС + ОписаниеОшибки( ) , СтатусСообщения. Внимание) ;
Возврат ;
КонецПопытки ;
Книга = ExcelПриложение. WorkBooks. Add( ) ;
Лист = Книга. WorkSheets( 1 ) ;
Колонка = 1 ;
Для каждого стр из ТП цикл
Если стр. Выгружать Тогда
Лист. Cells( 1 , Колонка) . Value = стр. НазваниеРеквизита;
Колонка = Колонка + 1 ;
КонецЕсли ;
КонецЦикла ;
выборка = Справочники[ИмяСправочника]. Выбрать( ) ;
СтрокаЛиста = 2 ;
Пока выборка. Следующий( ) Цикл
Колонка = 1 ;
Для каждого стр из ТП цикл
Если стр. Выгружать Тогда
Попытка
Если ТипЗнч( выборка[стр. НазваниеРеквизита]) = Тип( "Число" ) Тогда
Лист. Cells( СтрокаЛиста, Колонка) . NumberFormat = "0,00" ;
Лист. Cells( СтрокаЛиста, Колонка) . Value =
Формат( выборка[стр. НазваниеРеквизита], "ЧГ=0" ) ;
иначе
Лист. Cells( СтрокаЛиста, Колонка) . NumberFormat = "@" ;
Лист. Cells( СтрокаЛиста, Колонка) . Value =
Строка( выборка[стр. НазваниеРеквизита]) ;
КонецЕсли ;
исключение
Сообщить( "Ошибка установки значения для: " +
выборка[стр. НазваниеРеквизита]) ;
Сообщить( "Стр: " + СтрокаЛиста+ " Кол: " +
Колонка+ " Рек: " + стр. НазваниеРеквизита) ;
КонецПопытки ;
Колонка = Колонка + 1 ;
КонецЕсли ;
КонецЦикла ;
СтрокаЛиста = СтрокаЛиста + 1 ;
Состояние( "Экспорт из 1С в Excel " + СтрокаЛиста) ;
КонецЦикла ;
Книга. SaveAs( имяФайла) ;
ExcelПриложение. Quit( ) ;
Сообщить( "Файл выгружен успешно: " + имяФайла ) ;
Исключение
Сообщить( "Ошибка записи данных файла :" + имяФайла) ;
Сообщить( ОписаниеОшибки( ) ) ;
Попытка
ExcelПриложение. Quit( ) ;
Исключение
КонецПопытки ;
КонецПопытки ;
КонецПроцедуры
Импорт
Исходный код процедуры 1С для загрузки XLS файла:
Код 1C v 8.х Процедура ЧтениеXLSФайла(Элемент)
Если ПустаяСтрока( ИмяФайла) Тогда
Предупреждение( "Для запуска обработки необходимо предварительно выбрать файл Microsoft Excel." ) ;
Возврат ;
КонецЕсли ;
Попытка
Состояние( "Загрузка Microsoft Excel..." ) ;
ExcelПриложение = Новый COMОбъект( "Excel.Application" ) ;
Исключение
Сообщить( "Ошибка при загрузке Microsoft Excel." + Символы. ПС + ОписаниеОшибки( ) , СтатусСообщения. Внимание) ;
Возврат ;
КонецПопытки ;
Попытка
Состояние( "Открытие файла Microsoft Excel..." ) ;
ExcelФайл = ExcelПриложение. WorkBooks. Open( ИмяФайла) ;
Исключение
Сообщить( "Ошибка открытия файла Microsoft Excel." + ИмяФайла + Символы. ПС + ОписаниеОшибки( ) , СтатусСообщения. Внимание) ;
КонецПопытки ;
Попытка
Состояние( "Обработка файла Microsoft Excel..." ) ;
ExcelЛист = ExcelФайл. Sheets( 1 ) ;
xlCellTypeLastCell = 11 ;
ExcelПоследняяСтрока = ExcelЛист. Cells. SpecialCells( xlCellTypeLastCell) . Row;
ExcelПоследняяКолонка = ExcelЛист. Cells. SpecialCells( xlCellTypeLastCell) . Column;
Исключение
Сообщить( "Ошибка открытия листа №1 Microsoft Excel." + Символы. ПС + ОписаниеОшибки( ) , СтатусСообщения. Внимание) ;
ExcelПриложение. Quit( ) ;
КонецПопытки ;
КЧ = Новый КвалификаторыЧисла( 15 , 2 ) ;
КС = Новый КвалификаторыСтроки( 50 ) ;
Массив = Новый Массив;
Массив. Добавить( Тип( "Строка" ) ) ;
ОписаниеТиповС = Новый ОписаниеТипов( Массив, , КС) ;
Массив. Очистить( ) ;
Массив. Добавить( Тип( "Число" ) ) ;
ОписаниеТиповЧ = Новый ОписаниеТипов( Массив, , , КЧ) ;
ТаблицаДокумента. Очистить( ) ;
ТаблицаДокумента. Колонки. Очистить( ) ;
ТаблицаДокумента. Колонки. Добавить( "Номер" , ОписаниеТиповС, "Номер" , 5 ) ;
ТаблицаДокумента. Колонки. Добавить( "Артикул" , ОписаниеТиповС, "Артикул" , 11 ) ;
ТаблицаДокумента. Колонки. Добавить( "Описание" , ОписаниеТиповС, "Описание" , 25 ) ;
ТаблицаДокумента. Колонки. Добавить( "Цена" , ОписаниеТиповЧ, "Цена" , 6 ) ;
Для Строка = 1 По ExcelПоследняяСтрока Цикл
ОбработкаПрерыванияПользователя( ) ;
Стр= ТаблицаДокумента. Добавить( ) ;
Стр. Номер = Строка;
Попытка
Стр. Артикул = ExcelЛист. Cells( Строка, 1 ) . Value;
Стр. Описание = ExcelЛист. Cells( Строка, 2 ) . Value;
Стр. Цена = ExcelЛист. Cells( Строка, 3 ) . Value;
Исключение
Сообщить( "Ошибка чтения строки файла Microsoft Excel." + Строка + Символы. ПС + ОписаниеОшибки( ) , СтатусСообщения. Внимание) ;
КонецПопытки ;
Состояние( "Обработка файла Microsoft Excel : "
+ "строка " + Строка + " из " + ExcelПоследняяСтрока) ;
КонецЦикла ;
ExcelПриложение. Quit( ) ;
ЭлементыФормы. ТаблицаДокумента. Значение = ТаблицаДокумента;
ЭлементыФормы. ТаблицаДокумента. СоздатьКолонки( ) ;
КонецПроцедуры