Имя: Пароль:
1C
1С v8
Конвертация данных (КД). ВходящиеДанные видны в ПКО, но не видны в ПКС-ах Хелп
,
0 goodluckman
 
05.08.14
15:14
Доброго дня всем!

Друзья, нужна ваша помощь, 2 дня копаюсь в пустую.

Создаю правила обмена нетиповой конфы с бухой 2.0.
В нашей нетиповой конфе у банковских счетов не всегда заполнен реквизит "валюта", есть необходимость протягивать валюту из платежного документа в ПКО "БанковскиеСчета", а точнее в его ПКС "ВалютаДенежныхСредств", для корректной конвертации валюты.

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

Эта валюта прекрасно видна в ПКО "БанковскиеСчета" как "ВходящиеДанные", но вот дальше, при конвертации свойств (реквизитов) банковского счета, по документации и здравому смыслу, в подчиненных ПКС-ах "Банковского счета" валюта так же должна быть видна в переменной "ВходящиеДанные", но там пусто! точнее Неопределено((

Подскажите плизз, куда копать?
1 Timon1405
 
05.08.14
15:21
В ПКО добавить "ИсходящиеДанные=ВходящиеДанные"
2 goodluckman
 
05.08.14
22:05
Ответ в (1) неверен((

я пробовал похожий вариант в процессе танцев с бубном , - в ПКО справочника "банковские счета" повторно определял как новую структуру и ВходящиеДанные и ИсходящиеДанные и мониторил, что имею в этих переменных, уже в подчиненных ПКС-ах (реквизитов справочника), как я и писал выше в них было Неопределено...
3 Мимохожий Однако
 
05.08.14
22:26
Если Банковские счета, подчиненный справочник, то надо убрать ПВД по банковским счетам.
Если Валюта не заполнена, то проще указывать валюту по умолчанию какую надо.
ИМХО, информации недостаточно.
4 goodluckman
 
05.08.14
23:53
(3) МимохожийОднако, спасибо за совет. Попробовал убрать из ПВД справочник "банк. счета", - не помогло...(

попробую лаконично и структурно описать ситуацию:
1)Есть документ "ПоступлениеНаРасчетныйСчет" у него есть свое ПКО и свое ПВД.

2)У документа есть ссылочный реквизит "БанковскийСчет".
для справочника "БанковскиеСчета" есть тоже свое ПКО, которое указано в документе, точнее в ПКС-е реквизита документа "Банк. счет".

3)У некоторых элементов справочника "БанковскиеСчета", не выбрана "ВалютаДенежныхСредств", что препятствует корректной конвертации элементов справочника "БанковскиеСчета", поэтому валюту необходимо протягивать из реквизита самого документа "ПоступлениеНаРасчетныйСчет".

4) Для чего, в ПКС-е реквизита документа "БанковскийСчет" я инициализирую переменную "ИсходящиеДанные" в которые помещаю валюту документа.

5) При конвертации данного свойства документа(ревизита) вызывается ПКО "БанковскиеСчета", в обработчике которого "ПередВыгрузкой" протягиваемая валюта видна в переменной "ВходящиеДанные", что соответсвует документации!

6) Затем, как я понимаю, происходит конвертация свойств, элемента справочника "Банк. счета" по своим ПКО.

7)Одно из этих свойств называется "ВалютаДенежныхСредств", тип "СправочникСсылка.Валюты", в этом ПКС-е я пытаюсь получить валюту переданную выше, что ее подменить:
Значение = ВходящиеДанные.ВалютаНов;

но Валюта не видна во "ВходящиеДанные" как об этом повествует документация

(ПВД.ИсходящиеДанные -> ПКО.ВходящиеДанные
ПКО.ВходящиеДанные -> ПКС.ВходящиеДанные
ПКС.ИсходящиеДанные -> ПКО.ВходящиеДанные)

В этом и есть суть проблемы...

Укажите, что я не так в данном случае делаю ?
5 zmaximka
 
06.08.14
00:11
а что значит Валюта не видна во "ВходящиеДанные" ?
6 Мимохожий Однако
 
06.08.14
00:55
Валюту в исходящие данные надо помещать через структуру
7 goodluckman
 
06.08.14
01:24
(5) zmaximka, это значит, что в ПКО банковского счета, в событии "ПередВыгрузкой"
я вижу переданную валюту через:
ВходящиеДанные.ВалютаНов, то есть я могу прочитать это значение.
А в подчиненном данному ПКО ПКС-е для валюты, в переменной ВходящиеДанные лежит неопределено...


(6) МимохожийОднако, я так и делаю, о чем и написал в самом первом посте:


////////////////////////////////////////////////////////

Если Источник.Измерение1.ОсновнойБанковскийСчет.ВалютаДенежныхСредств.Пустая() Тогда
        ИсходящиеДанные = Новый Структура;
        ИсходящиеДанные.Вставить("ВалютаДенежныхСредств", Источник.Валюта);
КонецЕсли;
////////////////////////////////////////////////////////
8 vicof
 
06.08.14
06:38
(7) ничего не настораживает в коде?
9 goodluckman
 
06.08.14
09:43
(8) Можно конкретно?

Если имеешь ввиду условие "Если" То я его обрабатываю во всех местах. Если имя ключа, в одном месте я пишу "ВалютаДенежныхСредств", в другом "ВалютаНов", то это тоже для примера, и в реальном коде у меня все корректно!

Люди помогите, плииииз.
10 goodluckman
 
06.08.14
11:34
Я провел некоторое исследование, напихал в обработчики событий "ПередВыгрузкой" в используемые ПКО и ПКС конструкции Сообщить();

Получил логи в следующем порядке:
(черточкой обозначен вызов какого-либо правила)

-ПКО Документа ПоступлениеНаРасчетныйСчет

-ПКО справочника "БанковскиеСчета" Наименование банк. счета: Основной

-ПКС Реквизита справочника "ВалютаДенежныхСредств"
ВходящиеДанные = Неопределено  
ИсходящиеДанные = Неопределено  

-ПКС реквизита документа БанковскийСчетКонтрагента. Наименование счета: Основной
!Валюта которую хотим передать: руб.

-ПКО справочника "БанковскиеСчета" Наименование банк. счета: Основной

Наблюдения и мысли:
Вызов правила конвертации (ПКС) для реквизита документа происходит в самом конце, после чего вызывается ПКО справочника "Банк.Счета", но после этого почему то не происходит вызова ПКС-ов для свойств "Банковского счета", якобы свойства отконвертировались в самом начале...

Почему то сначала выгружаются объекты свойств, на которые указывают ссылки в реквизитах документа, а в конце сам документ, но ведь "исходящие данные" определяются в при конвертации свойств документа (его реквизитов) и от туда данные должны попасть в ПКО и ПКС справочника, но все происходит наоборот, я не вижу логики и совсем запутался((
11 Naumov
 
06.08.14
11:39
1. у тебя тупо не отрабатывает условие Если Источник.Измерение1.ОсновнойБанковскийСчет.ВалютаДенежныхСредств.Пустая() Тогда
Поэтому ИсходящиеДанные не инициализированы.
2. Отладку давно пора врубить и найти где неправ.
12 GenAcid
 
06.08.14
11:53
Я чего-то не пойму, судя по (0) ты пихаешь в исходящие данные в ПКО. Следом сам пишешь что по документации:

ПКО.ВходящиеДанные -> ПКС.ВходящиеДанные

Так откуда у тебя входящие заполнятся?
13 Naumov
 
06.08.14
12:06
(12) А где ты видишь ПКО? Он инициализровать Исходящие данные должен при выгрузке свойства Банковский счет, т.е. в ПКС, т.е. тут передача управления
ПКС.ИсходящиеДанные -> ПКО.ВходящиеДанные
14 GenAcid
 
06.08.14
12:15
(13) Да я уж перечитал, осознал.
15 goodluckman
 
06.08.14
12:40
(11) отрабатывает корректно условие "Если"! я просто выдернул из контекста, считайте, что в обработчике "ПередВыгрузкой" нет этого условия, на него можно не обращать внимая, у себя в остальных обработчиках я обрабатываю корректно проверку на валюту, я же писал раньше, что в одном случае надо конвертировать валюту из банковского счета, а в другом протягивать валюту из документа, - ПКС реквизита документа (инициализируется ИсхДанны),  - затем ПКО справочника БанкСчета (в нем валюта видна во ВходДанных), - затем подчиненный ПКС для реквизита справочника БанкСчета, который называется "Валюта", в которором во входящихДанных уже пусто!
Я все отладил, и описал ситтцацию уже после отладки!
16 GenAcid
 
06.08.14
12:45
(15) А у тебя случаем ВыгрузитьПоПравилу нигде явно не вызывается?
17 goodluckman
 
06.08.14
12:48
(13) Naumov, все верно передача управления:
ПКС.ИсходящиеДанные -> ПКО.ВходящиеДанные
ПКС в этом случае принадлежит реквизиту документа "БанкСчет"
ПКО принадлежит справочнику "БанковскиеСчета", у которого в обработчике события "ПередВыгрузкой" во ВходящиеДанные Валюта прекрасно себе лежит!

Проблема, в том, почему далее по иерархии, при конвертации реквизитов справочника "БанкСчета", в ПКС-е для Валюты, во ВходящиеДанные - Пусто ?! Ведь в документации ясно сказано: ПКО.ВходящиеДанные -> ПКС.ВходящиеДанные

(16) Увы, GenAcid, нигде ВыгрузитьПоПравилу не испозьзую...
18 Naumov
 
06.08.14
12:54
(17) А за чем дальше?
в событии перед выгрузкой ПКС Валюта у банковского счета определи "Значение" в зависимости от заполненности валюты у источника.
19 Naumov
 
06.08.14
12:58
Можно еще для ПКО банк.счета перед выгрузкой всетаки написать ИсходящиеДанные = ВходящиеДанные.
Кстати, глобальные обработчики ничего не переопределяют? А то в какой-то типовой конвертации принудительно инициализировались Входящие данные, соответственно все затиралось.
Если не прокатывает, то режим отладки и смотрим. НА этом мой талант Ванги исчерпан.
20 goodluckman
 
06.08.14
13:30
(18) Вот это и есть моя цель - в ПКС-е Валюты у банковского счета определить переменную "Значение".
Вопрос чем определить! У источника (банковского счета) валюта иногда пустая, но в этом случае у него есть ВходящиеДанные с валютой, которую надо использовать. Но как ее дальше протянуть в ПКС Валюты, я не знаю, ничего не получается(


(19) для ПКО банк.счета перед выгрузкой определял ИсходящиеДанные = ВходящиеДанные, и заново определя ИсходящиеДанные как новую структуру - беспозезно, - в ПКС - тишина, точнее "Неопределено"))
Если имеете ввиду "глобальные обработчики", принадлежащие ПВД, то для документа платежа и справочника банк. счета, там все чисто...
21 Naumov
 
06.08.14
13:31
глобальные обработчики у конвертации
22 Timon1405
 
06.08.14
13:58
(20) а галка "получать из входящих данных" в пкс стоит?
23 Naumov
 
06.08.14
14:01
(22) А не нужна она тут
24 goodluckman
 
06.08.14
14:19
(21) Понял! В глобальных все чисто, туда я не залезал)

(22) (23) Действительно она не нужна, но я и ее поведение обыгрывал для эксперимента, код подправлял, отлаживал, ошибка таже самая - в ПКС-е реквизита справочника "Банк. счета" во ВходДанных лежит "Неопределено", и заполнять источник нечем...  


Товарищи, ну хотя бы скажите, логика моих рассуждений верна?
Должна в таком примере происходить передача данных по принципу:
ПКС.ИсходящиеДанные -> ПКО.ВходящиеДанные
ПКО.ВходящиеДанные -> ПКС.ВходящиеДанные ???