Имя: Пароль:
1C
1С v8
Конвертация данных. Вопрос по справочнику контрагенты
,
0 AlexKulikov
 
12.12.16
18:57
Добрый вечер, уважаемые форумчане.

Источник - УТ 10.1
Приемник - УТ 10.3

Столкнулся с следующей проблемой:

Когда переношу данные из Источника, а именно документ "Корректировка долга", то хотелось бы получить информацию о "контактных данных" выгружаемого контрагента.
В результате у меня получилось следующее: В ПКО, для справочника "Контрагенты" в меню  "После Выгрузки", написал следующий код:  
<code>
Если (Не Источник.ЭтоГруппа) И (Не Источник.ПометкаУдаления) Тогда
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
                       |    КонтактнаяИнформация.Объект,
                       |    КонтактнаяИнформация.Тип,
                       |    КонтактнаяИнформация.Вид,
                       |    КонтактнаяИнформация.Представление,
                       |    КонтактнаяИнформация.Поле1,
                       |    КонтактнаяИнформация.Поле2,
                       |    КонтактнаяИнформация.Поле3,
                       |    КонтактнаяИнформация.Поле4,
                       |    КонтактнаяИнформация.Поле5,
                       |    КонтактнаяИнформация.Поле6,
                       |    КонтактнаяИнформация.Поле7,
                       |    КонтактнаяИнформация.Поле8,
                       |    КонтактнаяИнформация.Поле9,
                       |    КонтактнаяИнформация.Поле10,
                       |    КонтактнаяИнформация.Комментарий
                       |ИЗ
                       |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
                       |ГДЕ
                       |    КонтактнаяИнформация.Объект = &Объект";
        Запрос.УстановитьПараметр("Объект", Источник);
        Выборка = Запрос.Выполнить().Выбрать();
        Пока Выборка.Следующий() Цикл
            ВыгрузитьПоПравилу(Выборка,,,,"КонтактнаяИнформация");
        КонецЦикла;    
    КонецЕсли;
</code>

Где Объект - это ссылка на элемент справочника "Контрагенты". В результате у меня всегда пустой результат запроса. Хотя данные по контрагенту в регистре сведений есть.

Подскажите пожалуйста, где я ошибаюсь?
1 AlexKulikov
 
12.12.16
18:57
С Уважением, Алексей.
2 Cyberhawk
 
12.12.16
18:58
Объект.Ссылка может установить в кач-ве значения параметра?
3 Cyberhawk
 
12.12.16
18:58
Ну и заодно покажи свой "пустой результат запроса", где ты его смотришь
4 AlexKulikov
 
12.12.16
19:10
В консоли запросов смотрю. Так у меня "Источник" - это значение ссылочного типа(Контрагенты).

А так, когда запускал режим отладки обработчиков в конвертации данных, ставил точку останову с условием Запрос.Выполнить().Пустой() при 11 итерациях, всегда получалась "Истина."
В конфигураторе, у регистра сведений "КонтактнаяИнформация", для реквизита "Объект" указаны типы значений которые он может принимать, среди них СправончикСсылка.Контрагенты.
5 Defender aka LINN
 
12.12.16
19:11
(0) "Объект - это ссылка", а устанавливаем Источник. Хотя он тоже не ссылка.
6 Aleksey
 
12.12.16
19:16
(5) а кто он?

Источник - Произвольный - выгружаемый объект источник (ссылка или произвольные данные)

В данном случае стандартная выборка и Источник - Ссылка
7 Defender aka LINN
 
12.12.16
19:18
(6) Ну, положим, не ссылка, а выборка...
8 Aleksey
 
12.12.16
19:19
С чего ты взял что результат пустое?

В ПКО КонтактнаяИнформация он заходит?
Не запоминать выгруженные объекты - галку ставил?
КлючВыгружаемыхДанных указывать пробовал?
9 Aleksey
 
12.12.16
19:20
(7) А что выборка?
Выборка это как раз случай произвольных данных. Он корректно отработает.
10 AlexKulikov
 
12.12.16
19:24
Вот как так. В консоли, без этого условия по контрагенту -  есть информация.
Устанавливаю условие, выбираю любого контрагента, нет информации.

<code>
Если (Не Источник.ЭтоГруппа) И (Не Источник.ПометкаУдаления) Тогда
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
                       |    КонтактнаяИнформация.Объект,
                       |    КонтактнаяИнформация.Тип,
                       |    КонтактнаяИнформация.Вид,
                       |    КонтактнаяИнформация.Представление,
                       |    КонтактнаяИнформация.Поле1,
                       |    КонтактнаяИнформация.Поле2,
                       |    КонтактнаяИнформация.Поле3,
                       |    КонтактнаяИнформация.Поле4,
                       |    КонтактнаяИнформация.Поле5,
                       |    КонтактнаяИнформация.Поле6,
                       |    КонтактнаяИнформация.Поле7,
                       |    КонтактнаяИнформация.Поле8,
                       |    КонтактнаяИнформация.Поле9,
                       |    КонтактнаяИнформация.Поле10,
                       |    КонтактнаяИнформация.Комментарий
                       |ИЗ
                       |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
                       |ГДЕ
                       |    КонтактнаяИнформация.Объект = &Объект";
        Запрос.УстановитьПараметр("Объект", Источник);
        РезультатЗапроса = Запрос.Выполнить();
        Если НЕ РезультатЗапроса.Пустой() Тогда
            Сообщить("Что то есть");
        КонецЕсли;    
        Выборка = Запрос.Выполнить().Выбрать();
        Пока Выборка.Следующий() Цикл
            ВыгрузитьПоПравилу(Выборка,,,,"КонтактнаяИнформация");
        КонецЦикла;    
    КонецЕсли;


</code>
11 AlexKulikov
 
12.12.16
19:24
Источник    акватерм-Руссланд    СправочникСсылка.Контрагенты
12 AlexKulikov
 
12.12.16
19:24
Вот так в отладчике выглядит Источник.
13 h-sp
 
12.12.16
19:28
(12) скопируй с других правил это. Вот не лень сидеть изобретать велосипед? Когда всё уже давным-давно написано, надо просто скопипастить.
14 GANR
 
12.12.16
19:45
(0) Это Запрос.УстановитьПараметр("Объект", Источник);  на это Запрос.УстановитьПараметр("Объект", Источник.Ссылка); попробуйте заменить
15 AlexKulikov
 
14.12.16
16:53
Добрый день, уважаемые форумчане. Проблему с параметром я переборол, оказывается в УТ 10.1 для того, чтобы получить данные о контактной информации, нужно в качестве параметра передавать не ссылку на элемент справочника контрагенты, а ссылку на элемент справочников юридические лица или физические лица.

В итоге у меня получилась вот такая простыня для ПКО Контрагенты - закладка После выгрузки:
<code>
Если (Не Источник.ЭтоГруппа) И (Не Источник.ПометкаУдаления) Тогда
        
    
        мУсловие = "";
        
        ЗапросКЮридЛицам = Новый Запрос;
        ЗапросКЮридЛицам.УстановитьПараметр("Контрагент", Источник);
        ЗапросКЮридЛицам.Текст = "ВЫБРАТЬ
        |    ЮридическиеЛица.Ссылка,
        |    ЮридическиеЛица.ПометкаУдаления,
        |    ЮридическиеЛица.Предопределенный,
        |    ЮридическиеЛица.Родитель,
        |    ЮридическиеЛица.ЭтоГруппа,
        |    ЮридическиеЛица.Код,
        |    ЮридическиеЛица.Наименование,
        |    ЮридическиеЛица.ИНН,
        |    ЮридическиеЛица.КодПоОКПО,
        |    ЮридическиеЛица.Комментарий,
        |    ЮридическиеЛица.Контрагент,
        |    ЮридическиеЛица.КПП,
        |    ЮридическиеЛица.НаименованиеПолное,
        |    ЮридическиеЛица.ОсновнойБанковскийСчет,
        |    ЮридическиеЛица.Представление
        |ИЗ
        |    Справочник.ЮридическиеЛица КАК ЮридическиеЛица
        |ГДЕ
        |    ЮридическиеЛица.Контрагент = &Контрагент";
        
        РезультатЗапросаКЮрикам = ЗапросКЮридЛицам.Выполнить();
        
        Если РезультатЗапросаКЮрикам.Пустой() Тогда
            ЗапросКФизЛицам = Новый Запрос;
            ЗапросКФизЛицам.УстановитьПараметр("Контрагент", Источник);
            ЗапросКФизЛицам.Текст =  "ВЫБРАТЬ
            |    ФизическиеЛица.Ссылка,
            |    ФизическиеЛица.ПометкаУдаления,
            |    ФизическиеЛица.Предопределенный,
            |    ФизическиеЛица.Родитель,
            |    ФизическиеЛица.ЭтоГруппа,
            |    ФизическиеЛица.Код,
            |    ФизическиеЛица.Наименование,
            |    ФизическиеЛица.Контрагент,
            |    ФизическиеЛица.ОсновнойБанковскийСчет,
            |    ФизическиеЛица.ИНН,
            |    ФизическиеЛица.КодИМНС,
            |    ФизическиеЛица.Фамилия,
            |    ФизическиеЛица.Имя,
            |    ФизическиеЛица.Отчество,
            |    ФизическиеЛица.Комментарий,
            |    ФизическиеЛица.ВидОбращения,
            |    ФизическиеЛица.ДатаРождения,
            |    ФизическиеЛица.Представление
            |ИЗ
            |    Справочник.ФизическиеЛица КАК ФизическиеЛица
            |ГДЕ
            |    ФизическиеЛица.Контрагент = &Контрагент";
            
            РезультатЗапросаКФизикам = ЗапросКФизЛицам.Выполнить();
            Если Не РезультатЗапросаКФизикам.Пустой() Тогда
                ТаблицаРезультатаЗапросаКФизикам = РезультатЗапросаКФизикам.Выгрузить();
                Для Каждого Элемента Из ТаблицаРезультатаЗапросаКФизикам Цикл
                    мУсловие = Элемента.Ссылка;
                КонецЦикла;
            КонецЕсли;    
        Иначе
            ТаблицаРезультатЗапросаКЮрикам = РезультатЗапросаКЮрикам.Выгрузить();
            Для Каждого Элемента Из ТаблицаРезультатЗапросаКЮрикам Цикл
                мУсловие = Элемента.Ссылка;
            КонецЦикла;
        КонецЕсли;    
        
    КонецЕсли;
    
    Если ЗначениеЗаполнено(мУсловие) Тогда
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
                           |    КонтактнаяИнформация.Объект,
                           |    КонтактнаяИнформация.Тип,
                           |    КонтактнаяИнформация.Вид,
                           |    КонтактнаяИнформация.Представление,
                           |    КонтактнаяИнформация.Поле1,
                           |    КонтактнаяИнформация.Поле2,
                           |    КонтактнаяИнформация.Поле3,
                           |    КонтактнаяИнформация.Поле4,
                           |    КонтактнаяИнформация.Поле5,
                           |    КонтактнаяИнформация.Поле6,
                           |    КонтактнаяИнформация.Поле7,
                           |    КонтактнаяИнформация.Поле8,
                           |    КонтактнаяИнформация.Поле9,
                           |    КонтактнаяИнформация.Поле10,
                           |    КонтактнаяИнформация.Комментарий,
                           |    ИСТИНА КАК Активность
                           |ИЗ
                           |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
                           |ГДЕ
                           |    КонтактнаяИнформация.Объект = &Условие";
            Запрос.УстановитьПараметр("Условие", мУсловие);
            
            Выборка = Запрос.Выполнить().Выбрать();
            Пока Выборка.Следующий() Цикл
                ВыгрузитьПоПравилу(Выборка,,,,"КонтактнаяИнформация");
            КонецЦикла;    
    КонецЕсли;
</code>

Однако, при выполнении данного "замечательного" кода возникают следующие ошибки:
1)Не найдено соответствие для значения Источника
    Источник               =  Справочник "Юридические лица"
    ТипИсточника           =  Виды объектов контактной информации

Действительно, в источнике(УТ10.1) для регистра сведений "Контактная информация", указан реквизит составного типа "Объект", в котором присутствует данный справочник. В приемнике(УТ 10.3) такого справочника нет.

Соответственно, в правилах конвертации, лезу в регистр сведений "Контактная информация", в ПКС для реквизита "Объект" - закладка Перед выгрузкой, пытаюсь написать свой собственный код и вот тут возникает вторая проблема, чтобы я не писал, я не могу остановиться в этом обработчике с помощью отладчика.
Выдает такую ошибку:
2)шибка получения свойства объекта из входящих данных
    ПКО                    =  КонтактнаяИнформация  (Регистр сведений: Контактная информация)
    ПКС                    =  4  (--> Объект)
    Объект                 =  (Выборка из результата запроса)
    СвойствоПриемника      =  Объект  ()
    ОписаниеОшибки         =  Получение элемента по индексу для значения не определено
    ПозицияМодуля          =  ВнешняяОбработка.УниверсальныйОбменДаннымиXML(8282)
    КодСообщения           =  68
В итоге получается забавная ситуация, если я снимаю "Режим отладки обработчиков выгрузки", то у меня ошибок не возникает, и идет загрузка этого регистра, как только я его включаю и пишу в обработчике, к примеру: Сообщить("Остановись!");
У меня лезет эта ошибка.

Помогите советом, куда дальше копать?
Очень надеюсь на Вашу помощь, с уважением Алексей.