Загрузка номенклатуры с изображениями из многоуровневых файлов Excel
Учетные задачи - Логистика, склад и ТМЦ
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
В сети много разговоров о том, как загружать данные из многоуровневого листа экселя.
Самое тяжелое определить родителя, ибо в экселе в группировке нет родителя как такового
Во всяком случае, програмно его не получить. Можно получить только уровень элемента, а при неоднородной иерархии, когда родители и подпаки скачут как попало, обычным перебором не определить родителя текущего элемента, т.к. он может быть на несколько строк выше.
Нет смысла писать о всех возможных вариациях группировки в экселе.
У Евгения в Мегапрайсе есть некая функция определения родительской папки.
Как я понимаю, она работает так.
Цититую автора с его же слов
http://www.forum.mista.ru/topic.php?id=566936
делаешь ТЗ для заполнения
Две колонки Группа, Уровень С\читываем файл
Пока Стр для Каждого ляляля Следующий
Если Ляляля проблелов = 1 Тогда
ТЗ.Группа = Стр.Значение ТЗ. Уровень = 1
ИначеЕсли Пробелов ляляля = 2 Тогда
ТЗ.Группа = Стр.Значение ТЗ.Уровень = 2 и т.д.
КонецЦИкла.
ВерхняяГруппа = "";
Для Каждого Стр из ТЗ ЦИкл
Если Стр.Уровень = 1 Тогда ляляля найтигруппа
Не нашли создали
ВерхняяГруппа = СОзданнаяИлиНайденнаяГруппа
Если Уровень = 2 Тогда
лояляля - ищем.создаем
НайденнаяГруппа.РОдитель = ВерхняяГруппа;
ВерхняяГруппа = Найденнаягруппа.Ссылка;
и т.д. и т.п.
Но я, видимо, вконец непонятливый: единственное, что понял - то, что уровни надо указывать явно, а это не есть хорошо, т.к. заранее количество уровней вложенности нам неизвестно.
Поэтому пришлось написать свой алгоритм чтения многоуровневой иерархии из экселя с определением родителей.
Далее стоял вопрос, как считать из файла картинки, и тут, я, ни секунды не колеблясь, прибегнул к помощи Александра Шкураева
//infostart.ru/public/73687/
http://shkuraev.ru/?p=476
Его алгоритм позиционирования в таблице по координатам Shape-в очень интересен.
Ну и dll-ка его, с помощью которой можно энти Shape-ы (картинки) сохранить на диске.
После считывания картинок их надо сохранить в хранилище и тут я снова, не колеблясь ))) прибег к коду от Поручик-а
//infostart.ru/public/19932/
Хотя, положа руку на сердце, больше всего в разработке Поручика понравилось, как он dll-ку сохранил в виде двоичных данных в макете и при необходимости распаковывал в нужную папку.
Многое, конечно же, пришлось кодить самому и с нуля (особенно долго пришлось повозиться с определением родителя в экселевской группировке). Но, конечно же, если бы не "подсказки" вышеуказанных коллег, то работы было бы гораздо больше.
Поэтому, спасибо, друзья!
Итак, с гордостью представляю Вам моего франкенштейна, склепанного из моего кода с вкраплениями кода Саши Шкураева и Поручика.
Во вложенном архиве сама обработка, образец многоуровневого файла-прайса с картинками и внешняя компонента 1CGClipboard.dll (в сущности, она не нужна, т.к. лежит в обработке в макете).
Работа с обработкой очень проста.
1. Надо определиться, есть ли в нашем прайсе столбец с картинками и штрихкодами. В зависмости от этого надо проставить флажки "ИспользоватьШтрихКоды" и "ЗагружатьИзображения"
2. Далее надо указать номера столбцов и номер первой строки таблицы, с которой начинать считывать данные.
3. Потом надо выбрать каталог временного хранения изображений и группу номенклатуры, в которую будет подгружена новая
4. Выбираем файл таблицу. Если надо то можно выбрать лист таблицы (по умолчанию будет 1-й)
5. Нажимаем кнопку "Предварительный просмотр"
Ждем. Любуемся полученной таблицей "Товары" и ссылками на изображения во временном каталоге (их кстати, при необходимости, можно менять или добавлять прямо в таблице)
6. Нажимаем кнопку "Загрузить" и получаем всю номенклатуру с полным сохранением иерархии и изображениями
P.S. Само собой, все возможные виды группировок в экселе моя обработка не поддерживает, но я работал на самом рапространенном шаблоне. Работает на 8.1, но думаю, не стоит говорить, как в конфигураторе сконрвертить и в 8.2 / 8.3
Надеюсь моя работа поможет кому нибудь еще.
с уважением,
Джамал Абдусаламов
P.P.S 14.05.2015
Прошел год успешного пользования обработкой. Заметил небольшой косяк. Компонента 1CGClipboard.dll требует регистрации в системе что не всегда возможно, плюс она не работает на последних версиях мелкософтовского офиса.
поэтому порылся в сети и нашел способ сохранять средствами самого Excell-а.
Вкратце все выглядит так.
Картинки как и ранее мы находим методом Shape-ов
так же копируем их в clipboard методом Copy()
но затем не используем внешнюю компоненту а создаем внутри книги объект диаграмму затем Paste()-руем в нее наш рисунок и методом Export() выгружаем на диск
вот фрагменты кода
// СТАРЫЙ СПОСОБ СОХРАНЕНИЯ
//ИскомаяКартинка.Copy();
//Если ОчиститьОтНедопустимыхСимволов(СтрокаТЗ.Артикул) = "" Тогда
ИмяКартинки = КаталогКартинок + "\" + Новый УникальныйИдентификатор() + "_pic_" + СчетчикКартинок + ".jpg";
//Иначе
// ИмяКартинки = КаталогКартинок + "\" + ОчиститьОтНедопустимыхСимволов(СтрокаТЗ.Артикул) + "_pic_" + СчетчикКартинок + ".jpg";
//КонецЕсли;
//БуферОбмена.СохранитьИзБуфера(ИмяКартинки);
// ЛИБО ВОТ ЕЩЕ
//GraphicObject.ScaleHeight(1,1); // Истинный размер по высоте.
//GraphicObject.ScaleWidth(1,1); // Истинный размер по ширине.
//GraphicObject.Copy();
//Chart = EXCELApplication.ActiveSheet.ChartObjects().Add(0, 0, GraphicObject.Width, GraphicObject.Height).Chart();
//Chart.Paste();
//Chart.Export(ПолноеИмяФК);
//Chart = Неопределено;
// ИЛИ ЕЩЕ ИМ СЕЙЧАС ПОЛЬЗУЮСЬ НО ТРЕБУЕТ ДОПИЛА ПО ЧАСТИ ЗАКРЫТИЯ ДОКА БЕЗ СОХРАНЕНИЯ
//НЕ СТАЛ ЗАМОРАЧИВАТЬСЯ
//НУЖНО БЫЛО СРОЧНО ОДИН ПРАЙС ПОДРУЗИТЬ ПОТОМУ ПРОСТО ЗАГРУЗИЛ А ПОТОМ В ДИСПЕТЧЕРЕ ЗАДАЧ УДАЛИЛ
//ПРОЦЕСС EXCELL
//Ссылка на картинку
Картинка = ИскомаяКартинка;
// промежуточная книга для хранения диаграммы - контейнера картинки
Excel.Application.Workbooks.Add(1);
ИмяЛистаXLS = Excel.ActiveSheet.Name;
//Создание диаграммы, которая будет являться контейнером для картинки
//Расположение новой диаграммы - как объект на созданном ранее новом листе, являющемся в данный момент активным
//Размеры диаграммы слегка превышают размер картинки
ДиаграммаXLS = Excel.ActiveSheet.ChartObjects().Add(0, 0, Картинка.Width * 1.01, Картинка.Height * 1.01);
//Копирование картинки в буфер
Картинка.Copy();
//Заполняем диаграмму картинкой из буфера
ДиаграммаXLS.Chart.Paste();
//Сохраняем диаграмму во временном файле
ДиаграммаXLS.Chart.Export(ИмяКартинки);
ДиаграммаXLS = Неопределено;
В общем, дерзайте.
Эту обработку уже взял на вооружение StalkerAkella в //infostart.ru/public/343876/
Вступайте в нашу телеграмм-группу Инфостарт
См. также
39141 руб.
21.04.2017 113519 212 44
17284 руб.
26.04.2016 688134 1573 669
5490 руб.
12.08.2021 48468 654 71
6649 руб.
09.01.2024 22168 229 30
6000 руб.
11.12.2019 68059 1163 3
89900 руб.
09.06.2020 58317 47 60
12444 руб.
29.10.2014 237910 777 544
6000 руб.
26.11.2020 51294 865 4