Загрузка в документ 1С из файла CSV
Задача: загрузить в документ «Поступление товаров и услуг», данные из csv файла. Конфигурация «Бухгалтерия 3.0».
Решение: создадим обработку, которая парсит файл, создает если необходимо номенклатуру и загружает её в ранее созданный и выбранный для загрузки документ оприходования.
Скачать обработку можно здесь.
Из интересного:
Функция разложения строки в массив по разделителю (;)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт МассивСтрок = Новый Массив(); Если Разделитель = " " Тогда Стр = СокрЛП(Стр); Пока 1=1 Цикл Поз = Найти(Стр,Разделитель); Если Поз=0 Тогда МассивСтрок.Добавить(Стр); Возврат МассивСтрок; КонецЕсли; МассивСтрок.Добавить(Лев(Стр,Поз-1)); Стр = СокрЛ(Сред(Стр,Поз)); КонецЦикла; Иначе ДлинаРазделителя = СтрДлина(Разделитель); Пока 1=1 Цикл Поз = Найти(Стр,Разделитель); Если Поз=0 Тогда МассивСтрок.Добавить(Стр); Возврат МассивСтрок; КонецЕсли; МассивСтрок.Добавить(Лев(Стр,Поз-1)); Стр = Сред(Стр,Поз+ДлинаРазделителя); КонецЦикла; КонецЕсли; КонецФункции |
Диалог выбора открытого файла (множественный выбор)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
Процедура Загрузить(Команда) Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытияФайла.ПолноеИмяФайла = ""; Фильтр = НСтр("ru = 'Текст'; en = 'Text'") + "(*.csv)|*.csv"; ДиалогОткрытияФайла.Фильтр = Фильтр; ДиалогОткрытияФайла.МножественныйВыбор = Истина; ДиалогОткрытияФайла.Заголовок = "Выберите файлы"; Если ДиалогОткрытияФайла.Выбрать() Тогда МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; Для Каждого ИмяФайла Из МассивФайлов Цикл ВыбФайл = Новый Файл(ИмяФайла); Сообщить(ИмяФайла + НСтр("ru = '; Размер = '; en = '; Size = '") + ВыбФайл.Размер()); //загружаем файл во временную таблицу ЗФ=Новый ТекстовыйДокумент; ЗФ.Прочитать(ИмяФайла); //сообщить(ИмяФайла); для НомерСтроки=1 по ЗФ.КоличествоСтрок() Цикл //для НомерСтроки=1 по 5 Цикл // сообщить(1); Строка=ЗФ.ПолучитьСтроку(НомерСтроки); для ии=1 по 20 цикл Строка=СтрЗаменить(Строка,";;",";"); конеццикла; // сообщить(Строка); МассивСтр=РазложитьСтрокуВМассивПодстрок(Строка,";"); артикул=МассивСтр[0]; название=ОбработатьНазвание(МассивСтр[1]); количество=МассивСтр[2]; ед=МассивСтр[3]; цена=МассивСтр[4]; цена=СтрЗаменить(цена," ",""); цена=СокрЛП(цена); стртаб=ТЗ.Добавить(); стртаб.артикул=артикул; стртаб.номер=НомерСтроки; стртаб.название=название; стртаб.количество=количество; стртаб.цена=цена; стртаб.сумма=цена*количество; стртаб.ед=ед; конецЦикла; КонецЦикла; Иначе Предупреждение(НСтр("ru = 'Файл(ы) не выбран!'; en = 'File(s) not selected!'")); КонецЕсли; КонецПроцедуры |
Создание номенклатуры в справочнике:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Процедура СоздатьНоменклатуруНаСервере() // Вставить содержимое обработчика. для каждого стр из ТЗ цикл сообщить(стр.название); //ищем такое название в справочнике. Может уже есть? ссылканоменклатуры=справочники.Номенклатура.НайтиПоНаименованию(стр.название); если ссылканоменклатуры=справочники.Номенклатура.ПустаяСсылка() тогда сообщить("--такой номенклатуры нет!Создаем!"); нп=Справочники.Номенклатура.СоздатьЭлемент(); нп.Наименование=стр.название; нп.Артикул=стр.артикул; нп.Родитель=справочники.Номенклатура.НайтиПоНаименованию("Автозагрузка").Ссылка; нп.ВидНоменклатуры=справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товары"); нп.СтавкаНДС=Перечисления.СтавкиНДС.НДС18; нп.ЕдиницаИзмерения=справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию(стр.ед); нп.Записать(); иначе сообщить("--нашли!"); конецесли конеццикла; КонецПроцедуры |
Вставить в выбранный документ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
&НаСервере Процедура ВставитьНаСервере(док) // Вставить содержимое обработчика. если док.ссылка=документы.ПоступлениеТоваровУслуг.ПустаяСсылка() тогда сообщить("--не выбран документ куда будем загружать данные!"); иначе сообщить(док); док2=этаформа.Объект.Приход.ПолучитьОбъект(); для каждого стр из ТЗ цикл ссылканоменклатуры=справочники.Номенклатура.НайтиПоНаименованию(стр.название); новая=док2.Товары.Добавить(); новая.номенклатура=ссылканоменклатуры; новая.количество=стр.количество; новая.цена=стр.цена; новая.сумма=стр.сумма; новая.СтавкаНДС=Перечисления.СтавкиНДС.НДС18; новая.СчетУчета=ПланыСчетов.Хозрасчетный.ТоварыНаСкладах; конеццикла; док2.Записать(); конецесли КонецПроцедуры |