Имя: Пароль:
1C
 
КД 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) показано.
Такой вот трюк...
Ошибка? Это не ошибка, это системная функция.