|   |   | 
| 
 | КД 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) показано. Такой вот трюк... | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |