Ранее уже делал подобную обработку для вывода на печать макета из файла Open Office. Вот ссылка на эту публикацию:
Пример работы с файлами odt в клиент-серверной модели работы
Тестирование проводилось на платформе 8.3.16. Но уверен, что будет работать на всех новых релизах и старых до 8.3.8.
Коллеги, прошу ознакомиться с целью данной публикации:
Данная публикация создана НЕ для того чтоб рекламировать устаревший способ чтения данных из Excel. Способ можно изменить за 2 минуты, он всем известен (в т.ч. и мне).
Её цель - показать способ написания кода таким образом, чтоб его можно было за 20 минут адаптировать под любую новую задачу.
Опишу особенности реализации данной обработки:
1. Написана она для управляемых форм. Для обычных форм необходимо изменить алгоритм открытия файлов.
2. Работает она через COM объект. Да способ не очень быстрый и как бы устаревший, но часто используемый и проверенный!
3. Обработка позволяет считать одновременно неограниченное количество файлов. Их список задаётся в отдельной функции. Расширение задаёте там же, хоть xls, хоть xlsx. Главное условие - все файлы должны иметь одинаковые колонки.
4. Предположу область применения: если есть много филиалов и они выгружают файлы одинаковой структуры, а Ваша задача консолидировать. 20 и более раз нажимать кнопку "Загрузить" это неудобно. Проще всё считать разом и обработать за один подход.
5. В отдельной функции задаётся соответствие номера колонки в файле и названия поля. Название далее используется для формирования колонки в таблице значений и поля в запросе.
6. В отдельной функции задаётся соответствие названия колонки и типа значения. Используются примитивные типы данных: Строка, Число, Булево, Дата. Обработана ситуация, если тип значения число, а значение в ячейке пустое. Ошибки не будет, в таблицу будет записан ноль.
7. В коде есть маркер "_НазваниеТаблицы". Его через поиск и замену значений нужно заменить на нормальное значение. Например, в моей задаче это ОстаткиОтпусков. Это необязательно, просто для читабельности кода.
8. В обработке выбирается именно каталог, в котором хранятся файлы. Имена файлов задаются в функции в виде массива.
9. Результат чтения всех файлов помещается во временную таблицу с именем "ВТ_Excel_" + "_НазваниеТаблицы".
10. Временные файлы, используемые для передачи данных с клиента на сервер после чтения данных удаляются.
Если решите скачать обработку и использовать, то Вам необходимо выполнить следующие действия:
1. Заменить имена файлов в функции "ПолучитьСписокФайлов":
&НаКлиенте
Функция ПолучитьСписокФайлов()
СписокФайлов = Новый Массив;
СписокФайлов.Добавить("Файл1.xlsx");
СписокФайлов.Добавить("Файл2.xlsx");
СписокФайлов.Добавить("Файл3.xlsx");
СписокФайлов.Добавить("Файл4.xlsx");
СписокФайлов.Добавить("Файл5.xlsx");
СписокФайлов.Добавить("Файл6.xlsx");
СписокФайлов.Добавить("Файл7.xlsx");
СписокФайлов.Добавить("Файл8.xlsx");
СписокФайлов.Добавить("Файл9.xlsx");
СписокФайлов.Добавить("Файл10.xlsx");
Возврат СписокФайлов;
КонецФункции // ПолучитьСписокФайлов()
2. Указать соответствие колонок файла Excel и названия полей в функции ПолучитьСоответствиеПолей_НазваниеТаблицы:
&НаКлиенте
Функция ПолучитьСоответствиеПолей_НазваниеТаблицы()
СоответствиеПолей = Новый Соответствие;
СоответствиеПолей.Вставить(1, "Поле1");
СоответствиеПолей.Вставить(2, "Поле2");
СоответствиеПолей.Вставить(3, "Поле3");
СоответствиеПолей.Вставить(4, "Поле4");
СоответствиеПолей.Вставить(5, "Поле5");
СоответствиеПолей.Вставить(6, "Поле6");
Возврат СоответствиеПолей;
КонецФункции // ПолучитьСоответствие_НазваниеТаблицы()
3. Указать для каждого поля тип значения в таблице, чтоб в запрос попали типизированные данные, а не неограниченные строки/числа. Соответствие задаётся в функции ПолучитьСоответствиеТиповПолей_НазваниеТаблицы:
&НаКлиенте
Функция ПолучитьСоответствиеТиповПолей_НазваниеТаблицы()
СоответствиеПолей = Новый Соответствие;
СоответствиеПолей.Вставить("Поле1", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(150)));
СоответствиеПолей.Вставить("Поле2", Новый ОписаниеТипов("Дата"));
СоответствиеПолей.Вставить("Поле3", Новый ОписаниеТипов("Булево"));
СоответствиеПолей.Вставить("Поле4", Новый ОписаниеТипов("Число",,, Новый КвалификаторыЧисла(6, 0)));
СоответствиеПолей.Вставить("Поле5", Новый ОписаниеТипов("Число",,, Новый КвалификаторыЧисла(7, 2)));
СоответствиеПолей.Вставить("Поле6", Новый ОписаниеТипов("Число",,, Новый КвалификаторыЧисла(7, 2)));
Возврат СоответствиеПолей;
КонецФункции // ПолучитьСоответствиеПолей_НазваниеТаблицы()
4. Заменить строку "_НазваниеТаблицы" на название, описывающее Вашу решаемую задачу.
Как видно, действия для адаптации этого коды простые и понятные. Время на адаптацию кода минут 20 максимум!
Также этот код будет полезен новичкам/стажерам. Т.к. именно им часто приходится писать подобные загрузки в целях совершенствования навыков программирования.
На момент публикации в обработке более 300 строк структурированного кода. Обработка протестирована на реальных файлах и ошибок не содержит!
При наличии интереса к этой обработке сделаю такой же шаблон для чтения данных из файла Access. Разница в том, что чтение данных будет через ADO, и реализовано запросами.
Напомню ранее написанные статьи с общим названием "Ни в ЗУП ногой?! А мне нравится!":
1. Главные сложности решения, что отталкивает?
2. Плюсы решения, где они прячутся?
4. Главное - правильный перенос данных!
Статьи под общим названием "Как читать чужой код?":
Часть 1. Общие вопросы. Доработка чужого кода. Code review.
Часть 2. Доработка типовой конфигурации. Обновление доработанной типовой конфигурации.
Часть 3. Разбор и доработка запросов
Часть 4. Программный интерфейс. Исправление чужих доработок.
Отдельная статья про роль и значимость архитектора на проекте:
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.5.16.80