Имя: Пароль:
1C
 
Конвертация данных. ВыгрузитьПоПравилу
0 Wefast
 
13.05.16
16:57
Есть ПКО Сотрудник(Спр.Сотрудники => Спр.ФизическиеЛица)

Мне нужно помимо выгрузки сотрудников сделать запись в регистр сведений

В обработчике приВыгрузке пишу
СЗ = СоздатьОбъект("СписокЗначений");
СЗ.ДобавитьЗначение("ФизическоеЛицо",Источник);
ВыгрузитьПоПравилу(,,СЗ,,"РолиФизическихЛиц");

Создаю ПКО РолиФизическихЛиц
Делаю ПКС ФизическоеЛицо, ставлю получать из входящих данных. ПКО указываю СОтрудник.
ПКС Роль. Приемник имеет тип перечисления. Пишу Значение = "МоеПеречисление"
ПКС Организация. Пишу Значение = Константа.НазваниеОрганизации


Мало того что ничего не работает кроме роли. Т.е. в регистре появляется запись где заполнена только Роль после чего вылетает с ошибкой.

Так мне еще интересно как отрабатывает ПКС ФизическоеЛИцо если ПКО в нем указано то собственно откуда  я все и вызвал. Разве это не рекурсия?
1 takefive
 
13.05.16
17:19
Константа.НазваниеОрганизации.Получить()
это строка или ссылка?
2 Генератор
 
13.05.16
17:20
может если пко называется из сотрудника в физлицо, то в СЗ надо все-таки сотрудника передавать а не физ лицо
3 GANR
 
13.05.16
19:32
(0) Рекомендую подглядеть в типовые правила конвертации. К примеру БП 1.0 -> БП 2.0. Там же переносится контактная информация по физ. лицам, а это регистр сведений.
4 Franchiser
 
гуру
13.05.16
20:04
ключ выгружаемых данных определил?
5 Franchiser
 
гуру
13.05.16
20:08
и еще если пишешь Значение = "МоеПеречисление"  то не нужно указывать ПКО иначе оно будет по нему сконвентрировано
6 Franchiser
 
гуру
13.05.16
20:10
в качестве ключа можно указать сотрудника переданного через вх. данные
7 Wefast
 
15.05.16
03:40
(1) строка.
(2) как же я его передам, если в источнике нет физ лица, там сотрудник
(4) можно подробнее? Не сталкивался
8 AneJIbcuH
 
15.05.16
09:52
(0) Я так понял, после того, как ты выгрузил Сотрудника в ФизЛицо, в конечной базе тебе ещё необходимо создать запись в Регистре сведений.

По идее самый простой (может не самый производительный), это в обработчике "ПослеЗагрузки" определить программный текст создания записи в регистре сведений (Менеджером записи).

А если хочешь записать один раз набором записи, например, то можно попробовать такую фишку использовать (предполагаю, не пробовал :) ):

- В обработчике Конвертации: "Перед загрузкой данных", т.е. в самом начале загрузки в приемнике, определить Параметр: "Параметры.Вставить("СписокФизическихЛиц", Новый ТаблицаЗначений());
Параметры.СписокФизическихЛиц.Колонки.Добавить("ФизическоеЛицо");"

- В обработчике Правила конвертации объекта (Наверное у тебя "Сотрудник") - "После загрузки объекта", заполнять ТЗ Физ лиц: "НайденнаяСтрока = Параметры.СписокФизическихЛиц.Найти(Объект);
Если НайденнаяСтрока = Неопределено Тогда
    НоваяСтрока = Параметры.СписокФизическихЛиц.Добавить();
    НоваяСтрока.ФизическоеЛицо = Объект;
КонецЕсли;" Где Объект - Это загруженное физ лицо в конечную базу.

- Итогом, В обработчике Конвертации "После загрузки данных" написать программный код формирования набора записей, где в Параметры.СписокФизическихЛиц у тебя будет ТЗ со всеми загруженными физ. лицами.
9 Wefast
 
15.05.16
15:07
(8) пишу послезагрузки

Если НЕ ОбъектНайден Тогда
Объект.Записать();
КонецЕсли;
МЗ = РегистрыСведений.РолиФизическихЛиц.СоздатьМенеджерЗаписи();
МЗ.ФизическоеЛицо = Объект.Ссылка;
МЗ.Роль = Перечисления.РолиФизическихЛиц.Акционер;
МЗ.Организация = Справочники.Организации.НайтиПоНаименованию(Параметры.Организация);
МЗ.Прочитать();
Если НЕ МЗ.Выбран() Тогда
    МЗ.ФизическоеЛицо = Объект.Ссылка;
    МЗ.Роль = Перечисления.РолиФизическихЛиц.Акционер;
    МЗ.Организация = Справочники.Организации.НайтиПоНаименованию(Параметры.Организация);
    МЗ.Записать();
КонецЕсли;

Выдает ошибку:

Ошибка при загрузке данных: {Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1258)}: Ошибка в обработчике события ПослеЗагрузкиОбъекта
    ИмяПКО                 =  Сотрудники
    ТипОбъекта             =  Физическое лицо
    Объект                 =  Иванова ТАТЬЯНА Ивановна
    Обработчик             =  ПослеЗагрузкиОбъекта
    ОписаниеОшибки         =  Ошибка при вызове метода контекста (Записать): Запись не верна! Значение поля не соответствует установленному отбору: РолиФизическихЛиц: Иванова ТАТЬЯНА Ивановна, ОАО "Организация", Акционер, 3cca921d-35d9-4e25-946f-f5c1af11cedc (Регистр сведений: Роли физических лиц; Поле: ИдентификаторЗаписи)
    ПозицияМодуля          =  (15)
    КодСообщения           =  21
10 Wefast
 
15.05.16
15:53
Добавил еще
МЗ.ИдентификаторЗаписи = Новый УникальныйИдентификатор;

Все равно не помогло.
11 AneJIbcuH
 
16.05.16
04:59
(9) Тут где-то ошибка в подстановке данных в самом уже коде. Сделай простенькую обработку, которая будет по выбранным данным делать запись в рег. сведений и отладь код в ней уже.
12 Wefast
 
16.05.16
08:01
(11) Я так и не понял что не так. Но при записи через набор записей все работает
13 Wefast
 
16.05.16
08:02
Хотя конечно хотелось бы понять что не так с ВыгрузитьПоПравилу т.к. дальше много работы по переносы между 7 и 8
14 alkov
 
16.05.16
08:19
А почему бы в ПВД не написать
ВыгрузитьПоПравилу(Объект,,,,"РолиФизическихЛиц");
15 alkov
 
16.05.16
08:20
(8) Хреновое предложение. В ПослеЗагрузки объект в базе ещё не записан, если он новый, поэтому отбора в РС по нему не будет. Используйте обработчики в ПВД
16 AneJIbcuH
 
16.05.16
09:15
(15) Мы легко его можем записать. Объект.Записать().
Ниже допишем: ОбъектМодифицирован = Ложь;
17 AneJIbcuH
 
16.05.16
09:19
(14) А если объект тянется по ссылке?
18 Wefast
 
16.05.16
10:12
(14) не вышло же у меня по ВыгрузитьПоПравилу. Там что то еще сделать нужно, кажется что то связанное с КлючВыгружаемыхДанных, но что именно я не разобрался.

(15) Я написал
Если Не объектнайден тогда
Объект.Записать();
КонецЕсли;

Тогда ссылка есть.

(17) не очень понял, что имеется ввиду.
19 AneJIbcuH
 
16.05.16
10:22
(18) Да это вопрос к уважаемому alkov, он предлагает через ПВД. Так вот если сотрудник, например, передается в конечную базу по ссылке, ПВД не срабатывает.
20 Franchiser
 
гуру
21.05.16
01:57
(18) Сделай еще одно ПКО Сотрудники2 из ПКО Сотрудники и поставь галочку НеЗапоминатьВыгруженные так тебе проще.