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

1С: Собственный скрипт – настройка интеграции

Обе обработки UnSpot для 1С — UnSpot SCIM Adapter (пользователи и оргструктура) и UnSpot Schedule Status Adapter (статусы в расписании) — состоят из готового движка и скрипта выбора данных. Для конфигурации «ЗУП 3.1» скрипт встроен. Если у вас другая конфигурация или в ЗУП другие правила (например, свои виды занятости или свой источник email), скрипт можно заменить своим. В статье описано, что такой скрипт должен вернуть движку, какие переменные и функции ему доступны, что обязательно, а что нет, и как проверить результат. Как устроены встроенные скрипты — в статьях 1С: Синхронизация пользователей – как устроен скрипт, 1С: Синхронизация оргструктуры – как устроен скрипт и 1С: Синхронизация статусов расписания – как устроен скрипт.

Когда нужен собственный скрипт

  • У вас не «ЗУП 3.1 ПРОФ/КОРП»: бухгалтерия, «1С:Предприятие» на другой конфигурации или отраслевое решение.
  • В ЗУП данные хранятся нестандартно: email не в контактной информации физлица, подразделения хранятся в доработанном справочнике, руководитель определяется по своему правилу.
  • Нужны другие правила выбора: например, не синхронизировать часть организаций или передавать статусы только по определённым видам времени.

Если ваши отличия небольшие, проще всего взять встроенный скрипт и изменить в нём нужные места — в статьях о встроенных скриптах в конце есть таблицы «Что можно менять».

Как подключить свой скрипт

  1. Откройте форму настроек нужной обработки: UnSpot SCIM Adapter Settings или UnSpot Schedule Status Adapter Settings.
  2. В поле «Конфигурация 1С» выберите «Нестандартная конфигурация». Поле «Код выбора данных для синхронизации» станет редактируемым. Если свой скрипт ещё не сохранён, в поле появится заготовка из комментариев с описанием контракта. Сама заготовка как скрипт не сохраняется: сохранится только текст, который вы ввели или вставили в поле.
  3. Вставьте или напишите скрипт. Чтобы начать с готового, скопируйте встроенный скрипт: в режиме «ЗУП 3.1 (ПРОФ/КОРП)» он показывается в поле только для чтения. Затем переключите режим на «Нестандартная конфигурация» и вставьте текст.
  4. Нажмите «Сохранить и проверить»: обработка выполнит скрипт, покажет количество выбранных записей и обратится к UnSpot: обработка пользователей только читает данные UnSpot, а обработка статусов отправит по одному настоящему статусу на каждую дату, которую вернул скрипт (встроенный в проверке возвращает только сегодняшний день). Когда результат совпадает с ожидаемым, нажмите «Сохранить и запустить» или настройте регламентное задание.

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

Общие правила для обоих скриптов

  • Скрипт — это текст на встроенном языке 1С, который целиком выполняется одним вызовом «Выполнить» внутри модуля объекта обработки. Ему доступен обычный контекст 1С: справочники, запросы, регистры, общие модули конфигурации и всё, что перечислено ниже.
  • Результат скрипт передаёт через переменные с фиксированными именами. Имена в 1С не зависят от регистра, поэтому СотрудникиДляUnspot и СотрудникиДляUnSpot — одна и та же переменная.
  • Если обязательная переменная не определена, движок остановит запуск с ошибкой. Любое исключение внутри скрипта тоже прерывает запуск. Выбор данных выполняется до отправки изменений, поэтому при ошибке в скрипте в UnSpot ничего не изменится (обработка пользователей до скрипта успевает только прочитать список пользователей UnSpot).
  • Движок отправляет в UnSpot только описанные ниже поля: своё поле из структуры в UnSpot не уйдёт. Но в обработке пользователей лишний ключ ломает запуск: сравнивая сотрудника с пользователем UnSpot, движок ищет у пользователя UnSpot такое же поле, не находит его, и запуск останавливается с ошибкой. Кнопка «Сохранить и проверить» этого не покажет — сравнение выполняется только при настоящем запуске. Поэтому служебные ключи удаляйте из структуры до конца скрипта, как это делает встроенный скрипт, и не добавляйте полей, которых нет в таблице ниже.
  • Кроме переменных с результатом, в контексте скрипта видны локальные переменные движка, в том числе Настройки со всеми настройками обработки и токеном доступа: ещё одна причина считать доступ к настройкам равным доступу к коду.
  • Скрипт ничего не должен отправлять в UnSpot сам: он только готовит данные. Отправку, сопоставление, создание и удаление выполняет движок.

Скрипт для UnSpot SCIM Adapter: пользователи и оргструктура

Какие переменные скрипт получает

ПеременнаяЧто содержит
СинхронизацияПользователейВыбранный режим: полная, обновление или оргструктура. Значения доступны через структуру РежимыСинхронизацииПользователей: Полная, Обновление, Оргструктура
СинхронизироватьОргструктуруИстина, если в настройках включён флажок «Оргструктура»
СинхронизироватьМенеджераИстина, если включён флажок «Менеджер»
СинхронизироватьРежимРаботыИстина, если включён флажок «Режим работы»

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

Что скрипт должен вернуть

Переменная СотрудникиДляUnspot — массив. Каждый элемент массива — структура с данными одного сотрудника. Если включён флажок «Оргструктура», дополнительно нужна переменная ОргструктураДляUnspot — массив структур по одной на подразделение. Без включённого флажка ОргструктураДляUnspot можно не определять.

Поле сотрудникаОбязательностьЧто содержит
userNameВсегда обязательноEmail сотрудника, строго в нижнем регистре. По нему движок сопоставляет сотрудника с пользователем UnSpot: адреса UnSpot он приводит к нижнему регистру и сравнивает точно, поэтому адрес с заглавными буквами не сопоставится, а в режиме «Полная» движок попробует создать пользователя заново
externalIdОбязательно в режиме «Полная»Уникальный неизменный идентификатор физического лица (например, УникальныйИдентификатор физлица в виде строки). Нужен для сопоставления, если у сотрудника изменился email
familyNameОбязательно в режиме «Полная»Фамилия
givenNameОбязательно в режиме «Полная»Имя
titleНеобязательноДолжность
employeeIdНеобязательноТабельный номер
orgUnitНеобязательноПодразделение: путь от корня к дочернему через символ /, например Продажи/Региональный отдел. При обновлении пользователя пустое значение очищает его подразделение
departmentНеобязательноПодразделение одним названием, без пути: UnSpot находит подразделение верхнего уровня с таким названием или создаёт его и привязывает к нему сотрудника. Если заполнены и orgUnit, и department, приоритет у orgUnit. Чтобы 1С вообще не меняла подразделения сотрудников (например, их ведёт каталог), не добавляйте в структуру ни orgUnit, ни department
managerНеобязательноEmail руководителя. Движок отправляет поле, если ключ есть в структуре; флажок «Менеджер» он не проверяет, поэтому проверяйте переменную СинхронизироватьМенеджера в скрипте. Если руководителя ещё нет в UnSpot (например, его создают в этом же запуске), движок назначит его после создания
attendanceНеобязательноРежим работы: число от 0 (удалённый режим) до 100 (офисный режим). Передаётся, если включён флажок «Режим работы»

Что учитывать. Движок отправляет поле, только если оно есть в структуре. Если ключа нет, в UnSpot это поле не меняется. Если ключ есть, а значение пустое, UnSpot получит пустое значение — для подразделения это команда очистки. Поэтому для сотрудников, у которых данных нет, лучше не добавлять ключ вовсе, если вы не хотите очищать значение в UnSpot. Для подразделений правило другое: manager и description движок отправляет всегда, а если ключа нет — пустыми; manager подразделения уходит, только если пользователь с таким email есть среди активных пользователей UnSpot.

Поле подразделенияОбязательностьЧто содержит
pathОбязательноПолный путь от корня до подразделения через символ /, например Продажи/Региональный отдел
managerНеобязательноEmail руководителя подразделения
descriptionНеобязательноОписание подразделения

Встроенный скрипт передаёт каждое подразделение, включая родительские, отдельным элементом, а в orgUnit сотрудников использует те же пути. Придерживайтесь того же: путь в orgUnit сотрудника должен совпадать с path подразделения в оргструктуре. Правила, по которым UnSpot строит дерево из переданных путей, описаны в статье 1С: Синхронизация оргструктуры – как устроен обработчик.

Какие функции доступны

  • ПолучитьКонтактФизическогоЛица(ФизическоеЛицо, ТипКонтактнойИнформации) — возвращает представление первого контакта нужного типа из табличной части «Контактная информация» физлица или Неопределено. Для email: ПолучитьКонтактФизическогоЛица(ФизЛицо, Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты).
  • ПолучитьИерархиюПодразделенийВСтроке(Элемент, КорневойЭлемент) — строка пути для подразделения «от корня к дочернему» через /, без переданного корневого элемента и его родителей; если подразделение принадлежит организации, не совпадающей с корневым элементом, в начало пути добавляется строка организации — её название вместе с головной организацией (как у функции ниже).
  • ПолучитьИерархиюОрганизацийВСтроке(Элемент, КорневойЭлемент) — то же для организации: к её названию добавляется название головной организации (один уровень), если она не совпадает с корневым элементом и с самой организацией.
  • Функции, которыми встроенный скрипт считает режим работы (ЗаполнитьРежимРаботыСогласноГрафикуРаботы и вспомогательные к ней), тоже доступны. Как они устроены — в разделе о поле attendance статьи 1С: Синхронизация пользователей – как устроен скрипт.

Минимальный пример

Пример показывает форму результата: в рабочем скрипте значения берутся из запросов к вашей конфигурации, а не пишутся константами.

СотрудникиДляUnspot = Новый Массив;

Сотрудник = Новый Структура;
Сотрудник.Вставить("userName", "ivanov@company.ru");
Сотрудник.Вставить("externalId", "b0d4ce5d-2757-4699-948c-cfa72ba94f86");
Сотрудник.Вставить("familyName", "Иванов");
Сотрудник.Вставить("givenName", "Иван");
Сотрудник.Вставить("title", "Менеджер по продажам");
Сотрудник.Вставить("orgUnit", "Продажи/Региональный отдел");
Если СинхронизироватьМенеджера Тогда
	Сотрудник.Вставить("manager", "petrov@company.ru");
КонецЕсли;
Если СинхронизироватьРежимРаботы Тогда
	Сотрудник.Вставить("attendance", 60);
КонецЕсли;
СотрудникиДляUnspot.Добавить(Сотрудник);

Если СинхронизироватьОргструктуру Тогда
	ОргструктураДляUnspot = Новый Массив;

	Подразделение = Новый Структура;
	Подразделение.Вставить("path", "Продажи");
	ОргструктураДляUnspot.Добавить(Подразделение);

	Подразделение = Новый Структура;
	Подразделение.Вставить("path", "Продажи/Региональный отдел");
	Подразделение.Вставить("manager", "petrov@company.ru");
	ОргструктураДляUnspot.Добавить(Подразделение);
КонецЕсли;
1С

Что учитывать. В режиме «Полная» пользователи UnSpot с заполненным externalId, которых нет в вашем массиве, будут удалены (архивированы). Пример показывает только форму данных: не запускайте его на рабочем пространстве с реальными пользователями.

Скрипт для UnSpot Schedule Status Adapter: статусы расписания

Какие переменные скрипт получает

ПеременнаяЧто содержит
ТестовыйЗапускЛожь при обычном запуске и Истина при проверке («Сохранить и проверить»). В проверочном запуске выбирайте данные за один день: движок отправляет по одному статусу на каждую дату, поэтому при нескольких датах уйдёт несколько запросов подряд без паузы, и сервер может ответить ошибкой 429
НазваниеМодуляИсточник записей журнала регистрации — используйте его первым параметром в ЗаписьЖурналаРегистрации, чтобы записи скрипта попадали в тот же журнал

Что скрипт должен вернуть

Нужны две переменные, обе — соответствия. Если хотя бы одна не определена, запуск завершится ошибкой.

ПеременнаяКлючЗначение
СотрудникиДляUnSpotУникальный идентификатор физлица (строка)Структура с обязательными полями email (адрес электронной почты, в нижнем регистре) и name (полное имя — используется только в сообщениях журнала регистрации)
СтатусыСостоянийДляUnSpotДата в формате гггг-ММ-дд (строка)Вложенное соответствие: ключ — идентификатор физлица из СотрудникиДляUnSpot, значение — один числовой код статуса

Коды статусов возвращает функция ПолучитьСоответствиеСтатусовUnSpot() — результат лучше брать оттуда, а не писать числа вручную:

Имя в структуреКодЧто уйдёт в UnSpot
РабочееВремя1Сброс статуса: день без отметки
Больничный2Не работаю · «Больничный» (БЛ)
Отпуск3Не работаю · «Отпуск» (ОТ)
Командировка4Работаю удалённо · «Командировка» (К)
Отсутствие5Не работаю · «Отсутствие» (НН)
УдаленнаяРабота6Работаю удалённо · «Удаленная работа» (Д)

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

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

Если переменная СотрудникиДляUnSpot не определена, движок остановится с ошибкой «Переменная ‘СтатусыДляUnspot‘ должна быть определена и быть соответствием». Название переменной в тексте этой ошибки неточное — нужно определить именно СотрудникиДляUnSpot.

Какие функции доступны

  • СоздатьВТСотрудники(МенеджерВременныхТаблиц, МассивСотрудников, Месяц, ДатаАктуальности, ДатаНачала, ДатаОкончания) — по массиву ссылок на справочник «Сотрудники» создаёт временную таблицу ВТСотрудники для вызова УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников. Работает в конфигурациях, где есть этот механизм ЗУП.
  • ПолучитьБуквенныйКодВидаУчетаВремени(ВидУчетаВремени) — возвращает буквенный код вида использования рабочего времени (если у вида нет своего кода — код основного времени) или Неопределено.
  • ПолучитьСтатусыДистанционнойРаботыСотрудников(МассивСотрудников, ДатаНачала, ДатаОкончания) — читает из регистра «Дистанционная работа сотрудников» периоды дистанционной работы. Возвращает соответствие «идентификатор сотрудника → строки таблицы значений с полями Сотрудник, Период, ДатаОкончания, Статус» либо Неопределено, если учёт дистанционной работы выключен.
  • ФорматироватьДату(Дата) — форматирует дату как гггг-ММ-дд: так должны выглядеть ключи СтатусыСостоянийДляUnSpot.
  • ПолучитьСоответствиеСтатусовUnSpot() — коды статусов из таблицы выше.

Минимальный пример

СотрудникиДляUnSpot = Новый Соответствие;
СтатусыСостоянийДляUnSpot = Новый Соответствие;
СоответствиеСтатусовUnSpot = ПолучитьСоответствиеСтатусовUnSpot();

ИдФизЛица = "b0d4ce5d-2757-4699-948c-cfa72ba94f86";

Сотрудник = Новый Структура;
Сотрудник.Вставить("email", "ivanov@company.ru");
Сотрудник.Вставить("name", "Иван Иванов");
СотрудникиДляUnSpot.Вставить(ИдФизЛица, Сотрудник);

// 28 июля — отпуск, 29 июля — рабочий день (сброс статуса)
СтатусыНаДату = Новый Соответствие;
СтатусыНаДату.Вставить(ИдФизЛица, СоответствиеСтатусовUnSpot.Отпуск);
СтатусыСостоянийДляUnSpot.Вставить("2026-07-28", СтатусыНаДату);

// в проверочном запуске достаточно одной даты
Если Не ТестовыйЗапуск Тогда
	СтатусыНаДату = Новый Соответствие;
	СтатусыНаДату.Вставить(ИдФизЛица, СоответствиеСтатусовUnSpot.РабочееВремя);
	СтатусыСостоянийДляUnSpot.Вставить("2026-07-29", СтатусыНаДату);
КонецЕсли;
1С

Как проверить скрипт

  • Начните с «Сохранить и проверить». Для пользователей обработка покажет «Выбрано пользователей 1С: N» и «Выбрано подразделений 1С: N» (если оргструктура включена), для статусов — «Выбрано сотрудников с email: N» и «Выбрано статусов сотрудников на текущую дату: N» (здесь N — число дат со статусами; у встроенного скрипта в проверке 0 или 1). Если число отличается от ожидаемого, проверьте условия выбора и заполнение email.
  • Для статусов проверка отправит по одному настоящему статусу на каждую дату, которую вернул скрипт при ТестовыйЗапуск = Истина: на каждую дату — первому сотруднику из списка. Ограничьте проверочную выборку сотрудником, для которого это безопасно, или используйте тестовое рабочее пространство.
  • Смотрите журнал регистрации 1С («Администрирование → Обслуживание → Журнал регистрации»): в нём видны все шаги движка. Свои записи скрипт может добавлять через ЗаписьЖурналаРегистрации — в скрипте для статусов с источником НазваниеМодуля, как это делает встроенный скрипт.
  • После любого изменения скрипта для статусов учтите, что сохранение настроек сбрасывает кэш отправленных статусов, и следующий запуск пройдёт полностью.

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

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

Loading

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

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

Loading