Добрый день! Подскажите, пожалуйста, как в КД 2.1 использовать Выражения?
Все примеры, которые пересмотрела в инете используют простой поиск по реквизиту в справочнике Базы-Приемника по определенным реквизитам или установку конкретного значения перечисления или константы. В этом случае результатом вычисления выражения является конкретное значение, которые и присваивается.
Мне же необходимо использовать запрос в выражении. В этом случае у меня результатом запроса является уже не конкретное значение и поэтому внутри выражения объявляется переменная, которой и присваивается результат запроса.
В итоге, правила обмена сохраняются нормально, выгрузка из базы-источника происходит корректно, но когда уже делаю загрузку в базу-приемник, ругается "Ошибка при загрузке данных:Ошибка компиляции при вычислении выражения или выполнении фрагмента кода: {(1,22)}: Ошибка в выражении"
Обмен делаю через типовую обработку универсальный обмен данными XML.
(1) guzel001, в базе приемника свое выражение пробовали отладить?
Просто создать внешнюю обработку, скопировать туда ваш код, и посмотреть, что из этого выйдет?
Выражение я использую в правиле конвертации значений
С помощью запроса я пытаюсь найти в базе-приемнике договор контрагента и продолжить дальнейшую обработку выгрузки объекта.
И еще вообще то ПКЗ используется либо для перечислений либо для предопределенных значений справочника...и там только соответствие можно задать.
Есть ПКО есть ПКС в которых можно прописать в событиях код
Да, я ошиблась в третьем сообщении, кончено же у меня правило конвертации свойств
Если я правильно понимаю работу всего этого механизма, то сейчас у меня проблема в том, что надо как то присвоить переменной "Выражение" значение результата запроса - переменную "ДоговорКонтрагента"
Потому как если смотреть пример, ссылку на которой я отправляла выше, там
Выражение = "Справочники.Контрагенты.НайтиПоКоду"""+Параметры.НомерПапкиПриемника+""")";(6) bmk74, (7)
(11) bmk74, http://iantonov.me/page/konvertacija-pravilnaja-migracija-dannyh-v-1s цитата со страницы
В листинге выполняется заполнение реквизитов на основе произведенной выборки данных. Клиента мы передаем просто в виде ссылки, а тип клиента записываем в параметр «Выражение». Данные этого параметра будут интерпретированы в приемнике, и при выполнении реквизит будет заполненным корректным значением из перечисления.
а это значит что код Выражения отрабатывается в приемнике
(8)Извиняюсь соврал в ПКС это Значение = Выборка.Ссылка
И правило при выгрузке
Выражение вам в данном случае вообще не нужно, так как вы получаете ссылку на объект..и она нормально отработает по правилу ПКЗ договор
Правда правило у вас для договоров должно быть создано
(8)Выражение это собственно тест Который будет отработан через Выполнить() в базе приемнике, и тут у вас уже не будет источника, который вы в параметрах указывете...Можно попробовать передавать данные через параметр, или
Объект
а не источник использовать. К сожалению никогда не использовал это обычно все через ПКЗ делается...данные в ПКЗ договора, а там уже поиск...так намного проще
Во уже что то. Ну тогда странно почему у вас при выгрузке не ругается, так как данное правило отрабатывает на источнике...
Приведите код в этом событии..посмотрю
Да, действительно в копии в обработке Универсальный обмен данными XML заменила строку Значение = Вычислить(одЗначениеЭлемента(ФайлОбмена, одТипСтрока, , Ложь));
на Выполнить(одЗначениеЭлемента(ФайлОбмена, одТипСтрока, , Ложь));
и все прекрасно отработало!!! Спасибо!!!
Теперь буду думать, как переделать свой алгоритм поиска, если не меняя конфу, нельзя использовать запрос в выражении!
Основная моя проблема в том, что для поиска нужного договора мне необходимо взять реквизит из документа в источникеи сравнивать его с реквизитом внутри карточки договора в приемнике.
Поэтому хотела для поиска договора использовать запрос, не используя подчиненное правило конвертации .
(17) guzel001, Все делается гораздо проще.
ИсходящиеДанные в ПКС равно ВходящиеДанные в его ПКО
Работаем с ПКО Документа
ПКС Договор
Пишем в Перед выгрузкой вроде этого
ИсходящиеДанные=Новый Структура("Реквизит1,Реквизит2",Источник.Реквизит1, Источник.Реквизит2);
Переходим в ПКО Справочника Договоры и ставим галки на Свойствах Реквизит1 и Реквизит2 "Получить значения из входящих данных"
Всем огромное спасибо!!!
Все работает с помощью выражения, скомпоновала все ваши советы
Использовала Исходящие данные и вычисляемое выражение, в котором я выполняю поиск нужного Вида взаиморасчета в зависимости от подразделения.
Включила в ключевые поля поиска для договора Владельца, номер и видвзаиморасчетов
Основная моя проблема в том, что для поиска нужного договора мне необходимо взять реквизит из документа в источникеи сравнивать его с реквизитом внутри карточки договора в приемнике.
Для поиска нужного договора ГДЕ? В Приемнике? Т.е. то какой договор будет выгружен зависит от данных содержащихся в приемнике?
(21) kasper076, да
У меня идет сопоставление один ко многим. В базе источнике это один договор с определенным номером, в приемнике у меня их несколько с таким же номером, но различаются они подразделением.
В источнике подразделение указывается в документе, и нужно в зависимости от него выбрать нужный договор с правильным реквизитом подразделение.
Новые договора не создаются, только поиск из существующих.
(22) guzel001, так почему бы не выгрузить Подразделение в параметр? А при загрузке в зависимости от значение этого параметра и значения пришедшего договора выбрать нужный договор в приемнике?
(24) bmk74, а зачем лезть в ПКО "Договора"? В источнике договор один. Значит нужно его и выгрузить. Но чтобы в приемнике выбрать один из договоров соответствующих договору в источнике, нужно еще выгрузить подразделение. А т.к. в приемнике может не быть реквизита "Подразделение", то выгружаем в параметр.
в приемнике у меня их несколько с таким же номером, но различаются они подразделением
Что подразумевает под собой что в приемнике у договора есть реквизит подразделение..ИМХО
PS: у ПКО договора надо отключить поиск по идентификатору, и включить по полям номер и подразделение
(26) bmk74, соответствие договоров подразделениям может устанавливаться в Регистре сведений.
Если в приемнике, в договоре есть реквизит "Подразделение", то действительно нужно в ПКО "Договора" передать через ВходящиеДанные значение подразделения и установить его полем поиска. Я бы еще Владельца в поля поиска включил.
И ДоговорыКонтрагентов.ВидВзаиморасчетов.Подразделение.Код = &Подразделение
Посмотрел запрос. там правда немного не там договор, тогда да лучше через параметр иначе придется подразделение и дальше передавать в правила ВидВзаиморасчетов что уже более трудоемко...
(29) bmk74, зато это позволит не обрабатывать загрузку. Объект будет загружаться автоматически. А в случае с параметром придется на стороне приемника искать нужный договор.
КлючВыгружаемыхДанных - Произвольный. По умолчанию - это ссылка на объект Источник, а если Источник неопределен, то используется ИмяПКО (подразумевается, что правило описывает в таком случае один объект-приемник). Данный параметр необходимо использовать если одному объекту источнику могут соответствовать несколько объектов приемника, например, в зависимости от входящих данных, или в случае, когда объект приемник полностью заполняется из входящих данных (например по результатам запроса), а объект источник, как таковой отсутствует.
Т.е. данное свойство позволяет идентифицировать выгруженные объекты, даже если Источника не существует, и не выгружать один и тот же объект по нескольку раз. При загрузке оно как нам поможет? не нашел ни одного обработчика на стороне Приемника, где было бы доступно это свойство.
Использовать после выгрузки в правиле ПКЗ, вашего документа тогда в базе приемника уже будет создан объект но не записан еще и можно будет что то типа этого сделать
Ваш запрос, в параметрах указывать
Объект. реквизиты объекта
Объект.Договор = Выборка.Ссылка
Но как я говорил правильнее создайте ПКЗ Договора в которых и будет происходить поиск договоров
там нет ничего сложного вообще
Т.Е. ваше ПКС - вызывает ПКЗ договора В этом ПКЗ указываете по каким полям сопоставлять реквизиты источника и приемника, если нужно то в ПКС договора прописываете уже нужные вам правила что бы при загрузке он нашел нужный вам договор....