Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Импорт-экспорт между двумя базами , оптимизировать код          
Gigi Подменю пользователя
сообщение 17.06.19, 10:38
Сообщение #1

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

Всем привет!
Вообще сам вопрос темы в принципе решен ... и казалось бы результат устроил... все вроде бы нормально работает ...только один нюанс.
Слишком много кодовых строк получилось.
Очень длинная кодовая конструкция..... состоящая в основном из многочисленных функций и процедур подспорья. Да .. только ПОДСПОРЬЯ!!!!
В связи с чем опять понимается, сколько всего в этой супер продвинутой системе, нужно писать самому...
все писать ... без конца края .... и все это только что бы уже наконец подойти к долгожданному решению задачи. И всю эту кучу бедствия, впихнуть всего в ОДНУ КОДОВУЮ ЛИНИЮ. Для того, что бы наконец нажать на эту несчастную кнопку, под которой вписана та самая .. всего ОДНА ЛИНИЯ ))... До нажатия которой, после стольких бед, наверно уже нужно аж перекреститься smile.gifsmile.gif ))
Так что многое понимается после этого... В особенности когда ставишь точки над И... И оглянувшись видишь то количество строк кода, которое по вынужденному обстоятельству было написано до этого. Равно как и то, что если ограничивался бы только встроенными функциями системы, какое это было бы уже просто жалким зрелищем.
Вот что понимается после этого...
Но ладно ... это так ... опять делюсь "ощущениями"
А что касается вопроса темы, он в том, как оптимизировать и сократить код. И сделать его, скажем так, более удобоваримым.
Вот в чем вопрос.
И для того что бы получить рекомендации, для этого необходимо скинуть те самые мною же писанные не малые строки кода )), от которых у самого же голова идет кругом. )) Не говоря уже о тех людях которым он будет представлен.
Так что, до получения каких рекомендаций на этом сайте..., до этого ...к сожалению это необходимо.. Имею ввиду все наглядно представить.
А это если распечатать на бумаге А4, в шрифте на пример 12, займет целых две страницы ... если не больше.
А ведь участникам форума может будет не охота вникать во все это.
Именно поэтому воздерживаюсь скидывать код. И думаю так лучше пока данная тема не получит отклик. Поэтому решил только в таком случае скинуть сам код.
И если кто решит до рекомендаций, не полениться с ознакомлением с деталями вопроса то,
Буду признателен!
Вот собственно суть вопроса.

pablo Подменю пользователя
сообщение 18.06.19, 11:14
Сообщение #2

Старейшина
********
Группа: Команда (модераторы)
Сообщений: 1116
Из: Одесса-Луганск
Спасибо сказали: 192 раз
Рейтинг: 0

Вы хотите чтобы Вам Ваш код разбили на процедуры и функции? Ради чего? В чем прелесть кода из 1 строки, кроме того, что транслятор быстрее ее разберет (что сомнительно)?


Signature
Правильно поставленный вопрос содержит до 90% ответа.

Gigi Подменю пользователя
сообщение 18.06.19, 14:14
Сообщение #3

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

pablo @ Сегодня, 11:14 * ,
Цитата(pablo @ 18.06.19, 11:14) *
Вы хотите чтобы Вам Ваш код разбили на процедуры и функции? Ради чего? В чем прелесть кода из 1 строки, кроме того, что транслятор быстрее ее разберет (что сомнительно)?

Да нет уважаемые ...
В том и все дело что в коде никакой прелести не вижу... слишком громоздки поучился. Имею ввиду до самой строки, вернее пару строк запуска.
Поэтому хотел просто как то сократить. Что бы и выполнение было быстрее и что бы и мне было легче ...
А "транслятор" ... это каким образом?
Короче уважаемые ... транслятор ... ретранслятор не знаю )) ... а я лучше получу рекомендации от живых людей , а не от робота)))
Поэтому ладно... была не была скину код.
Только не пугайтесь ... я скину в режиме Скрыть/Отобразить что бы глаза не мозолило.
Просто хочу что бы живые люди посмотрели что и как сделал ... и изложить это детально.
Главное после этого, чего хотел и какую задачу ставил, станет ясно лучше всяких объяснений.
А потом уже получить советы как сократить код. И правильный ли путь взял для решения задачи.
Может все можно было сделать проще?
Короче ладно .. ща скину.

Gigi @ Сегодня, 14:02 * ,
Вот все необходимое для импорта данных из одной базы в другую в моем случае выглядит так.. И если кое где добавить строки то думаю и для экспорта.
Хотя все это для того случая когда две базы идентичный друг-другу. Т.е. с одинаковыми именами матаданных, реквизитов и т.д.
ОБЩИЙ МОДУЛЬ 1

//МетаданныеОбъект=FxSub_МетаДанные.МетаданныеПараметры(МетаданныеГруппа,МетаданныеИмя,"МетаданныеОбъект");
Функция МетаданныеПараметры(МетаданныеГруппа,МетаданныеИмя,ЗначениеВозврата) Экспорт
Если МетаданныеГруппа="Справочники"  или МетаданныеГруппа="Справочник" тогда
        МетаданныеОбъект=Справочники[МетаданныеИмя];
        МетаданныеИсточника=Метаданные.Справочники[МетаданныеИмя];
        РеквизитИдентификаторТип=Строка(МетаданныеИсточника.ТипКода);
        РеквизитИдентификатор="Код";
        ОсновнойРеквизит="Наименование";
        ОсновнойРеквизитТип="Строка";
        КомандаНайтиПоРеквИдент="НайтиПоКоду";
        ОсновнойРеквизит_ЗначениеПриНеопределенномПустомЗначении="Без наименования";
        НовыйОбъект=МетаданныеОбъект.СоздатьЭлемент();
ИначеЕсли МетаданныеГруппа="Документы" или МетаданныеГруппа="Документ" тогда
        МетаданныеОбъект=Документы[МетаданныеИмя];
        МетаданныеИсточника=Метаданные.Документы[МетаданныеИмя];
        РеквизитИдентификаторТип=Строка(МетаданныеИсточника.ТипНомера);
        РеквизитИдентификатор="Номер";
        ОсновнойРеквизит="Дата";
        ОсновнойРеквизитТип="Дата";
        КомандаНайтиПоРеквИдент="НайтиПоНомеру";
        НовыйОбъект=МетаданныеОбъект.СоздатьДокумент();
ИначеЕсли МетаданныеГруппа="Перечисления" или МетаданныеГруппа="Перечисление" тогда
        МетаданныеОбъект=Перечисления[МетаданныеИмя];
        МетаданныеИсточника=Метаданные.Перечисления[МетаданныеИмя];
        РеквизитИдентификаторТип=Неопределено;
        РеквизитИдентификатор="Наименование";
        ОсновнойРеквизит=Неопределено;
        ОсновнойРеквизитТип=Неопределено;
        КомандаНайтиПоРеквИдент=Неопределено;
        НовыйОбъект=Неопределено;
ИначеЕсли МетаданныеГруппа="РегистрыСведений" или МетаданныеГруппа="РегистрСведений" тогда
         МетаданныеОбъект=РегистрыСведений[МетаданныеИмя];        
        МетаданныеИсточника=Метаданные.РегистрыСведений[МетаданныеИмя];
        РеквизитИдентификаторТип=Неопределено;
        РеквизитИдентификатор=Неопределено;
        ОсновнойРеквизит=Неопределено;
        ОсновнойРеквизитТип=Неопределено;
        КомандаНайтиПоРеквИдент=Неопределено;
        НовыйОбъект=РегистрыСведений[МетаданныеИмя].СоздатьНаборЗаписей();
Иначе
        Возврат  Неопределено;
КонецЕсли;
//=====================
стрЗначения=Новый Структура();
стрЗначения.Вставить("МетаданныеОбъект",МетаданныеОбъект);
стрЗначения.Вставить("МетаданныеИсточника",МетаданныеИсточника);
стрЗначения.Вставить("РеквизитИдентификаторТип",РеквизитИдентификаторТип);
стрЗначения.Вставить("РеквизитИдентификатор",РеквизитИдентификатор);
стрЗначения.Вставить("ОсновнойРеквизитТип",ОсновнойРеквизитТип);
стрЗначения.Вставить("НовыйОбъект",НовыйОбъект);
//=====================
Если ТипЗнч(ЗначениеВозврата)=Тип("Структура") тогда
    Возврат стрЗначения;
Иначе
    Возврат стрЗначения[ЗначениеВозврата];
КонецЕсли;
//=====================    
КонецФункции

//стрРеквизиты=FxSub_МетаДанные.МетаданныеРеквизиты(МетаданныеГруппа,МетаданныеИмя);
Функция МетаданныеРеквизиты(МетаданныеГруппа,МетаданныеИмя)
стрРеквизиты = Новый Структура();
МетаданныеИсточника=FxSub_МетаДанные.МетаданныеПараметры(МетаданныеГруппа,МетаданныеИмя,"МетаданныеИсточника");
//====================================
Если МетаданныеГруппа="РегистрыСведений" тогда
    Для Каждого Измерение Из МетаданныеИсточника.Измерения Цикл
    стрРеквизиты.Вставить(Измерение.Имя, Измерение.Представление());
    КонецЦикла;
    Для Каждого Ресурс Из МетаданныеИсточника.Ресурсы Цикл
    стрРеквизиты.Вставить(Ресурс.Имя, Измерение.Представление());
    КонецЦикла;
    Для Каждого Реквизит Из МетаданныеИсточника.Реквизиты Цикл
    стрРеквизиты.Вставить(Реквизит.Имя, Реквизит.Представление());
    КонецЦикла;
ИначеЕсли МетаданныеГруппа="Справочники" или МетаданныеГруппа="Документы" тогда
    Для Каждого Реквизит Из МетаданныеИсточника.Реквизиты Цикл
    стрРеквизиты.Вставить(Реквизит.Имя, Реквизит.Представление());
    КонецЦикла;
КонецЕсли;
//====================================
Возврат стрРеквизиты;
КонецФункции

//БитаяСсылка=FxSub_МетаДанные.БитаяСсылка("МетаГруппа","МетаИмя",СтрокаGUID);
Функция БитаяСсылка(МетаГруппа,МетаИмя,СтрокаGUID)  Экспорт
//============================    
МетаданныеОбъект=МетаданныеПараметры(МетаГруппа,МетаИмя,"МетаданныеОбъект");
//============================
Если МетаданныеОбъект=Неопределено Тогда
    БитаяСсылка = Неопределено;
Иначе
    НовыйGUID= Новый УникальныйИдентификатор(СтрокаGUID);
    БитаяСсылка = МетаданныеОбъект.ПолучитьСсылку(НовыйGUID);
КонецЕсли;
//============================    
Возврат БитаяСсылка;    
КонецФункции



ОБЩИЙ МОДУЛЬ 2

//Соединение=FxSub_BaseConnectCOM.БАЗА_ПодключениеСОМ(Server,Base,Log,Pass);
Функция БАЗА_ПодключениеСОМ(Server,Base,Log,Pass) Экспорт
//=============================    
Если Base=Неопределено или (Log=Неопределено или Pass=Неопределено) Тогда
    Сообщить("Параметры подключения не указаны!");
    Возврат Неопределено;         
КонецЕсли;
//-----------------------------
Если Base="" или (Log="" или Pass="") Тогда
    Сообщить("Параметры подключения не указаны!");
    Возврат Неопределено;         
КонецЕсли;
//=============================
Если Server=Неопределено или Строка(Server="") Тогда
    Возврат ПодключениеКФайловойБД_черезСОМ(Base,Log,Pass);
Иначе
    Возврат ПодключениеКСервернойБД_черезСОМ(Server,Base,Log,Pass);    
КонецЕсли;    
//=============================
КонецФункции

Функция ПодключениеКФайловойБД_черезСОМ(Base,Log,Pass) Экспорт
//=============================
ПараметрыСоеденения = "File="""+Base+""";Usr="""+Log+""";Pwd="""+Pass+""";";
V82COMConnector=Новый COMОбъект("V83.COMConnector");
//=============================
Попытка
    Base1С = V82COMConnector.Connect(ПараметрыСоеденения);  //Сообщить(Base1С);
Исключение
    Сообщить("Ошибка подключения!");
    Возврат Неопределено;
КонецПопытки;
//=============================
Возврат Base1С;
//=============================
КонецФункции

Функция ПодключениеКСервернойБД_черезСОМ(Server,Base,Log,Pass)Экспорт
//=============================    
ПараметрыСоеденения = "Srvr="""+Server+""";Ref="""+Base+""";Usr="""+Log+""";Pwd="""+Pass+""";";
V82COMConnector= Новый COMОбъект("V83.COMConnector");
//=============================
Попытка
Base1С = V82COMConnector.Connect(ПараметрыСоеденения); //Сообщить(Base1С);
Исключение
Сообщить("Ошибка подключения!");
КонецПопытки;
//=============================
Возврат Base1С;
//=============================
КонецФункции

//####################################################################################

//ОбъектВXML=FxSub_BaseConnectCOM.Сериализация(СоединениеCOM,СериализуемыйОбъектИлиСсылка);
Функция Сериализация(СоединениеCOM,СериализуемыйОбъектИлиСсылка) Экспорт
//============================
    Попытка знОбъектИлиСсылка=СериализуемыйОбъектИлиСсылка.ПолучитьОбъект(); Исключение знОбъектИлиСсылка=СериализуемыйОбъектИлиСсылка    КонецПопытки;
//============================
    Если СоединениеCOM=Неопределено Тогда
        Дерево=СериализаторXDTO.ЗаписатьXDTO(знОбъектИлиСсылка);
        ЗаписьXML=Новый ЗаписьXML;
        ЗаписьXML.УстановитьСтроку();
        ФабрикаXDTO.ЗаписатьXML(ЗаписьXML,Дерево);  //Сообщить(Ф.Параметры);
    Иначе
        Дерево=СоединениеCOM.СериализаторXDTO.ЗаписатьXDTO(знОбъектИлиСсылка);
        ЗаписьXML = СоединениеCOM.NewObject("ЗаписьXML");
        ЗаписьXML.УстановитьСтроку();
        СоединениеCOM.ФабрикаXDTO.ЗаписатьXML(ЗаписьXML,Дерево);
    КонецЕсли;
//============================
    Возврат ЗаписьXML.Закрыть();
КонецФункции

//ПолученныйОбъект=FxSub_BaseConnectCOM.Десериализация(СоединениеCOM,ТекстXML,ВозвратСсылкаОбъект,БитаяСсылка);
Функция Десериализация(СоединениеCOM,ТекстXML,ВозвратСсылкаОбъект,БитаяСсылка) Экспорт
//============================    
Если СоединениеCOM=Неопределено Тогда
    ПарсерXML_Частичный=Новый ЧтениеXML;  
    ПарсерXML=Новый ЧтениеXML;
    ПарсерXML_Частичный.УстановитьСтроку(ТекстXML);
    ПарсерXML.УстановитьСтроку(ТекстXML); //Сообщить(ТекстXML+Символы.ПС+Строка(ПарсерXML)+" - "+ТипЗнч(ПарсерXML));
Иначе
    ПарсерXML = СоединениеCOM.NewObject("ЧтениеXML");
    ПарсерXML.УстановитьСтроку(ТекстXML); //Сообщить(ПарсерXML);    
КонецЕсли;
//============================
    Пока ПарсерXML.Прочитать() Цикл
    Если ПарсерXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
    МетаОбъект=ПарсерXML.Имя;  //Сообщить(МетаОбъект);
    Прервать;
    КонецЕсли;
    КонецЦикла;
//============================
    Если СоединениеCOM=Неопределено Тогда
        Объект=СериализаторXDTO.ПрочитатьXML(ПарсерXML);
    Иначе
        Объект=СоединениеCOM.СериализаторXDTO.ПрочитатьXML(ПарсерXML);
    КонецЕсли;
//============================
ПарсерXML.Закрыть();
//============================
//Сообщить(МетаОбъект);
Если Найти(МетаОбъект,"Catalog")>0 или Найти(МетаОбъект,"Document")>0 Тогда
    Если  ВозвратСсылкаОбъект="Ссылка" Тогда             
        Если  Объект.Ссылка.Пустая() Тогда
            Если  БитаяСсылка=Неопределено Тогда   Значение=Объект.Ссылка;    Иначе  Значение=БитаяСсылка;  КонецЕсли;
        Иначе
            Значение=Объект.Ссылка;
        КонецЕсли;
    Иначе
        Значение=Объект;
    КонецЕсли;
Иначе
    Значение=Объект;
КонецЕсли;
//============================
    //Сообщить(Строка(Значение)+" - "+ТипЗнч(Значение));
Возврат Значение;
КонецФункции

//####################################################################################

//Значение=FxSub_BaseConnectCOM.ССЫЛКА_ПоКодуНомеру(СоединениеCOM,"МетаданныеГруппа","МетаданныеИмя",КодНомерПоиска);
Функция ССЫЛКА_ПоКодуНомеру(СоединениеCOM,МетаданныеГруппа,МетаданныеИмя,КодНомерПоиска) Экспорт
//=========================================    
Если КодНомерПоиска=Неопределено или КодНомерПоиска = "" Тогда
Сообщить("Код или номер поиска не определен!"+Символы.ПС+"Функция: ""FxSub_BaseConnectCOM.ССЫЛКА_ПоКодуНомеру""");
Возврат Неопределено;    
КонецЕсли;    
//=========================================
Если МетаданныеГруппа = "Справочники" Тогда
    ССЫЛКА = СоединениеCOM.Справочники[МетаданныеИмя].НайтиПоКоду(КодНомерПоиска);
    //Объект=ССЫКА.ПолучитьОбъект();
ИначеЕсли  МетаданныеГруппа = "Документы" Тогда
    ССЫЛКА = СоединениеCOM.Документы[МетаданныеИмя].НайтиПоНомеру(КодНомерПоиска);
    //Объект=ССЫКА.ПолучитьОбъект();
КонецЕсли;
//=========================================
Возврат ССЫЛКА;
КонецФункции

//####################################################################################

//ЗначениеВозврата=FxSub_BaseConnectCOM.ПолучитьRefXML(ПутьКФайлуИлиТекстXML,XML_ФайлИлиТекст,"БитаяСсылка");
Функция ПолучитьRefXML(ПутьКФайлуИлиТекстXML,XML_ФайлИлиТекст,ЗначениеВозврата)    Экспорт
//============================
Если  XML_ФайлИлиТекст="Файл" Тогда
    ПарсерXML = Новый ЧтениеXML;
    ПарсерXML.ОткрытьФайл(ПутьКФайлуИлиТекстXML);
Иначе        
    ПарсерXML = Новый ЧтениеXML;
    ПарсерXML.УстановитьСтроку(ПутьКФайлуИлиТекстXML);
КонецЕсли;  //Сообщить(ПарсерXML);
//============================
    Пока ПарсерXML.Прочитать() Цикл
    Если ПарсерXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
    МетаОбъект=ПарсерXML.Имя;  //Сообщить(МетаОбъект);         
    Прервать;
    КонецЕсли;
    КонецЦикла;
//------------------------------------------------------------
    Пока ПарсерXML.Прочитать() Цикл
    Если ПарсерXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
    Атрибут=ПарсерXML.Имя;  
    ИначеЕсли ПарсерXML.ТипУзла = ТипУзлаXML.Текст Тогда
    Значение=ПарсерXML.Значение;
    Если Атрибут="Ref" Тогда  знRef=Значение;;Прервать; КонецЕсли;     
    КонецЕсли;
    КонецЦикла;
//============================
МетаОбъект=стрЗаменить(МетаОбъект,"Object","");
МетаОбъект=стрЗаменить(МетаОбъект,"Ref","");
//--------------------------------------------------------------
ТекстДлина=СтрДлина(МетаОбъект);    
СимволНом = Найти(МетаОбъект, ".");     
МетаИмя = Сред(МетаОбъект, СимволНом+1,ТекстДлина);
МетаГруппа=стрЗаменить(МетаОбъект,"."+МетаИмя,"");
МетаГруппа=стрЗаменить(МетаГруппа,"Catalog","Справочники");
МетаГруппа=стрЗаменить(МетаГруппа,"Document","Документы");
//============================
БитаяСсылка=FxSub_МетаДанные.БитаяСсылка(МетаГруппа,МетаИмя,знRef);
//============================
стрЗначения=Новый Структура();
стрЗначения.Вставить("МетаГруппа",МетаГруппа);
стрЗначения.Вставить("МетаИмя",МетаИмя);
стрЗначения.Вставить("Ref",знRef);
стрЗначения.Вставить("БитаяСсылка",БитаяСсылка);
//=====================
Если ТипЗнч(ЗначениеВозврата)=Тип("Структура") тогда
    Возврат стрЗначения;
Иначе
    Возврат стрЗначения[ЗначениеВозврата];
КонецЕсли;
//=====================
КонецФункции

//стрРеквизитыЗначения=FxSub_BaseConnectCOM.ССЫЛКА_РеквизитыЗначения(СоединениеCOM,ЭлементCOM_Ссылка,стрРеквизиты)
Функция ССЫЛКА_РеквизитыЗначения(СоединениеCOM,ЭлементCOM_Ссылка,стрРеквизиты) Экспорт
стрРеквизитыЗначения=Новый Структура();
//============================
// Это грубо, но так проще..  просто устал столько писать... поэтому реши без лишних уже хлопот...
//И через эту же функцию решил прогонять и данные на пример табличной части  объекта
Попытка
    ОбъектВXML=Сериализация(СоединениеCOM,ЭлементCOM_Ссылка);
    стрРеквизитыЗначения.Вставить("COMОбъект_Ссылка",ОбъектВXML);
    БитаяСсылка=FxSub_BaseConnectCOM.ПолучитьRefXML(ОбъектВXML,"Текст","БитаяСсылка");
    Если  БитаяСсылка=Неопределено Тогда  стрРеквизитыЗначения.Удалить("COMОбъект_Ссылка");  КонецЕсли;
Исключение
//Сообщить(ОписаниеОшибки());
КонецПопытки;
//============================
~ЗаполнениеДанныхИмпрота:;
Для Каждого Элемент Из стрРеквизиты Цикл
    Реквизит=Элемент.Ключ;
    Значение=ЭлементCOM_Ссылка[Реквизит];
    Если ТипЗнч(Значение)=Тип("COMОбъект") Тогда  //Сообщить(Строка(Реквизит)+" - "+Значение);
        ОбъектВXML=Сериализация(СоединениеCOM,Значение);
        Реквизит="COMОбъект_"+Элемент.Ключ;
        Значение=ОбъектВXML; //Сообщить(Строка(Реквизит)+" - "+Значение);
    КонецЕсли;
    стрРеквизитыЗначения.Вставить(Реквизит,Значение);
КонецЦикла;
//============================
    Для Каждого Элемент Из стрРеквизитыЗначения Цикл
    Реквизит=Элемент.Ключ;
    Значение=Элемент.Значение;
    Если Найти(Реквизит,"COMОбъект_")>0 Тогда
        Если Реквизит="COMОбъект_Ссылка" Тогда
        Значение=Десериализация(,Значение,"Ссылка",БитаяСсылка);    
        Иначе
        Значение=Десериализация(,Значение,"Ссылка",);
        КонецЕсли;
    стрРеквизитыЗначения.Удалить(Реквизит);
    Реквизит=СтрЗаменить(Реквизит,"COMОбъект_","");    
    КонецЕсли;
    стрРеквизитыЗначения.Вставить(Реквизит,Значение);
    КонецЦикла;
//============================
Возврат стрРеквизитыЗначения;
КонецФункции



И наконец тест запуска

&НаКлиенте
Процедура БАЗА_ИМПОРТ(Команда)
//============================
    Server=Объект.Server;
    Base=Строка(Объект.Base);
    Log=Объект.Пользователь;
    Pass=Объект.Пароль;
    КодНомерПойска="000000002";
    стрРеквизиты=ЗагрузкаДанных_серв.МетаданныеРеквизиты("МетаГруппа","МетаИмя");
    Записывать=Ложь;
//============================
Если Вопрос("Запустить импорт данных?",РежимДиалогаВопрос.ДаНет,,,"Импорт данных")=КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли;
Если Вопрос("Записывать данные импорта?",РежимДиалогаВопрос.ДаНет,,,"Импорт данных")=КодВозвратаДиалога.Да Тогда Записывать=Истина; КонецЕсли;
//----------------------------
ТЕСТ_ДанныхИмпорта_Запись(Server,Base,Log,Pass,"МетаГруппа","МетаИмя",КодНомерПойска,стрРеквизиты,Записывать)
//============================    
КонецПроцедуры

&НаСервере
Процедура ТЕСТ_ДанныхИмпорта_Запись(Server,Base,Log,Pass,МетаГруппа,МетаИмя,КодНомерПойска,стрРеквизиты,Записывать)
//============================
    Соединение=FxSub_BaseConnectCOM.БАЗА_ПодключениеСОМ(Server,Base,Log,Pass); //Сообщить(Соединение);
    Если Соединение=Неопределено Тогда Возврат КонецЕсли;    
//============================
    стрРеквизиты.Вставить("Ссылка");
    COMОбъектСсылка=FxSub_BaseConnectCOM.ССЫЛКА_ПоКодуНомеру(Соединение,МетаГруппа,МетаИмя,знНомер);
    стрРеквизитыЗначения=FxSub_BaseConnectCOM.ССЫЛКА_РеквизитыЗначения(Соединение,COMОбъектСсылка,стрРеквизиты);
//============================    
    Для Каждого Элемент Из стрРеквизитыЗначения Цикл
        Реквизит=Элемент.Ключ;
        Значение=Элемент.Значение;     
        Сообщить(Реквизит+" - "+Значение);
    КонецЦикла;
//============================
Если Записывать=Истина Тогда
    КлючСуществует=стрРеквизитыЗначения.Свойство("Ссылка");    
    Если КлючСуществует=Истина Тогда
        ОбъектСсылка=стрРеквизитыЗначения.Ссылка;
        Если (ОбъектСсылка.Пустая() или Найти(Строка(ОбъектСсылка),"<Объект не найден>")>0) Тогда
            знОбъект=FxSub_МетаДанные.МетаданныеПараметры(МетаГруппа,МетаИмя,"НовыйОбъект");
            Если Найти(Строка(ОбъектСсылка),"<Объект не найден>")>0  Тогда
            ДокОбъект.УстановитьСсылкуНового(ОбъектСсылка);
            //ДокОбъект.ОбменДанными.Загрузка = Истина;  
            КонецЕсли;
        Иначе
            знОбъект = ОбъектСсылка.ПолучитьОбъект();  
        КонецЕсли;
    Иначе
        Возврат;
    КонецЕсли;
    стрРеквизитыЗначения.Удалить("Ссылка");
Иначе
    Возврат;
КонецЕсли;
//============================
    знОбъект=FxSub_МетаДанные.МетаданныеПараметры(МетаГруппа,МетаИмя,"НовыйОбъект");
    Для Каждого Элемент Из стрРеквизитыЗначения Цикл
        Реквизит=Элемент.Ключ;
        Значение=Элемент.Значение;     
        знОбъект[Реквизит]=Значение;
    КонецЦикла;
КонецЕсли;
//============================
КонецПроцедуры



Ну вот видите уважаемые ... сколько строк .. УЖАС... КАРАУЛ ПРОСТО....
Поэтому не настаиваю с ответов прямо щас ... можно позже или вообще завтра.
Просто если не сильно тяжело пройдитесь или вообще протестите сами.
А потом порекомендуйте что либо в ответе на вопрос темы:
КАК СОКРАТИТЬ КОД?

sava1 Подменю пользователя
сообщение 18.06.19, 14:33
Сообщение #4

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

Цитата(Gigi @ 18.06.19, 15:14) *
видите уважаемые ... сколько строк .. УЖАС... КАРАУЛ ПРОСТО....


ничего личного, но - КТО БЫ ГОВОРИЛ....
в тексте буков больше, чем в коде.

Сообщение отредактировал sava1 - 18.06.19, 14:34

Gigi Подменю пользователя
сообщение 18.06.19, 14:36
Сообщение #5

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

Gigi @ Сегодня, 14:14 * ,

Гууу ... там ошибка ... не правильно скопировал ...
  
Линия:
ДокОбъект.УстановитьСсылкуНового(ОбъектСсылка);
            //ДокОбъект.ОбменДанными.Загрузка = Истина;  
//Вместо этого там надо
  ДокОбъект.УстановитьСсылкуНового(ОбъектСсылка);
            //ДокОбъект.ОбменДанными.Загрузка = Истина;
  //короче ... переменная не та стояла

Но меня в особенности интересуют два вопроса.
Пока вопрос первый - как стерилизовать так что бы объект имел полный вид в XML
Т.е. обычно при этом если реквизит ссылка то в тексте XML указан уникальный идентификатор.
Можно ли одной командой стерилизовать так что бы при таком реквизите был указан не только УИ а была под ветка данных этого объекта.
Второй вопрос - Есть ли в 1С короткая команда, которая сама читает все данные XML включая указанные там табличные части. А потом создает новый объект в котором уже все данные из XML заполонены.
Я понимаю что это мало вероятно но все таки... это сократило бы строки кода.
Цитата
ничего личного, но - КТО БЫ ГОВОРИЛ....
в тексте буков больше, чем в коде.

Не согласен ))) В коде все-таки больше
Ладно! Пока все

Gigi Подменю пользователя
сообщение 19.06.19, 8:33
Сообщение #6

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

Gigi @ Вчера, 14:36 * ,


Gigi @ Сегодня, 8:04 * ,
На этом сайте почему то нельзя исправить опечатки предыдущих сообщений... "стерилизовать" вместо сериализовать.
ДокОбъект.УстановитьСсылкуНового(ОбъектСсылка);
            //ДокОбъект.ОбменДанными.Загрузка = Истина;

Вместо
  знОбъект.УстановитьСсылкуНового(ОбъектСсылка);
            //знОбъект.ОбменДанными.Загрузка = Истина;

Ладно! Ерунда..
Так вот вопросы по прежнему открыты
Первый - как сериализовать так что бы объект имел полный XML вид. Т.е. вместо уникальных идентификаторов по реквизитам ссылок имел бы под-ветки данных объекта ссылки.
Второй - Можно ли в 1С создать не сильно длинную процедуру, которая создает таблицу XML... где ВСЕ ДАННЫЕ объекта... включая табличные части. А потом создает новый объект в котором уже все данные из этой таблицы заполонены.
И что бы все это ограничивалось короткими командами.... имело не тот представленный вид.... километровый
Вот эти вопросы.
Дело в том, что то как сделал это пока тестил в двух тестовых базах.
Пока не решаюсь все это прописать в рабочую. Ибо не хочу наступать опять на те же грабли.
Когда не от глубокого знания написал, а позже узнал что можно было сделать гораздо проще. И потом в каждой форме пришлось менять. И делать двойную работу.
Поэтому и хотел узнать ... может и в данном случае можно было сделать проще... без этих километровых строк кода.

DiplomatTM Подменю пользователя
сообщение 02.07.19, 23:03
Сообщение #7

Молчаливый
*
Группа: Пользователи
Сообщений: 1
Спасибо сказали: 0 раз
Рейтинг: 0


 ! 

Правила: 6
 


Сообщение отредактировал Vofka - 03.07.19, 8:35

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 11:38
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!