Версия для печати темы (https://pro1c.org.ua/index.php?s=5e5d50924a2ce650b053dc0b33ac4b40&showtopic=12548)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Выгрузка изображений с иерархией групп

Автор: bereznoy 22.05.13, 20:47

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

Если СокрЛП(КаталогИзображений)="" Тогда
        Предупреждение("Выберите каталог для сохранения файлов.");
        Возврат;
    КонецЕсли;
    СоздатьКаталог(КаталогИзображений);
    Запрос=Новый Запрос("
    |ВЫБРАТЬ
    |    Объект КАК Номенклатура,
    |    Объект.Код КАК Код,
    |    Хранилище,
    |    ВЫБОР КОГДА Объект.ОсновноеИзображение=Ссылка ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК ЭтоОсновное
    |ИЗ
    |    Справочник.ХранилищеДополнительнойИнформации
    |ГДЕ
    |    Объект ССЫЛКА Справочник.Номенклатура
    |УПОРЯДОЧИТЬ ПО Объект");
    Выборка=Запрос.Выполнить().Выбрать();
    ФормаПроцесса=ПолучитьФорму("ФормаПроцесса");
    ФормаПроцесса.Заголовок="Выполняется выгрузка...";
    Всего=Выборка.Количество();
    ФормаПроцесса.ЭлементыФормы.ИндикаторПроцесса.МаксимальноеЗначение=Всего;
    н=0;
    СчДопИзображений=0;
    ПоследняяНоменклатура=Неопределено;
    ФормаПроцесса.Открыть();
    Пока Выборка.Следующий() Цикл
        
        ОбработкаПрерыванияПользователя();
        н=н+1;
        Если н=1 ИЛИ Цел(н/10)=н/10 ИЛИ н=Всего Тогда
            ФормаПроцесса.ЭлементыФормы.ИндикаторПроцесса.Значение=н;
            ФормаПроцесса.ЭлементыФормы.ТекущийЭлемент.Заголовок=Выборка.Номенклатура;
        КонецЕсли;
        
        Если ТолькоОсновныеИзображения И НЕ Выборка.ЭтоОсновное Тогда
            Продолжить;
        КонецЕсли;
        Если НЕ Выборка.ЭтоОсновное Тогда
            Если ПоследняяНоменклатура<>Выборка.Номенклатура Тогда
                СчДопИзображений=1;
            Иначе
                СчДопИзображений=СчДопИзображений+1;
            КонецЕсли;
            ПоследняяНоменклатура=Выборка.Номенклатура;
        КонецЕсли;
        ИмяФайла=СокрЛП(Выборка.Код)+?(Выборка.ЭтоОсновное,"","("+СчДопИзображений+")")+РасширениеФайлов;
        Файл=Выборка.Хранилище.Получить();
        Если Файл<>Неопределено Тогда
            Файл.Записать(КаталогИзображений+"\"+ИмяФайла);
            Сообщить("Записан файл: "+ИмяФайла,СтатусСообщения.Информация);
        Иначе
            Сообщить("Изображение отсутствует в хранилище! "+Выборка.Номенклатура,СтатусСообщения.Внимание);
        КонецЕсли;
        
    КонецЦикла;
    ФормаПроцесса.Закрыть();

Автор: Vofka 22.05.13, 20:58

Возможности проверить нет, так что инфа не 100%. В запрос вставьте строку

|ИТОГИ ПО
|   Номенклатура ИЕРАРХИЯ

Автор: bereznoy 22.05.13, 21:06

Цитата(Vofka @ 22.05.13, 21:58) *
Возможности проверить нет, так что инфа не 100%. В запрос вставьте строку
|ИТОГИ ПО
|   Номенклатура ИЕРАРХИЯ

В запросе ладно получу я группу, а дальше как создать именно по иерархии каталоги на локальном диске, подозреваю что "СоздатьКаталог()", но как что именно что б было папка в нудной папке и потом по ним раскидать фотографии, ну тут тоже думаю вот так надо "КопироватьФайл(<Имя файла источника>, <Имя файла приемника>) ", но прошу помощи

Автор: Vofka 22.05.13, 21:25

bereznoy, я сейчас отвечу на новый вопрос, вы напишете "ну ладно, это сделаю, а дальше вот мне ещё надо..."?

Автор: bereznoy 22.05.13, 21:43

Цитата(Vofka @ 22.05.13, 22:25) *
bereznoy, я сейчас отвечу на новый вопрос, вы напишете "ну ладно, это сделаю, а дальше вот мне ещё надо..."?

Какой новый, ключевой вопрос выгрузка каталогов на локальный диск таких же как в номенклатуре, получить группы из запроса думаю это не составит труда и сделать обход результата даже для начинающего как я, вопрос прежний и он озвучен в заголовке темы

Автор: bereznoy 22.05.13, 22:43

Вот так выгружает все папки общим списком, как сделать что б выгружалось как в иерархии (в папке подпака и т.д.)

    З = Новый Запрос;
    З.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Наименование КАК Наименование
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.ЭтоГруппа = ИСТИНА";

    Каталоги = З.Выполнить();
    Папки = Каталоги.Выбрать();
    Пока Папки.Следующий() Цикл
        Если Папки.Группа = Истина Тогда
            
                    КаталогНаДиске = Новый Файл(Папки.Наименование);
                    Если НЕ КаталогНаДиске.Существует() Тогда
                                                                     СоздатьКаталог(Папки.Наименование);
                    КонецЕсли;

        КонецЕсли;
    КонецЦикла;

Автор: Vofka 23.05.13, 7:54

Цитата(bereznoy @ 22.05.13, 22:43) *
ключевой вопрос выгрузка каталогов на локальный диск таких же как в номенклатуре

Да вы что? А выше про это где сказано?

Автор: bereznoy 23.05.13, 8:58

Цитата(bereznoy @ 22.05.13, 20:47) *
Есть выгрузка изображений из номенклатуры, выгружается общим списком, подскажите как можно сделать что б выгрузка была с папками, т.е. иерархию сохранить
Вот выгрузка сплошняком


Спасибо за ап, форумчане, те кто умеет читать, подскажите плиз, может кто уже так делал или идея есть

Автор: bereznoy 23.05.13, 21:42

Все сделал, конечно знаю что некорректно, долго выполняется, медленно, но делает то что мне надо, пока так выкрутился, если у кого то появятся оптимизирующие советы, подскажите icon_beer17.gif

Если СокрЛП(КаталогИзображений)="" Тогда
        Предупреждение("Выберите каталог для сохранения файлов.");
        Возврат;
    КонецЕсли;
    //СоздатьКаталог(КаталогИзображений);
    Запрос=Новый Запрос("ВЫБРАТЬ
                        |    ХранилищеДополнительнойИнформации.Объект КАК Номенклатура,
                        |    ХранилищеДополнительнойИнформации.Объект.Артикул КАК Код,
                        |    ХранилищеДополнительнойИнформации.Хранилище,
                        |    ВЫБОР
                        |        КОГДА ХранилищеДополнительнойИнформации.Объект.ОсновноеИзображение = ХранилищеДополнительнойИнформации.Ссылка
                        |            ТОГДА ИСТИНА
                        |        ИНАЧЕ ЛОЖЬ
                        |    КОНЕЦ КАК ЭтоОсновное,
                        |    ХранилищеДополнительнойИнформации.Объект.Ссылка КАК Тов
                        |ИЗ
                        |    Справочник.ХранилищеДополнительнойИнформации КАК ХранилищеДополнительнойИнформации
                        |ГДЕ
                        |    ХранилищеДополнительнойИнформации.Объект ССЫЛКА Справочник.Номенклатура
                        |
                        |УПОРЯДОЧИТЬ ПО
                        |    ХранилищеДополнительнойИнформации.Объект");
    Карт=Запрос.Выполнить();
/////////////////////////////////////////////////////////////////////////////////////////////    
    З = Новый Запрос;
    З.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка КАК Папка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.ЭтоГруппа = ИСТИНА";

    Каталоги = З.Выполнить();
    Папки = Каталоги.Выбрать();
    Пока Папки.Следующий() Цикл
        Если ЗначениеЗаполнено(Папки.Папка.Родитель)=0 Тогда
            //Корень
            КаталогНаДиске0 = Новый Файл(КаталогИзображений+"\"+СокрЛП(Папки.Папка.Наименование));
            Если НЕ КаталогНаДиске0.Существует() Тогда
                СоздатьКаталог(КаталогИзображений+"\"+СокрЛП(Папки.Папка.Наименование));
                //Загружаем картинки
                СчДопИзображений=0;
                ПоследняяНоменклатура=Неопределено;

                Изображение = Карт.Выбрать();
                Пока Изображение.Следующий() Цикл
                    Если Изображение.Тов.Родитель = Папки.Папка Тогда
                                                             
                                Если ТолькоОсновныеИзображения И НЕ Изображение.ЭтоОсновное Тогда
                                    Продолжить;
                                КонецЕсли;
                                Если НЕ Изображение.ЭтоОсновное Тогда
                                    Если ПоследняяНоменклатура<>Изображение.Номенклатура Тогда
                                        СчДопИзображений=1;
                                    Иначе
                                        СчДопИзображений=СчДопИзображений+1;
                                    КонецЕсли;
                                    ПоследняяНоменклатура=Изображение.Номенклатура;
                                КонецЕсли;
                                ИмяФайла=СокрЛП(Изображение.Код)+?(Изображение.ЭтоОсновное,"","("+СчДопИзображений+")")+РасширениеФайлов;
                                Файл=Изображение.Хранилище.Получить();
                                Если Файл<>Неопределено Тогда
                                    Файл.Записать(КаталогИзображений+"\"+СокрЛП(Папки.Папка.Наименование)+"\"+ИмяФайла);
                                Иначе
                                    Сообщить("Изображение отсутствует в хранилище! "+Изображение.Номенклатура,СтатусСообщения.Внимание);
                                КонецЕсли;
                            
                    КонецЕсли;
                КонецЦикла;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Папки1 = Каталоги.Выбрать();
    Пока Папки1.Следующий() Цикл
        Если ЗначениеЗаполнено(Папки1.Папка.Родитель)=1 И ЗначениеЗаполнено(Папки1.Папка.Родитель.Родитель)=0 Тогда
            //Первый уровень
            КаталогНаДиске1 = Новый Файл(КаталогИзображений+"\"+СокрЛП(Папки1.Папка.Родитель)+"\"+СокрЛП(Папки1.Папка.Наименование));
            Если НЕ КаталогНаДиске1.Существует() Тогда
                СоздатьКаталог(КаталогИзображений+"\"+СокрЛП(Папки1.Папка.Родитель)+"\"+СокрЛП(Папки1.Папка.Наименование));
                //Загружаем картинки
                СчДопИзображений=0;
                ПоследняяНоменклатура=Неопределено;

                Изображение1 = Карт.Выбрать();
                Пока Изображение1.Следующий() Цикл
                    Если Изображение1.Тов.Родитель = Папки1.Папка Тогда
                                                             
                                Если ТолькоОсновныеИзображения И НЕ Изображение1.ЭтоОсновное Тогда
                                    Продолжить;
                                КонецЕсли;
                                Если НЕ Изображение1.ЭтоОсновное Тогда
                                    Если ПоследняяНоменклатура<>Изображение1.Номенклатура Тогда
                                        СчДопИзображений=1;
                                    Иначе
                                        СчДопИзображений=СчДопИзображений+1;
                                    КонецЕсли;
                                    ПоследняяНоменклатура=Изображение1.Номенклатура;
                                КонецЕсли;
                                ИмяФайла=СокрЛП(Изображение1.Код)+?(Изображение1.ЭтоОсновное,"","("+СчДопИзображений+")")+РасширениеФайлов;
                                Файл=Изображение1.Хранилище.Получить();
                                Если Файл<>Неопределено Тогда
                                    Файл.Записать(КаталогИзображений+"\"+СокрЛП(Папки1.Папка.Родитель)+"\"+СокрЛП(Папки1.Папка.Наименование)+"\"+ИмяФайла);
                                Иначе
                                    Сообщить("Изображение отсутствует в хранилище! "+Изображение1.Номенклатура,СтатусСообщения.Внимание);
                                КонецЕсли;
                            
                    КонецЕсли;
                КонецЦикла;

            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Папки2 = Каталоги.Выбрать();
    Пока Папки2.Следующий() Цикл
        Если ЗначениеЗаполнено(Папки2.Папка.Родитель.Родитель)=1  Тогда
            //Второй уровень
            КаталогНаДиске2 = Новый Файл(КаталогИзображений+"\"+СокрЛП(Папки2.Папка.Родитель.Родитель.Наименование)+"\"+СокрЛП(Папки2.Папка.Родитель.Наименование)+"\"+СокрЛП(Папки2.Папка.Наименование));
            Если НЕ КаталогНаДиске2.Существует() Тогда
                СоздатьКаталог(КаталогИзображений+"\"+СокрЛП(Папки2.Папка.Родитель.Родитель.Наименование)+"\"+СокрЛП(Папки2.Папка.Родитель.Наименование)+"\"+СокрЛП(Папки2.Папка.Наименование));
                //Загружаем картинки
                СчДопИзображений=0;
                ПоследняяНоменклатура=Неопределено;

                Изображение2 = Карт.Выбрать();
                Пока Изображение2.Следующий() Цикл
                    Если Изображение2.Тов.Родитель = Папки2.Папка Тогда
                                                             
                                Если ТолькоОсновныеИзображения И НЕ Изображение2.ЭтоОсновное Тогда
                                    Продолжить;
                                КонецЕсли;
                                Если НЕ Изображение2.ЭтоОсновное Тогда
                                    Если ПоследняяНоменклатура<>Изображение2.Номенклатура Тогда
                                        СчДопИзображений=1;
                                    Иначе
                                        СчДопИзображений=СчДопИзображений+1;
                                    КонецЕсли;
                                    ПоследняяНоменклатура=Изображение2.Номенклатура;
                                КонецЕсли;
                                ИмяФайла=СокрЛП(Изображение2.Код)+?(Изображение2.ЭтоОсновное,"","("+СчДопИзображений+")")+РасширениеФайлов;
                                Файл=Изображение2.Хранилище.Получить();
                                Если Файл<>Неопределено Тогда
                                    Файл.Записать(КаталогИзображений+"\"+СокрЛП(Папки2.Папка.Родитель.Родитель.Наименование)+"\"+СокрЛП(Папки2.Папка.Родитель.Наименование)+"\"+СокрЛП(Папки2.Папка.Наименование)+"\"+ИмяФайла);
                                Иначе
                                    Сообщить("Изображение отсутствует в хранилище! "+Изображение2.Номенклатура,СтатусСообщения.Внимание);
                                КонецЕсли;
                            
                    КонецЕсли;
                КонецЦикла;

            КонецЕсли;
        КонецЕсли;
    КонецЦикла;

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua