Вход | Регистрация

  1  2   

устройство метаданных "изнутри"

устройство метаданных "изнутри"
Я
   illi_dan
 
04.05.18 - 20:41
Здравствуйте. Стоит задача по выгрузке произвольного объекта в текстовый файл.Пользователь выбирает документ который у него есть в базе и тот должен исчерпывающе быть представлен тестовом формате,что бы далее можно было произвести обратную операцию(текстовый файл должен будет преобразоваться в документ).Необходимо это реализовать через метаданные.В связи с непониманием устройства метаданных есть несколько вопросов:
1)Насколько я понимаю, у метаданных есть коллекции ТабличныЧасти и Реквизиты.У реквизита еще есть значение.Получается для выгрузки достаточно не более двух вложенных циклов или у этих параметров могут  быть дочерние объекты,создаваемые пользователем?
2)Если реквизит - строка,то проблем с выгрузкой нету. Но как быть со сложными типами "ДокументССылка" и прочие?
3)Пытаюсь получить значение документа через [],пишет что преобразование значение к типу число не может быть выполнено
Код:


Для Каждого реквизит из Метаданные.Реквизиты цикл
                Типов=реквизит.Тип.Типы();
                //Для Каждого тип из Типов цикл

                    сч=сч+1;
                    Текст.ДобавитьСтроку(реквизит + ":"+Параметры.ДокСсылка[реквизит]+Символы.ПС);
                    
                //КонецЦикла

                
            КонецЦикла;



Параметры.ДокСсылка - это объект,который выбрал пользователь в форме. 
Заранее благодарен за любую помощь.
 
 
   VS-1976
 
1 - 04.05.18 - 20:47
(0) Есть же возможность выгрузить объект в xml платформой. Зачем изобретать велосипед?
   Garykom
 
2 - 04.05.18 - 20:55
еще JSON есть же
   Garykom
 
3 - 04.05.18 - 20:55
и ЗначениеВСтрокуВнутр
   MakaMaka
 
4 - 04.05.18 - 21:28
(0) Есть ответ в КД 2.1, не надо ничего придумывать, все просто, логично и очень технологично.
   Fragster
 
5 - 04.05.18 - 21:34
прав (4), остальное для саморазвития
   illi_dan
 
6 - 04.05.18 - 21:36
У меня учебное задание.Все это необходимо сделать оперируя метаданными, не использую значенияВстрокуВнутрь,Json,XMl
   zwei
 
7 - 04.05.18 - 21:37
(0) Ты точно с плюсов пришел?
   MakaMaka
 
8 - 04.05.18 - 21:44
(6) Знаешь что такое рекурсия?

Так вот когда твой пользователь выбрал что то, проверяешь тип объекта, если тип нашел и есть ссылка, то тогда начинаешь выгружать.

Получаешь ГУИД объекта и все реквизиты объекта, проверяешь:
1. Табличная часть этот реквизит;
2. Ссылочный тип реквизита;

Если тип реквизита не ссылочный, то пишешь в объект, если ссылочный то пишешь в значение реквизита ГУИД, и потом рекурсивно выгружаешь этот реквизит. Но зачем тебе этой геникологией заниматься я чет не раздуплил
   MakaMaka
 
9 - 04.05.18 - 21:46
(6) И судя по тестовому заданию твой работодатель даун, изобретение велосипедов хорошо, но только на велозаводе. Обычно подобная чушь делается либо в КД2.1, частично в КД3.0 либо при использовании выгрузок объектов в формате CommerceML
   Египтянин
 
10 - 04.05.18 - 21:50
попробуй так

Текст.ДобавитьСтроку(реквизит + ":"+Параметры.ДокСсылка[реквизит.ИМЯ]+Символы.ПС);
 
 Рекламное место пустует
   Египтянин
 
11 - 04.05.18 - 21:53
Текст.ДобавитьСтроку(Реквизит.ИМЯ + ":"+Параметры.ДокСсылка[Реквизит.ИМЯ]+Символы.ПС);
   MakaMaka
 
12 - 04.05.18 - 21:54
(10) И как он перенесет номенклатуру таким макаром? Он так только комментарий перенесет, строку или число, а ссылочный объект он не перенесет. Его ждет БДСМ с узлами и тегами, при загрузке. Но эта тема будет в понедельник наверное, пока выгружать будем.
   Египтянин
 
13 - 04.05.18 - 21:55
+(11) Вообще то нужно учиться пользоваться отладчиком.

(12) кого ты лечишь мальчик? Я с 7.7 начинал, и в тексте переносил и оле и дбф у меня десятки самописных выгрузок/загрузок.
   illi_dan
 
14 - 04.05.18 - 21:58
(8) УникальныйИдентиф (8) Функции УникальныйИдентификатор() Тоже запрещены. Я так понимаю нужно будет вернуть название реквизита и если он ссылочный,то искать такой в базе?
   illi_dan
 
15 - 04.05.18 - 21:59
(10)Благодарю,но на ссылочных объектах все та же ошибка
   illi_dan
 
16 - 04.05.18 - 22:01
(12) до понедельника сдать уже надо.Так что предстоит и загружать на выходных(
   Египтянин
 
17 - 04.05.18 - 22:04
(16) Пишется минут за 30. Но мне лень.
   Египтянин
 
18 - 04.05.18 - 22:05
Что пишет Сообщить(Реквизит.Имя)
Что пишет Сообщить(Параметры.ДокСсылка)
   Египтянин
 
19 - 04.05.18 - 22:06
(16) да забей, все равно за выходные 1С не выучишь. А без умения пользоваться отладчиком, тебя все равно с работы выгонят.
   Египтянин
 
20 - 04.05.18 - 22:09
как быть сложными типами "ДокументССылка" и прочие?
Документ[ТвойТип].НайтиПоНомеру(ТвойНомер);
Справочник[ТвойТип].НайтиПоКоду(ТвойКод);
Ну или получать по УИД. А чего ты у постановщика задачи не спросил, по какому принципу синхронизироваться? По коду, по наименованию или по УИД?
   MakaMaka
 
21 - 04.05.18 - 22:11
(14) Бред какой то. Ну выгружай как строки.
(19) Согласен без умения работать отладчиком работать ТС не сможет.

(13) Видел я подобные выгрузки, они частно похожи на скрипящее инвалидное кресло, порой там такое, что думаешь, лучше бы КД2.1 было, чем вольные написания творцов.
   Египтянин
 
22 - 04.05.18 - 22:13
(21) Чего тут такого страшного? Вот обычная загрузка
Перем Соединение Экспорт;
Функция ОпределитьРежимЗаписиДокументаИЗаписать(СсылкаНаОбъект,ОбъектОЛЕ)    
    Если СсылкаНаОбъект.Проведен и НЕ ОбъектОЛЕ.Проведен Тогда
        Если ОбъектОЛЕ.ПометкаУдаления Тогда
            ОбъектОЛЕ.ПометкаУдаления = Ложь;                
        КонецЕсли;        
        ОбъектОЛЕ.Записать(Соединение.РежимЗаписиДокумента.Проведение,Соединение.РежимПроведенияДокумента.Неоперативный);
    ИначеЕсли  СсылкаНаОбъект.Проведен и ОбъектОЛЕ.Проведен Тогда
        ОбъектОЛЕ.Записать(Соединение.РежимЗаписиДокумента.Проведение,Соединение.РежимПроведенияДокумента.Неоперативный);
    ИначеЕсли Не СсылкаНаОбъект.Проведен и ОбъектОЛЕ.Проведен Тогда
        ОбъектОЛЕ.ПометкаУдаления = СсылкаНаОбъект.ПометкаУдаления;
        ОбъектОЛЕ.Записать(Соединение.РежимЗаписиДокумента.ОтменаПроведения,Соединение.РежимПроведенияДокумента.Неоперативный);    
    ИначеЕсли СсылкаНаОбъект.Проведен И ОбъектОЛЕ.ЭтоНовый() Тогда
        ОбъектОЛЕ.ПометкаУдаления = СсылкаНаОбъект.ПометкаУдаления;
        ОбъектОЛЕ.Записать(Соединение.РежимЗаписиДокумента.ОтменаПроведения,Соединение.РежимПроведенияДокумента.Неоперативный);    
    Иначе
        ОбъектОЛЕ.ПометкаУдаления = СсылкаНаОбъект.ПометкаУдаления;
        ОбъектОЛЕ.Записать(Соединение.РежимЗаписиДокумента.Запись,Соединение.РежимПроведенияДокумента.Неоперативный);            
    КонецЕсли;    
КонецФункции

Функция ПолучитьЗначениеПоВиду(Значение)
    Если Значение.Метаданные().Имя = "НазначенияСвойствКатегорийОбъектов" Тогда//ищем по коду, чтобы не задвоить предопределенные элементы

        Возврат Соединение.ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.НайтиПоКоду(Значение.Код);
    КонецЕсли;
    
    Если Значение.Метаданные().Имя = "Номенклатура" Тогда
        Возврат ПолучитьНоменклатуру(Значение);    
    КонецЕсли;
    
    
    Если Не ЗначениеЗаполнено(Значение) Тогда Возврат Неопределено КонецЕсли;
    
    Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда
        ИдентификаторИсточник   = Значение.УникальныйИдентификатор();
        ИдентификаторПолучатель = Соединение.NewObject("УникальныйИдентификатор", СокрЛП(ИдентификаторИсточник));
        СсылкаНаОбъект = Соединение.Справочники[Значение.Метаданные().Имя].ПолучитьСсылку(ИдентификаторПолучатель);
        Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда 
            НовыйЭлемент = Соединение.Справочники[Значение.Метаданные().Имя].СоздатьЭлемент();
            НовыйЭлемент.УстановитьСсылкуНового(СсылкаНаОбъект);
            НовыйЭлемент.Код          = Значение.Код;
            НовыйЭлемент.Наименование = Значение.Наименование;
            Если ТипЗнч(Значение.Владелец) = Тип("ПланВидовХарактеристикСсылка.СвойстваОбъектов") Тогда
                НовыйЭлемент.Владелец     = ПолучитьЗначениеПоВиду(Значение.Владелец);
            КонецЕсли;
            НовыйЭлемент.Записать();
            Возврат НовыйЭлемент.Ссылка;
        Иначе
            Возврат СсылкаНаОбъект;
        КонецЕсли;            
    ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение))  Тогда
        ИдентификаторИсточник   = Значение.УникальныйИдентификатор();
        ИдентификаторПолучатель = Соединение.NewObject("УникальныйИдентификатор", СокрЛП(ИдентификаторИсточник));
        СсылкаНаОбъект = Соединение.ПланыВидовХарактеристик[Значение.Метаданные().Имя].ПолучитьСсылку(ИдентификаторПолучатель);
        Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда
            НовыйЭлемент = Соединение.ПланыВидовХарактеристик[Значение.Метаданные().Имя].СоздатьЭлемент();
            НовыйЭлемент.УстановитьСсылкуНового(СсылкаНаОбъект);
            НовыйЭлемент.Код                = Значение.Код;
            НовыйЭлемент.Наименование       = Значение.Наименование;   
            СтрокаТипа = "";            
            ТипЗначения = Значение.ТипЗначения.Типы();
            Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗначения[0]) Тогда
                СтрокаТипа = "СправочникСсылка.";
                ОбъектСсылка = Новый (ТипЗначения[0]);
                СтрокаТипа = СтрокаТипа + ОбъектСсылка.Метаданные().Имя;
            ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗначения[0]) Тогда
                СтрокаТипа = "ПланВидовХарактеристикСсылка.";
                ОбъектСсылка = Новый (ТипЗначения[0]);
                СтрокаТипа = СтрокаТипа + ОбъектСсылка.Метаданные().Имя;
                
            ИначеЕсли ТипЗначения[0] = Тип("Строка") Тогда                
                СтрокаТипа = "Строка";
            ИначеЕсли ТипЗначения[0] = Тип("Число")  Тогда
                СтрокаТипа = "Число";                
            ИначеЕсли ТипЗначения[0] = Тип("Булево") Тогда
                СтрокаТипа = "Булево";     
            ИначеЕсли ТипЗначения[0] = Тип("Дата") Тогда
                СтрокаТипа = "Дата";     
                
            КонецЕсли;
            
            НовыйЭлемент.ТипЗначения        = Соединение.NewObject("ОписаниеТипов",СтрокаТипа);            
            НовыйЭлемент.НазначениеСвойства = ПолучитьЗначениеПоВиду(Значение.НазначениеСвойства);
            НовыйЭлемент.Записать();
            Возврат НовыйЭлемент.Ссылка;
        Иначе
            Возврат СсылкаНаОбъект;
        КонецЕсли;        
        
    ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение))                Тогда
        ИдентификаторИсточник   = Значение.УникальныйИдентификатор();
        ИдентификаторПолучатель = Соединение.NewObject("УникальныйИдентификатор", СокрЛП(ИдентификаторИсточник));
        СсылкаНаОбъект = Соединение.Документы[Значение.Метаданные().Имя].ПолучитьСсылку(ИдентификаторПолучатель);
        Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда 
            Возврат Неопределено;
        Иначе
            Возврат СсылкаНаОбъект;            
        КонецЕсли;                         
    ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение))             Тогда    
        Возврат ПолучитьЗначениеПеречислениеОЛЕ(Значение);
    КонецЕсли;
    
КонецФункции

//функция переносит свойства из базы источника в базу приемника 

//СсылкаБазы - ссылка на элемент базы из которой переносятся свойства, например Номенклатура или характеристика
//СсылкаОЛЕ  - ссылка на элемент базы в которую переносятся свойства

Функция СоздатьСвойства(СсылкаБазы,СсылкаОЛЕ)
    НаборЗаписейЗначенияСвойствОЛЕ = Соединение.РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
    НаборЗаписейЗначенияСвойствОЛЕ.Отбор.Объект.Использование = Истина;
    НаборЗаписейЗначенияСвойствОЛЕ.Отбор.Объект.Значение = СсылкаОЛЕ;
    НаборЗаписейЗначенияСвойствОЛЕ.Очистить();
    
    Запрос = Новый Запрос;
    ТекстЗапроса = 
    "ВЫБРАТЬ
    |    ЗначенияСвойствОбъектов.Объект,
    |    ЗначенияСвойствОбъектов.Свойство,
    |    ЗначенияСвойствОбъектов.Значение
    |ИЗ
    |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    |    ЗначенияСвойствОбъектов.Объект = &Ссылка";
    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр("Ссылка",СсылкаБазы);
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        СтрокаНабораЗаписейОЛЕ = НаборЗаписейЗначенияСвойствОЛЕ.Добавить();
        СтрокаНабораЗаписейОЛЕ.Объект   = ПолучитьЗначениеПоВиду(Выборка.Объект);
        СтрокаНабораЗаписейОЛЕ.Свойство = ПолучитьЗначениеПоВиду(Выборка.Свойство);        
        Если ТипЗнч(Выборка.Значение) = Тип("Строка")       или ТипЗнч(Выборка.Значение) = Тип("Число")
            или ТипЗнч(Выборка.Значение) = Тип("Дата")      или ТипЗнч(Выборка.Значение) = Тип("Булево") Тогда
            СтрокаНабораЗаписейОЛЕ.Значение = Выборка.Значение;
        Иначе
            СтрокаНабораЗаписейОЛЕ.Значение = ПолучитьЗначениеПоВиду(Выборка.Значение);         
        КонецЕсли;     
    КонецЦикла;
    НаборЗаписейЗначенияСвойствОЛЕ.Записать();
КонецФункции


Функция ПолучитьВидКонтактнойИнформации(ВидКонтактнойИнформации)
    ВидКонтактнойИнформацииОЛЕ = Соединение.Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию(СокрЛП(ВидКонтактнойИнформации.Наименование));
    Если ВидКонтактнойИнформацииОЛЕ.Пустая() Тогда
        ВидКонтактнойИнформацииОЛЕ = Соединение.Справочники.ВидыКонтактнойИнформации.СоздатьЭлемент();
        ВидКонтактнойИнформацииОЛЕ.Код = ВидКонтактнойИнформации.Код;
        ВидКонтактнойИнформацииОЛЕ.Наименование = ВидКонтактнойИнформации.Наименование;
        ВидКонтактнойИнформацииОЛЕ.Тип = ПолучитьЗначениеПеречислениеОЛЕ(ВидКонтактнойИнформации.Тип);
        ВидКонтактнойИнформацииОЛЕ.ВидОбъектаКонтактнойИнформации = ПолучитьЗначениеПеречислениеОЛЕ(ВидКонтактнойИнформации.ВидОбъектаКонтактнойИнформации);
        ВидКонтактнойИнформацииОЛЕ.Записать();
        Возврат ВидКонтактнойИнформацииОЛЕ.Ссылка;        
    Иначе        
        Возврат ВидКонтактнойИнформацииОЛЕ;
    КонецЕсли;                              
КонецФункции


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


Функция ПолучитьКонтактноеЛицо(КонтактноеЛицо,ПерезаписыватьРеквизиты=Ложь)
    Если Не ЗначениеЗаполнено(КонтактноеЛицо) Тогда Возврат Неопределено КонецЕсли;
    ИдентификаторИсточник   = КонтактноеЛицо.УникальныйИдентификатор();
    ИдентификаторПолучатель = Соединение.NewObject("УникальныйИдентификатор", СокрЛП(ИдентификаторИсточник));
    СсылкаНаОбъект = Соединение.Справочники.КонтактныеЛица.ПолучитьСсылку(ИдентификаторПолучатель);
    Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда
        ОбъектКонтактноеЛицо                   = Соединение.Справочники.КонтактныеЛица.СоздатьЭлемент();
        ОбъектКонтактноеЛицо.УстановитьСсылкуНового(СсылкаНаОбъект);
        ОбъектКонтактноеЛицо.ПометкаУдаления   = КонтактноеЛицо.ПометкаУдаления;
        ОбъектКонтактноеЛицо.Код               = КонтактноеЛицо.Ссылка.Код;            
        ОбъектКонтактноеЛицо.Наименование      = КонтактноеЛицо.Ссылка.Наименование;
        ОбъектКонтактноеЛицо.Записать();  
        Возврат ОбъектКонтактноеЛицо.Ссылка;
    Иначе
        Если ПерезаписыватьРеквизиты Тогда
            ОбъектКонтактноеЛицо                   = СсылкаНаОбъект.ПолучитьОбъект();
            ОбъектКонтактноеЛицо.ПометкаУдаления   = КонтактноеЛицо.ПометкаУдаления;
            ОбъектКонтактноеЛицо.Код               = КонтактноеЛицо.Ссылка.Код;            
            ОбъектКонтактноеЛицо.Наименование      = КонтактноеЛицо.Ссылка.Наименование;         
            ОбъектКонтактноеЛицо.Записать();
            Возврат КонтактноеЛицо.Ссылка;        
        Иначе        
            Возврат СсылкаНаОбъект;
        КонецЕсли;
    КонецЕсли;                       
    
КонецФункции

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


Функция ПолучитьЕдиницуИзмерения(ЕдиницаИзмерения)
    ИдентификаторИсточник   = ЕдиницаИзмерения.УникальныйИдентификатор();
    ИдентификаторПолучатель = Соединение.NewObject("УникальныйИдентификатор", СокрЛП(ИдентификаторИсточник));
    СсылкаНаОбъект = Соединение.Справочники.ЕдиницыИзмерения.ПолучитьСсылку(ИдентификаторПолучатель);
    Возврат СсылкаНаОбъект;
КонецФункции


Функция СоздатьБанковскиеСчета(Контрагент,ОЛЕВладелец)
    Если Не ЗначениеЗаполнено(Контрагент) Тогда Возврат Неопределено КонецЕсли;
    Выборка = Справочники.БанковскиеСчета.Выбрать(,Контрагент);
    Пока Выборка.Следующий() Цикл         
        ИдентификаторИсточник   = Выборка.Ссылка.УникальныйИдентификатор();
        ИдентификаторПолучатель = Соединение.NewObject("УникальныйИдентификатор", СокрЛП(ИдентификаторИсточник));
        СсылкаНаОбъект = Соединение.Справочники.БанковскиеСчета.ПолучитьСсылку(ИдентификаторПолучатель);
        Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда
            ОбъектБанковскиеСчета = Соединение.Справочники.БанковскиеСчета.СоздатьЭлемент();
            ОбъектБанковскиеСчета.УстановитьСсылкуНового(СсылкаНаОбъект);
            ОбъектБанковскиеСчета.Код                   = Выборка.Ссылка.Код;
            ОбъектБанковскиеСчета.Наименование          = Выборка.Ссылка.Наименование;
            ОбъектБанковскиеСчета.Владелец              = ОЛЕВладелец;    
            ОбъектБанковскиеСчета.НомерСчета            = Выборка.Ссылка.НомерСчета;
            ОбъектБанковскиеСчета.Банк                  = Соединение.Справочники.Банки.НайтиПоКоду(Выборка.Ссылка.Банк.Код);
            ОбъектБанковскиеСчета.БанкДляРасчетов       = Соединение.Справочники.Банки.НайтиПоКоду(Выборка.Ссылка.БанкдляРасчетов.Код);
            ОбъектБанковскиеСчета.ТекстКорреспондента   = Выборка.Ссылка.ТекстКорреспондента;
            ОбъектБанковскиеСчета.ТекстНазначения       = Выборка.Ссылка.ТекстНазначения;
            ОбъектБанковскиеСчета.ВидСчета              = Выборка.Ссылка.ВидСчета;
               ОбъектБанковскиеСчета.ВалютаДенежныхСредств = ПолучитьЗначениеВалюты(Выборка.Ссылка.ВалютаДенежныхСредств);
            ОбъектБанковскиеСчета.НомерИДатаРазрешения  = Выборка.Ссылка.НомерИДатаРазрешения;
            ОбъектБанковскиеСчета.ДатаОткрытия          = Выборка.Ссылка.ДатаОткрытия;
            ОбъектБанковскиеСчета.ДатаЗакрытия          = Выборка.Ссылка.ДатаЗакрытия;
            ОбъектБанковскиеСчета.МесяцПрописью         = Выборка.Ссылка.МесяцПрописью;
            ОбъектБанковскиеСчета.СуммаБезКопеек        = Выборка.Ссылка.СуммаБезКопеек;
               ОбъектБанковскиеСчета.Записать();
        КонецЕсли;        
    КонецЦикла;    
    
КонецФункции

Функция ПолучитьБанковскийСчет(БанковскийСчет,ПерезаписыватьРеквизиты=Ложь)
    Если Не ЗначениеЗаполнено(БанковскийСчет.Владелец) Тогда Возврат Неопределено КонецЕсли;
    ИдентификаторИсточник   = БанковскийСчет.УникальныйИдентификатор();
    ИдентификаторПолучатель = Соединение.NewObject("УникальныйИдентификатор", СокрЛП(ИдентификаторИсточник));
    СсылкаНаОбъект = Соединение.Справочники.БанковскийСчетыКонтрагентов.ПолучитьСсылку(ИдентификаторПолучатель);
    Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда
        Возврат Неопределено;
    Иначе
        Если ПерезаписыватьРеквизиты Тогда
            ОбъектБанковскиеСчета = СсылкаНаОбъект.ПолучитьОбъект();
            ОбъектБанковскиеСчета.Код                   = БанковскийСчет.Код;
            ОбъектБанковскиеСчета.Наименование          = БанковскийСчет.Наименование;
            ОбъектБанковскиеСчета.Владелец              = ПолучитьКонтрагента(БанковскийСчет.Владелец);    
            ОбъектБанковскиеСчета.НомерСчета            = БанковскийСчет.НомерСчета;
            ОбъектБанковскиеСчета.Банк                  = Соединение.Справочники.Банки.НайтиПоКоду(БанковскийСчет.Банк.Код);
            ОбъектБанковскиеСчета.БанкДляРасчетов       = Соединение.Справочники.Банки.НайтиПоКоду(БанковскийСчет.БанкдляРасчетов.Код);
            ОбъектБанковскиеСчета.ТекстКорреспондента   = БанковскийСчет.ТекстКорреспондента;
            ОбъектБанковскиеСчета.ТекстНазначения       = БанковскийСчет.ТекстНазначения;
            ОбъектБанковскиеСчета.ВидСчета              = БанковскийСчет.ВидСчета;
               ОбъектБанковскиеСчета.ВалютаДенежныхСредств = ПолучитьЗначениеВалюты(БанковскийСчет.ВалютаДенежныхСредств);
            ОбъектБанковскиеСчета.НомерИДатаРазрешения  = БанковскийСчет.НомерИДатаРазрешения;
            ОбъектБанковскиеСчета.ДатаОткрытия          = БанковскийСчет.ДатаОткрытия;
            ОбъектБанковскиеСчета.ДатаЗакрытия          = БанковскийСчет.ДатаЗакрытия;
            ОбъектБанковскиеСчета.МесяцПрописью         = БанковскийСчет.МесяцПрописью;
            ОбъектБанковскиеСчета.СуммаБезКопеек        = БанковскийСчет.СуммаБезКопеек;
               ОбъектБанковскиеСчета.Записать();  
            Возврат ОбъектБанковскиеСчета.Ссылка;        
        Иначе        
            Возврат СсылкаНаОбъект;
        КонецЕсли;
    КонецЕсли;        
КонецФункции


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

Функция ПолучитьДоговор(Договор,ПерезаписыватьРеквизиты=Ложь);    
    Если Не ЗначениеЗаполнено(Договор) Тогда Возврат Неопределено КонецЕсли;
    ИдентификаторИсточник   = Договор.УникальныйИдентификатор();
    ИдентификаторПолучатель = Соединение.NewObject("УникальныйИдентификатор", СокрЛП(ИдентификаторИсточник));
    СсылкаНаОбъект = Соединение.Справочники.ДоговорыКонтрагентов.ПолучитьСсылку(ИдентификаторПолучатель);
    Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда
        Возврат Неопределено;
    Иначе
        Если ПерезаписыватьРеквизиты Тогда
            ОбъектДоговоры                   = СсылкаНаОбъект.ПолучитьОбъект();
            ОбъектДоговоры.ПометкаУдаления   = Договор.ПометкаУдаления;
            ОбъектДоговоры.Код               = Договор.Ссылка.Код;            
            ОбъектДоговоры.Наименование      = Договор.Ссылка.Наименование;
            ОбъектДоговоры.Владелец          = ПолучитьКонтрагента(Договор.Владелец);
            ОбъектДоговоры.Организация       = Справочники.Организации.НайтиПоКоду("000000001");
            ОбъектДоговоры.ВидДоговора       = ПолучитьЗначениеПеречислениеОЛЕ(Договор.Ссылка.ВидДоговора);
            ОбъектДоговоры.ПроцентПредоплаты = Договор.Ссылка.ПроцентОплаты;
            ОбъектДоговоры.Дата              = Договор.Ссылка.Дата;
            ОбъектДоговоры.Номер             = Договор.Ссылка.Номер;
            ОбъектДоговоры.СрокДействия      = Договор.Ссылка.СрокДействия;
            ОбъектДоговоры.КонтролироватьСуммуЗадолженности     = Договор.Ссылка.КонтролироватьСуммуЗадолженности;
            ОбъектДоговоры.КонтролироватьЧислоДнейЗадолженности = Договор.Ссылка.КонтролироватьЧислоДнейЗадолженности;
            ОбъектДоговоры.Записать();
            Возврат ОбъектДоговоры.Ссылка;        
        Иначе        
            Возврат СсылкаНаОбъект;
        КонецЕсли;
    КонецЕсли;    
КонецФункции

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

КонецФункции


Функция ПолучитьЗначениеПеречислениеОЛЕ(Перечисление)
    Если Не ЗначениеЗаполнено(Перечисление) Тогда 
        Возврат Перечисления[Перечисление.Метаданные().Имя].ПустаяСсылка() 
    КонецЕсли;
    Индекс   = Перечисления[Перечисление.Метаданные().Имя].Индекс(Перечисление);
    Возврат Соединение.Перечисления[Перечисление.Метаданные().Имя].Получить(Индекс);    
КонецФункции

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

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



Функция ПолучитьНоменклатуру(Номенклатура,ПерезаписыватьРеквизиты=Ложь)
    Если Не ЗначениеЗаполнено(Номенклатура) Тогда Возврат Неопределено КонецЕсли;
    ИдентификаторИсточник   = Номенклатура.УникальныйИдентификатор();
    ИдентификаторПолучатель = Соединение.NewObject("УникальныйИдентификатор", СокрЛП(ИдентификаторИсточник));
    СсылкаНаОбъект = Соединение.Справочники.Номенклатура.ПолучитьСсылку(ИдентификаторПолучатель);  
    Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда//такая Номенклатура отстутсвует   

        Если Номенклатура.ЭтоГруппа  Тогда
            ОЛЕНоменклатура = Соединение.Справочники.Номенклатура.СоздатьГруппу();
            ОЛЕНоменклатура.УстановитьСсылкуНового(СсылкаНаОбъект);
            ОЛЕНоменклатура.ПометкаУдаления    = Номенклатура.ПометкаУдаления;
            ОЛЕНоменклатура.Родитель           = ПолучитьНоменклатуру(Номенклатура.Родитель);
            ОЛЕНоменклатура.Код                = Номенклатура.Код;
            ОЛЕНоменклатура.Наименование       = Номенклатура.Наименование;            
            ОЛЕНоменклатура.Записать();
            Возврат ОЛЕНоменклатура.Ссылка;
        Иначе
            ОЛЕНоменклатура = Соединение.Справочники.Номенклатура.СоздатьЭлемент();
            ОЛЕНоменклатура.УстановитьСсылкуНового(СсылкаНаОбъект);
            ОЛЕНоменклатура.Родитель                   = ПолучитьНоменклатуру(Номенклатура.Родитель);
            ОЛЕНоменклатура.ПометкаУдаления            = Номенклатура.ПометкаУдаления;
            ОЛЕНоменклатура.Код                        = Номенклатура.Код;
            ОЛЕНоменклатура.Наименование               = Номенклатура.Наименование;
            ОЛЕНоменклатура.НаименованиеПолное         = Номенклатура.НаименованиеПолное;   
            ОЛЕНоменклатура.БазоваяЕдиницаИзмерения    = ПолучитьБазовуюЕдиницуИзмерения(Номенклатура.БазоваяЕдиницаИзмерения);
            ОЛЕНоменклатура.ВестиУчетПоХарактеристикам = Номенклатура.ВестиУчетПоХарактеристикам;
            ОЛЕНоменклатура.СтавкаНДС                  = Соединение.Перечисления.СтавкиНДС.НДС18;
            ОЛЕНоменклатура.Артикул                    = Номенклатура.Артикул;
            ОЛЕНоменклатура.ВидНоменклатуры            = Соединение.Справочники.ВидыНоменклатуры.НайтиПоКоду("000000001");
            ОЛЕНоменклатура.Записать();        
            УстановитьЕдиницы(Номенклатура,ОЛЕНоменклатура);
            ОЛЕНоменклатура.ЕдиницаХраненияОстатков = ПолучитьЕдиницуИзмерения(Номенклатура.ЕдиницаХраненияОстатков);
            ОЛЕНоменклатура.ЕдиницаИзмеренияМест    = ПолучитьЕдиницуИзмерения(Номенклатура.ЕдиницаИзмеренияМест);
            ОЛЕНоменклатура.ТипЦенРеквизит          = ПолучитьТипЦен(Номенклатура.ТипЦенРеквизит);
            
            ОЛЕНоменклатура.Записать();        
            Возврат ОЛЕНоменклатура.Ссылка;
        КонецЕсли;        
    Иначе    
        Если ПерезаписыватьРеквизиты Тогда
            Если Номенклатура.ЭтоГруппа  Тогда
                ОЛЕНоменклатура = СсылкаНаОбъект.ПолучитьОбъект();
                ОЛЕНоменклатура.ПометкаУдаления    = Номенклатура.ПометкаУдаления;
                ОЛЕНоменклатура.Родитель           = ПолучитьНоменклатуру(Номенклатура.Родитель);
                ОЛЕНоменклатура.Код                = Номенклатура.Код;
                ОЛЕНоменклатура.Наименование       = Номенклатура.Наименование;            
                ОЛЕНоменклатура.Записать();
                Возврат ОЛЕНоменклатура.Ссылка;
            Иначе
                ОЛЕНоменклатура = СсылкаНаОбъект.ПолучитьОбъект();
                ОЛЕНоменклатура.Родитель                   = ПолучитьНоменклатуру(Номенклатура.Родитель);
                ОЛЕНоменклатура.ПометкаУдаления            = Номенклатура.Пометк
   illi_dan
 
23 - 04.05.18 - 22:17
(20) код как я понимаю тоже уникальный идентификатор объекта?Использовать уникальные идентификаторы нельзя, у меня нету тз, есть просто задание по итогу которого либо я подхожу,либо нет.Смотрят скорее всего на умение нестандартно мыслить и быстро обучаться.
   MakaMaka
 
24 - 04.05.18 - 22:18
Соединение.Справочники.Номенклатура.СоздатьГруппу(); 

НормальнО? Не долго работает? Не напрягает?
   Египтянин
 
25 - 04.05.18 - 22:19
(23) код и наименование это реквизит, который есть у всех справочников. Если стоит галочка уникальность кодов, то уникальный, если не стоит то не уникальный.
   Египтянин
 
26 - 04.05.18 - 22:19
(24) в 2006 году с этими вашими экспертами не парились, писали абы работало.
   MakaMaka
 
27 - 04.05.18 - 22:20
(23) Если тебе надо выгружать данные и нет идентификаторов, то ищи либо по наименованию либо по коду. НЕ ЗАБУДЬ ЮНЫЙ ПАДАВАН ПРОВЕРЯТЬ НА ГРУППУ! Наименование это прекрасно, но НЕЛЬЗЯ забывать о иерархии справочников!
   Египтянин
 
28 - 04.05.18 - 22:20
это еще под 8.0 загрузка.
   Египтянин
 
29 - 04.05.18 - 22:21
(23) а куда ты хоть устраиваешься? Франчайзи, фикси?
   MakaMaka
 
30 - 04.05.18 - 22:21
(28) Да я и не говорю что не рабочий вариант, рабочий и очень даже, но есть способ сделать тоже самое технологичнее и проще ( на мой взгляд) но код нормальный, молодец.
   MakaMaka
 
31 - 04.05.18 - 22:22
(29) это недофранч с неочень грамотным руководителем. На фикси он бы сидел с отчетом. А это если фикси, то скорее всего на нетленку с обменом с таким же нетленным сайтом
   Египтянин
 
32 - 04.05.18 - 22:28
(30) Ну спасибо! Ты же говорил, скрипящее инвалидное колесо. Однако у людей небось до сих пор работает.
(31) а ты откуда знаешь куда он устраивается?
   MakaMaka
 
33 - 04.05.18 - 22:30
(32) Да работает, оно тихо работает и тихо отваливается. Ты вот как поймешь работает выгрузка или спотыкается?

Выход у тебя один,

Попытка

Попытка
Попытка
Попытка

Исключение
КонецПопытки;
Исключение 

КонецПопытки;

Исключение 

КонецПопытки;
Исключение 

КонецПопытки;
 
 
   Египтянин
 
34 - 04.05.18 - 22:32
(33) где ты там в моем коде хоть одну Попытка Исключение нашел?
   MakaMaka
 
35 - 04.05.18 - 22:32
(32) А я вижу что он спрашивает.

Так что там про попытки? Сколько у тебя их? если у тебя их нет, то выгрузка точно инвалид, т.к. она тихо отвалится и усе, тушите свет
   MakaMaka
 
36 - 04.05.18 - 22:35
а отвалится она через 2-3 релиза обновления базы приемника, т.к. все меняется очень быстро.
   Египтянин
 
37 - 04.05.18 - 22:35
(35) але она через планы обмена работает. Если она отвалится, то при следующей выгрузке/загрузке отработает.
   Египтянин
 
38 - 04.05.18 - 22:36
(36) А чего есть такой обмен, который при изменении релизов не отваливается?
   MakaMaka
 
39 - 04.05.18 - 22:37
Тогда забираю слова назад про выгрузку, т.к. у нас просто через КОМ работает выгрузка, типа как хочет ТС, это дичь дикая.
   MakaMaka
 
40 - 04.05.18 - 22:40
Короче без плана обмена подобная выгрузка дикая дичь. Я видел как она реализована на 2 РС, это вырви глаз.
   Египтянин
 
41 - 04.05.18 - 22:40
ну перепишите как то так
   Египтянин
 
42 - 04.05.18 - 22:40
Соединение = Неопределено;
    ЗаписьXML = Новый ЗаписьXML(); 
    ЗаписьXML.УстановитьСтроку(); 
    Узел = ПланыОбмена.ТорговаяБаза.НайтиПоКоду("000000003"); 
    ИмяБазы      = Узел.ИмяБазыДанных;
    ИмяСервера   = Узел.СерверБазыДанных;
    Пользователь = Узел.Пользователь;
    Пароль       = Узел.Пароль;
    
    ВыполнитьСоединение(ТипСоединения);        
     
    
    ЗапСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); 
    ЗапСообщения.НачатьЗапись(ЗаписьXML, Узел); 
    
    Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗапСообщения.НомерСообщения); 
    Пока Выборка.Следующий() Цикл 
        Данные = Выборка.Получить();
        Если ТипЗнч(Данные) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда            
            ВыгрузитьДокументРеализацияТоваровУслуг(Данные.Ссылка);
            ПланыОбмена.УдалитьРегистрациюИзменений(Узел, Данные);
        ИначеЕсли  ТипЗнч(Данные) = Тип("ДокументОбъект.ВозвратТоваровОтПокупателя") Тогда
            ВыгрузитьДокументВозвратОтПокупателя(Данные.Ссылка);
            ПланыОбмена.УдалитьРегистрациюИзменений(Узел, Данные);
        ИначеЕсли ТипЗнч(Данные) = Тип("СправочникОбъект.Номенклатура") Тогда
            ПолучитьНоменклатуру(Данные.Ссылка,Истина);
            ПланыОбмена.УдалитьРегистрациюИзменений(Узел, Данные);
            
        ИначеЕсли ТипЗнч(Данные) = Тип("СправочникОбъект.ХарактеристикиНоменклатуры") Тогда
            ПолучитьХарактеристику(Данные.Ссылка,Истина);        
            ПланыОбмена.УдалитьРегистрациюИзменений(Узел, Данные);
        КонецЕсли;        
    КонецЦикла;
   MakaMaka
 
43 - 04.05.18 - 22:42
(42) вот тут я могу сказать, проще сделать правила регистрации, что бы регистрировать все с отборами и прочими плюшками. Т.к. только регистрация объекта проходит дважды, при записи и в момент выгрузки, ТС об этом вообще не знает. Для него это темный лес.
   Египтянин
 
44 - 04.05.18 - 22:43
(43) ну отключи автоматическую регистрацию, напиши свою.
   MakaMaka
 
45 - 04.05.18 - 22:46
(44) А ее полюбому отключать, иначе БСП работать не будет.
   MakaMaka
 
46 - 04.05.18 - 22:47
Египтянин код зачетный, честно. Нормальная обработка, еще раз извиняюсь за дерзость и наглость, ты меня хорошо обсадил. Признаю.
   Asmody
 
47 - 04.05.18 - 22:48
(22) За слово 'OLE' в 2018 году принято давать клавиатурой по рукам.
   Египтянин
 
48 - 04.05.18 - 22:52
(47) Успокойси, код 2006 года, я сам уже лет 5-7 ничего не пишу.
   systemstopper
 
49 - 04.05.18 - 22:55
(47) а как надо говорить?
 
 Рекламное место пустует
   systemstopper
 
50 - 04.05.18 - 22:55
(48) а что ты делаешь сам?
   Египтянин
 
51 - 04.05.18 - 22:57
(50) да х. пинаю.
   MakaMaka
 
52 - 04.05.18 - 23:13
(49) надо не говорить, а надо делать, планы обмена по правилам конвертации и регистрации. КД 2.1 минимум и хорошо если КД 3.0,
   illi_dan
 
53 - 05.05.18 - 00:08
(29) (27) Навалял рекурсивную функцию пока без проверки на группу,однако падает с ошибкой "преобразование к типу Число не может быть выполнено"

&НаСервере
функция ЗаписатьФайл(ДокСсылка)
    перем Метаданные;
    Метаданные=ДокСсылка.метаданные();    
        Текст=новый ТекстовыйДокумент;
        Для Каждого реквизит из Метаданные.реквизиты цикл
            Если Найти(реквизит.ПолноеИмя(),"Ссылка")>0 Тогда
                ЗаписатьФайл(метаданные.НайтиПоНомеру(реквизит.номер()));
            Иначе 
                Текст.ДобавитьСтроку(реквизит + ":"+ДокСсылка[реквизит.Имя]+Символы.ПС);
            КонецЕсли
            
        КонецЦикла;
            
        Текст.Записать(объект.ПутьКФайлу);

    
    
КонецФункции
   hhhh
 
54 - 05.05.18 - 00:26
(53) назвать переменную "Метаданные" - это извини меня дебилизм. Это слово занято.

пиши проще

ХренЗнаетКАкаяПеременная = ДокСсылка.метаданные();


и вот это что за бред?

 НайтиПоНомеру(реквизит.номер())

то есть у тебя есть реквизит. Но ты как бы не хочешь к нему обратиться. Хочешь еще прогнать по кругу поиск, чтобы было занятно. Зачем его искать, когда он есть уже?
   mexanik_96
 
55 - 05.05.18 - 00:33
почему запрещено то, почему запрещено это?
   illi_dan
 
56 - 05.05.18 - 00:46
(54) да,показалось что эта функция как взятие адреса в "c")
   hhhh
 
57 - 05.05.18 - 00:55
(56) реквизит - это и есть адрес.
   illi_dan
 
58 - 05.05.18 - 02:02
Прогнал в отладчике

Если Найти(реквизит.ПолноеИмя(),"Ссылка")>0 Тогда


Сюда вообще не заходит,и при обращении по [] выдает ошибку
"преобразование к типу Число не может быть выполнено",в чем может быть проблема?
   illi_dan
 
59 - 05.05.18 - 02:05
Ан нет,работает вроде бы со скрипом,но в условие не заходит(
   hhhh
 
60 - 05.05.18 - 02:19
(59) ну нет в имени реквизита слова "Ссылка". Очень редки такие имена. Обычно простое имя реквизита "Контрагент", "Склад", например. Наверно вам не имя нужно, а тип реквизита.
   illi_dan
 
61 - 05.05.18 - 02:39
(60) Да,мне нужно узнать является ли эта переменная ссылкой.Однако я работаю с метаданными, и ТипЗнч от него возвращает просто "объект метаданных" вне зависимости от того,ссылка это или нет. И не знаю,как решить(
   Провинциальный 1сник
 
62 - 05.05.18 - 02:49
(8) Главное не забыть о возможности циклических ссылок.. Стандартная сериализация ЗначениеВСтрокуВнутр и сериализация в XML на этом роняют платформу.
   hhhh
 
63 - 05.05.18 - 02:54
(61) глупо писать ТипЗнч, пиши Тип. Ну и вообще открой справку, хотя бы для хохмы. Ctrl-F1  очень удобная вещь, называется синтакс помощник.
   mistеr
 
64 - 05.05.18 - 09:09
(61) Ты справкой принципиально не пользуешься?
   Lama12
 
65 - 05.05.18 - 10:39
ИМХО. Похоже (0) студен сдающий зачет.
   MakaMaka
 
66 - 05.05.18 - 14:16
(65) походу он пересдающий зачет и студенту грозят весенним призывом.
   ugorchina
 
67 - 05.05.18 - 15:35
(0) а куда усстраиваешься то? Я то же хочу!
   NSSerg
 
68 - 05.05.18 - 16:19
(47) А если разовую задачу, которую при помощи ОЛЕ можно написать за 5 минут - пишут час чтоб не получить клавиатурой по рукам - что в этом случае делать?
   Garykom
 
69 - 05.05.18 - 16:50
(68) Зачем писать 5 минут, когда можно писать час?
   NSSerg
 
70 - 05.05.18 - 17:54
(69) Потому что денег больше за то же время не получишь точно, а вот санкций от начальника, который разбирается в программировании - схлопотать можешь. И в любом случае от скорости решения задач зависят и репутация и зарплата.
   Garykom
 
71 - 05.05.18 - 18:19
(70) Часто нечто временное (разовая задача) превращается в постоянно.

А когда переставили винду/платформу и OLE перестало работать это стабильная ситуация и на решение проблемы уйдет намного больше времени чем "час".

И да использую веб-сервисы или иные способы (да хоть банальная выгрузка/загрузка файлов врукопашную или с помощью КД что еще проще) обычно сравнимы по скорости написания с OLE.

А если человек больше ничего кроме ОЛЕ не знает тут уже извините.

ЗЫ Сам был одно время фанатом ОЛЕ пока не столкнулся с траблами в будущем возникающими.
   NSSerg
 
72 - 05.05.18 - 19:08
(71) постоянная задача загрузки какой-то мелочи из экселя, загрузка на десяток строк. И что предлагается вместо оле?
   NSSerg
 
73 - 05.05.18 - 19:13
(71) и при чем тут фанатство? нормальный разработчик использует то что эффективней для конкретной задачи. А когда разработчика бзикует на ограничениях, это уже здорово вредит работе, а когда он через файлы обмена или вебсервисы или с помощью КД пытается загрузить из экселя простейшую плоскую табличку - это уже, извините, человеку пора к доктору :)
   Garykom
 
74 - 05.05.18 - 19:20
(72) Вместо оле предлагается ТабличныйДокумент.Прочитать()
   Garykom
 
75 - 05.05.18 - 19:21
(73) Вменяемый разработчик должен думать "а что будет потом?" Вместо тяп/ляп и в продакшен.

Если ОЛЕ лучше чем все прочие методы - вперед и с песней. Но сначала ознакомьтесь со всеми прочими методами.
   NSSerg
 
76 - 05.05.18 - 20:37
(75) Ты следил вообще за веткой? На какой пост я отвечал?
Зачем ты мне сейчас это пишешь?
Это я пишу о том, что если в данном случае ОЛЕ лучше, то извращение использовать другие методы. А ты со мной спорил.
Теперь хочешь всё перевернуть с ног на голову?
   Garykom
 
77 - 05.05.18 - 20:48
(76) В 2018 году ОЛЕ лучше в 0.1% случаев.
   vis_tmp
 
78 - 05.05.18 - 20:55
(74)Кстати, вопрос: как этим методом получить гиперссылку из ячейки Excel-а?
Гиперссылка представляет из себя URL на картинку на сайте.
   Garykom
 
79 - 05.05.18 - 21:49
(78) Обычный текст возвращается же
   NSSerg
 
80 - 05.05.18 - 22:17
(77) любая разовая простая загрузка из эксель. это раз.
во вторых не в любом языке есть табличный документ.
Сначала ты ограничил себя в методах, теперь ограничил себя восьмеркой.
   NSSerg
 
81 - 05.05.18 - 22:21
+ (80) а в третьих это маразм, когда есть прямые методы работы с данными, которые уже находятся в открытом на экране файле - городить огород вместо десяти простейших строк кода.
   Garykom
 
82 - 05.05.18 - 23:00
(80) (81) Ответ будет только один.

С какого перепугу взял что MS Office установлен?
   Garykom
 
83 - 05.05.18 - 23:05
Зачем ограничивать себя одной технологией, который в придачу может и не быть?

Не проще использовать нечто более универсальное, куда можно засунуть данные разными способами.

Пишешь загрузку из ТабДок, а как данные туда попали это уже отдельный вопрос.

"Прочитать()", ВК (нативная/com) или нечто иное типа веб-сервиса это уже пофиг для нашего кода.
В одном месте поменять/добавить и все работает.


А если у тебя прямая загрузка из Excel через OLE без промежуточной ТЗ/ТД то привет, приехали.
   ugorchina
 
84 - 06.05.18 - 07:31
Многие спорят что лучше и все как один кричат что ОЛЕ это плохо да объясните уже наконец чем плох ОЛЕ?
   ugorchina
 
85 - 06.05.18 - 07:32
(84) мне вот нравится работать с ОЛЕ но что в нем плохого то? Скорость,? , Что ещё?
   ugorchina
 
86 - 06.05.18 - 07:46
+(85) и ещё поделитесь информацией можно ли как то из сторонней программы работать с По ОЛЕ с 1с как например у клиента стоит скажем атол рабочее место кассира и есть возможность внесения доработок в данную программу так вот я всегда задавался вопросом а как подружится к 1с напрямую и выполнять ее код из сторонней прогрыммы как например создать документ по ОЛЕ (но не между 1с и 1с а между мое ПО и 1с) ? Есть ли вообще такого рода возможность?
   hhhh
 
87 - 06.05.18 - 08:30
(85) ОЛЕ уже всё. Пользуйся вэб-сервисами и другими новомодными штуками. Это абсолютно то же самое, даже код примерно такой же, но ряд преимуществ: не зависишь от платформы, автоматическая проверка входных параметров, работа со смартфонами и планшетами.
   ugorchina
 
88 - 06.05.18 - 09:02
(87) как я понимаю ответ и на (86)?
   hhhh
 
89 - 06.05.18 - 11:04
(88) ну это только для 7.7 имеет смысл, там реквизитов в документе 5, от силы 10 штук. А в восьмерке, там всё другое. Другие масштабы. Там реквизитов штук 50 + несколько табчастей, по 20-30 реквизитов в каждой. И многие из них являются справочниками или тоже документами. В общем еще и поиск по журналам и их рекурсивно создавать придется. Вставить такую программу внутрь программы атолл проблематично.
   vis_tmp
 
90 - 06.05.18 - 11:35
(79)Тоже так думал, но нет возвращается текст "Изображение"...
   Garykom
 
91 - 06.05.18 - 13:56
(90) "СпособЧтенияЗначений = Значение" не помогает?
   vis_tmp
 
92 - 06.05.18 - 14:26
(90)Именно так и читаю
   vis_tmp
 
93 - 06.05.18 - 14:27
(92)к(91)
   Garykom
 
94 - 06.05.18 - 14:33
(92) А если наоборот Текст?
   DmitriyDI
 
95 - 06.05.18 - 15:17
(0) с нуля такое писать можно неделями, а то и месяцами, чтобы все работало универсально, считаю, что эта задача перебор для собеседования.
   Garykom
 
96 - 06.05.18 - 15:21
(95) Ты не совсем прав, это замечательная учебная задача.

В процессе даже если не напишет полностью рабочее то придется освоить кучу всего.

Например при обходе/выгрузке реквизитов когда они объектные надо при рекурсии понимать когда остановиться.

"Документ Реализация" - "Реквизит Справочник Контрагенты" - У справочника свои реквизиты и их тоже надо выгружать?

А тут еще цикла получится когда совершенно случайно у справочника есть реквизит типа документ = Реализация ))
   DmitriyDI
 
97 - 06.05.18 - 15:28
(96) я не спорю, в качестве учебной, а вот в качестве для собеседования, считаю что перебор, не просят же написать с нуля базу аналог бухгалтерии, интересная задача, выучить можно массу всего и т.д.
ну тут явный перебор, я бы задумался стоит ли идти в такое место.
   Йохохо
 
98 - 06.05.18 - 15:35
(97) задача наверняка для стажера, то есть достаточно показать, что знаешь циклы, можешь перебрать реквизиты, для обратной задачи умеешь найти по номеру
   vis_tmp
 
99 - 07.05.18 - 06:36
(94)Попробовал текстом, результат тот же...
А у тебя это получалось на практике?
Если есть желание посмотреть, могу прислать мой Excel файлик-пример
   vis_tmp
 
100 - 07.05.18 - 06:36
100
  1  2   

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует