Работа в 1С с CSV файлами — загрузка из внешнего файла в 1С
CSV (от англ. Comma-Separated Values) — универсальный текстовый формат, предназначенный для типизации табличных данных. В этом формате колонки отделяются специальными символами — разделителями. Разделителями чаще всего служат символы «;»(точка с запятой) , «,»(запятая) или табуляция (системное значение «Символы.Таб» в 1С 8). Загрузка из CSV в 1С чаще всего нужна, чтобы загрузить данные в систему из внешнего источника, например, сайта или другой учетной системы.
Ниже я рассмотрю создание обработки загрузки данных из CSV и дам ссылку на скачивание универсальной обработки загрузки данных.
Содержание
Что такое CSV
CSV, по сути, — обыкновенный текст, в котором указаны данные. Обычно в первой строке обозначены названия колонки, во второй и далее — данные. Вот пример типичного CSV, отрытого в блокноте, Вы можете увидеть выше.
Разработка обработки загрузки из CSV в 1С
Ниже я рассмотрю пошагово, каким образом можно реализовать парсинг из CSV и загрузку в 1С 8.3 на основе универсальной обработки, которую я создал. С помощью этой обработки Вы сможете загрузить любые данные.
1.Создаем новую обработку и форму обработки
Обратите внимание, что в табличное поле я не добавлял колонки, при загрузке колонки будут генерироваться автоматически, исходя из файла.
2. Обработчик выбора каталога
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
При нажатии на выбор необходимо отображать диалог выбора файла в ОС. Сделать это очень просто. Необходимо на обработчик «НачалоВыбора» в поле ввода файла указать следующий код:
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогВыбора.Заголовок = "Выберите каталог"; Если ДиалогВыбора.Выбрать() Тогда ИмяФайла = ДиалогВыбора.ПолноеИмяФайла; КонецЕсли;
3. Обработка данных из CSV в 1C
После того как мы указали нужный путь на диске, мы должны приступить к обработке файла.
Для начала мы очищаем информацию в таблице и находим файл на диске, а потом считываем его:
//очищаем таблицу и удаляем информацию Таблица.Очистить(); Таблица.Колонки.Очистить(); ЭлементыФормы.Таблица.Колонки.Очистить(); // чтение ЗагружаемыйФайл = Новый ТекстовыйДокумент; ЗагружаемыйФайл.Прочитать(ИмяФайла);
После того как мы получили все данные из CSV, мы считываем первую строчку и формируем столбцы на форме с наименованиями шапки
//шапка по умолчанию первая строчка
Шапка = ЗагружаемыйФайл.ПолучитьСтрoку(1);
//раскладываем строку в массив МассивКол = РазложитьСтрокуВМассивПодстрок(Шапка,Разделитель); // процедура из типовой конфигурации, разбивает строку в массив по разделителям //генерируем столбцы Для Каждого ИмяСтолбца Из МассивКол Цикл ИмяБезПробелов = СтрЗаменить(ИмяСтолбца," ",""); // убираем из имени пробелы Таблица.Колонки.Добавить(ИмяБезПробелов,,ИмяСтолбца); НовыйСтолбец = ЭлементыФормы.Таблица.Колонки.Добавить(ИмяБезПробелов, ИмяСтолбца); НовыйСтолбец.Данные = ИмяБезПробелов; КонецЦикла;
После того как шапка сформирована, можно приступать к обработке загрузки самих данных:
Для НомерСтроки=2 по ЗагружаемыйФайл.КоличествоСтрок() Цикл Состояние("Обрабатывается "+Строка(Формат(?(ЗагружаемыйФайл.КоличествоСтрок()=0,0,((100*НомерСтроки)/ ЗагружаемыйФайл.КоличествоСтрок())),"ЧЦ=3; ЧДЦ=0"))+" %"); ОбработкаПрерыванияПользователя(); //указав данный оператор, цикл можно прервать в любой момент нажатие ctrl+break // получить стрoку с указанным номером и преобразуем её в массив Строка = ЗагружаемыйФайл.ПолучитьСтроку(НомерСтроки); МассивКол = РазложитьСтрокуВМассивПодстрок(Строка,Разделитель);// процедура из типовой конфигурации, разбивает строку в массив по разделителям НоваяСтрочка= Таблица.Добавить(); Если МассивКол.Количество() <> Таблица.Колонки.Количество() Тогда Продолжить; // скорее всего в тексте содержит разделитель КонецЕсли; Для НомерСтолбца= 1 по МассивКол.Количество() Цикл //заполняем строчку значениями ТекущееЗначение = МассивКол[НомерСтолбца-1]; ИмяКолонки = Таблица.Колонки[НомерСтолбца-1].Имя; НоваяСтрочка[ИмяКолонки] = ТекущееЗначение; КонецЦикла; КонецЦикла;
Тут мы обрабатываем построчно все строчки и заносим их в табличное поле.
В результате у нас получается вот такая вот красивая табличка:
После того как данные загружены в табличку, их можно использовать как Вам угодно — загрузить прайс, загрузить номенклатуру, загрузить контрагентов, загрузить остатки.
Скачать: обработка для загрузки данных из CSV в 1С 8.2.
Про загрузку из excel в 1С можно прочитать тут.
Если же у Вас всё равно возникают трудности, Вы можете обратиться ко мне, подробнее в разделе услуги программиста 1С .
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
СПРОСИТЕ в комментариях!
Андрей:
К сожалению универсальная обработка не заработала в Розница 2.0
Выдаёт ошибку «Возможно, обработка (отчет) устарела или не является дополнительной:Метод объекта не обнаружен (СведенияОВнешнейОбработке)»
Как решить эту проблему?
Можете подсказать?
Программист 1С:
Обработка предназначена для работы в режиме обычного приложения.
А розница 2.0 — конфигурация написана уже под управляемое приложение.
И она не предназначена что бы подключать её как внешнюю обработку.
Дмитрий:
«После того, как данные загружены в табличку, их можно использовать как вам угодно»
Имеется в виду, что это заготовка для обработки? то есть надо дописывать загрузку собственно в объекты конфигурации?
Или как-то можно использовать получившуюся таблицу?
Программист 1С:
Да, это некая заготовка.
После загрузки в табличку обработки очень просто обработать данные в объекты конфигурации.
Дмитрий:
а можно несколько слов про это «очень просто»?
если создавать интерфейс, в котором настраивать соответствие полей файла полям справочника (к примеру), то выводить табличку необязательно — нужна только ее структура.
если же писать под конкретный объект и конкретную структуру файла — табличка тем более не нужна — можно обойтись временной таблицей без вывода ее в интерфейс.
хочется понять логику
Программист 1С:
Логика — научить Вас загружать данные из csv в табличку 1С, для наглядности сделана форма что бы видеть данные.
Трансформация данных в вашей конфигурации это дело второе.
Дмитрий:
понял, спасибо
Pavel:
Добрый день, подскажите как с помощью данной обработки можно загрузить реестр из банка с разделителем ^ и затем выгрузить обратно разбив его на несколько других файлов согласно кода услуги?
например:
1^854525^9999^
1^1^25300016326^^^130000.00^0.00^
2^2^95000044902^^^153679.00^0.00^
3^2^95000096004^^^13438.00^0.00^
код услуги — второй реквизит каждой из последних трех строк….заранее спасибо. Первая строка служебная.
Илья:
Можно еще добавить выбор разделителя, т.к. он бывает разным
Ольга:
Здравствуйте, очень нужна эта обработка в УТ. Но ссылка, видимо, уже не рабочая. Помогите!!! )))
Программист 1С:
Приветствую!)
Браузер видимо некорректно обрабатывал скачивание.
Перезагрузил в zip формат)))
Странный:
Добрый день!
Если в csv файле несколько колонок с одинаковым названием то при прочтении файла выскакивает ошибка. Натолкните на мысль пожалуйста как сделать чтобы не уникальные колонки автоматом переименовывались, и значения попадали именно туда куда нужно.
Кирилл:
Добрый день,
Можно в имени колонки добавить порядковый номер, например: «Товар_1, Цена_2, Сумма_3».
В этом случае мы генерируем 100% уникальные имена колонок и решаем эту проблему.
Антон:
Добрый день!
Подскажите как быть: есть строка — она делится на колонке разделителем «;», но есть колонка «назначение платежа» и тексте которой присутствует «;» и естественно в МассивКолонок добавляется больше значений чем надо. Есть ли возможность как-то вытянуть отдельно именно эту строку. Спасибо!
Кирилл:
Добрый день!
Красивых решений наверное не подскажу. Но Ексель как то понимает такие вещи — значит скорее всего можно научить и 1С.
Из простого — попросить выгружать CSV файл с другим разделителем. Практически во всех выгрузках в других программах можно выбрать нужный разделитель.
Если найдете изящное решение — пожалуйста, напишите как решили)
Александр:
Скачал, спасибо, хорошая заготовка. Облегчила пол дела
Кирилл:
Спасибо за добрый слова!
Алексей:
Очень долго грузит данный пример, можно загрузить быстрее?
файл 12 млн строк, 15 колонок в файле.
Merlin:
Здравия! А можно увидеть обработку по выгрузке в csv? Интересует выгрузка регистра сведений.
Благодарю.
Вася:
В 8.3 не работает, не понимает что за таблица
Аноним:
Выгружаю данные по автобусам из csv в 1С,есть автобусы с одинаковыми номерами:цифры одинаковы,серии разные, и они у нас различаются просто с индексами 1 и 2, например:6711 и 6712, т.е получаются четырехзначные номера.Формула считывает информацию только с автобусов с трехзначным номером.Куда залезть,чтобы дать команду на считывание четырехзначного номера…связь с программистом,который нам это делать потеряна …
Аноним:
3500;0001;81298919;33;31.10.2017 06:13;1;01;0054;0054;00000802;00000802;0;29;93;54;0;0;0;71800;0;1;3500-0001-2017.11.01-СЕРГЕЙ-ПК-1.csv
3500;0001;81136253;36;31.10.2017 05:33;1;01;0070;0070;00006712;00006712;0;32;81;52;0;0;0;78350;0;1;3500-0001-2017.11.01-СЕРГЕЙ-ПК-1.csv
3500;0001;81130341;39;31.10.2017 05:29;1;01;0054;0054;00006711;00006711;0;33;112;62;0;0;0;81000;0;1;3500-0001-2017.11.01-СЕРГЕЙ-ПК-1.csv
Аноним:
к примеру:здесь три машины с номером 802, 6711, 6712.Безболезненно выгружается 802 машина ,»двойников» не находит. ПОМОГИТЕ…
Аноним:
спасибо
Елена:
Спасибо огромное!
Аноним:
Спасибо большое