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


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



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

(12) кого ты лечишь мальчик? Я с 7.7 начинал, и в тексте переносил и оле и дбф у меня десятки самописных выгрузок/загрузок.
14 illi_dan
 
04.05.18
21:58
(8) УникальныйИдентиф (8) Функции УникальныйИдентификатор() Тоже запрещены. Я так понимаю нужно будет вернуть название реквизита и если он ссылочный,то искать такой в базе?
15 illi_dan
 
04.05.18
21:59
(10)Благодарю,но на ссылочных объектах все та же ошибка
16 illi_dan
 
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
как быть сложными типами "ДокументССылка" и прочие?

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

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

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

Попытка

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

Исключение

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

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

Исключение

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

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

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

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

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

пиши проще


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


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

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

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

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

А тут еще цикла получится когда совершенно случайно у справочника есть реквизит типа документ = Реализация ))
97 DmitriyDI
 
06.05.18
15:28
(96) я не спорю, в качестве учебной, а вот в качестве для собеседования, считаю что перебор, не просят же написать с нуля базу аналог бухгалтерии, интересная задача, выучить можно массу всего и т.д.
ну тут явный перебор, я бы задумался стоит ли идти в такое место.
98 Йохохо
 
06.05.18
15:35
(97) задача наверняка для стажера, то есть достаточно показать, что знаешь циклы, можешь перебрать реквизиты, для обратной задачи умеешь найти по номеру
99 vis_tmp
 
07.05.18
06:36
(94)Попробовал текстом, результат тот же...
А у тебя это получалось на практике?
Если есть желание посмотреть, могу прислать мой Excel файлик-пример
100 vis_tmp
 
07.05.18
06:36
100
101 Адинэснег
 
07.05.18
07:09
(0) ВыгрузкаЗагрузкаДанныхXML.epf
Там же есть флаг "Выгружать пр необходимости", выгружающий "дочерние" объекты ссылок соответствующих типов
102 Garykom
 
гуру
07.05.18
11:30
(99) Да скинь на почту, у меня просто libreoffice а не ms office и гиперссылки прекрасно читаются
103 s202
 
07.05.18
11:36
И ведь большинство работодателей, выбирая между тобой (которому за 40, и который умеет) и малолетним долбойобом из (0) - выберет малолетнего долбойоба. Только потому, что он малолетний.
104 vis_tmp
 
07.05.18
11:41
(102)Выслал, посмотри, если не сложно.
Очень хочется понять как доставать гиперссылку.
105 Nyarlathotep
 
07.05.18
11:44
(0) Иллидан, ты опять кровью демонов упоролся?)) Накой оно тебе?)
106 Azverin
 
07.05.18
11:44
(0) а эта что, задача на собеседовании? - жесть...
107 NSSerg
 
07.05.18
12:49
(103) На условные 50 тысяч возьмет малолетнего, а на 500 опытного.
108 Garykom
 
гуру
07.05.18
14:08
(107) Угу только часто (почему то) работодатели считают что 9 женщин смогут родить ребенка за месяц.

И наймут 10 малолетних по 50 тысяч...
109 NSSerg
 
07.05.18
16:33
(108) Но никто же не заставляет опытному идти к таким клиентам? На рынке навалом работодателей которые наелись молодыми и неопытными, и понимают разницу. Кто мешает устраиваться на работу к таким?
110 Garykom
 
гуру
07.05.18
16:59
(109) Требование переезда в другой город, по удаленке мало кто хочет давать работу.