
1С:Предприятие
Обучайте сотрудников и назначайте курсы прямо из 1С: кадры и подразделения приходят в LMS автоматически, задачи обучения возвращаются в 1С, а вход в личный кабинет — по подписанной ссылке без пароля.
Руководство по подключению 1С к Brusnika.LMS
Инструкция рассчитана на самостоятельное подключение: без помощи нашей команды. Подключение состоит из двух частей. 1С-разработчик создаёт и публикует HTTP-сервис в 1С, а администратор LMS указывает его адрес и ключ в настройках. Для автосинхронизации дополнительно нужен администратор сервера LMS.
Ориентировочный порядок: сначала сервис в 1С и его проверка через curl, затем настройка в LMS, потом расписание и вход без пароля.
Что понадобится
- Brusnika.LMS в режиме Standalone (отдельный портал).
- Права администратора в LMS: раздел «Управление системой».
- 1С-разработчик, который умеет добавлять расширения конфигурации и HTTP-сервисы.
- Информационная база 1С, опубликованная на веб-сервере, с адресом, доступным из LMS по HTTPS.
- Отдельный сервисный пользователь информационной базы 1С для обращений LMS.
- Для автосинхронизации — доступ к серверу LMS (администратор сервера).
Один портал LMS может держать несколько независимых подключений — например, по одному на каждое юрлицо со своей базой 1С. Шаги 1–5 и 7 выполняются отдельно для каждой базы, а крон из шага 6 настраивается один раз на весь портал. Если у вас одна база, заведите одно подключение.
HTTP-сервис в 1С
Разработчик создаёт расширение с сервисом /hs/lms по контракту.
Публикация и проверка
Сервис публикуется на веб-сервере и проверяется командами curl.
Настройка в LMS
Администратор указывает адрес, путь и ключ, проверяет связь и запускает синхронизацию.
Автосинхронизация
Администратор сервера настраивает регулярный вызов синхронизации.
Вход без пароля
1С формирует подписанные ссылки, а сотрудники открывают LMS без ввода пароля.
Шаг 1. Создайте HTTP-сервис в 1С
Если баз несколько, сервис нужно поднять на каждой из них. Сервис делается расширением конфигурации, чтобы не менять типовую конфигурацию. Корневой URL сервиса — lms, поэтому в LMS он будет доступен по пути /hs/lms. Другой путь тоже можно использовать, его нужно будет указать в настройках LMS.
Сервис должен реализовать четыре метода. Все ответы — JSON в кодировке UTF-8. Каждый запрос LMS отправляет с заголовком X-API-Key.
| Метод | Назначение |
|---|---|
GET /ping | Проверка связи |
GET /departments | Список подразделений |
GET /employees?limit=&offset= | Постраничный список сотрудников |
POST /tasks | Создание, завершение и удаление задачи обучения |
Сервис учитывает сотрудников (физических лиц), а не пользователей информационной базы 1С. Сотрудников отдавайте из кадровых данных вашей конфигурации.
GET /ping
Возвращает любой корректный JSON без поля error. Рекомендуем такой ответ:
{ "ok": true }
GET /departments
Дерево подразделений. Поле id — стабильный идентификатор (GUID) подразделения, parent — идентификатор родительского подразделения или пустая строка для корневого.
{
"items": [
{ "id": "guid-подразделения", "name": "Производство", "parent": "guid-родителя-или-пусто" }
]
}
GET /employees
Постраничный список сотрудников. Параметры: limit (по умолчанию 100, максимум 500) и offset (по умолчанию 0). Если есть следующая страница, верните "has_more": true.
{
"items": [
{
"id": "guid-физлица",
"tabNumber": "00123",
"lastName": "Иванов",
"firstName": "Иван",
"middleName": "Иванович",
"email": "ivanov@company.ru",
"position": "Менеджер",
"departments": ["guid-подразделения"],
"active": true
}
],
"has_more": false
}
Требования к полям:
id— GUID физического лица. Он не должен меняться со временем, по нему LMS сопоставляет сотрудников.departments— список идентификаторов из ответа/departments.active—trueдля работающих сотрудников иfalseдля уволенных. Чтобы LMS деактивировала уволенного, верните его сactive: false.- Поля «руководитель» в контракте нет.
- За один проход LMS обрабатывает до 5000 сотрудников.
POST /tasks
Один метод для трёх действий: поле action принимает значения add, complete и delete.
Создание задачи:
{
"action": "add",
"employee_id": "guid-физлица",
"title": "Пройти курс «Охрана труда»",
"due_date": "2026-10-15",
"description": "...",
"url": "https://lms.company.ru/?programs=42"
}
В ответ на add верните идентификатор созданной задачи — LMS запоминает его:
{ "task_id": "1c-task-987" }
Завершение и удаление задачи:
{
"action": "complete",
"employee_id": "guid-физлица",
"task_id": "1c-task-987"
}
Для удаления передайте "action": "delete" с теми же полями.
Ошибки
Если запрос нельзя выполнить, верните JSON с полем error и понятным текстом причины. LMS покажет администратору, что действие не удалось.
Шаг 2. Опубликуйте сервис
- Опубликуйте информационную базу на веб-сервере (Apache или IIS) стандартными средствами платформы 1С:Предприятие.
- В файле публикации
default.vrdвключите публикацию расширений по умолчанию:publishExtensionsByDefault="true". - Обновите публикацию и убедитесь, что сервис отвечает по адресу вида:
https://<сервер>/<имя_публикации>/hs/lms/ping
Адрес должен быть доступен из сети, где работает LMS, по HTTPS. Если 1С находится за файрволом, разрешите доступ с адреса сервера LMS.
Шаг 3. Создайте сервисного пользователя и ключ
- Создайте в информационной базе 1С отдельного пользователя для интеграции. Это должен быть сервисный пользователь, а не сотрудник.
- Выдайте ему право использовать HTTP-сервис
lms. - Задайте ключ доступа, который сервис проверяет в заголовке
X-API-Key. Этот ключ вы укажете в LMS как «Ключ API».
Храните ключ в закрытом месте и не публикуйте его в скриптах и репозиториях.
Шаг 4. Проверьте сервис командами curl
Прежде чем настраивать LMS, убедитесь, что сервис работает. Подставьте свой адрес и ключ:
curl -sS -H "X-API-Key: KEY" "https://<сервер>/<публикация>/hs/lms/ping"
curl -sS -H "X-API-Key: KEY" "https://<сервер>/<публикация>/hs/lms/departments"
curl -sS -H "X-API-Key: KEY" "https://<сервер>/<публикация>/hs/lms/employees?limit=10&offset=0"
Ожидаемый результат:
/pingвозвращает корректный JSON без ошибки;/departmentsвозвращает список подразделений в полеitems;/employeesвозвращает первые 10 сотрудников в полеitemsс корректнымиid, ФИО иactive.
Пока эти запросы не отвечают, переходить к настройке в LMS не стоит.
Шаг 5. Добавьте подключение в LMS
- Откройте Настройки → Управление системой → Интеграции → Интеграция с 1С и нажмите «Добавить подключение».
- Задайте код подключения (slug) и название компании. Код — только латиница, цифры, «-» и «_», начинается с буквы или цифры, например
parnas. Он входит в ссылку входа без пароля и во внутреннюю адресацию, поэтому после создания его изменить нельзя. - Заполните параметры подключения:
| Поле | Что указать |
|---|---|
| Адрес публикации 1С | Адрес информационной базы из публикации, например https://1c.company.ru/zup |
| Путь HTTP-сервиса | Путь сервиса, по умолчанию /hs/lms |
| Ключ API | Ключ сервисного пользователя из шага 3 |
| SSO-секрет | Секрет для подписи ссылок входа этой базы (см. шаг 7) |
- Нажмите «Сохранить», затем «Проверить». Если связь есть, статус изменится на «Подключено».
- Нажмите «Синхронизировать». В результате появятся счётчики: создано, обновлено, деактивировано и пропущено из-за лимита мест.
- Откройте список пользователей LMS и убедитесь, что сотрудники и подразделения из 1С загрузились.
- Для каждой следующей компании повторите шаги 1–4 и этот шаг. Список подключений показывает все компании сразу со статусом настройки.
Ключ и SSO-секрет после сохранения показываются в скрытом виде. Чтобы изменить значение, введите новое.
Что общее на весь портал: пользователи и профили, одно дерево оргструктуры и лимит мест по тарифу — все компании делят один пул мест.
Что своё у каждого подключения: код, адрес, путь, ключ API, SSO-секрет, соответствие «сотрудник 1С ↔ пользователь LMS» и своя ветка в общем дереве оргструктуры, поэтому подразделения разных компаний не смешиваются.
Шаг 6. Включите автосинхронизацию
Кнопка «Синхронизировать» запускает обмен вручную для одного подключения. Чтобы кадры обновлялись сами, администратор сервера LMS настраивает регулярный вызов. Он настраивается один раз на весь портал, а не на каждую компанию: вызов синхронизирует все подключения сразу.
- Сгенерируйте секретный токен для планировщика:
openssl rand -hex 32
- Запишите его в файл
include/onec.local.phpна сервере LMS. Файл создаётся на основе шаблонаinclude/onec.local.php.example:
<?php
return [
'ONEC_CRON_TOKEN' => 'сгенерированный-токен',
];
- Добавьте в планировщик (crontab) вызов раз в час. Токен передаётся в заголовке
X-OneC-Cron-Token:
0 * * * * curl -sS -X POST -H "X-OneC-Cron-Token: <токен>" "https://<хост-LMS>/api/onec-sync-cron"
Если токен неверный или не задан, LMS ответит отказом, и синхронизация не запустится. Токен не является ключом API 1С: это отдельный секрет, известный только серверу LMS и планировщику.
Шаг 7. Настройте вход без пароля
Вход без пароля работает в обратную сторону: ссылку формирует 1С, а LMS проверяет её подпись именно по секрету того подключения, которое указано в ссылке.
- Придумайте длинный случайный SSO-секрет и укажите его в настройках нужного подключения в поле «SSO-секрет». У каждого подключения секрет свой.
- Передайте то же значение разработчику соответствующей базы 1С. Оно должно совпадать с обеих сторон.
- На стороне 1С формируйте подпись по правилу:
payload = connection + "|" + employee_id + "|" + ts
sig = HMAC-SHA256(payload, ssoSecret)
Здесь connection — код подключения из шага 5, employee_id — GUID сотрудника из ответа /employees, ts — текущее время Unix в секундах, а sig — подпись в виде hex-строки.
- Соберите ссылку:
https://<хост-LMS>/?onec=Y&connection=parnas&employee_id=guid-физлица&ts=1780000000&sig=<hex-hmac>
- Разместите ссылку там, где сотрудник открывает обучение: в форме, на рабочем столе или в задаче.
Что важно учесть:
- Код подключения обязателен и входит в подпись, поэтому подменить его на другую компанию, не сломав подпись, нельзя. При одной базе это просто единственный заведённый код.
- Ссылка действует 1 час от времени
ts. Формируйте её в момент, когда сотрудник её открывает, а не заранее. - Часы сервера 1С и сервера LMS должны быть синхронизированы.
- Сотрудник должен быть уже загружен в LMS хотя бы одной синхронизацией именно этого подключения, иначе вход не пройдёт.
Шаг 8. Задачи обучения в 1С
Отдельной настройки для задач нет. Когда сотруднику, пришедшему из 1С, назначают курс в разделе «Расписания программ», LMS вызывает POST /tasks с действием add и запоминает возвращённый task_id. Если подключений несколько, LMS сама определяет нужную базу по сотруднику: метка подключения ставится при синхронизации, и запрос уходит в ту базу, откуда сотрудник пришёл.
Что учесть при реализации метода в 1С:
- создайте в 1С задачу для сотрудника с указанным
employee_idи верните её идентификатор в полеtask_id; - сотрудник, который не приходил из 1С, в этом сценарии пропускается: назначение курса не прерывается;
- действия
completeиdeleteреализуйте в сервисе сразу, хотя LMS пока не вызывает их автоматически.
Проверка результата
- Три команды curl из шага 4 возвращают корректные ответы (для каждой базы).
- В настройках каждого подключения статус «Подключено», кнопка «Проверить» проходит.
- После «Синхронизировать» счётчик «Создано» соответствует ожидаемому числу сотрудников.
- Сотрудники и подразделения из 1С видны в LMS.
- Уволенный сотрудник (
active: false) после очередной синхронизации деактивирован. - Регулярный вызов по расписанию отрабатывает, «Последняя синхронизация» обновляется.
- Ссылка входа, сформированная в 1С, открывает личный кабинет сотрудника.
- При назначении курса в расписании программ в 1С появляется задача.
Частые проблемы
| Что происходит | Возможная причина | Что делать |
|---|---|---|
| Кнопка «Проверить» выдаёт ошибку | Неверный адрес, путь или ключ; 1С недоступна из LMS | Проверьте адрес публикации, путь /hs/lms и ключ. Выполните curl с сервера LMS |
| Ответ не в формате JSON | Публикация не подхватила расширение | Проверьте publishExtensionsByDefault="true" и обновите публикацию |
| Список сотрудников пустой | В выборке нет сотрудников или у сервисного пользователя нет прав на данные | Проверьте запрос в сервисе и права пользователя |
| Сотрудники дублируются | Поле id меняется между вызовами | Отдавайте стабильный GUID физического лица |
| Сотрудник не деактивируется | Сервис не возвращает его с active: false | Возвращайте уволенных сотрудников с признаком active: false |
| Часть сотрудников не создана | Исчерпан лимит мест тарифа: он общий на весь портал | Смотрите счётчик «Пропущено (лимит мест)» и расширьте тариф |
| Вход по ссылке не работает | Секреты различаются, не тот код подключения в ссылке или подписи, ссылка просрочена, сотрудник не синхронизирован | Сверьте SSO-секрет этого подключения, connection, время серверов и выполните синхронизацию |
| Один человек появился в LMS дважды | Он числится в двух базах 1С одновременно, и каждая база создаёт свой аккаунт | Оставьте его только в одной базе |
| Автосинхронизация не запускается | Не задан или неверен токен планировщика | Проверьте ONEC_CRON_TOKEN и заголовок X-OneC-Cron-Token |
| Синхронизация не создаёт задачи | Сотрудник не пришёл из 1С или курс назначен не через расписание программ | Проверьте, что сотрудник загружен синхронизацией, а курс назначен в «Расписаниях программ» |
Что дальше
Общая информация об интеграции