Достаточно хорошо известны различные способы загрузки данных из MS Excel 97-2010, а именно - COM-соединение, ADO, COMSafeArray и прочие извраты; но почти все их реализации для 1С совпадают в одном. Из 1С указывается, какой файл и лист(ы) интересуют пользователя, после чего выполняется некий явный или скрытый вызов, обращение, читающее данные в 1С. В ряде случаев уже на стороне 1С предполагается разбирательство с прочитанными данными, их дальнейшая обработка и анализ.
Но что, если пользователю сложно/неинтересно копаться в наворотах обработки-загрузчика на стороне 1С? Или если у вас нет времени делать такие навороты с прочитанными данными, а пользователь прекрасно владеет экселем, умеет сам ставить там нужные отборы? Если пользователь в принципе хочет определить множество данных, подлежащих загрузке в 1С, на стороне экселя и чисто его средствами?
Оговорюсь, речь не идёт о копипасте простой области в mxl, откуда уже можно прочитать. Там, знаете ли, и формулы могут оказаться, и жуткие объединённые ячейки, и вообще размер области иной раз такой, что копипастится десятки минут.
Предоставим такую возможность "по месту открытия файла". В самом деле, гораздо проще в экселе выяснить, что надо грузить, чем долго извращаться, вырезать в отдельные файлы, копипастить или всяко фильтровать в 1С. Пусть пользователь так или иначе выделит область, которая ему нужна, прочитает в 1С и повторит эту итерацию сколько надо раз подряд. В итоге на стороне 1С получится или таблица, состоящая только из нужных кусков-выделений (так сделано в приложенной обработке), или несколько таблиц, по одной на каждую выделенную область (это уже вопрос реализации на 1С и оставляется на откуп коллегам). Принцип прост - вместо того, чтобы закупить весь ассортимент магазина и дома разбираться, что из этого надо, идите и купите только нужное вам.
Важно: вы можете использовать любой отбор, отфильтровать данные и просто выделить их. Отбор по значению, цвету, шрифту - всё к вашим услугам. Потом выделяете получившееся, мышкой или клавиатурой, и нажимаете спецкнопку - и все данные уже в 1С именно согласно отбору. См. картинки с 4 по 7.
Обновление: добавлена возможность указать конкретные колонки-приёмники в 1С, и сопоставить им столбцы в экселе. Если задействован этот режим (указана хоть одна колонка), читаются только данные из сопоставленных столбцов (т.е. Select F1..FN, а не Select *). См. картинки 8 и 9.
Техническая реализация:
1. Обработка 1С запускает com-соединение экселя с указанным файлом, добавляя в код проекта свой модуль и процедуры обработки событий, в инструментальную панель свои кнопки, и цепляя подписки на штатные события экселя;
2. Нажатие кнопки чтения выделенного фрагмента вызывает событие, перехватываемое обработкой 1С, где и происходит считывание средствами ADO. Считываются все ячейки выделенного фрагмента, их значения приводятся к строковым (IMEX=1), хотя можно и более внимательно рассмативать типы. Условий в запросе ADO нет.
3. Все считываемые данные вносятся в единую таблицу значений согласно их абсолютным адресам в исходном файле. Нумерация строк и колонок таблицы идёт с разрывами, таблица содержит только прочитанное (без пустот между ними). Если используется чтение по колонкам, читаются только данные из столбцов, сопоставленных колонкам 1С.
4. В коде в закомментированном виде есть возможность кнопки чтения всех данных текущего листа целиком.
5. Попытка сохранения изменений заблокирована, чтобы всё добавленное в п.1 не сохранилось навечно (принудительную удалялку добавленных фич я не писал, но это несложно сделать). Попытка закрытия перехватывается 1С.
6. Всё вышеперечисленное возможно при наличии доступа к VB IDE, что проверяется в реестре и, при необходимости и наличии прав у пользователя, может включаться/выключаться.
Далее заполнения таблицы значений ничего не делал - т.к. публикация рассчитана на разработчиков, то думаю, коллеги, все сами смогут распорядиться прочитанными данными по своему усмотрению.
Собственно, можно обойтись и без ADO, это мне захотелось так сделать; на идее реализации способ чтения не сказывается.
UPD: сделана версия для УФ 8.3 с учётом модной нынче немодальности.
Кто найдёт баги - сообщайте, буду оперативно дорабатывать.
p.s. А всё просто потому, что мне поставили задачу "загрузить из экселя", брать готовую (свою или чужую) выходило громоздко, а писать в сотый раз одни и те же баяны уже не было сил. Вот и захотелось извратиться)))