1С: Собственный скрипт – настройка интеграции
Обе обработки UnSpot для 1С — UnSpot SCIM Adapter (пользователи и оргструктура) и UnSpot Schedule Status Adapter (статусы в расписании) — состоят из готового движка и скрипта выбора данных. Для конфигурации «ЗУП 3.1» скрипт встроен. Если у вас другая конфигурация или в ЗУП другие правила (например, свои виды занятости или свой источник email), скрипт можно заменить своим. В статье описано, что такой скрипт должен вернуть движку, какие переменные и функции ему доступны, что обязательно, а что нет, и как проверить результат. Как устроены встроенные скрипты — в статьях 1С: Синхронизация пользователей – как устроен скрипт, 1С: Синхронизация оргструктуры – как устроен скрипт и 1С: Синхронизация статусов расписания – как устроен скрипт.
Когда нужен собственный скрипт
- У вас не «ЗУП 3.1 ПРОФ/КОРП»: бухгалтерия, «1С:Предприятие» на другой конфигурации или отраслевое решение.
- В ЗУП данные хранятся нестандартно: email не в контактной информации физлица, подразделения хранятся в доработанном справочнике, руководитель определяется по своему правилу.
- Нужны другие правила выбора: например, не синхронизировать часть организаций или передавать статусы только по определённым видам времени.
Если ваши отличия небольшие, проще всего взять встроенный скрипт и изменить в нём нужные места — в статьях о встроенных скриптах в конце есть таблицы «Что можно менять».
Как подключить свой скрипт
- Откройте форму настроек нужной обработки: UnSpot SCIM Adapter Settings или UnSpot Schedule Status Adapter Settings.
- В поле «Конфигурация 1С» выберите «Нестандартная конфигурация». Поле «Код выбора данных для синхронизации» станет редактируемым. Если свой скрипт ещё не сохранён, в поле появится заготовка из комментариев с описанием контракта. Сама заготовка как скрипт не сохраняется: сохранится только текст, который вы ввели или вставили в поле.
- Вставьте или напишите скрипт. Чтобы начать с готового, скопируйте встроенный скрипт: в режиме «ЗУП 3.1 (ПРОФ/КОРП)» он показывается в поле только для чтения. Затем переключите режим на «Нестандартная конфигурация» и вставьте текст.
- Нажмите «Сохранить и проверить»: обработка выполнит скрипт, покажет количество выбранных записей и обратится к 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С («Администрирование → Обслуживание → Журнал регистрации»): в нём видны все шаги движка. Свои записи скрипт может добавлять через
ЗаписьЖурналаРегистрации— в скрипте для статусов с источникомНазваниеМодуля, как это делает встроенный скрипт. - После любого изменения скрипта для статусов учтите, что сохранение настроек сбрасывает кэш отправленных статусов, и следующий запуск пройдёт полностью.
Связанные статьи
- 1С: Обзор интеграции — какие бывают интеграции с 1С и с чего начать.
- 1С: Синхронизация пользователей – как устроен скрипт — разбор встроенного скрипта: сотрудники.
- 1С: Синхронизация оргструктуры – как устроен скрипт — разбор встроенного скрипта: подразделения и руководители.
- 1С: Синхронизация статусов расписания – как устроен скрипт — разбор встроенного скрипта для статусов.
- 1С: Синхронизация пользователей – настройка интеграции — форма настроек обработки для пользователей.
- 1С: Синхронизация оргструктуры – настройка интеграции — передача дерева подразделений.
- 1С: Синхронизация статусов расписания – настройка интеграции — форма настроек обработки для статусов.