Загрузка из Excel в управляемом приложении

30.11.17

Интеграция - Загрузка и выгрузка в Excel

С появлением управляемого интерфейса стали актуальными вопросы в давно освоенных приемах работы. В частности, загрузка из файла.

Столкнулся очередной раз с задачей древней как мир, кому-то из коллег показалось что в excel задача по загрузке информации в регистр сведений 1С (в частности ЛицевыеСчетаСотрудников) будет выполняться проще, чем в интерфейсе 1С. Но не надо на этом зацикливаться, информация, изложенная ниже, носит более широкий характер. Так вот, ввиду отсутствия MS Office на компьютере с базой пользователь благополучно был с обидой отправлен восвояси, при этом на локальном компьютере у пользователя был установлен офис, и это даже ставилось как аргумент. Позже возникла необходимость загрузки информации в похожий регистр, но задача отличалась тем, что теперь требовалось загрузить из Excel с локальной тачки в клиент-серверную базу. Устав людям доказывать, что не одним экселем сыт 1С, взялся за реализацию несложной задачи и так получилось, что увидел в наискучнейшем рутинном занятии повод для изысканий тут. Итак, как ни странно, подробного разбора полетов не нашел ни здесь, ни на профильных сайтах, есть опытные ответчики на сайтах и тут тоже был замечен из категории черного пояса по "Спасибо, кэп", с советами "в управляемом приложении перенеси все &НаКлиент"  или "Конечно, перед открытием нужно указать путь на сервере, проснулся, типа скачай мою обработку и научись". Так вот эта заметка будет полезна тем, кто обойдется без выслушивания подобного рода высказывателей.

Со времен Толстого, задача действительно разделилась. И у банальной процедуры загрузки появились варианты, где ее выполнять, на клиенте или на сервере.

Первый вариант &НаКлиенте

Подходит для озвученной мною задачи, если у вас файл Эксель это просто несколько колонок с загружаемыми реквизитами, простой структуры, типа колонка - снизу ее значение и никаких логических или сложных арифметических действий или индексирования со значениями в колонках не требуется, тогда будет достаточно следующего кода. Замечу, этот код не зависит от типа базы, файлоая/серверная и требуется наличие экселя только на стороне клиента (это из области "Спасибо, кэп", но будет полезно в определении круга задач для тех, кто читал с начала)

&НаКлиенте
Процедура Загрузка(Команда)
	
	Колонки = Новый Массив;
	Колонки.Добавить("Сотрудник");
	Колонки.Добавить("Счет");
	
	Попытка 
		ex = ПолучитьCOMобъект("","Excel.Application");
	Исключение
		Сообщить("Excel Application не создан!!");
		Возврат;
	КонецПопытки;
	
	Попытка
		ex.workbooks.open(Файл,1);
	Исключение
		Сообщить("Файл перемещен или удален!");
		Возврат;
	КонецПопытки;
	
	RCount = ex.ActiveSheet.UsedRange.Rows.Count();
	Для j = 2 по RCount цикл
		
		Если СокрЛП(ex.ActiveSheet.Cells(j,1).Value)="" Тогда
			Продолжить;
		КонецЕсли;
		
		Стр = Новый Массив;
		Для i=1 По Колонки.Количество() Цикл
			 Стр.Добавить(СокрЛП(ex.ActiveSheet.Cells(j,i).Value));
		КонецЦикла;	
		
		ДобавитьЗаписьЛицевойСчет(Стр, ВыбПроект);
	КонецЦикла;	
	
	ex.workbooks.Close();
	ex.quit();
	
КонецПроцедуры

Второй вариант &НаСервере.

После загрузки вам необходимо выполнить группировку загруженных данных, например, вы загружаете информацию не по лицевым счетам, а по загрузке графиков работы сотрудников при суммированном учете, не спорю, можно это извернуться и сделать массивами &НаКлиенте, но при загрузке большого объема данных логичнее в целях увеличения производительности перенести операцию &НаСервер и выполнить загрузку в таблицу значений. При явном указании пути к файлу на клиенте в процедуру &НаСервере, в лучшем случае получите сообщение, что файл не найден. Поэтому перед выполнением необходимо скопировать файл во временное хранилище в процедуре &НаКлиенте, а затем сохранить его во временный каталог уже на сервере

&НаКлиенте
Процедура Загрузка(Команда)
	
	Двоичное = Новый ДвоичныеДанные(Файл);
	Адрес = ПоместитьВоВременноеХранилище(Двоичное, ЭтаФорма.УникальныйИдентификатор);
	
	ЗагрузкаНаСервере(Адрес, ВыбПроект);
КонецПроцедуры

&НаСервере
Процедура ЗагрузкаНаСервере(Адрес, Проект)

	темп_Путь = КаталогВременныхФайлов()+ "prncss_Megan_"+Формат(ТекущаяДата()-Дата(2012,01,01), "ЧГ=0")+".xls";
	
	темп_файл = ПолучитьИзВременногоХранилища(Адрес);
	темп_файл.Записать(темп_Путь);
	
	СписокКолонок = Новый СписокЗначений;
	СписокКолонок.Добавить("ФизЛицо");
	СписокКолонок.Добавить("НомерЛицевогоСчета");
	
	ТабЛицСчетов = ЗагрузитьЭксель(темп_Путь,СписокКолонок);
	
	Попытка
    	УдалитьФайлы(темп_Путь); 
	Исключение
    	Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
....

КонецПроцедуры

&НаСервере
Функция  ЗагрузитьЭксель(Путь, СписокКолонки)
	
	ТЗФайл = Новый ТаблицаЗначений;
	
	Попытка 
		ex = ПолучитьCOMобъект("","Excel.Application");
	Исключение
		Сообщить("Excel Application не создан!!");
		Возврат ТЗФайл;
	КонецПопытки;
	
	Попытка
		ex.workbooks.open(Путь,1);
	Исключение
		Сообщить("Файл перемещен или удален!");
		Возврат ТЗФайл;
	КонецПопытки;
	
	
	Для каждого Зн Из СписокКолонки Цикл
		ТЗФайл.Колонки.Добавить(Зн.Значение);	
	КонецЦикла;	
	
	RCount = ex.ActiveSheet.UsedRange.Rows.Count();
	CCount = ex.ActiveSheet.UsedRange.Columns.Count();
	Для j = 2 по RCount цикл
		
		Новая = ТЗФайл.Добавить();
		Для i=1 По СписокКолонки.Количество() Цикл
			Новая.Установить(i-1, СокрЛП(ex.ActiveSheet.Cells(j,i).Value));
		КонецЦикла;	
		
	КонецЦикла;	
	
	ex.workbooks.Close();
	ex.quit();
	
	Возврат ТЗФайл;
КонецФункции

Временный каталог используется стандартного пользователя USR1CV82. В своем коде я еще применил таймстэмп на всякий случай, во избежание ошибки разделенного доступа к файлу в случае неожиданного завершения в прошлый запуск (почему-то окончание фразы сразу подумалось о другом и стало немного грустно ;)  а потом весело: не только 1С-ники косячат).

Всем благ, поменьше вам гневных советчиков на форумах, те, кто ничего нового не прочел, но упорно читал до конца, отвечу вам фразой известного футболиста про "Ваши ожидания".

загрузка excel

См. также

SALE! 10%

Загрузка номенклатуры из Excel в УТ11, КА 2, ERP 2, Розница 2. Дополнительные реквизиты и сведения, характеристики, картинки, цены, остатки

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка из файлов xls, xlsx, ods, csv, mxl в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

10560 9504 руб.

29.10.2014    210175    620    524    

439

Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 11.12.2023, версия 9.5 - 9.9)

13200 руб.

20.11.2015    150721    367    375    

501

Маркетплейсный загрузчик для 12-ти маркетплейсов в "БП 3", "УТ 11", "КА 2", ERP, УНФ

Загрузка и выгрузка в Excel Маркетплейсы Платформа 1С v8.3 Бухгалтерский учет 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)

Реальный помощник, с помощью которого Вы сделаете необходимые документы для Wildberries, OZON, ЯндексМаркет, Мегамаркет, Aliexpress, "Детский мир", Казань-Экспресс, "Леруа Мерлен", ЭНФАНТА (Акушерство), ЛаМода, Летуаль, "Твой дом" в документы "Отчет комиссионера (агента) о продажах" и другие, может работать в "Бухгалтерия 3", "Бухгалтерия 3 КОРП", УТ 11, УНФ, КА 2, ERP. Возможность подключить любые маркетплейсы. Анализ продаж ОЗОН. 30 дней БЕСПЛАТНОГО пользования!

1800 руб.

12.08.2021    31893    226    63    

117

SALE! 20%

Загрузка документов и номенклатуры из Excel в 1С "одним нажатием": УПД, ТОРГ-12, отчеты маркетплейсов, заказы, счета, прайсы

Загрузка и выгрузка в Excel Оптовая торговля Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С. Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, заказ, отчет комиссионера и т.д.). Не требует MS Office. Для поиска таблиц используются методы эвристического поиска. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д. Содержит модуль работы с электронной почтой и api-загрузчик отчетов о продажах маркетплейсов.

5000 4000 руб.

09.11.2016    214926    925    886    

939

Загрузка данных отчета о реализации товаров из Excel файла СберМегаМаркет

Загрузка и выгрузка в Excel Маркетплейсы Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Загрузка данных отчета о реализации товаров из сервиса СберМегаМаркет для конфигурации: Бухгалтерия предприятия, редакция 3.0; Управление торговлей, редакция 11 и Управление нашей фирмой, редакция 3.0 в документ "Отчет комиссионера (агента) о продажах".

4800 руб.

07.06.2022    15078    79    0    

60

SALE! 30%

Распознавание и загрузка сканов в 1С "одним нажатием": УПД, ТОРГ-12, накладные, счета, номенклатура, заказы и т.д.

Загрузка и выгрузка в Excel Документооборот и делопроизводство (СЭД) Учет документов Распознавание документов и образов Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная программа для распознавания ЛЮБЫХ СКАНОВ ИЛИ ФОТО ТОВАРНЫХ ДОКУМЕНТОВ в 1С. Не требует указания параметров и предварительной настройки. Просто выбираете файл (PDF, JPG, DOC, XLS, HTML и т.д.) выбираете документ 1С и нажимаете кнопку "Распознать и загрузить".

6000 5520 руб.

04.06.2019    101378    296    173    

312
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. maxdmt 28 30.11.17 21:59 Сейчас в теме
Если ваш сервер 64бит а мс офис 32 - то вариант на сервере не взлетит.
autosvg; Rie; +2 Ответить
2. proal 209 01.12.17 06:24 Сейчас в теме
Начиная с 8.3.8, можно загружать Excel-файл напрямую в ТабличныйДокумент.
Правда, эту фичу я опробовал только в 8.3.10 версии, поэтому не могу ручаться за корректность загрузки в предыдущих версиях.
В моем случае файлы простые (1 страница, никаких формул, голый текст и числа), ошибок загрузки пока не встречал.
А загружается очень просто:

ОбъектТабличногоДокумента..Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);

И никакого офиса на сервере не надо, битность тоже не влияет.
Rabot; 1v7; neo-ti; NightGod; myoker; DataReducer; sogesti; i132; freud; IvanKh; jaroslav.h; Denium79; Staky; starik-2005; gradi; MaxS; +16 Ответить
4. alex_bitti 139 01.12.17 08:55 Сейчас в теме
(2) этот вариант не проще, нужен объект, даже если структура объекта (набор полей) сформируется налету (если честно последнюю не пробовал, но были проблемы с этим раньше), после загрузки она абсолютно неведома для разработчика, загрузка в ТаблицуЗначений все же более интерактивная, создавая структуру таблицы, есть возможность хранить ее отдельно от данных, если например требуется загрузка отдельных данных заранее не изветно где они расположены
5. PavelKolobkov 01.12.17 09:20 Сейчас в теме
(2) При загрузке через ТабличныйДокумент некорректно читаются символы с диакритическими знаками.
8. Isonic 234 01.12.17 10:57 Сейчас в теме
7. Isonic 234 01.12.17 10:57 Сейчас в теме
(2) теряется часть значений в ячейке!
3. alex_bitti 139 01.12.17 08:42 Сейчас в теме
согласитесь управляемое приложение создает некие неудобства, причем не управляемое приложение как таковое, а его реализация в 1С, правила модерации на этом ресурсе заставляют жестко привязываться к теме, а вообще проблема есть даже с реализацией типовых механизмов, например, у меня есть файл с созданный в Конвертации данных и мне необходимо загрузить его в Универсальный обмен на Сервере с клиента, задача казалась бы простой но ужасно реализованной в типовом варианте
6. Isonic 234 01.12.17 10:56 Сейчас в теме
предложенный автором способ, и способы загрузки предложенные в комментах не работоспособны при использовании файлов excel с объемом 10к и более строк!

Загрузка по времени увеличивается в геометрической прогрессии!

PS: проверено на файлах с количеством строк более 500к. Мощные серваки просто загнулись

Правильнее использовать метод "Range"
9. alex_bitti 139 01.12.17 11:19 Сейчас в теме
(6) а с чем связана проблема? просто давно не приходилось делать большие загрузки, 6 лет назад в 8.2 (УФ) делал загрузку справочников подобным образом, номенклатура была около 50к строк, долго но все зашло, вроде, деталей не помню. сам эксель плохо работает с большими объемами, xls старый формат на сколько мне не изменяет имеет ограничение в 64к строк,
вспомнил, по моему я делал как раз открытие и закрытие загружаемого файла, и чтение со следующей после последней загруженной перед закрытием, может это не правильно, но сделано как сделано, на тот момент как смог))
10. Isonic 234 01.12.17 11:25 Сейчас в теме
(9) построчное и поячеечное чтение очень много времени занимает. Не прикольно когда загрузку приходиться ждать 1-2 дня
11. alex_bitti 139 01.12.17 11:26 Сейчас в теме
(10) я дописал предыдущий коммент, нет загрузилось тогда все в течении дня рабочего
12. MaxS 2826 01.12.17 12:17 Сейчас в теме
(6) Попробуйте в 1С открыть большой файл через главное меню Файл- Открыть. Если открывается, то и программой не составит труда обработать через ТабличныйДокумент.
У меня обработкой без проблем читаются 100к строк.
13. alex_bitti 139 01.12.17 12:32 Сейчас в теме
(12) табличный документ не для всего подходит, например из 115 колонок нужно загрузить 40 не подряд естественно, и несколько сот строк тоже не подряд, структура загружаемых данных заранее не известна, зависит от содержания, простой пример такой ситуации я написал в основном тексте, есть графики с календарями, в некоторых месяцах 30 денй в некоторых 31, у кого то есть ночные часы у кого то их нет
14. MaxS 2826 01.12.17 12:53 Сейчас в теме
(13) 1С с табличным документом быстрее работает, чем с внешней программой, к которой нужно неоднократно обращаться для считывания данных. Запуск сторонней программы наверное больше памяти съест, чем загрузка всего файла в табличный документ.
15. alex_bitti 139 01.12.17 13:03 Сейчас в теме
(14) мне кажется это немного другая тема, повторюсь, в 1С есть возможность нормально создать объект из модуля, или реквизит объекта из модуля? предложенный вами метод частный случай, но не спорю более производительный, хотя если углубиться дальше 1С можно было бы поспорить
16. Dmitry888 38 01.03.21 12:49 Сейчас в теме
Спасибо все получилось
17. Dmitry888 38 01.03.21 12:49 Сейчас в теме
Но было очень сложно и не понятно и потому спустя 6 месяцев получилось сделать что-то подобное
Оставьте свое сообщение