Имя: Пароль:
1C
1С v8
Конвертация данных 2, регистр сведений в справочник
0 baboon
 
09.07.19
13:12
Конвертация данных 2, регистр сведений в справочник
Всем привет!

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

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

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

Переопределять объект в событии ПередВыгрузкой - не поможет, так как в выходных данных тип уже будет безусловно определен как
"НаборЗаписейРегистра", да и сам код предполагает наличие отбора и определенной структуры именно под регистр,
через который, как я понял передаются отборы по зарегистрированным измененным записям:

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


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

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

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


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