Имя: Пароль:
1C
1С v8
И чего только не встречается при обмене.
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) Я понял, о каком УИД-е ты говоришь! Тот, который можно через вкладку "Настройки" ПКО самой верхней галочкой отключить/включить?
Вот я, действительно, голова два уха. :)))
У меня другие косяки с этой настройкой полезли: ссылки стали теряться, хотя я везде отключил код, связанный со своей подменой. Я теперь её отключил нафиг... Хотя не хотелось.