|
КД 2.1. Выгрузить из 1С 7.7 идентификатор объекта | ☑ | ||
---|---|---|---|---|
0
zelenprog
25.01.24
✎
15:52
|
Добрый день!
Есть такая задача. Из источника (7.7) в приемник (8.3) надо перенести справочник с помощью "Конвертации данных" 2.1. При первой загрузке в 8.3 нужно запомнить соответствие между объектом источника и объектом приемника в специальном регистре сведений и при повторных загрузках искать не по полям поиска, а по этому соответствию. Для этого в приемнике был создан регистр сведений "СоответствиеИДОбмена" с реквизитами "ID77", "Ссылка" (или "GUID"). Для получения ID-шника источника используется функция 7.7 "ЗначениеВСтрокуВнутр()". Как это все реализовать в "Конвертации данных"? Самый первый вопрос - как при выгрузке записать в выгружаемый XML-файл ID-шники для каждого элемента справочника? Подскажите, пожалуйста. |
|||
1
Djelf
25.01.24
✎
16:08
|
Можно так сделать:
//{ ============= Конвертация ссылок 1С:77 1С:83 =============================== Функция глПолучитьСсылку83(Объект77,ПредставлениеСсылки) Экспорт ТипСсылки83 = СоздатьОбъект("Справочник.ТипСсылки83"); Если ТипСсылки83.НайтиПоНаименованию(ПредставлениеСсылки)=0 Тогда ТипСсылки83.Новый(); ТипСсылки83.Наименование = ПредставлениеСсылки; ТипСсылки83.Записать(); КонецЕсли; Ссылка77 = глМДВ.ЗначениеВСамуюДлиннуюСтрокуБД(Объект77); Ссылки83 = СоздатьОбъект("Справочник.Ссылки83"); Ссылки83.ИспользоватьВладельца(ТипСсылки83.ТекущийЭлемент()); Если Ссылки83.НайтиПоРеквизиту("Ссылка77",Ссылка77,0)=0 Тогда Ссылки83.Новый(); Ссылки83.Владелец = ТипСсылки83; Ссылки83.Ссылка77 = Ссылка77; Ссылки83.Ссылка83 = Сред(Сервис.ПолучитьGUID(),2,36); Ссылки83.Записать(); КонецЕсли; Возврат Ссылки83.Ссылка83; КонецФункции //глПолучитьСсылку83 //------------------------------------------------------------------------------ Функция глПолучитьОбъект77(Ссылка83,ПредставлениеСсылки) Экспорт ТипСсылки83 = СоздатьОбъект("Справочник.ТипСсылки83"); Если ТипСсылки83.НайтиПоНаименованию(ПредставлениеСсылки)=0 Тогда Сообщить("Ошибка: Тип ссылки 1С:8.3 "+ПредставлениеСсылки+" не инициализирован","!"); Возврат 0; КонецЕсли; Ссылки83 = СоздатьОбъект("Справочник.Ссылки83"); Ссылки83.ИспользоватьВладельца(ТипСсылки83.ТекущийЭлемент()); Если Ссылки83.НайтиПоРеквизиту("Ссылка83",Ссылка83,0)=0 Тогда Сообщить("Ошибка: Ссылка из 1С 1С:8.3 по "+ПредставлениеСсылки+" "+Ссылка83+" не найдена","!"); Возврат 0; Иначе Возврат глМДВ.ЗначениеИзДлиннойСтрокиБД(0,Ссылки83.Ссылка77); КонецЕсли; КонецФункции //глПолучитьОбъект77 |
|||
2
zelenprog
25.01.24
✎
16:25
|
Я так понимаю, этот код нужен для того, чтобы в базе 7.7 сформировать специальные справочники, в которых будет храниться соответствие ссылок объектов 7.7 и 8.3.
А откуда надо вызывать эти функции? Что такое объект "глМДВ"? Как будет выполняться загрузка в 8.3 при помощи "Конвертации данных"? |
|||
3
big
25.01.24
✎
19:39
|
(1) Чепуха какая-то )) Для чего создавать уникальный гуид для уникального элемента, когда этот элемент УЖЕ уникален?? ))
(0) Вот по этой ссылке https://infostart.ru/1c/tools/791366/ в обработке выгрузки из 7.7 есть функция получения "псевдогуида" любого объекта 7.7 Всё строится на основании типа, вида объекта и его уникального ИД. Соответственно при загрузке данный "псевдогуид" легко преобразуется в реальный объект. То есть ни при выгрузке, ни при загрузке не надо использовать никаких дополнительных справочников и т.д. и т.п. В данный момент у меня нет доступа к моим личным обработкам, чтобы запостить сюда рабочую функцию, но взял я её именно у этого автора. Всё это активно используется в обмене данными. |
|||
4
Андрей_Андреич
naïve
26.01.24
✎
07:29
|
Мне кажется, достаточно функции 1С++ ЗначениеВДлиннуюСтрокуБД
Синтаксис: ЗначениеВДлиннуюСтрокуБД(<Object>) Назначение: преобразует ссылочный тип данных 1С (Справочник, документ, перечисление) во внутренние представление системы, строковое представление вида и внутренний ИД объекта. Возвращает строку - внутреннего представления в виде: [Kind(4)][ID(6)][Sign(3)] = 13 символов. Возвращаемое значение: Строка 13 символов. Параметры: <Object> - значение любого хранимого типа. |
|||
5
zelenprog
26.01.24
✎
08:48
|
Как в 7-ке "вычислить" ID (или GUID) - понятно.
Теперь следующий вопрос. Как этот ID при помощи "Конвертации данных" записать в файл выгрузки из 7-ки? И как затем в 8-ке при загрузке выполнить по этому ID поиск соответствующего объекта в регистре "СоответствиеИДОбмена"? |
|||
6
big
26.01.24
✎
12:52
|
(5) Можно к нужным выгружаемым объектам добавить вручную реквизит а-ля ИД77 и в него выгружать. Можно выгружать в создаваемый узел xml. При загрузке в процедуре поиска уже оперируем этими данными.
|
|||
7
Djelf
26.01.24
✎
15:14
|
(2) глМДВ=СоздатьОбъект("MetaDataWork");
(5) Примерно так это делается. "Наименование" или "Код" должно быть в 2х вариантах, одно со флагом "Поиск", второе без флага. В первом случае где стоит флаг "Поиск" туда подсовываем ГУИД при выгрузке. Значение = глПолучитьСсылку83(Источник,"Справочник.Партнеры"); Поиск в 8ке работает, как указано ниже. Поиск в регистре СоответствиеИДОбмена, ну... там же как-то дополняется, запросом имхо... //ПКО_Контрагенты2Партнеры_ПоследовательностьПолейПоиска GUID = СвойстваПоиска.Получить("Наименование"); УникальныйИдентификатор = Новый УникальныйИдентификатор(GUID); СсылкаНаОбъект = Справочники.Партнеры.ПолучитьСсылку(УникальныйИдентификатор); СвойстваПоиска = Новый Соответствие; СвойстваПоиска.Вставить("{УникальныйИдентификатор}",GUID); |
|||
8
Djelf
26.01.24
✎
13:25
|
(3) Затем что мне нужен был не один уникальный ГУИД, а несколько, на один элемент справочника в 7.7
Да, я знаю, что можно в 8ке сделать не уникальные ГИУД, но мне захотелось этого избежать. |
|||
9
zelenprog
29.01.24
✎
10:36
|
(7) >>> "Наименование" или "Код" должно быть в 2х вариантах, одно со флагом "Поиск", второе без флага.
"Наименование" или "Код" - это что такое? Это свойства? Получается, в ПКО справочника должно быть два одинаковых ПКС? Что в этих ПКС нужно указывать в качестве источника и приемника? >>> В первом случае где стоит флаг "Поиск" туда подсовываем ГУИД при выгрузке. А как это делается? В каком обработчике? |
|||
10
Djelf
29.01.24
✎
10:39
|
(9) Так работает
|
|||
11
zelenprog
29.01.24
✎
11:40
|
(10) А зачем "приемник" указан "Наименование"?
По идее такое ПКС должно записать ГУИД в реквизит "Наименование" приемника. Зачем это нужно? |
|||
12
Djelf
29.01.24
✎
12:03
|
(11) Да плевать на название приемника, в (7) я все равно переопределяю поле поиска. Ну нет в КД2 для 7ки ГУИД, можно допилить, но и так работает.
|
|||
13
zelenprog
29.01.24
✎
12:22
|
(12) Как сработает поиск - это я понял.
Я не понял другой момент. В правилах конвертации свойств у нас будет два правила, у которых "приемник" указан "Наименование". Какое из них сработает? То есть по какому из этих правил объекту в приемнике будет присвоено Наименование? Чем это определяется в КД2? |
|||
14
Djelf
29.01.24
✎
12:27
|
(13) Поиск отдельно, заполнение отдельно.
Т.е. поиск я переопределяю, там любое доступное поле может быть, наименование, код и т.п. А заполнение сработает как в (10) показано. Такой вот трюк... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |