1С: Синхронизация оргструктуры – как устроен скрипт
Скрипт выбора данных — вторая половина обработки UnSpot SCIM Adapter: код на встроенном языке 1С, который выбирает из информационной базы сотрудников, подразделения и руководителей. Скрипт один, а описан в двух статьях по назначению. Эта статья — про часть, которая строит оргструктуру: блоки 0 и 5–7 встроенного скрипта для конфигурации «ЗУП 3.1 (ПРОФ/КОРП)». Сотрудники и их поля (блоки 1–4 и 8) разобраны в статье 1С: Синхронизация пользователей – как устроен скрипт; нумерация блоков в обеих статьях общая. Как подключить передачу оргструктуры — в статье 1С: Синхронизация оргструктуры – настройка интеграции, как обработка отправляет подразделения — в статье 1С: Синхронизация оргструктуры – как устроен обработчик.
Содержание
Где находится скрипт и как он запускается
Какие настройки формы видит скрипт
Какой массив данных собирает скрипт
Какие записи попадают в массив
Как собирается каждое поле подразделения
С чего начинается: головная организация в пути
Как структуры попадают в массив
Как оргструктура попадает к сотруднику и в UnSpot
Кратко
- Эта часть скрипта 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 сопоставляет присланные пути с имеющимся деревом по названиям. Недостающие родители создаются по пути автоматически |
manager | Email руководителя подразделения или пустое значение | UnSpot назначает руководителя подразделения по email; пустое значение снимает руководителя. Обработка передаёт email, только если пользователь с таким адресом есть среди активных пользователей UnSpot, иначе заменяет его пустым значением |
description | Описание: для организации — полное наименование, для подразделения — наименование для записей о трудовой деятельности | Описание подразделения в UnSpot |
Условный пример нескольких структур массива — для базы с двумя головными организациями:
path | manager | description |
|---|---|---|
Альфа | 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 — это делает код обработки.
- Не записывает ничего в информационную базу: он только читает данные.
- Не передаёт отчество, телефон, дату рождения, паспортные данные, сведения о зарплате и причины отсутствий — их нет в списке запрашиваемых реквизитов.
- Не удаляет пользователей и подразделения напрямую: он лишь отдаёт актуальный список, а удаление пропавших выполняет обработка по правилам режима синхронизации.
Связанные статьи
- 1С: Синхронизация оргструктуры – настройка интеграции — как передавать дерево подразделений.
- 1С: Синхронизация оргструктуры – как устроен обработчик — протокол, отправляемые данные, создание, обновление и удаление подразделений.
- 1С: Синхронизация пользователей – как устроен скрипт — разбор блоков про сотрудников.
- 1С: Собственный скрипт – настройка интеграции — как написать скрипт для нестандартной конфигурации.
- 1С: Обзор интеграции — какие бывают интеграции с 1С и с чего начать.