Top.Mail.Ru
Центр помощи / Для администратора / 4. Интеграции / Синхронизация пользователей / 1С: Синхронизация оргструктуры – как устроен скрипт

1С: Синхронизация оргструктуры – как устроен скрипт

Скрипт выбора данных — вторая половина обработки UnSpot SCIM Adapter: код на встроенном языке 1С, который выбирает из информационной базы сотрудников, подразделения и руководителей. Скрипт один, а описан в двух статьях по назначению. Эта статья — про часть, которая строит оргструктуру: блоки 0 и 5–7 встроенного скрипта для конфигурации «ЗУП 3.1 (ПРОФ/КОРП)». Сотрудники и их поля (блоки 1–4 и 8) разобраны в статье 1С: Синхронизация пользователей – как устроен скрипт; нумерация блоков в обеих статьях общая. Как подключить передачу оргструктуры — в статье 1С: Синхронизация оргструктуры – настройка интеграции, как обработка отправляет подразделения — в статье 1С: Синхронизация оргструктуры – как устроен обработчик.

Кратко

  • Эта часть скрипта UnSpot SCIM Adapter собирает массив ОргструктураДляUnspot: одна запись на каждое действующее подразделение и на организации, которые входят в путь (единственная головная организация в путь не входит).
  • В записи — путь подразделения в дереве (через /), email руководителя и описание.
  • Массив собирается при включённом флажке «Оргструктура». Руководители подразделений нужны и флажку «Менеджер», поэтому при нём те же блоки тоже выполняются, но дерево в UnSpot не уходит.
  • Путь строится по иерархии справочников «Организации» и «Подразделения организаций»; расформированные подразделения пропускаются.
  • Ниже сначала описаны поля и откуда берётся каждое, затем — блоки скрипта (свёрнуты).
  • Незнакомое слово — загляните в раздел Термины статьи-обзора.

Где находится скрипт и как он запускается

Скрипт — это текст в поле «Код выбора данных для синхронизации» формы настроек обработки. Если в поле «Конфигурация 1С» выбрано «ЗУП 3.1 (ПРОФ/КОРП)», поле доступно только для просмотра, а текст скрипта обновляется вместе с обработкой. Если выбрана «Нестандартная конфигурация», поле редактируется, и ваш код выполняется вместо встроенного.

В начале каждого запуска обработка выполняет текст скрипта в том сеансе 1С, где идёт синхронизация. На выходе скрипт оставляет массив СотрудникиДляUnspot — по одной структуре на сотрудника — и, если включён флажок «Оргструктура», массив ОргструктураДляUnspot — по одной структуре на подразделение. Отправкой этих массивов в UnSpot занимается сама обработка, а не скрипт: что и как она отправляет, описано в статье 1С: Синхронизация оргструктуры – как устроен обработчик.

Что учитывать. Скрипт выполняется без ограничений безопасного режима и с правами пользователя, от имени которого идёт синхронизация. Относитесь к правке этого поля как к правке кода конфигурации и ограничьте доступ к форме настроек администраторами.

Какие настройки формы видит скрипт

Значения полей формы настроек обработка передаёт скрипту в виде готовых переменных. Задавать их в скрипте не нужно — именно поэтому один и тот же скрипт работает во всех режимах.

ПеременнаяЧто этоЗначения
СинхронизацияПользователейРежим синхронизации из формы настроекРежимыСинхронизацииПользователей.Полная — «Полная»; РежимыСинхронизацииПользователей.Обновление — «Только обновление»; РежимыСинхронизацииПользователей.Оргструктура — «Только обновление оргструктуры»
СинхронизироватьОргструктуруФлажок «Оргструктура»Истина или Ложь
СинхронизироватьМенеджераФлажок «Менеджер»Истина или Ложь

Схема работы скрипта

Скрипт состоит из девяти блоков. Блоки идут сверху вниз в том порядке, в котором они перечислены в таблице; часть блоков выполняется только при включённых флажках. В этой статье разобраны блоки 0 и 5–7, блоки 1–4 и 8 — в статье 1С: Синхронизация пользователей – как устроен скрипт.

№БлокЧто делаетКогда выполняется
0ПодготовкаРешает, включать ли название головной организации в путь подразделенийВсегда
1Выбор сотрудниковПолучает действующих сотрудников с заполненным emailВсегда
2Одно место работыИз нескольких позиций одного физлица оставляет однуВсегда
3Запись сотрудникаСобирает структуру с полями для UnSpotВсегда
4Режим работыСчитает долю офисных днейФлажок «Режим работы»
5ОрганизацииСтроит записи оргструктуры для организаций и находит их руководителейФлажок «Оргструктура» или «Менеджер»
6Руководители подразделенийСобирает email руководителей по подразделениямФлажок «Оргструктура» или «Менеджер»
7ПодразделенияСтроит записи оргструктуры для подразделенийФлажок «Оргструктура» или «Менеджер»
8Руководитель сотрудника и результатЗаписывает сотруднику email руководителя его подразделения, убирает служебные поля, формирует массивыВсегда; руководитель — при флажке «Менеджер»

Какой массив данных собирает скрипт

Результат этой части скрипта — массив ОргструктураДляUnspot: по одной структуре на каждую организацию и каждое действующее подразделение. Скрипт собирает его только при включённом флажке «Оргструктура». Обработка отправляет массив в UnSpot целиком запросом PUT /OrgUnits, и UnSpot приводит свою оргструктуру в соответствие с ним: создаёт недостающие подразделения, обновляет руководителя и описание у существующих и удаляет синхронизируемые подразделения, которых в массиве нет. Подробности — в статье 1С: Синхронизация оргструктуры – как устроен обработчик.

Блоки 5–7 не складывают структуры сразу в массив. Сначала они наполняют промежуточное соответствие ПодразделенияПоИдентификатору: ключ — идентификатор организации или подразделения в 1С, значение — структура с полями подразделения. Массив получается из этого соответствия в самом конце, в блоке 8. Соответствие нужно и тогда, когда флажок «Оргструктура» выключен: из него блок 8 берёт руководителя для поля manager у сотрудников. Поэтому блоки 5–7 выполняются при включённом любом из флажков «Оргструктура» и «Менеджер», а массив ОргструктураДляUnspot формируется только при первом.

Какие записи попадают в массив

  • Организации из справочника «Организации». Если в базе одна головная организация, она отдельной записью не идёт — её название не входит в пути. Если головных организаций несколько, в массив попадают все организации, включая головные;
  • Подразделения из справочника «Подразделения организаций», кроме расформированных: подразделение пропускается, если оно расформировано и дата расформирования уже наступила.

Идентификаторы организаций и подразделений из 1С в UnSpot не передаются и там не хранятся: подразделения сопоставляются по названию на каждом уровне пути. Поэтому переименование подразделения в 1С UnSpot воспринимает как появление нового подразделения и исчезновение старого.

Поля структуры подразделения

ПолеЧто содержитЗачем оно нужно UnSpot
pathПолный путь организации или подразделения через / — от верхнего уровня до самого подразделенияОпределяет подразделение и его место в дереве. Других идентификаторов у подразделения нет: UnSpot сопоставляет присланные пути с имеющимся деревом по названиям. Недостающие родители создаются по пути автоматически
managerEmail руководителя подразделения или пустое значениеUnSpot назначает руководителя подразделения по email; пустое значение снимает руководителя. Обработка передаёт email, только если пользователь с таким адресом есть среди активных пользователей UnSpot, иначе заменяет его пустым значением
descriptionОписание: для организации — полное наименование, для подразделения — наименование для записей о трудовой деятельностиОписание подразделения в UnSpot

Условный пример нескольких структур массива — для базы с двумя головными организациями:

pathmanagerdescription
Альфаceo@alfa.ruАльфа Групп, ООО
Альфа/Продажиpetrova@alfa.ruОтдел продаж
Альфа/Продажи/Региональный отделпустоРегиональный отдел продаж
Бетаdirector@beta.ruБета Трейд, ООО

Как собирается каждое поле подразделения

Структуры собирают три блока: 5 — для организаций, 6 — вспомогательный, собирает руководителей подразделений, и 7 — для подразделений. Ещё до них блок 0 принимает решение, которое влияет на путь каждой записи. Ниже для каждого поля показано, откуда берётся значение, как оно вычисляется и какой код за это отвечает. Листинги — куски встроенного скрипта без комментариев; полные блоки — в разделе Разбор по блокам. Многоточие в листинге означает пропущенные строки.

С чего начинается: головная организация в пути

Блок 0 решает, будет ли название головной организации в начале каждого пути. Скрипт считает головные организации — те, у которых реквизит ОбособленноеПодразделение равен Ложь. Если их больше одной (например, у холдинга несколько независимых юрлиц), результат — Истина, и название головной организации включается в путь: одноимённые отделы разных юрлиц не сольются в одно подразделение. Если головная организация одна, результат — Ложь, и её название в пути не входит. При выключенном флажке «Оргструктура» результат всегда Ложь: пути не передаются.

Если СинхронизироватьОргструктуру Тогда
	ВключитьГоловнуюОрганизациюВИерархию = ПолучитьКоличествоЭлементовСправочника("Организации", "Организации.ОбособленноеПодразделение = Ложь") > 1;
Иначе
	ВключитьГоловнуюОрганизациюВИерархию = Ложь;
КонецЕсли;
1С

Поле path: путь

Откуда. Для организации — её наименование и связь с головной организацией, для подразделения — цепочка его родителей и организация-владелец.

Как вычисляется. Путь строят две функции обработки; обе принимают вторым параметром «корень» — элемент, на котором путь обрывается. Корень выбирается по результату блока 0: если названия головной организации нужны, корня нет (Неопределено) и путь идёт до самого верха; если не нужны, корнем становится головная организация подразделения.

  • ПолучитьИерархиюОрганизацийВСтроке берёт наименование организации и, если у неё есть головная организация, отличная от корня, дописывает её название слева;
  • ПолучитьИерархиюПодразделенийВСтроке поднимается от подразделения по родителям, склеивая наименования через /, и затем дописывает слева организацию-владельца — тем же способом, если она не совпадает с корнем.

Например, в базе с одной головной организацией отдел «Региональный отдел» внутри «Продаж» получит путь Продажи/Региональный отдел, а филиал (обособленное подразделение) — путь Филиал. Если головных организаций две и больше, пути начнутся с названия головной: Альфа/Продажи/Региональный отдел и Альфа/Филиал.

Организации в блоке 5:

Если ВключитьГоловнуюОрганизациюВИерархию = Ложь И Организация.ОбособленноеПодразделение = Ложь Тогда
	Продолжить
КонецЕсли;
...
НазваниеОрганизации = ПолучитьИерархиюОрганизацийВСтроке(Организация, ?(ВключитьГоловнуюОрганизациюВИерархию, Неопределено, Организация.ГоловнаяОрганизация));
ПодразделениеДляUnspot.Вставить("path", НазваниеОрганизации);
1С

Подразделения в блоке 7:

Если Подразделение.Расформировано И Подразделение.ДатаРасформирования < ТекущаяДата() Тогда
	Продолжить;
КонецЕсли;
ПодразделениеДляUnspot.Вставить(
	"path",
	ПолучитьИерархиюПодразделенийВСтроке(Подразделение, ?(ВключитьГоловнуюОрганизациюВИерархию, Неопределено, Подразделение.ГоловнаяОрганизация))
);
1С

Сами функции входят в состав обработки, а не в текст скрипта:

Функция ПолучитьИерархиюОрганизацийВСтроке(Знач Элемент, КорневойЭлемент=Неопределено)
	Результат = Элемент.Наименование;
	Если Не Элемент.ГоловнаяОрганизация.Пустая() И Элемент.ГоловнаяОрганизация <> КорневойЭлемент И Элемент.ГоловнаяОрганизация <> Элемент Тогда
		Результат = Элемент.ГоловнаяОрганизация.Наименование + "/" + Результат;
	КонецЕсли;
	Возврат Результат;
КонецФункции

Функция ПолучитьИерархиюПодразделенийВСтроке(Знач Элемент, КорневойЭлемент=Неопределено)
	Результат = Элемент.Наименование;
	Пока Не Элемент.Родитель.Пустая() И Элемент.Родитель <> КорневойЭлемент Цикл
		Элемент = Элемент.Родитель;
		Результат = Элемент.Наименование + "/" + Результат;
	КонецЦикла;
	Если Элемент.Владелец <> Неопределено И Не Элемент.Владелец.Пустая() И Элемент.Владелец <> КорневойЭлемент Тогда
		Результат = ПолучитьИерархиюОрганизацийВСтроке(Элемент.Владелец, КорневойЭлемент) + "/" + Результат;
	КонецЕсли;
	Возврат Результат;
КонецФункции
1С

Поле manager: руководитель

Откуда. Для организации — ответственные лица организации, лицо вида «Руководитель». Для подразделения — данные руководителей подразделений. В обоих случаях скрипт получает физлицо руководителя, а email берёт из контактной информации физлица — первого элемента с типом «Адрес электронной почты», приведённого к нижнему регистру.

Как вычисляется для организации (блок 5). Функция ПодписиДокументов.ОтветственныеЛицаОрганизации возвращает ответственных лиц организации на текущую дату. Если среди них есть руководитель и у него заполнен email, адрес записывается в manager; иначе значение остаётся пустым. Если при этом включены флажок «Оргструктура» и режим «Полная», а руководителя нет среди выбранных сотрудников, скрипт добавляет его в массив СотрудникиДляUnspot отдельной записью. Комментарий в скрипте объясняет шаг так: если руководителя организации нет в пользователях, его добавляют. Организация, которую условие Продолжить выше пропустило (она не входит в иерархию), обходится целиком, вместе с этим шагом.

ОтветственныеЛицаОрганизации = ПодписиДокументов.ОтветственныеЛицаОрганизации(Организация, "Руководитель", ТекущаяДата());
ЭлектроннаяПочтаРуководителя = Неопределено;
Если ОтветственныеЛицаОрганизации["Руководитель"] <> Неопределено Тогда
	РуководительФЗ = ОтветственныеЛицаОрганизации["Руководитель"];
	ЭлектроннаяПочта = ПолучитьКонтактФизическогоЛица(РуководительФЗ, Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
	Если ЭлектроннаяПочта <> Неопределено И ЭлектроннаяПочта <> "" Тогда
		ЭлектроннаяПочтаРуководителя = НРег(ЭлектроннаяПочта);
		ИдФизЛицаРуководителя = Строка(РуководительФЗ.УникальныйИдентификатор());
		Если
			СинхронизироватьОргструктуру
			И СинхронизацияПользователей = РежимыСинхронизацииПользователей.Полная
			И ПользователиПоИдентификатору[ИдФизЛицаРуководителя] = Неопределено
		Тогда
			ЭлементСотрудника = Новый Структура;
			ЭлементСотрудника.Вставить("externalId", ИдФизЛицаРуководителя);
			ЭлементСотрудника.Вставить("userName", ЭлектроннаяПочтаРуководителя);
			ЭлементСотрудника.Вставить("familyName", РуководительФЗ.Фамилия);
			ЭлементСотрудника.Вставить("givenName", РуководительФЗ.Имя);
			ЭлементСотрудника.Вставить("title", ОтветственныеЛицаОрганизации["РуководительДолжность"].Наименование);
			ЭлементСотрудника.Вставить("employeeId", Неопределено);
			ЭлементСотрудника.Вставить("orgUnit", НазваниеОрганизации);
			ЭлементСотрудника.Вставить("orgUnitId", Строка(Организация.УникальныйИдентификатор()));
			ПользователиПоИдентификатору.Вставить(ИдФизЛицаРуководителя, ЭлементСотрудника);
		КонецЕсли;
	КонецЕсли;
КонецЕсли;
ПодразделениеДляUnspot.Вставить("manager", ЭлектроннаяПочтаРуководителя);
1С

Как вычисляется для подразделения (блоки 6 и 7). Блок 6 заранее собирает по всей структуре предприятия соответствие «идентификатор подразделения → email руководителя»: функция РуководителиПодразделений.ДанныеРуководителей возвращает руководителей, а подразделения, у руководителя которых email не заполнен, пропускаются. Блок 7 при построении каждого подразделения просто берёт из этого соответствия значение по идентификатору подразделения; если значения нет, в manager будет пусто.

СтруктураПредприятия = Новый Массив;
СтруктураПредприятияСправочник = Справочники.СтруктураПредприятия.Выбрать();
Пока СтруктураПредприятияСправочник.Следующий() Цикл
	СтруктураПредприятия.Добавить(СтруктураПредприятияСправочник.Ссылка);
КонецЦикла;
РуководителиПоПодразделению = Новый Соответствие;
Руководители = РуководителиПодразделений.ДанныеРуководителей(СтруктураПредприятия);
Если Руководители <> Неопределено Тогда
	Для Каждого РуководительКЗ Из Руководители Цикл
		ЭлектроннаяПочта = ПолучитьКонтактФизическогоЛица(РуководительКЗ.Значение["ФизическоеЛицо"], Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
		Если ЭлектроннаяПочта = Неопределено Или ЭлектроннаяПочта = "" Или РуководительКЗ.Ключ.Источник.Ссылка.Пустая() Тогда
			Продолжить;
		КонецЕсли;
		ИдПодразделения = Строка(РуководительКЗ.Ключ.Источник.Ссылка.УникальныйИдентификатор());
		РуководителиПоПодразделению.Вставить(ИдПодразделения, НРег(ЭлектроннаяПочта));
	КонецЦикла;
КонецЕсли;
1С

И строка блока 7, которая записывает результат в структуру подразделения:

ПодразделениеДляUnspot.Вставить("manager", РуководителиПоПодразделению[Строка(Подразделение.Ссылка.УникальныйИдентификатор())]);
1С

Что учитывать. Скрипт собирает руководителей подразделений из данных, которые есть в редакции «ЗУП КОРП» (так сказано в комментарии скрипта: синхронизация руководителей доступна только для КОРП-версии); без них поле manager у подразделений остаётся пустым. Кроме того, обработка перед отправкой заменит manager пустым значением, если пользователя с таким email нет среди активных пользователей UnSpot — например, если у руководителя в контактной информации первым стоит личный адрес, а в UnSpot он заведён по рабочему.

Поле description: описание

Откуда и как вычисляется. Копируется без преобразований: для организации — реквизит НаименованиеПолное, для подразделения — реквизит НаименованиеДляЗаписейОТрудовойДеятельности.

ПодразделениеДляUnspot.Вставить("description", Организация.НаименованиеПолное);
ПодразделениеДляUnspot.Вставить("description", Подразделение.НаименованиеДляЗаписейОТрудовойДеятельности);
1С

Как структуры попадают в массив

Каждая готовая структура кладётся в соответствие ПодразделенияПоИдентификатору под идентификатором организации или подразделения в 1С. В самом конце скрипта, в блоке 8, при включённом флажке «Оргструктура» значения соответствия по очереди переносятся в массив. Код блока 8 целиком — в статье 1С: Синхронизация пользователей – как устроен скрипт.

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

Разбор по блокам

Ниже блоки 0 и 5–7 описаны и показаны так, как они выглядят в поле «Код выбора данных для синхронизации»; вспомогательные комментарии в листингах опущены.

Блоки свёрнуты, чтобы не мешать чтению: нажмите на название блока, чтобы раскрыть его описание и листинг.

Блок 0. Подготовка: головная организация в пути

Если включена синхронизация оргструктуры, скрипт считает головные организации в справочнике «Организации» — те, у которых реквизит ОбособленноеПодразделение равен Ложь. Если их больше одной (например, холдинг с независимыми юрлицами), название головной организации включается в начало пути каждого подразделения, чтобы одноимённые отделы разных юрлиц не слились в одно подразделение. Если головная организация одна, её название в путь не входит. При выключенном флажке «Оргструктура» признак всегда равен Ложь — дерево не строится.

Если СинхронизироватьОргструктуру Тогда
	ВключитьГоловнуюОрганизациюВИерархию = ПолучитьКоличествоЭлементовСправочника("Организации", "Организации.ОбособленноеПодразделение = Ложь") > 1;
Иначе
	ВключитьГоловнуюОрганизациюВИерархию = Ложь;
КонецЕсли;
1С
Блок 5. Организации и их руководители

Блоки 5–7 выполняются, если включён хотя бы один из флажков «Оргструктура» или «Менеджер»: руководителя сотрудника скрипт берёт из данных подразделений, поэтому подразделения нужны ему и без передачи дерева. Результат блоков — соответствие ПодразделенияПоИдентификатору: ключ — идентификатор организации или подразделения, значение — структура с полями path, manager и description.

Блок 5 обходит справочник «Организации». Если головная организация одна, она пропускается — её название не входит в пути. Путь организации строится функцией ПолучитьИерархиюОрганизацийВСтроке. Руководитель организации определяется функцией ПодписиДокументов.ОтветственныеЛицаОрганизации по должности «Руководитель»; его email берётся из контактной информации физлица — используется первый элемент с типом «Адрес электронной почты».

Если при флажке «Оргструктура» и режиме «Полная» руководителя организации нет среди выбранных сотрудников, скрипт добавляет его в массив пользователей как отдельную запись — чтобы руководитель появился в UnSpot и мог быть назначен.

Если СинхронизироватьОргструктуру Или СинхронизироватьМенеджера Тогда
	ПодразделенияПоИдентификатору = Новый Соответствие;

	//организации с руководителями
	Организации = Справочники.Организации.Выбрать();
	Пока Организации.Следующий() Цикл
		Организация = Организации.Ссылка;

		Если ВключитьГоловнуюОрганизациюВИерархию = Ложь И Организация.ОбособленноеПодразделение = Ложь Тогда
			Продолжить
		КонецЕсли;

		ПодразделениеДляUnspot = Новый Структура;
		НазваниеОрганизации = ПолучитьИерархиюОрганизацийВСтроке(Организация, ?(ВключитьГоловнуюОрганизациюВИерархию, Неопределено, Организация.ГоловнаяОрганизация));
		ПодразделениеДляUnspot.Вставить("path", НазваниеОрганизации);
		ОтветственныеЛицаОрганизации = ПодписиДокументов.ОтветственныеЛицаОрганизации(Организация, "Руководитель", ТекущаяДата());
		ЭлектроннаяПочтаРуководителя = Неопределено;
		Если ОтветственныеЛицаОрганизации["Руководитель"] <> Неопределено Тогда
			РуководительФЗ = ОтветственныеЛицаОрганизации["Руководитель"];
			ЭлектроннаяПочта = ПолучитьКонтактФизическогоЛица(РуководительФЗ, Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты); 
			Если ЭлектроннаяПочта <> Неопределено И ЭлектроннаяПочта <> "" Тогда
				ЭлектроннаяПочтаРуководителя = НРег(ЭлектроннаяПочта);
				ИдФизЛицаРуководителя = Строка(РуководительФЗ.УникальныйИдентификатор());
				//если руководителя организации нет в пользователях, то добавляем его
				Если
					СинхронизироватьОргструктуру
					И СинхронизацияПользователей = РежимыСинхронизацииПользователей.Полная
					И ПользователиПоИдентификатору[ИдФизЛицаРуководителя] = Неопределено
				Тогда
					ЭлементСотрудника = Новый Структура;
					ЭлементСотрудника.Вставить("externalId", ИдФизЛицаРуководителя);
					ЭлементСотрудника.Вставить("userName", ЭлектроннаяПочтаРуководителя);
					ЭлементСотрудника.Вставить("familyName", РуководительФЗ.Фамилия);
					ЭлементСотрудника.Вставить("givenName", РуководительФЗ.Имя);
					ЭлементСотрудника.Вставить("title", ОтветственныеЛицаОрганизации["РуководительДолжность"].Наименование);
					ЭлементСотрудника.Вставить("employeeId", Неопределено);
					ЭлементСотрудника.Вставить("orgUnit", НазваниеОрганизации);
					ЭлементСотрудника.Вставить("orgUnitId", Строка(Организация.УникальныйИдентификатор()));
					ПользователиПоИдентификатору.Вставить(ИдФизЛицаРуководителя, ЭлементСотрудника);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		ПодразделениеДляUnspot.Вставить("manager", ЭлектроннаяПочтаРуководителя);
		ПодразделениеДляUnspot.Вставить("description", Организация.НаименованиеПолное);
		ПодразделенияПоИдентификатору.Вставить(Строка(Организация.УникальныйИдентификатор()), ПодразделениеДляUnspot);
	КонецЦикла;
1С
Блок 6. Руководители подразделений

Блок собирает по структуре предприятия руководителей подразделений из данных РуководителиПодразделений.ДанныеРуководителей и строит соответствие «идентификатор подразделения → email руководителя». Подразделения, у руководителя которых email не заполнен, пропускаются. Синхронизация руководителей подразделений доступна только для редакции «ЗУП КОРП»: там заполняются данные руководителей подразделений.

//выбираем руководителей подразделений
СтруктураПредприятия = Новый Массив;
СтруктураПредприятияСправочник = Справочники.СтруктураПредприятия.Выбрать();
Пока СтруктураПредприятияСправочник.Следующий() Цикл
	СтруктураПредприятия.Добавить(СтруктураПредприятияСправочник.Ссылка);
КонецЦикла;
РуководителиПоПодразделению = Новый Соответствие;

Руководители = РуководителиПодразделений.ДанныеРуководителей(СтруктураПредприятия);
Если Руководители <> Неопределено Тогда
	Для Каждого РуководительКЗ Из Руководители Цикл
		ЭлектроннаяПочта = ПолучитьКонтактФизическогоЛица(РуководительКЗ.Значение["ФизическоеЛицо"], Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты); 
		Если ЭлектроннаяПочта = Неопределено Или ЭлектроннаяПочта = "" Или РуководительКЗ.Ключ.Источник.Ссылка.Пустая() Тогда
			Продолжить;
		КонецЕсли;
		ИдПодразделения = Строка(РуководительКЗ.Ключ.Источник.Ссылка.УникальныйИдентификатор());
		РуководителиПоПодразделению.Вставить(ИдПодразделения, НРег(ЭлектроннаяПочта));
	КонецЦикла; 
КонецЕсли;
1С
Блок 7. Подразделения

Блок обходит справочник «Подразделения организаций». Расформированные подразделения (расформировано и дата расформирования уже наступила) пропускаются. Для остальных строится полный путь функцией ПолучитьИерархиюПодразделенийВСтроке: она поднимается по родителям подразделения и добавляет в начало иерархию организации-владельца — если организация не является корнем пути. В поле manager записывается email руководителя из блока 6, в поле description — наименование для записей о трудовой деятельности.

Подразделения = Справочники.ПодразделенияОрганизаций.Выбрать();
Пока Подразделения.Следующий() Цикл
	Подразделение = Подразделения.Ссылка;
	Если Подразделение.Расформировано И Подразделение.ДатаРасформирования < ТекущаяДата() Тогда
		Продолжить;
	КонецЕсли;
	ПодразделениеДляUnspot = Новый Структура;
	ПодразделениеДляUnspot.Вставить(
		"path",
		ПолучитьИерархиюПодразделенийВСтроке(Подразделение, ?(ВключитьГоловнуюОрганизациюВИерархию, Неопределено, Подразделение.ГоловнаяОрганизация))
	);
	ПодразделениеДляUnspot.Вставить("manager", РуководителиПоПодразделению[Строка(Подразделение.Ссылка.УникальныйИдентификатор())]);
	ПодразделениеДляUnspot.Вставить("description", Подразделение.НаименованиеДляЗаписейОТрудовойДеятельности);
	ПодразделенияПоИдентификатору.Вставить(Строка(Подразделение.УникальныйИдентификатор()), ПодразделениеДляUnspot); 
КонецЦикла;
1С

Как оргструктура попадает к сотруднику и в UnSpot

Результат блоков 5–7 используется в блоке 8. При флажке «Менеджер» сотруднику в поле manager записывается email руководителя его подразделения из соответствия ПодразделенияПоИдентификатору. Если у подразделения руководителя нет или руководитель — сам сотрудник, в manager записывается пустое значение — это команда снять руководителя. При флажке «Оргструктура» подразделения из соответствия собираются в массив ОргструктураДляUnspot — по одной структуре на подразделение. Код блока 8 — в статье 1С: Синхронизация пользователей – как устроен скрипт; что обработка делает с массивом дальше, — в статье 1С: Синхронизация оргструктуры – как устроен обработчик.

Что можно менять в нестандартной конфигурации

Для нестандартной конфигурации за основу берётся копия встроенного скрипта: всё, что вы не меняли, продолжает работать как описано выше. Требования к собственному скрипту — обязательные поля и вспомогательные функции — описаны в статье 1С: Собственный скрипт – настройка интеграции.

Что менятьГдеНа что обратить внимание
Признак головной организацииБлок 0, условие Организации.ОбособленноеПодразделение = ЛожьНужен, если в справочнике «Организации» в вашей конфигурации другой реквизит для головной организации
Источники организаций, подразделений и руководителейБлоки 5–7Справочники и регистры ЗУП замените на аналоги вашей конфигурации; результат должен остаться в том же формате: path, manager, description

После любой правки нажмите «Сохранить и проверить»: обработка выполнит пробную выборку и покажет, сколько подразделений выбрано. Если число отличается от ожидаемого, проверьте условия отбора в блоке 7. Что менять в части скрипта про сотрудников — в статье 1С: Синхронизация пользователей – как устроен скрипт.

Чего скрипт не делает

  • Не отправляет данные в UnSpot и не читает данные UnSpot — это делает код обработки.
  • Не записывает ничего в информационную базу: он только читает данные.
  • Не передаёт отчество, телефон, дату рождения, паспортные данные, сведения о зарплате и причины отсутствий — их нет в списке запрашиваемых реквизитов.
  • Не удаляет пользователей и подразделения напрямую: он лишь отдаёт актуальный список, а удаление пропавших выполняет обработка по правилам режима синхронизации.

Связанные статьи

Оставьте заявку, и мы свяжемся с вами в течение 30 минут.

Loading

Как улучшить работу офиса?

Оставьте контакт - покажем на демо как уйти от таблиц, двойных бронирований и путаницы с рабочими местами.

Loading