|
И чего только не встречается при обмене. | ☑ | ||
---|---|---|---|---|
0
AndrewM
16.04.12
✎
20:56
|
Реализую обмен между неидентичными конфигурациями. Какие только нестандартные ситуации в правилах обмена не пришлось уже разобрать по причине различия в переносимых документах и справочниках.
Например, необходимо сравнить справочники по реквизитам, которые находятся не в самих справочниках, а в регистрах сведений либо в других справочниках. А именно: надо сравнить по табельному номеру физлица, находящиеся в реквизите переносимого документа. В источнике этот реквизит хранится в регистре сведений по измерению «ФизЛицо», а в приёмнике – как обычно, в справочнике «Сотрудники», содержащем реквизит «ФизЛицо». Как оказалось, с источником всё проще: создаёшь ПКС для ПКО «ФизЛицо» с пустым источником и в обработчике «ПередВыгрузкой» этого ПКС вытаскиваешь всё, что нужно. Но не всё так просто оказалось с приёмником. Я пробую делать подмену при загрузке, а именно в обработчике «ПриЗагрузке» ПКО «ФизЛица» пишу следующее (кстати, табельный номер пришлось засунуть в комментарий, т.к. такого реквизита, как уже говорил, ни в физлице источника, ни в физлице приёмника просто нет): ============================= Если НЕ Объект.ЭтоГруппа Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СотрудникиОрганизаций.Ссылка |ИЗ | Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций |ГДЕ | СотрудникиОрганизаций.Код = &ТабельныйНомер"; Запрос.УстановитьПараметр("ТабельныйНомер", Объект.Комментарий); Выгрузка = Запрос.Выполнить().Выгрузить(); Если Выгрузка.Количество() > 0 Тогда Объект = Выгрузка[0].Ссылка.Физлицо Ссылка.ПолучитьОбъект(); КонецЕсли; КонецЕсли; ============================= Получается, я как бы вместо правила сам нахожу нужное физлицо и подставляю ему. На, дескать, бери. :) Причём в этом обработчике физлицо по табельному номеру сотрудника находится (проверял с помощью «Сообщить()» в этом же обработчике). Вроде должно бы работать. Но после таких действий в перенесённом документе на стороне приёмника в поле, в котором должно выходить это физлицо, выходит: <Объект не найден> (314:96e1002264bfbab211df8356a2781f80) Почему так происходит? Я вижу такую схему на стороне приёмника при загрузке: 1. Сначала вызывается ПКО переносимого документа. 2. ПКО документа вызывает свои ПКС, в числе которых есть и ПКС по реквизиту с физлицами. 3. ПКС по реквизиту с физлицами вызывает ПКО для физлиц, которое указано в поле «Правило» этого ПКС. 4. ПКО для физлиц ищет соответствие. Здесь я делаю подмену, заменяю при загрузке физлицо на найденное мной. 5. ПКО для физлиц возвращает найденное физлицо (а фактически подменённое мной) в ПКС по реквизиту с физлицами, которое в свою очередь возвращает его в ПКО документа. Таким образом, в документе на соответствующем реквизите должно отобразиться то физлицо, которое я подменил в обработчике «ПриЗагрузке». Почему же выходит: <Объект не найден (314:96e1002264bfbab211df8356a2781f80) ? И верна ли описанная мной выше схема взаимодействия ПКО и ПКС? |
|||
1
AndrewM
17.04.12
✎
08:48
|
Ап
|
|||
2
AndrewM
17.04.12
✎
09:29
|
Если ставлю свой код в обработчик "ПередЗагрузкой", то не удаётся обратиться к "Объект.Комментарий", в котором я храню табельный номер.
|
|||
3
Fish
17.04.12
✎
09:31
|
(2) Хранить табельный номер в комментарии - это пять :)) комментарии именно для этого и предназначены :))
|
|||
4
Serg_1960
17.04.12
✎
09:31
|
Вы "не тот" реквизит выбрали в качестве ключевого. Уникальность табельного номера - не гарантируется. В принципе, в типовых конфигурация, учет по табельным номерам может не использоваться. Сделайте однократную "синхронизацию" физ.лиц по наименованию или по коду (что лучше) и используйте эти реквизиты для обмена - они то есть в обеих базах (как я понял).
Алгоритм, сорри, - кривой до безобразия :( "ВЫБРАТЬ СотрудникиОрганизаций.ФизЛицо.Ссылка КАК Ссылка..." - и не надо обращаться в через несколько точек к нужному значению в присвоении значения объекту - не камильфо. В установке параметра - "СокрЛП(Объект.Комментарий)" - комментарий, всё-таки, строка неограниченной длины. Не камильфо В алгоритме нет проверки на отсутствие нужных данных. Если запрос ничего не найдёт - то объект останется без изменений. Вероятно ты поэтому и получаешь такие сообщения. |
|||
5
AndrewM
17.04.12
✎
12:46
|
(3) Не правильно понял: я табельный номер в комментарии не храню. Я его туда запихиваю только во время выполнения правила, т.к. реквизита "ТабельныйНомер" в физлице просто нет (ни в источнике, ни в приёмнике) и деваться больше некуда. А после выполнения правила табельный номер в комментарии не сохраняется. Новый реквизит для этого создавать не хотел, хотел обойтись малой кровью. Но, видимо, придётся. :(
(4) В том-то и дело, что от меня требуют именно синхронизацию по табельному номеру и настаивают на том, что табельный номер в организации уникален. Я бы и сам рад синхронизировать по коду. Но справочники уже заполнены, обе базы работают давно и соответственно по кодам их не сверишь (по наименованию - может быть, но не знаю, как на это мой руководитель отреагирует :). А теперь вот между базами, заполненными отдельно, понадобился обмен. Насчёт однократной синхронизации: в смысле в первый раз пройтись по существующим элементам в обеих базах и совместить коды? Не вариант, т.к. обе базы в дальнейшем так и планируют заполнять отдельные пользователи. Всегда будут расхождения. А табельный номер будет общий. "ВЫБРАТЬ СотрудникиОрганизаций.ФизЛицо.Ссылка КАК Ссылка..." - извините, что-то я в своём запросе такой строчки не увидел. Видимо, имели в виду это: Объект = Выгрузка[0].Ссылка.Физлицо.Ссылка.ПолучитьОбъект(); Ну вот так. :) А как можно по-другому? :) Кстати, могу написать так: Объект = Выгрузка[0].Ссылка.Физлицо.ПолучитьОбъект(); Всё же на одно звено меньше. А если пишу вот так: Объект.Ссылка = Выгрузка[0].Ссылка.Физлицо; система начинает ругаться с формулировкой: "реквизит "Ссылка" не доступен для записи". "комментарий, всё-таки, строка неограниченной длины" - у меня уже ограниченной. :) Дело в том, что в правилах нельзя устанавливать ключевыми реквизитами неограниченные строки. А так как я пока экспериментирую с копиями, поменял пока длину комментария в обоих базах. :) Но тут я согласен. "Если запрос ничего не найдёт - то объект останется без изменений." - всё верно: если не найдёт по табельному номеру, ничего не меняю, чтобы создалось новое физлицо данными из источника. Так и ожидалось. "Вероятно ты поэтому и получаешь такие сообщения." - проверяю пока только с одним документом, содержащим одно физлицо, которое находится и там, и там с полностью идентичными данными и однозначно должно найтись. И это физлицо находится однозначно, это я проверял через "Сообщить()" из того же обработчика. И даже при таких условиях в документе теряется ссылка на физлицо. Итог: пока вижу такой вариант: создаю доп. реквизит "ТабельныйНомер" в справочнике "ФизическиеЛица", простенькой обработкой прохожусь по всем элементам справочника "Сотрудники" и по ссылке на физлицо заполняю этот новый реквизит табельными номерами. А затем в обработчике после записи элемента справочника "Сотрудники" придётся добавить строчку кода, заполняющую этот новый реквизит в том физлице, на которое элемент "Сотрудник" ссылается. А иначе даже не знаю как. :( Но, блин, как всё-таки подменить объект при загрузке по правилу так, чтобы документ ничего не заподозрил. Не люблю править конфу, это уж точно не комильфо. |
|||
6
hhhh
17.04.12
✎
13:00
|
(5) ну это точно такая строчка у вас бредовая? Или пошитули?
Объект = Выгрузка[0].Ссылка.Физлицо Ссылка.ПолучитьОбъект(); |
|||
7
Fish
17.04.12
✎
13:15
|
(5) Табельный номер у физлица - это бред. Табельный номер может быть только у сотрудника.
|
|||
8
AndrewM
17.04.12
✎
13:16
|
(6) вы про пробел? Это точка куда-то пропала, когда вставлял в пост. :)
В коде написано так: Объект = Выгрузка[0].Ссылка.Физлицо.Ссылка.ПолучитьОбъект(); А вообще первая ссылка - это ссылка на элемент справочника "Сотрудник", а вторую ссылку можно опустить и написать так: Объект = Выгрузка[0].Ссылка.Физлицо.ПолучитьОбъект(); Но проблему это не решает. |
|||
9
hhhh
17.04.12
✎
13:18
|
(8) первую ссылку тоже можно опустить
ВЫБРАТЬ | СотрудникиОрганизаций.Физлицо |
|||
10
AndrewM
17.04.12
✎
13:19
|
(7) и вот тут включается изворотливость простого исполнителя (меня в смысле), от которого требуют, чтобы работало вот так. :))
|
|||
11
AndrewM
17.04.12
✎
13:21
|
(9) Согласен. Признаю, что не очень удачно это написал. :)
|
|||
12
hhhh
17.04.12
✎
13:36
|
(11) так тебе еще миллино ссылок, которые ссылаются на твое физлицо надо в базе перещелкать. Они у тебя ведь на тот УИД настроены. Вот ты голова два уха.
|
|||
13
AndrewM
17.04.12
✎
13:48
|
(12) так я же только один документ переношу. В нём и есть ссылка на физлицо. Вообще нужно перенести лишь документ одного определённого вида. Но так как в нём есть ссылки на кучу других справочников, пришлось и их тянуть тоже.
Стоп! По-моему ты не так меня понял: я не собираюсь в базе приёмнике подменять элемент справочника "ФизическиеЛица" и перезаписывать его. Я хочу лишь найти уже имеющийся в приёмнике элемент и подсунуть ссылку на него в тот документ, который переносится. |
|||
14
qeos
17.04.12
✎
13:48
|
многа букав
|
|||
15
Lama12
17.04.12
✎
13:57
|
(10) А бумажка руководства есть о том что сделать нужно именно так а не иначе? И о том, что оно знает, что в результате таких действий истема потом работать не будет и поддерживать ее будет не возможно?
Понимаю... затем ты сменишь работу а тут какашки будут разгребать другие. Но может лучше не делать какашки? |
|||
16
AndrewM
17.04.12
✎
14:09
|
(15) Почему не будет работать, если в физлице я создам реквизит, в котором просто будут дублироваться табельные номера, введённые в справочнике "Сотрудники"? В сотрудниках же табельный номер уникален.
Блин, если я буду синхронизировать по коду, то в обоих базах создадут одно и то же физлицо отдельно и при обмене оно задвоится. В базе-источнике у физлица даже ИНН нет. Можно, правда, делать синхронизацию по наименованию и дате рождения. Видел, что так делается в типовом обмене между ЗУП и БП. Но проблема в том, что если пользователь в какой-либо из баз поленился ввести дату рождения или сделал опечатку, то физлицо снова задваивается. Сталкивался с этим в другой организации. |
|||
17
AndrewM
17.04.12
✎
14:12
|
(15) Вопрос: как бы ты поступил, если надо реализовать обмен между базами, которые уже заполнены и ведутся и так и будут вестись разными людьми? Спрашиваю, заочно предполагая, что ты опытнее меня. :)
|
|||
18
AndrewM
17.04.12
✎
19:05
|
(15) Ну так почему система не будет работать, если я создам реквизит в физлице, в котором буду дублировать табельный номер ссылающегося на него сотрудника? Ляпнул и убежал. :(
Пока у меня есть одна догадка о возможном риске: Правильно ли я рассуждаю, что если человек устроится в контору сразу на две должности, по полставки на каждую, то ему в базе заведут один элемент физлицо и два элемента сотрудника с разными табельными номерами, ссылающихся на это одно физлицо? Или это не так делается при устройстве на две должности одновременно? Какие ещё могут риски, если добавить в физлицо реквизит, дублирующий таб. номер? Нужны аргументы, а то мне не поверят. :) Скажут: "ты зелёный, иди учи матчасть". :) |
|||
19
hhhh
17.04.12
✎
23:59
|
(19) в документе ты не меняешь ГУИД. Поэтому пишет "Объект не найден". Ты ведь только объект поменял. А ссылку на него в документе не заменил.
|
|||
20
AndrewM
18.04.12
✎
08:21
|
(19) Так поэтому я и спрашивал, верна ли вот эта предполагаемая мной схема:
1. Сначала вызывается ПКО переносимого документа. 2. ПКО документа вызывает свои ПКС, в числе которых есть и ПКС по реквизиту с физлицами. 3. ПКС по реквизиту с физлицами вызывает ПКО для физлиц, которое указано в поле «Правило» этого ПКС. 4. ПКО для физлиц ищет соответствие. Здесь я делаю подмену, заменяю при загрузке физлицо на найденное мной. 5. ПКО для физлиц возвращает найденное физлицо (а фактически подменённое мной) в ПКС по реквизиту с физлицами, которое в свою очередь возвращает его в ПКО документа. ? Если верна, то значит, что объект должен подменяться ещё до передачи ссылки на него документу. А если не верна, то как подменить ссылку и в документе? Через Входящие данные? |
|||
21
AndrewM
20.04.12
✎
12:05
|
(19) Я понял, о каком УИД-е ты говоришь! Тот, который можно через вкладку "Настройки" ПКО самой верхней галочкой отключить/включить?
Вот я, действительно, голова два уха. :))) У меня другие косяки с этой настройкой полезли: ссылки стали теряться, хотя я везде отключил код, связанный со своей подменой. Я теперь её отключил нафиг... Хотя не хотелось. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |