Интеграция 1С с локальным мессенджером on-premise: опыт развёртывания на мини-ПК
Продолжение статьи: DevOps для 1С на практике: как я развернул домашний сервер за 14 дней и 32 часа
Репозиторий проекта: github.com/VladimirProgrammist1C/1c-home-server
Расширение интеграции: ВЧ_ИнтеграцияСVoceChat
Введение
Продолжение статьи: DevOps для 1С на практике: как я развернул домашний сервер за 14 дней и 32 часа
Репозиторий проекта: github.com/VladimirProgrammist1C/1c-home-server
Расширение интеграции: ВЧ_ИнтеграцияСVoceChat
В предыдущей статье мы разобрали, как поднять изолированную среду для 1С на мини-ПК: PostgreSQL в Docker, мониторинг, бэкапы, безопасный доступ через Tailscale. Но техническая часть — это только фундамент. Вторая половина задачи — бизнес-логика.
Зачем это нужно? На собеседованиях 1С-разработчиков часто спрашивают: «Есть ли опыт интеграции с внешними системами через REST/SOAP? Как обрабатываете ошибки и таймауты?». Если коммерческого опыта пока нет, его можно смоделировать самостоятельно — на учебном проекте.
В этом проекте я реализовал интеграцию 1С:ЗУП 3.1 с VoceChat — мессенджером, развёрнутым on-premise (как в крупных организациях). Данные не покидают периметр, нет зависимости от облачных блокировок, полный контроль над инфраструктурой. И да, всё это работает на обычном мини-ПК (Geekom A9 Max), реализовано силами одного человека, без бюджета на лицензии.
Что вы получите: готовое решение можно адаптировать под любой локальный мессенджер и особенности вашей организации. Отработаете навыки: асинхронные очереди, HTTP-запросы, обработка ошибок, документирование.
Цель статьи — показать, как спроектировать и реализовать отказоустойчивую интеграцию «по-взрослому», но в домашних условиях. С ТЗ, архитектурными решениями, асинхронной очередью и готовым кодом.
📋 Содержание
- Бизнес-кейс: от идеи до требований
- Архитектурные решения
- Техническая реализация
- Сценарии тестирования
- Журнал уведомлений: контроль и управление
- Фоновая миграция исторических данных
- Быстрая настройка
- Результаты и метрики
- Что можно улучшить (Roadmap)
- Исходный код и документация
- Об авторе
Бизнес-кейс: от идеи до требований
🎯 Проблема
При приёме нового сотрудника кадровик проводит документ «Приём на работу» в 1С:ЗУП. Без автоматического уведомления системные администраторы узнают об этом с задержкой: в лучшем случае 30–60 минут (через почту), в худшем — несколько недель, если заявка «потеряется» в потоке писем или устных поручений. В результате новый сотрудник не получает доступы к 1С, почте, корпоративным ресурсам, что тормозит его адаптацию и создаёт простои.
📋 Целевое состояние
| Показатель | Было | Стало |
|---|---|---|
| Время от приёма до заявки IT | ~30–60 мин, до нескольких недель | < 1 мин (автоматически) |
| Ручной труд | Писать сообщение вручную | Только провести документ |
| Риск потери заявки | Высокий | Нулевой (автоматическая очередь + ретраи) |
🟡 Технические требования
- Совместимость: Не изменять типовые объекты ЗУП 3.1. Обновление конфигурации от вендора не должно ломать интеграцию.
- Безопасность: Ключи API не хранить в открытом коде. Маскировать в интерфейсе.
- Производительность: Задержка проведения документа ≤ 200 мс.
- Отказоустойчивость: При недоступности мессенджера задача не теряется, а повторяется автоматически (до 3 попыток).
Архитектурные решения
🔴 Отклонённые варианты
Изначально рассматривался вариант добавления кнопки [Отправить в чат] на форму документа «Приём на работу». Этот вариант был отвергнут:
- Кнопка на форме «Приём на работу» требует ручного действия (человеческий фактор), блокирует проведение документа синхронным HTTP-запросом, а при обновлении ЗУП типовая форма может измениться, что приведёт к ошибкам совместимости.
🟢 Принятая архитектура: Producer-Consumer
Глобальный переключатель в настройках оказался предпочтительнее реквизита формы. Он централизован, безопасен для обновлений и позволяет одним кликом отключить интеграцию на время массовой загрузки или тестов, не меняя интерфейсы документов.

Ключевые принципы:
- Асинхронность: Проведение документа не ждёт ответа сервера мессенджера. Задача просто ставится в очередь.
- Защита от дублей: Уведомление формируется только при первом проведении документа (
Источник.ЭтоНовый() И Не Источник.Проведен). - Изоляция: Вся логика инкапсулирована в расширении. Типовая конфигурация остаётся чистой.
Техническая реализация
📦 Структура расширения (фрагмент)
На скриншоте показаны только ключевые объекты метаданных. Полная структура включает также подсистемы, роли, общие команды и формы.

Основные компоненты:
| Тип объекта | Наименование | Назначение |
|---|---|---|
| Константы | 8 констант | Глобальные настройки: URL, порт, ключ API, ID канала, таймаут, макс. попытки |
| Регистр сведений | ВЧ_ОчередьУведомлений |
Асинхронная очередь задач: ИДСообщения, ТекстСообщения (ХранилищеЗначения), Статус, ПопыткиОтправки, ТекстОшибки |
| Перечисление | ВЧ_СтатусыУведомлений |
Статусы: Ожидает отправки, В обработке, Отправлено, Ошибка отправки |
| Общие модули | 2 модуля | ВЧ_ИнтеграцияСервер (HTTP-запросы), ВЧ_ОбработчикиСобытий (подписки, очередь, РЗ) |
| Регламентное задание | ВЧ_ОбработчикОчередиУведомлений |
Запуск каждые 30 секунд, обработка очереди задач |
| Подписка на событие | ВЧ_ПриПриемеНаРаботу |
Событие ПередЗаписью документа «Прием на работу» |
| Обработки | 3 обработки | Тестирование отправки, журнал уведомлений, миграция данных |
| Роли | 3 роли | ВЧ_ОсновнаяРоль, ВЧ_АдминистраторИнтеграции, ВЧ_ЧтениеИнтеграции |
🔄 Механизм повторных попыток
Логика ретраев инкапсулирована в общем модуле ВЧ_ОбработчикиСобытий. Регламентное задание вызывает процедуру Обработать(), которая:
- Читает лимит попыток из константы
ВЧ_МаксимальноеКоличествоПопыток - Выбирает задачи со статусом
Ожидает отправкичерез виртуальную таблицуСрезПоследних() - Фильтрует записи по условию
ПопыткиОтправки < МаксПопыток - Для каждой задачи извлекает текст из
ХранилищеЗначенияи отправляет черезВЧ_ИнтеграцияСервер - Обновляет статус через процедуру
ОбновитьСтатусЗадачи()
// Общий модуль ВЧ_ОбработчикиСобытий
&НаСервере
Процедура Обработать() Экспорт
МаксПопыток = ПолучитьМаксимальноеКоличествоПопыток();
ОчередьСообщений = ПолучитьОчередьСообщений(МаксПопыток);
Для Каждого ЭлементОчереди Из ОчередьСообщений Цикл
ОбработатьЭлементОчереди(ЭлементОчереди);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПолучитьМаксимальноеКоличествоПопыток()
МаксПопыток = Константы.ВЧ_МаксимальноеКоличествоПопыток.Получить();
Возврат Макс(МаксПопыток, 1);
КонецФункции
&НаСервере
Функция ПолучитьОчередьСообщений(Знач МаксПопыток)
Запрос = СоздатьЗапросОчередиСообщений();
Запрос.УстановитьПараметр("СтатусОжидает", Перечисления.ВЧ_СтатусыУведомлений.Ожидает);
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("МаксПопыток", МаксПопыток);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
&НаСервере
Функция СоздатьЗапросОчередиСообщений()
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| Очередь.ИДСообщения КАК ИДСообщения,
| Очередь.Период КАК Период,
| Очередь.ДокументОснование КАК ДокументОснование,
| Очередь.ТекстСообщения КАК ТекстСообщения,
| Очередь.IDКанала КАК IDКанала,
| Очередь.ПопыткиОтправки КАК ПопыткиОтправки
|ИЗ
| РегистрСведений.ВЧ_ОчередьУведомлений.СрезПоследних(
| &ТекущаяДата,
| Статус = &СтатусОжидает
| И ПопыткиОтправки < &МаксПопыток) КАК Очередь
|УПОРЯДОЧИТЬ ПО
| Очередь.Период ВОЗР";
Возврат Запрос;
КонецФункции
&НаСервере
Процедура ОбработатьЭлементОчереди(Знач Элемент)
Попытка
Результат = ОтправитьУведомление(Элемент);
ОбновитьСтатусЗадачи(Элемент.ИДСообщения, Элемент.Период, Результат);
Исключение
ТекстОшибки = ОписаниеОшибки();
ЗаписатьОшибкуВЖурнал("Ошибка отправки уведомления: " + ТекстОшибки, Элемент.ДокументОснование);
ОбновитьСтатусЗадачи(Элемент.ИДСообщения, Элемент.Период, СоздатьРезультатОшибки(ТекстОшибки));
КонецПопытки;
КонецПроцедуры
Ключевые особенности:
- Использование
СрезПоследних()для работы с периодическим регистром - Разделение логики на мелкие функции (принцип единственной ответственности)
- Обработка исключений с логированием в журнал регистрации
- Транзакционное обновление статуса через
НаборЗаписей
Сценарии тестирования
Для проверки работоспособности и отказоустойчивости решения были разработаны 7 тестовых сценариев. Все они успешно пройдены на тестовом контуре:
| ID | Сценарий | Ожидаемый результат |
|---|---|---|
TC-01 |
Первое проведение документа «Приём на работу» | Запись в регистре создаётся со статусом Ожидает отправки. Через ≤30 сек статус меняется на Отправлено, сообщение появляется в канале VoceChat. |
TC-02 |
Повторное проведение того же документа | Новая запись в регистре НЕ создаётся (срабатывает защита от дублей). Уведомление не дублируется. |
TC-03 |
Интеграция выключена (ВЧ_ИспользоватьИнтеграцию = Ложь) |
Документ проводится без ошибок. Запись в регистр уведомлений не создаётся. HTTP-запросы не отправляются. |
TC-04 |
Сервер VoceChat недоступен (имитация обрыва сети) | Задача остаётся в очереди. После исчерпания лимита попыток статус меняется на Ошибка отправки. Данные не теряются, возможна повторная отправка вручную. |
TC-05 |
Неверный BotAPIKey (ошибка 401 Unauthorized) | В журнале регистрации фиксируется ошибка с кодом ответа. Статус задачи меняется на Ошибка отправки. Процесс обработки очереди не прерывается. |
TC-06 |
Тестовая отправка через обработку | При нажатии Выполнить тест в канале появляется тестовое сообщение. Интерфейс обработки отображает «🟢 Успешно». |
TC-07 |
Управление через Журнал уведомлений | Кнопка Повторить отправку сбрасывает статус на Ожидает отправки. Кнопка «Перейти к документу» открывает документ. Фильтры корректно отбирают записи по статусу и периоду. |
Дополнительно: Все события интеграции логируются в журнал регистрации с именем ВЧ_Интеграция с уровнями Информация, Предупреждение и Ошибка — это упрощает диагностику при сбоях в production.
Журнал уведомлений: контроль и управление
Для визуального контроля процесса отправки реализована обработка ВЧ_ЖурналУведомлений:
- Фильтры: по периоду, статусу («Ожидает отправки»/«В обработке»/«Отправлено»/«Ошибка отправки»), документу «Приём на работу», сотруднику.
- Действия:
Повторить отправку— сбрасывает статус на «Ожидает отправки» и счётчик попыток (для администраторов).Удалить— удаляет записи из истории (с подтверждением, только администраторам).Перейти к документу— открывает документ «Приём на работу» из записи журнала.
- Безопасность: через ролевую модель — кадровик видит только свои документы, администратор имеет полный доступ (роль
ВЧ_АдминистраторИнтеграции).

Фоновая миграция исторических данных
При добавлении ресурса Сотрудник в регистр ВЧ_ОчередьУведомлений (версия расширения ≥ 2.1.0) старые записи остались с пустым значением. Чтобы не ломать фильтры и аналитику, реализована фоновая обработка ВЧ_ПерезаполнениеСотрудникаВРегистреУведомлений:
- Пакетная обработка (по 100 записей за транзакцию) — не блокирует работу пользователей.
- Прогресс и логирование в журнал регистрации (событие
ВЧ_ЗаполнениеСотрудников). - Запускается от имени администратора интеграции.
Это пример «взрослого» подхода к работе с историческими данными: миграция выполняется фоном, с контролем прогресса и возможностью отката, без влияния на основную работу системы.
Быстрая настройка
- Установить расширение
build/ВЧ_ИнтеграцияСVoceChat_v2.1.0.cfeчерез Конфигуратор. - В режиме Предприятия открыть форму
ВЧ_НастройкиИнтеграции. - Включить переключатель
ВЧ_ИспользоватьИнтеграцию(поля станут активными). - Заполнить
URL,Порт,BotAPIKeyиID канала. - Для проверки связи перейти в подсистему
Интеграция с мессенджером→Тестирование отправкии нажатьВыполнить тест.
Результаты и метрики
| Показатель | Значение | Статус |
|---|---|---|
| Время разработки (включая документацию) | ~30.5 часов | 🟢 |
| Строк кода | ~3 005 | 🟢 |
| Задержка проведения документа | +15 мс (лимит ≤ 200 мс) | 🟢 |
| Доставка при сбое сети | Задача остаётся в очереди, отправляется при восстановлении | 🟢 |
| Совместимость с обновлениями ЗУП | Расширение не меняет типовые метаданные | 🟢 |
| Журнал уведомлений | Фильтры, действия, ролевая модель | 🟢 |
| Фоновая миграция | Пакетная обработка, логирование, без блокировок | 🟢 |
Все 7 сценариев тестирования (TC-01...TC-07) прошли успешно. Ошибки корректно логируются в журнал регистрации с уровнями Информация, Предупреждение и Ошибка.
Что можно улучшить (Roadmap)
- v3.0.0: Уведомления по другим кадровым событиям:
- Кадровый перевод (смена подразделения/должности → изменение прав доступа)
- Увольнение (отзыв доступов сотрудника)
- Отпуск (временное делегирование прав другому сотруднику)
- v4.0.0: Расширение функционала журнала:
- Шаблоны сообщений для разных типов событий
- История изменений статуса с комментариями
- Экспорт статистики отправки (Excel/PDF)
- v5.0.0: Уведомления из других конфигураций:
- УТ: уведомления менеджерам по контрагентам
- БП: уведомления бухгалтерам о новых документах
- УНФ: уведомления о заказах клиентов
Исходный код и документация
Проект полностью открыт. Вы можете склонировать репозиторий, адаптировать интеграцию под любой локальный мессенджер и использовать в своих задачах.
Об авторе
Владимир Бессонов
🔗 GitHub | 📄 Лицензия: MIT
💡 Не ждите «идеального» коммерческого проекта, чтобы прокачать навыки интеграции. Домашний сервер + открытая задача + публичное репо = портфолио, которое работает на вас.
Есть вопросы по реализации? Пишите в комментариях или создавайте Issue на GitHub — с радостью помогу! 🚀
Вступайте в нашу телеграмм-группу Инфостарт