Использование выражений в правилах конвертации свойств

Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
1. guzel001 07.04.16 08:11 Сейчас в теме
Добрый день! Подскажите, пожалуйста, как в КД 2.1 использовать Выражения?

Все примеры, которые пересмотрела в инете используют простой поиск по реквизиту в справочнике Базы-Приемника по определенным реквизитам или установку конкретного значения перечисления или константы. В этом случае результатом вычисления выражения является конкретное значение, которые и присваивается.
Мне же необходимо использовать запрос в выражении. В этом случае у меня результатом запроса является уже не конкретное значение и поэтому внутри выражения объявляется переменная, которой и присваивается результат запроса.

В итоге, правила обмена сохраняются нормально, выгрузка из базы-источника происходит корректно, но когда уже делаю загрузку в базу-приемник, ругается "Ошибка при загрузке данных:Ошибка компиляции при вычислении выражения или выполнении фрагмента кода: {(1,22)}: Ошибка в выражении"


Обмен делаю через типовую обработку универсальный обмен данными XML.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. ditp 94 07.04.16 09:56 Сейчас в теме
(1) guzel001, в базе приемника свое выражение пробовали отладить?
Просто создать внешнюю обработку, скопировать туда ваш код, и посмотреть, что из этого выйдет?
10. guzel001 07.04.16 09:57 Сейчас в теме
(7) ditp, конечно, этот код отрабатывает в приемнике во внешней обработки. Выбирает корректный договор
2. bmk74 242 07.04.16 09:01 Сейчас в теме
Какое выражение, в каком правиле?, и что вообще пытаетесь сделать... с помощью запроса ?
3. guzel001 07.04.16 09:36 Сейчас в теме
Выражение я использую в правиле конвертации значений

С помощью запроса я пытаюсь найти в базе-приемнике договор контрагента и продолжить дальнейшую обработку выгрузки объекта.

Делаю по этому примеру http://www.mykod.info/prostie-primeri/prostie-primeri-7
4. bmk74 242 07.04.16 09:43 Сейчас в теме
Обработчик события правила какой ?
5. guzel001 07.04.16 09:49 Сейчас в теме
Правило конвертации свойств Договор, а обработчик Перед Выгрузкой
6. bmk74 242 07.04.16 09:53 Сейчас в теме
И еще вообще то ПКЗ используется либо для перечислений либо для предопределенных значений справочника...и там только соответствие можно задать.
Есть ПКО есть ПКС в которых можно прописать в событиях код
8. guzel001 07.04.16 09:56 Сейчас в теме
Да, я ошиблась в третьем сообщении, кончено же у меня правило конвертации свойств

Если я правильно понимаю работу всего этого механизма, то сейчас у меня проблема в том, что надо как то присвоить переменной "Выражение" значение результата запроса - переменную "ДоговорКонтрагента"
Потому как если смотреть пример, ссылку на которой я отправляла выше, там
Выражение = "Справочники.Контрагенты.НайтиПоКоду"""+Параметры.НомерПапкиПриемника+""")";(6) bmk74, (7)
11. bmk74 242 07.04.16 09:58 Сейчас в теме
(8)Не в выражение а в источник если выборка у вас выбирает договора то есть присвоить Источник = Выборка.Ссылка
13. guzel001 07.04.16 10:03 Сейчас в теме
(11) bmk74, http://iantonov.me/page/konvertacija-pravilnaja-migracija-dannyh-v-1s
цитата со страницы
В листинге выполняется заполнение реквизитов на основе произведенной выборки данных. Клиента мы передаем просто в виде ссылки, а тип клиента записываем в параметр «Выражение». Данные этого параметра будут интерпретированы в приемнике, и при выполнении реквизит будет заполненным корректным значением из перечисления.

а это значит что код Выражения отрабатывается в приемнике
14. bmk74 242 07.04.16 10:07 Сейчас в теме
(8)Извиняюсь соврал в ПКС это Значение = Выборка.Ссылка
И правило при выгрузке
Выражение вам в данном случае вообще не нужно, так как вы получаете ссылку на объект..и она нормально отработает по правилу ПКЗ договор
Правда правило у вас для договоров должно быть создано
15. bmk74 242 07.04.16 10:20 Сейчас в теме
(8)Выражение это собственно тест Который будет отработан через Выполнить() в базе приемнике, и тут у вас уже не будет источника, который вы в параметрах указывете...Можно попробовать передавать данные через параметр, или
Объект
а не источник использовать. К сожалению никогда не использовал это обычно все через ПКЗ делается...данные в ПКЗ договора, а там уже поиск...так намного проще
16. tusv 212 07.04.16 10:47 Сейчас в теме
(15) bmk74,
Выражение это собственно тест Который будет отработан через Выполнить() в базе приемнике

Через Вычислить().
Потому и выдается "Ошибка компиляции при вычислении выражения или выполнении фрагмента кода"
9. bmk74 242 07.04.16 09:56 Сейчас в теме
Во уже что то. Ну тогда странно почему у вас при выгрузке не ругается, так как данное правило отрабатывает на источнике...
Приведите код в этом событии..посмотрю
12. guzel001 07.04.16 09:59 Сейчас в теме
(9) bmk74,
ТекстВыражения = "Запрос = Новый Запрос;
|Запрос.Текст = ""ВЫБРАТЬ
|ДоговорыКонтрагентов.Ссылка ИЗ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
| ГДЕ ДоговорыКонтрагентов.Владелец.Код = &Владелец
| И ДоговорыКонтрагентов.ВидВзаиморасчетов.Подразделение.Код = &Подразделение
| И ДоговорыКонтрагентов.Номер = &НомерДоговора"";
|Запрос.УстановитьПараметр(""Владелец"","+""""+Источник.Контрагент.Код+""""+");
|Запрос.УстановитьПараметр(""Подразделение"","+""""+Источник.Подразделение.КодБУ+""""+");
|Запрос.УстановитьПараметр(""НомерДоговора"","+""""+Источник.Договор.НомерДоговора+""""+");
|Результат = Запрос.Выполнить();
|Выборка = Результат.Выбрать();
|Пока
|Выборка.Следующий() Цикл
|ДоговорКонтрагента = Выборка.Ссылка;
|КонецЦикла;
|";
Выражение = ТекстВыражения;

Вообще пишу обмен из самописки в переписанную Бухгалтерию

Пробовала в строке ДоговорКонтрагента = Выборка.Ссылка; писать так
Выражение = Выборка.Ссылка; - все равно та же ошибка
17. guzel001 07.04.16 12:26 Сейчас в теме
Да, действительно в копии в обработке Универсальный обмен данными XML заменила строку Значение = Вычислить(одЗначениеЭлемента(ФайлОбмена, одТипСтрока, , Ложь));
на Выполнить(одЗначениеЭлемента(ФайлОбмена, одТипСтрока, , Ложь));
и все прекрасно отработало!!! Спасибо!!!

Теперь буду думать, как переделать свой алгоритм поиска, если не меняя конфу, нельзя использовать запрос в выражении!

Основная моя проблема в том, что для поиска нужного договора мне необходимо взять реквизит из документа в источникеи сравнивать его с реквизитом внутри карточки договора в приемнике.


Поэтому хотела для поиска договора использовать запрос, не используя подчиненное правило конвертации .
19. tusv 212 07.04.16 13:21 Сейчас в теме
(17) guzel001, Все делается гораздо проще.
ИсходящиеДанные в ПКС равно ВходящиеДанные в его ПКО
Работаем с ПКО Документа
ПКС Договор
Пишем в Перед выгрузкой вроде этого
ИсходящиеДанные=Новый Структура("Реквизит1,Реквизит2",Источник.Реквизит1, Источник.Реквизит2);
Переходим в ПКО Справочника Договоры и ставим галки на Свойствах Реквизит1 и Реквизит2 "Получить значения из входящих данных"
33. guzel001 07.04.16 15:31 Сейчас в теме
(19) tusv, (29) bmk74, (31) kasper076,

Всем огромное спасибо!!!
Все работает с помощью выражения, скомпоновала все ваши советы
Использовала Исходящие данные и вычисляемое выражение, в котором я выполняю поиск нужного Вида взаиморасчета в зависимости от подразделения.

Включила в ключевые поля поиска для договора Владельца, номер и видвзаиморасчетов
21. kasper076 112 07.04.16 13:48 Сейчас в теме
(17) guzel001,
Основная моя проблема в том, что для поиска нужного договора мне необходимо взять реквизит из документа в источникеи сравнивать его с реквизитом внутри карточки договора в приемнике.

Для поиска нужного договора ГДЕ? В Приемнике? Т.е. то какой договор будет выгружен зависит от данных содержащихся в приемнике?
22. guzel001 07.04.16 13:59 Сейчас в теме
(21) kasper076, да
У меня идет сопоставление один ко многим. В базе источнике это один договор с определенным номером, в приемнике у меня их несколько с таким же номером, но различаются они подразделением.
В источнике подразделение указывается в документе, и нужно в зависимости от него выбрать нужный договор с правильным реквизитом подразделение.
Новые договора не создаются, только поиск из существующих.
23. kasper076 112 07.04.16 14:02 Сейчас в теме
(22) guzel001, так почему бы не выгрузить Подразделение в параметр? А при загрузке в зависимости от значение этого параметра и значения пришедшего договора выбрать нужный договор в приемнике?
24. bmk74 242 07.04.16 14:13 Сейчас в теме
(22)так в чем вопрос подразделение из источника в
1 В ПКС Договор документа При выгрузке
 ИсходящиеДанные = Новый Структура("Подразделение",Источник.Подразделение)


2 В ПКО Договора...В ПКС Подразделение источник не указываем, ставим галку получать из входящих данных и все...
25. kasper076 112 07.04.16 14:20 Сейчас в теме
(24) bmk74, а зачем лезть в ПКО "Договора"? В источнике договор один. Значит нужно его и выгрузить. Но чтобы в приемнике выбрать один из договоров соответствующих договору в источнике, нужно еще выгрузить подразделение. А т.к. в приемнике может не быть реквизита "Подразделение", то выгружаем в параметр.
26. bmk74 242 07.04.16 14:24 Сейчас в теме
(25)
в приемнике у меня их несколько с таким же номером, но различаются они подразделением

Что подразумевает под собой что в приемнике у договора есть реквизит подразделение..ИМХО
PS: у ПКО договора надо отключить поиск по идентификатору, и включить по полям номер и подразделение
27. kasper076 112 07.04.16 14:30 Сейчас в теме
(26) bmk74, соответствие договоров подразделениям может устанавливаться в Регистре сведений.
Если в приемнике, в договоре есть реквизит "Подразделение", то действительно нужно в ПКО "Договора" передать через ВходящиеДанные значение подразделения и установить его полем поиска. Я бы еще Владельца в поля поиска включил.
29. bmk74 242 07.04.16 14:35 Сейчас в теме
(27)
И ДоговорыКонтрагентов.ВидВзаиморасчетов.Подразделение.Код = &Подразделение

Посмотрел запрос. там правда немного не там договор, тогда да лучше через параметр иначе придется подразделение и дальше передавать в правила ВидВзаиморасчетов что уже более трудоемко...
31. kasper076 112 07.04.16 14:50 Сейчас в теме
(29) bmk74, зато это позволит не обрабатывать загрузку. Объект будет загружаться автоматически. А в случае с параметром придется на стороне приемника искать нужный договор.
28. tusv 212 07.04.16 14:34 Сейчас в теме
(25) kasper076, Не вижу в этом проблеммы, что Договор в источнике 1, а в приемнике их несколько
Просто в ПКО Договора Перед выгрузкой пишем например
КлючВыгружаемыхДанных = Источник.Код+"-"+ВходящиеДанные.Подразделение.Код

Выгрузится как надо. Сколько требуется
30. kasper076 112 07.04.16 14:45 Сейчас в теме
(28) tusv,
КлючВыгружаемыхДанных - Произвольный. По умолчанию - это ссылка на объект Источник, а если Источник неопределен, то используется ИмяПКО (подразумевается, что правило описывает в таком случае один объект-приемник). Данный параметр необходимо использовать если одному объекту источнику могут соответствовать несколько объектов приемника, например, в зависимости от входящих данных, или в случае, когда объект приемник полностью заполняется из входящих данных (например по результатам запроса), а объект источник, как таковой отсутствует.

Т.е. данное свойство позволяет идентифицировать выгруженные объекты, даже если Источника не существует, и не выгружать один и тот же объект по нескольку раз. При загрузке оно как нам поможет? не нашел ни одного обработчика на стороне Приемника, где было бы доступно это свойство.
32. tusv 212 07.04.16 15:05 Сейчас в теме
(30) kasper076,
При загрузке оно как нам поможет?

Объект без шума и пыли будет найден в обработчике "Поля поиска"
35. kasper076 112 08.04.16 07:07 Сейчас в теме
(32) tusv, а можно пример загрузки по КлючВыгружаемыхДанных. По чеснухе поискал примеры не нашел.
34. guzel001 07.04.16 15:32 Сейчас в теме
(28) tusv, ключ выгружаемых данных сегодня не освоила, буду пробовать!)))
Но сейчас меня в принципе и поиск на стороне источника тоже устраивает
18. bmk74 242 07.04.16 13:12 Сейчас в теме
Использовать после выгрузки в правиле ПКЗ, вашего документа тогда в базе приемника уже будет создан объект но не записан еще и можно будет что то типа этого сделать
Ваш запрос, в параметрах указывать
Объект. реквизиты объекта
Объект.Договор = Выборка.Ссылка
Но как я говорил правильнее создайте ПКЗ Договора в которых и будет происходить поиск договоров
там нет ничего сложного вообще
Т.Е. ваше ПКС - вызывает ПКЗ договора В этом ПКЗ указываете по каким полям сопоставлять реквизиты источника и приемника, если нужно то в ПКС договора прописываете уже нужные вам правила что бы при загрузке он нашел нужный вам договор....
20. bmk74 242 07.04.16 13:31 Сейчас в теме
(18)Тьфу перепутал, не ПКЗ а ПКО...заработался..
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот