Как загрузить csv в 1с
Здравствуйте. Эта публикация является частью учебного процесса, так что не судите строго.
Задача - создать обработку для загрузки данных в учебную конфигурацию из файла с расширением CSV.
Учебная конфигурация - это простая база ведения домашней бухгалтерии.
Данные - это файл выгрузки из аналогичной андроид программы.
Итак приступим к решению.
Шаг 1. Прочитать файл с данными
Создаем обработку. В форме обработки создаем:
- реквизит - строку "Имя Файла"
- и команду "Прочитать".
Для команды "Прочитать" сразу сделаем процедуры ПрочитатьНаКлиенте и ПрочитатьНаСервере и пока отложим их.
Нам необходимо, чтобы строка "Имя Файла" позволяла выбрать файл. Для этого создадим дополнительную процедуру
Как видно, начало процедуры вполне стандартное, однако в процессе работы над основной процедурой "Прочитать" я столкнулся с небольшой проблемой - файл был в не той кодировке и не хотел восприниматься алгоритмом, поэтому я добавил сюда строки:
А также пришлось добавить на форму соответствующую функцию
Теперь вернемся к процедуре "Прочитать", а именно к процедуре "ПрочитатьНаСервере" которую мы создали выше. Код процедуры состоит из таких частей:
Здесь мы читаем данные с файла и добавляем их в таблицу значений. Хочу сразу предупредить, что таблица значений не предусматривает одинаковое название колонок. У меня как раз были такие, поэтому я не стал долго мучатся с этим и просто переименовал их. Однако подозреваю, что если чуть подумать и поднапрячься, то можно доработать код и решить эту проблему.
Захотелось немного покуражиться и программно добавить таблицу значений на форму. Хотя у этого была и рациональная причина - в дальнейшем не нужно будет каждый раз переделывать код, если файл с данными будет с другим количеством и названием колонок.
Итак, мы прочитали данные, переходим к следующему шагу.
Шаг 2. Загрузить данные в непосредственно в базу
Создаем на форме реквизит "ЧленСемьи", тип "СправочникСсылка.Семья" - если не забыли, у меня учебная база ведения домашней бухгалтерии.
А также команду "ЗагрузитьВБазу" и к ней соответствующие процедуры "ЗагрузитьВБазуНаКлиенте" и "ЗагрузитьВБазуНаСервере".
Рассмотрим код процедуры "ЗагрузитьВБазуНаСервере()".
Он также состоит из нескольких частей. Первая часть кода:
Здесь мы делаем запрос на чтение прочитанных данных на форме. Так как мы уже прочитали данные, то можем присвоить колонкам названия, используемые нами в базе.
Вторая часть кода
Здесь мы уже непосредственно загружаем прочитанные данные в базу (конечно, второй запрос можно было не делать, но мне так показалось удобнее).
Рассмотрим некоторые строки кода детальнее.
Так как, по сути, мы читали текстовый файл, то строки с суммами пришлось обработать - убрать лишние пробелы и заменить "." на ","
Данные, которые мы загружаем, имеют простую структуру: суммы + доходы суммы - расходы. Поэтому простое условие >0 позволило нам разделить данные для прихода и расхода.
Программно создаем документ, куда будем заносить данные
Здесь пришлось повозиться - до меня не сразу дошло, что если программно создаешь документ, то и дату туда надо заносить в формате "год.месяц.день час:мин:сек" пришлось добавить функцию для даты
Сразу скажу - спешил, поэтому функцию нашел здесь же на форуме. Сейчас пишу и думаю, что можно было сделать то же самое, используя "СтрРазделить", но код был бы длиннее.
База, по сути, - пустая, и мне не хотелось вручную наполнять справочники, поэтому добавил функцию:
Так как справочников много, сделал два параметра "СправочникСтатья" и "СтатьяНаименование".
//*** Если есть шапка таблицы ***
Шапка_CSV = Файл_CSV . ПолучитьСтроку ( 1 );
// Чтение и разделение на отдельные значения в массив (по разделителю)
Массив_CSV = СтрРазделить ( Шапка_CSV , Используемый_разделитель );
//***************************
Для Каждого СтрокаНом Из Массив_CSV Цикл
// Удаляем пробелы т.к. в названии столбцов они не допускаются
ИмяБП = СтрЗаменить ( СтрокаНом , " " , "" );
ТЗ . Колонки . Добавить ( ИмяБП ,, СтрокаНом );
Для НомерСтроки = 2 по Файл_CSV . КоличествоСтрок () Цикл // Если без шапки, то начинаем с первой строчки
// Получаем строку по-порядку
Строка_CSV = Файл_CSV . ПолучитьСтроку ( НомерСтроки );
// Разделяем с помощью выбранного разделителя каждую строку на столбцы
Массив_CSV = СтрРазделить ( Строка_CSV , Используемый_разделитель );
НоваяСтрочка = ТЗ . Добавить (); // Добавляем строку в ТЗ
Для Ном_Столбца = 1 по Массив_CSV . Количество () Цикл
ТекЗначение_CSV = Массив_CSV [ Ном_Столбца - 1 ];
ИмяКолонки_CSV = ТЗ . Колонки [ Ном_Столбца - 1 ]. Имя ;
НоваяСтрочка [ ИмяКолонки_CSV ] = ТекЗначение_CSV ;
Используемый_разделитель = ";" ;
Файл_CSV = "D:\import_21092020.csv" ;
//*** Получаем данные из запроса ***
Запрос = Новый Запрос ;
Запрос . Текст =
"ВЫБРАТЬ
| ВнутреннийПрайс.Код КАК Код,
| ВнутреннийПрайс.Наименование КАК Наименование,
| ВнутреннийПрайс.ЗакупочнаяЦена КАК ЗакупочнаяЦена,
| ВнутреннийПрайс.РозничнаяЦена КАК РозничнаяЦена,
| ВнутреннийПрайс.ОптоваяЦена КАК ОптоваяЦена
|ИЗ
| Справочник.Цены КАК ВнутреннийПрайс" ;
РезультатЗапроса = Запрос . Выполнить (). Выгрузить ();
ТаблицаЗначений = РезультатЗапроса ;
//**********************************
Текст_CSV = "" ; // Текст с учетом заголовков, разделителей и переноса строк
Для Каждого СтрокаТЗ из ТаблицаЗначений Цикл
Если Текст_CSV = "" тогда
СтрокаКол = "" ;
КолонкиТЗ = ТаблицаЗначений . колонки ;
Для Каждого Каждая_Колонка Из КолонкиТЗ Цикл
СтрокаКол = "" + СтрокаКол + Каждая_Колонка . Имя + Используемый_разделитель ;
КонецЦикла;
Текст_CSV = СтрокаКол + Символы . ПС ;
Текст_CSV = Текст_CSV + СтрокаТЗ . Код + Используемый_разделитель + СтрокаТЗ . Наименование
+ Используемый_разделитель + СтрокаТЗ . ЗакупочнаяЦена + Используемый_разделитель + СтрокаТЗ . РозничнаяЦена
+ Используемый_разделитель + СтрокаТЗ . ОптоваяЦена + Символы . ПС ;
КодANSI = КодировкаТекста . ANSI ;
ТекстовыйФайлЗапись = Новый ЗаписьТекста ( Файл_CSV , КодANSI ); // Создание файла CSV
ТекстовыйФайлЗапись . ЗаписатьСтроку ( Текст_CSV ); // Запись информации в файл
ТекстовыйФайлЗапись . Закрыть (); // Обязательно закрываем, иначе зависает в процессе
Читайте также: