Имя: Пароль:
1C
1С v8
Конвертация Данных. Перенос Изображения Номенклатуры
, ,
0 AndreyBorovkov
 
25.12.13
11:57
Здравствуйте всем! Стоит задача перенести справочник номенклатура из УТ в УНФ. Переношу с помощью КД. Все ясно кроме одного момента. Как перенести ОсновноеИзображение номенклатуры с помощью КД если в УТ - реквизит ОсновноеИзображение имеет тип хранилище значений а в УНФ - это справочник файлы. Может кто сталкивался подскажите будьте добры..
1 vicof
 
25.12.13
11:59
Упакуй файл из справочника в хранилище.
2 AndreyBorovkov
 
25.12.13
12:03
(1) Пожалуйста поподробней)
3 vicof
 
25.12.13
12:08
Тебе надо привести твой файл к типу ХранилищеЗначения.
Я не знаю, как там в УНФ, скорей всего тоже хранилище.
Перед выгрузкой изображения пишешь:
Значение = Источник.ТвойФайл.РеквизитХранилище;
Ну или как там у тебя в УНФ добраться до реквизита, который этот файл содержит.
4 cw014
 
25.12.13
12:10
У него из хранилища в справочник нужно передать

В значение передавай структуру, вызывай правило, которое загрузить по этой структуре справочник
5 AndreyBorovkov
 
25.12.13
12:11
(3)
В УТ - это реквизит, тип "ХранилищеЗначений"
В УНФ - это реквизит, тип справочник "файлы"

Я переношу из УТ в УНФ. Может наоборот всетаки?
6 vicof
 
25.12.13
12:14
(4)(5) А ну да, наоборот. невнимательно прочитал.
7 AndreyBorovkov
 
25.12.13
12:14
(4) Пожалуйста напишите как для чайника, буду очень благодарен!!
8 Поpyчик-4
 
25.12.13
12:16
(0) Я бы кодировал изображение в УТ в формат base64 и передавал в УНФ в параметрах объекта. При загрузке объекта в УНФ раскодировать данные и записывать в справочник файлы или что там в УНФ.
9 cw014
 
25.12.13
12:19
(7) 1.Сделай правило для справочника "Файлы" без источника, укажи реквизиты
2. В ПКО "ОсновноеИзображение" перед выгрузкой пиши:
Значение = Новый Структура(ТутПеречисляйРеквизитыИНеЗабудьОсновноеИзображение,Тут,Перечисляй,Значения,Реквизитов,Не,Забудь,Основное,Изображение...);
ПКО укажи свое правило в 1
10 AndreyBorovkov
 
25.12.13
12:25
(9)  в п.2 Вы имели ввиду ПКС ОсновноеИзображение ?
11 cw014
 
25.12.13
12:25
(10) Да, ошибся
12 AndreyBorovkov
 
25.12.13
12:27
(11) спасибо большое , буду пробовать)
13 Kvestin
 
25.12.13
13:00
Я бы делал так:
- перегнал исходное Хранилище значений в Base64 строку, которую можно безболезненно передавать как текст
- при загрузке конвертировал это строку обратно в файл

Далее надо в соответствующей подсистеме УНФ смотреть, что надо подать на вход процедуре, чтобы она закинула файл туда куда нужно и привязала его к нужному объекту (там их несколько есть).
В простейшем случае, можно самому сделать элемент справочника Файл, но это не лучший вариант, т.к. организация хранения может поменяться (хранили в конфигурации а потом решили в томах) и ваш код перестанет работать.
Лучше просмотреть экспортные процедуры подсистемы Файлы и использовать именно их после загрузки самого элемента номенклатуры.
14 cw014
 
25.12.13
13:03
(13) Видимо с КД ты не работал
15 Поpyчик-4
 
25.12.13
13:09
(14) Я с КД2 работаю с 2007 года, но  сделал бы так же, с использованием процедур БСП
16 AndreyBorovkov
 
25.12.13
14:13
(13)
Функция ДобавитьФайл(
Знач ВладелецФайлов,
Знач ИмяБезРасширения,
Знач РасширениеБезТочки = Неопределено,
Знач ВремяИзменения = Неопределено,
Знач ВремяИзмененияУниверсальное = Неопределено,
Знач АдресФайлаВоВременномХранилище,
Знач АдресВременногоХранилищаТекста = "",
Знач Описание = "",
Знач НоваяСсылкаНаФайл = Неопределено) Экспорт

Вот в эту функцию ?
17 Necessitudo
 
25.12.13
14:18
А синхронизацию данных как делать?
18 Kvestin
 
25.12.13
14:23
(14) На правилах КД у меня работат все переносы (между ЗУП, УПП, УТ и БУ + самописная на БСП).
Чтобы понять как работать с КД, необходимо просмотреть всю логику работы универсальной загрузки XML (что я и сделал в свое время).
Все остальное - это гадание на галочках в правилах без понимания как все это обрабатывается изнутри.
19 AndreyBorovkov
 
25.12.13
14:28
(18) Вы не могли бы подробней описать как сделать перенос?
Я думаю это пригодится для других.
Как преобразовывать и в какую процедуру задействовать?
20 Kvestin
 
25.12.13
15:17
(19)
У меня нет под рукой УНФ, и я не помню, как именно там привязывается изображение к номенклатуре. Т.е. там именно реквизит с типом СправочникСсылка.Файлы или просто список файлов привязанных в элементу справочника Номенклатуры через владельца.
Исходя из этого будет понятно как искать этот присоединенный файл в справочнике УНФ (т.к. никакого GUIDа при выгрузке у вас нет).

Далее необходимо создать ПКО для конвертации из хранилища значений в СправочникСсылка.Файлы. В это правило добавляем параметр [Base64] и ставим галку [Получать из входящих данных].Далее перед выгрузкой пишем:
//Получение данных
Попытка
    мДв              = Источник.Хранилище.Получить().ПолучитьДвоичныеДанные();
    мСтрока64         = Base64Строка(мДв);
    
    ВходящиеДанные.Вставить("Base64"            , мСтрока64);
Исключение
    Отказ = Истина;
    //ВызватьИсключение "Ошибка определения двоичных данных картинки контактного лица ";
КонецПопытки;

Таким образом, мы получим при загрузке сам файл в виде строки.
Далее надо настроить поиск этого самого файла в справочнике Файлы.
После этого при загрузке возможны 2 варианта:
- нашли файл и его надо обновить
- файл к номенклатуре не привязан и надо его добавить

Чтобы не гадать. Я запустил бы мониторинг производительности и сделал бы обе эти операции в УНФ "руками". Протом проанализировал какие функции используются в том или ином случае.
Результат анализа написал бы в После загрузки ПКО.
Как пример вот кусок кода в ПКО для переноса УТ => РАРУС CRM (писал напарник):

//Просто помещение картинки, определение реквизитов
//мBase64                         = ПараметрыОбъекта.Получить("Base64");
//мДв                                = Base64Значение(мBase64);//Двоичные данные
//мКартинка                        = Новый Картинка(мДв);
//мИзвлеченныйТекст                 = "";
//СтатусИзвлеченияТекста             = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен;
////-->
//Объект.Расширение                = ПараметрыОбъекта.Получить("РасширениеФайла");
//Объект.СтатусИзвлеченияТекста     = СтатусИзвлеченияТекста;
//Объект.ТекстХранилище             = Новый ХранилищеЗначения(мИзвлеченныйТекст);

//мТипХраненияФайла                = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе;
//Объект.ФайлХранилище            = Новый ХранилищеЗначения(мКартинка, Новый СжатиеДанных(9));
//Объект.ДатаСоздания                = ТекущаяДата();
//Запись в объект

мЕстьФайлы     = Ложь;
Фильтр         = НСтр("ru = 'Все картинки (*.bmp;*.gif;*.png;*.jpeg;*.dib;*.rle;*.tif;*.jpg;*.ico;*.wmf;*.emf)|*.bmp;*.gif;*.png;*.jpeg;*.dib;*.rle;*.tif;*.jpg;*.ico;*.wmf;*.emf"
+ "|Формат bmp(*.bmp*;*.dib;*.rle)|*.bmp;*.dib;*.rle"
+ "|Формат GIF(*.gif*)|*.gif"
+ "|Формат JPEG(*.jpeg;*.jpg)|*.jpeg;*.jpg"
+ "|Формат PNG(*.png*)|*.png"
+ "|Формат TIFF(*.tif)|*.tif"
+ "|Формат icon(*.ico)|*.ico"
+ "|Формат метафайл(*.wmf;*.emf)|*.wmf;*.emf'");
Если ЗначениеЗаполнено(Объект.ВладелецФайла) Тогда
    мЕстьФайлы = ПрисоединенныеФайлы.CRM_ОбъектИмеетФайлыСФильтромПоРасширению(Объект.ВладелецФайла.Ссылка, Фильтр);
КонецЕсли;
мОшибка         = Ложь;
мТекстОшибки     = "";
Если Не мЕстьФайлы Тогда
    Попытка
        Если ЗначениеЗаполнено(Объект.ВладелецФайла) Тогда
            //Добавим файл и пропишем его путь
            мBase64             = ПараметрыОбъекта.Получить("Base64");
            мРасширениеФайла    = ПараметрыОбъекта.Получить("РасширениеФайла");
            мДв                    = Base64Значение(мBase64);//Двоичные данные
            мВремяИзменения     = ТекущаяДата();
            СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен;
            ИзвлеченныйТекст = "";
            
            //0. Поместим файл во временное хранилище
            АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(мДв);
            
            
            //I. Добавление файла
            мПрисоединенныйФайл = ПрисоединенныеФайлы.ДобавитьФайл(
            Объект.ВладелецФайла.Ссылка,
            Объект.Наименование,
            мРасширениеФайла,
            мВремяИзменения,
            Неопределено,
            АдресФайлаВоВременномХранилище,
            "");
            //todo непонятно как в этом всем фигурируют наши двоичные данные
            Если мПрисоединенныйФайл = Неопределено Тогда
            Иначе
                //II. Заполнение информации о файле
                Объект.ПутьКФайлу                 = мПрисоединенныйФайл.ПутьКФайлу;
                Объект.Том                      = мПрисоединенныйФайл.Том;
                Объект.Размер                      = мПрисоединенныйФайл.Размер;
                Объект.Расширение                  = мПрисоединенныйФайл.Расширение;
                Объект.ТипХраненияФайла          = мПрисоединенныйФайл.ТипХраненияФайла;
                Объект.СтатусИзвлеченияТекста     = СтатусИзвлеченияТекста;
                Объект.ТекстХранилище             = Новый ХранилищеЗначения(ИзвлеченныйТекст);
            КонецЕсли;
        КонецЕсли;    
    Исключение
        ВызватьИсключение "Ошибка обработки загруженной фотографии контактного лица"+ОписаниеОшибки();
    КонецПопытки;
КонецЕсли;
21 Kvestin
 
25.12.13
15:20
(19) Обратите внимание:
- в БСП две подсистемы работы с файлами (в УНФ скорее всего тоже). Одна подразумевает версионирование, а вторая нет. Модули для добавления у них различные.
- обязательно протестируйте вариант добавление новой номенклатуры с новым файлом, т.к. в этом случае вам надо добавить элемент в справочник Файлы с владельцем (элемент спаравочника Номенклатура), который еще не записана (и фактически ссылки у вас еще нет).
22 AndreyBorovkov
 
25.12.13
16:35
(21) Большое спасибо, все становится немного яснее
23 AndreyBorovkov
 
27.12.13
16:42
Итак в ПКО Номенклатуры в обработчике После выгрузки пишу:
    Если ПараметрыОбъекта <> Неопределено Тогда    
    мBase64 = ПараметрыОбъекта.Получить("Base64");
    мДв = Base64Значение(мBase64);//Двоичные данные
    ВладелецФайла = Ссылка;
    АдресВременногоХранилищаФайла = ПоместитьВоВременноеХранилище(мДв);
    ИмяБезРасширения = "ФотоНоменклатуры";
    РасширениеБезТочки = "jpg";
    ВремяИзменения = ТекущаяДата();
    ВремяИзмененияУниверсальное = ТекущаяДата();
    Размер = 100;
    АдресВременногоХранилищаТекста = "";
        
    ЭтоВебКлиент = Ложь;
    Пользователь = Неопределено;
    Комментарий = "";
    ЗаписатьВИсторию = Ложь;
    Кодировка = Неопределено;
    ///////////////////////////////////Функция из БСП    
        ЭлементФайл = FileOperationsServerCall.CreateFileWithVersion(
        ВладелецФайла,
        ИмяБезРасширения,
        РасширениеБезТочки,
        ВремяИзменения,
        ВремяИзмененияУниверсальное,
        Размер,
        АдресВременногоХранилищаФайла,
        АдресВременногоХранилищаТекста,
        False); // this is not web client
    КонецЕсли;
      Отказ = Истина;


Вся номенклатура сначала загружена без картинок, то есть она существует в базе. При попытке загрузить её уже с картинками  выскакивает ошибка при записи номенклатуры как бы объект(номенклатура) несоответвует (изменен)("операция не может быть выполнена из-за несоответствия версии") , оно ясно что он изменен в той функции из бсп, но я же в конце пишу отказ . почему все равно производится попытка записи.
24 AndreyBorovkov
 
27.12.13
16:48
Кстате для этого первого элемента на котором и выскакивает ошибка перегрузилось фото и подставилось как мне надо. Как мне обойти эту ошибку что б номенклатуру не записывало?
25 AndreyBorovkov
 
27.12.13
17:29
Kvestin, на Вас надежда))..
26 Kvestin
 
27.12.13
18:26
Почему используете обработчик ПослеВыгрузки?
Нужно использовать [ПередВыгрузкой] для формирования Base64 строки и [ПослеЗАГРУЗКИ] для добавления изображения на этапе загрузки.
27 Kvestin
 
27.12.13
18:51
(23) "оно ясно что он изменен в той функции из бсп" - не совсем понимаю зачем эта функция должна записывать номенклатуру переданную по ссылке в [ВладелецФайла].
28 AndreyBorovkov
 
27.12.13
19:02
(26) Я "Перед выгрузкой" сделал как вы говорили. И на "Перед загрузкой" получил двоичные данные все как положено.

В общем с задачей справился, благодаря Вам! Создал с помощью конвертации элементы справочника "файлы", и отделно обработкой привязал их к номенклатуре! Все получилось! Еще раз спасибо Вам большое, без Вас я б к этому решению не пришол бы сам..
29 Kvestin
 
27.12.13
19:05
(28) Меня просто смутила фраза "Итак в ПКО Номенклатуры в обработчике После выгрузки пишу:". Поэтому и спросил.
Я рад что у вас все получилось. Хороших выходных ...
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.