Конвертация подразделений

1. user712426 08.10.20 15:11 Сейчас в теме
Здравствуйте!
Есть база ЗУП с иерархическим справочником ПодразделенияОрганизаций (по факту в режиме предприятия он тоже заполнен с иерархией).
И есть УПП с иерархическим справочником Подразделения (по факту в УПП он без иерархии, почему-то наши сотрудники не заполнили его изначально иерархически..).

Мне надо конвертировать док. Прием на работу из ЗУП в УПП..

в ПКО в ПередВыгрузкой:

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Сотрудник");
ТЗ.Колонки.Добавить("Подразделение");
ТЗ.Колонки.Добавить("Должность");
ТЗ.Колонки.Добавить("ДатаПриема");

новстр = ТЗ.добавить();
новстр.Сотрудник = Источник.Сотрудник;
новстр.Подразделение = Источник.Подразделение;
новстр.Должность = Источник.ДолжностьПоШтатномуРасписанию;
новстр.ДатаПриема = Источник.ДатаПриема;

ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("Работники", ТЗ);
Показать



и в ПКС у реквизитов таблицы Работники
значение = ОбъектКоллекции.<соотв.имя>;

Все работает! и все бы хорошо, если не одно но: добавлять/изменять справочник Подразделения в УПП нельзя!!!!
и в зупе к примеру если подразделения имеют такую иерархию:
- подразделение 001000
- - подразделение 001010
- - подразделение 001020
- - - подразделение 001021
- - - подразделение 001022

в упп:
подразделение 001000
подразделение 001010
подразделение 001020

т.е. нет подразделений - - - подразделение 001021 и - - - подразделение 001022

суть в чем: при выгрузке документа, чтобы если у сотрудника подразделение - - - подразделение 001021, то ему присваивалось в упп подразделение 001020! т.е. его родитель..

это я так понимаю в ПКО в ПослеЗагрузки надо это как-то прописать? я правильно понимаю?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
10. spec8s 830 08.10.20 17:10 Сейчас в теме
(8) Другой вариант действительно через поля поиска, нужно для начала в ПКО Подразделения указать Код как поле поиска (отметить галочкой)

В ПКО Подразделения в обработчике ПоляПоиска написать код:

КодДляПоиска = СвойстваПоиска.Код;
МассивКодов = Новый Массив;
МассивКодов.Добавить(КодДляПоиска);
МассивКодов.Добавить(ЛЕВ(КодДляПоиска, СтрДлина(КодДляПоиска)-1) + "0"); //Заменяем последний символ на 0
МассивКодов.Добавить(ЛЕВ(КодДляПоиска, СтрДлина(КодДляПоиска)-2) + "00"); //Заменяем последние 2 символа на 0

СсылкаНаОбъект = Неопределено;
Для Каждого ВариантКода Из МассивКодов Цикл
	СсылкаНаОбъект = Справочники.Подраздения.НайтиПоКоду(ВариантКода);
	Если ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
		ПрекратитьПоиск = Истина;
		Прервать;
	КонецЕсли;
КонецЦикла;
Показать


Но тут есть минус, если не нашли по коду, то будет создан новый элемент справочника подразделения.
Чтобы этого не было надо в ПКО Подразделения в обработчике ПослеЗагрузки вставить код:
Если Объект.ЭтоНовый() Тогда
	Отказ = Истина;
КонецЕсли;
user712426; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RustamZz 08.10.20 15:38 Сейчас в теме
новстр.Подразделение = Источник.Подразделение.Родитель;
Если я правильно понял проблему.
3. user712426 08.10.20 15:48 Сейчас в теме
(2)а если неизвестна глубина иерархии? но известно, что она не более 5 где-то..
я почитала в справке по ПКО.ПоляПоиска..

Событие выполняется при поиске элемента ссылочного типа. Если установлен поиск по уникальнму идентификатору и программа нашла элемент, то поиск прекращается. Если поиск по уникальному идентификатору не дал положительного результата и указано, что нужно продолжить поиск в этом случае или поиск по уникальному идентификатору не проводился, то программа пытается найти элементы по свойствам поиска. В обработчике нужно установить список полей через запятую по которым нужно проводить поиск. Если очередная попытка дала положительный результат, то поиск прекращается.
Поиск возможен только по тем полям у которых на этапе выгрузка был установлен флаг поиска данных.
Параметры:

НомерВариантаПоиска - число. Номер попытки поиска. Попыток поиска может быть не больше 10.

СвойстваПоиска – соответствие, в котором хранятся текущие значения реквизитов поиска. Эти значения можно использовать в произвольных алгоритмах для идентификации объектов ИБ при загрузке данных. Следует иметь в виду, что при создании нового объекта, значения из соответствия СвойстваПоиска используются для заполнения свойств нового объекта.

ПараметрыОбъекта - либо Неопределено либо Соответствие, в котором хранятся дополнительные параметры, переданные для данного объекта из источника в приемник. Если параметров передано не было, то ПараметрыОбъекта = Неопределено. В данном обработчике соответствие содержит только те параметры, для которых установлен признак поиска.

ПрекратитьПоиск - булево. Если Истина, то поиск объекта прекращается, в зависимости от того СсылкаНаОбъект заполнена или нет создается новый объект.

СсылкаНаОбъект - ссылка на результирующий объект. Если в обработчике установить данную ссылку (не пустую) то программа ее запомнит и поиск на этом будет считать успешно завершенным

УстанавливатьУОбъектаВсеСвойстваПоиска - булево. Определяет нужно ли после удачного завершения поиска установить объекту все реквизиты поиска. Объект может быть найден по части реквизитов. Этот флаг определяет нужно оставшиеся реквизиты, которые не участвовали в поиске (но по которым поиск возможен) установить объекту или нет. Значение по умолчанию: Истина.

НастройкаПоиска - строка. Выбранный пользователем вариант сопоставления объектов. В ПКО есть таблица Варианты настроек полей поиска - с возможными вариантами настроек полей поиска для пользователя. Разработчик правил определяет возможные комбинации полей поиска, которые пользователь может выбирать при настройке обмена. Все настройки указанные разработчиком правил должны быть отработаны в коде обработчика "Поля поиска". Переменная НастройкаПоиска в обработчике определяет выбранный пользователем вариант сопоставления (ИмяНастройкиДляАлгоритма из соответствующей строки таблицы). Если пользователь не выбрал ни один вариант сопоставления, или ему ни один вариант не был предложен, то НастройкаПоиска - пустая строка.

СтрокаИменСвойствПоиска – строка в которой задаются ключевые поля варианта поиска. Могут быть указаны только те свойства, для которых при настройке правил обмена был выставлен флаг поиска.

Пример:

Если НомерВариантаПоиска = 1 тогда

СтрокаИменСвойствПоиска = "Код, Наименование";

ИначеЕсли НомерВариантаПоиска = 2 тогда

СтрокаИменСвойствПоиска = "Код";

Иначе

СтрокаИменСвойствПоиска = "Наименование";

КонецЕсли;
Показать


как правильно написать, что надо искать код подразделения без последних к примеру 2х символов (точнее их заменить на ноль!)
4. RustamZz 08.10.20 15:55 Сейчас в теме
(3)
новстр.Подразделение = Новый Структура ("Код", ПолучитьКодПодразделенияС00(Источник.Подразделение));
Нужно сделать новое ПКО с приемником Справочник.Подразделение источник пустой и одним полем Код. Это правило указать у ПКС Подразделение в этом документе.
5. spec8s 830 08.10.20 16:06 Сейчас в теме
Надо в ЗУП к подразделениям добавить признак "Есть в УПП"
При выгрузке подразделения определять его рекурсивно, пока не найдем подразделение у которого есть признак "Есть в УПП"

Суть в том, что надо определять подразделение при отправке из ЗУП, а при загрузке в УПП.
6. user712426 08.10.20 16:11 Сейчас в теме
(5) реквизит добавлять не хотелось бы. а вот
"надо определять подразделение при отправке из ЗУП, а при загрузке в УПП."
хотелось бы сделать правильно.
я вот думаю в ПКО При загрузке надо писать если найден = супер.. если нет, то ищем,чтобы на конце еще два нолика... как то так..
7. spec8s 830 08.10.20 16:13 Сейчас в теме
Если в документе всегда одна строка, то можно добавить параметр, туда записывать код подразделения.
При загрузке объекта уже писать алгоритм поиска подразделения по коду
8. user712426 08.10.20 16:50 Сейчас в теме
(7)при загрузке объекта - это вы имеете ввиду когда обработку (на основе Универсальный обмен данными в XML) буду запускать на приемнике, там анализировать?
9. spec8s 830 08.10.20 16:54 Сейчас в теме
(8)В ПКО, событие ПослеЗагрузкиОбъекта
10. spec8s 830 08.10.20 17:10 Сейчас в теме
(8) Другой вариант действительно через поля поиска, нужно для начала в ПКО Подразделения указать Код как поле поиска (отметить галочкой)

В ПКО Подразделения в обработчике ПоляПоиска написать код:

КодДляПоиска = СвойстваПоиска.Код;
МассивКодов = Новый Массив;
МассивКодов.Добавить(КодДляПоиска);
МассивКодов.Добавить(ЛЕВ(КодДляПоиска, СтрДлина(КодДляПоиска)-1) + "0"); //Заменяем последний символ на 0
МассивКодов.Добавить(ЛЕВ(КодДляПоиска, СтрДлина(КодДляПоиска)-2) + "00"); //Заменяем последние 2 символа на 0

СсылкаНаОбъект = Неопределено;
Для Каждого ВариантКода Из МассивКодов Цикл
	СсылкаНаОбъект = Справочники.Подраздения.НайтиПоКоду(ВариантКода);
	Если ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
		ПрекратитьПоиск = Истина;
		Прервать;
	КонецЕсли;
КонецЦикла;
Показать


Но тут есть минус, если не нашли по коду, то будет создан новый элемент справочника подразделения.
Чтобы этого не было надо в ПКО Подразделения в обработчике ПослеЗагрузки вставить код:
Если Объект.ЭтоНовый() Тогда
	Отказ = Истина;
КонецЕсли;
user712426; +1 Ответить
11. user712426 09.10.20 09:14 Сейчас в теме
(10)спасибо большое! я тоже уже дописала. даже два варианта есть получается через ПоляПоиска и ПриЗагрузке в ПКО.
Очень выручили!
12. user712426 09.10.20 11:17 Сейчас в теме
получилось!
Прикрепленные файлы:
Оставьте свое сообщение

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