Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Конвертация данных 2, регистр сведений в справочник

Конвертация данных 2, регистр сведений в справочник
Я
   baboon
 
09.07.19 - 13:12
Конвертация данных 2, регистр сведений в справочник
Всем привет!

Потребовалось поправить обмен данными между самопиской и УТ 11.2
Я не проф. разработчик 1С- админ, пытался сам учиться, и кое-что иногда делаю по образу и подобию :)
Влез в эту тему, понял, что сделано через конвертацию данных, через ком-соединение из
УТ в самописку обращается. Поставил конфу Конвертация Данных, поразбирался пару дней, и методом подобия
добавил правило для выгрузки и правило для конвертации.
Источник - регистр сведений, приемник в УТ - справочник. Ну по сути это кодификаторы,
там надо передать код, наименование и пару числовых реквизитов.
Но вот так проги написали, что в УТ это справочник, а в самописке - регистр.
Вроде все понятно (думал я), сделал правило конвертации, но обмен не проходит, возникает ошибка.

Я только смог запустить под отладчиком обмен и увидел там вот такое сообщение:
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(3404)}: ВНЕШНЕЕ СОЕДИНЕНИЕ: {Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(9105)}:
Поле объекта не обнаружено (СправочникСсылка.КоэфКоррекции)
Объект = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
ВызватьИсключение СтрокаСообщения;

Увидел, что в ИмяРегистра - там СправочникСсылка.СпрКоэфКоррекции.
Не понимаю - источник в правиле у меня указан РегистрСведенийЗапись. ЗначенияКоррекции, а вот приемник в УТ
и есть СправочникСсылка.СпрКоэфКоррекции, так почему он в регистрах-то ищет по этому имени?
В нынешнем обмене я ни одного такого правила не нашел, где регистр в справочник
выгружается, но там и правил немного.
Или это вообще нельзя в конвертации так делать, регистр сведений в справочник передавать?
 
 
   vicof
 
1 - 09.07.19 - 13:17
Гуглом пользоваться не учили?
http://1c-esse.buter.ru/konvertaciya-dannyx-2-1-iz-registra-v-spravochnik.html
   baboon
 
2 - 09.07.19 - 13:22
Спасибо за ссылку, только это вроде хоть и близко, но не совсем то,  и вопрос все же остается - просто указать в источник регистр, в приемнике - справочник, и реквизиты сопоставить, так нельзя и аллес? Только запрос писать в правиле выгрузки как в этом примере?
   hhhh
 
3 - 09.07.19 - 13:22
(0) смотрите в каком событии вы это ваяете. Если ПриВыгрузке или ПередВыгрузкой то это в УТ. Если в ПриЗагрузке или ПослеЗагрузки, то это уже самописка у вас. Вы там наверно налепили загрузку в выгрузку и наоборот.
   hhhh
 
4 - 09.07.19 - 13:24
(3) да, наоборот. выгрузка -самописка, загрузка ут.
   vicof
 
5 - 09.07.19 - 13:26
(2) Запрос можешь не писать, а через объектную модель. Но будет в 99% случаев тормознее.
   hhhh
 
6 - 09.07.19 - 13:28
(2) и вообще, покажите скрин вашего правила.
   baboon
 
7 - 09.07.19 - 13:29
(3) да я сделал совсем просто - выгрузка из регистра способ - стандартная выборка. И правило указал.
правило тоже простейшее - источник, приемник да реквизиты сопоставил, ничего не программировал, ток из списков выбирал и имена давал.
Если отключаю своё правило - то данные из самописки в ут передаются. Я так понимаю, что именно при загрузке на той стороне (УТ)
сбой происходит.
   Йохохо
 
8 - 09.07.19 - 13:41
вроде при правильном коде ошибка должна быть Поле объекта не обнаружено КоэфКоррекции, лучше переписать правило с нуля
и еще проверить что Вы в конвертации обновили структуру УТшки
   Ёпрст
 
9 - 09.07.19 - 13:42
(0)
в Перед выгрузкой формируй структуру +ВыгрузитьПоПравилу в приёмнике заполняй из входящийданных. Итого 2 правила ПКО
   baboon
 
10 - 10.07.19 - 18:57
Благодарю всех за участие. После суток мозголомки в итоге установил:
1. В штатной реализации в контексте типового обмена обработка КонвертацияОбъектовИнформационныхБаз не умеет передавать
РегистрСведений в Справочник без лишних ухищрений. Просто потому, что исходящие данные, невзирая на тип приемника сразу определяет как
набор записей регистра - Процедура ВыгрузитьРегистр(...).

Переопределять объект в событии ПередВыгрузкой - не поможет, так как в выходных данных тип уже будет безусловно определен как
"НаборЗаписейРегистра", да и сам код предполагает наличие отбора и определенной структуры именно под регистр,
через который, как я понял передаются отборы по зарегистрированным измененным записям:
        Если ТипЗнч(НаборЗаписейДляВыгрузки) = Тип("Структура") Тогда
            
            ОтборНабораЗаписей  = НаборЗаписейДляВыгрузки.Отбор;
            СтрокиНабораЗаписей = НаборЗаписейДляВыгрузки.Строки;
            
        Иначе// НаборЗаписей

            
            ОтборНабораЗаписей  = НаборЗаписейДляВыгрузки.Отбор;
            СтрокиНабораЗаписей = НаборЗаписейДляВыгрузки;
            
        КонецЕсли;
        
        // записываем сначала отбор потом набор записей

        // отбор

        
        Приемник = СоздатьУзел("НаборЗаписейРегистра");  ///<<  вот так, без всякого усложнения...



Я просто добавил небольшую врезку в Процедура ВыгрузитьРегистр(...), где делаю проверку типа приемника:

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

    Если//<<<< проверим тип приемника - и если это справочник, выгрузим строки набора записей как объекты

        Лев(Правило.ТипПриемника, СтрДлина("СправочникСсылка.")) = "СправочникСсылка."
    Тогда
        
        Для каждого СтрЗаписьРег Из НаборЗаписейДляВыгрузки Цикл
                ВыгрузкаОбъектаВыборки
                (СтрЗаписьРег, ПравилоВыгрузкиДанных, , ИсходящиеДанные, НеВыгружатьОбъектыПоСсылкам,,,,ИмяПКО);
        КонецЦикла;
        
        
    Иначе//<<<< проверим тип приемника - иначе штатный код:

        
        Если ТипЗнч(НаборЗаписейДляВыгрузки) = Тип("Структура") Тогда ...


и это сработало. В результате просто в КД мышкой накликано правило конвертации, сопоставлены свойства, все отработало.
 
 Рекламное место пустует

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