|
Конвертация Данных. Перенос Изображения Номенклатуры | ☑ | ||
---|---|---|---|---|
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) Меня просто смутила фраза "Итак в ПКО Номенклатуры в обработчике После выгрузки пишу:". Поэтому и спросил.
Я рад что у вас все получилось. Хороших выходных ... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |