Граф Wiki

Интеграция с СОРМ3

Интеграция с системами оперативно-розыскных мероприятий (СОРМ) реализована в соответствии с Приказом Минкомсвязи России № 573 от 29.10.2018, устанавливающим требования к «техническим и программным средствам информационных систем, содержащих базы данных абонентов оператора связи».

Интеграция с СОРМ
Содержание страницы
Схема интеграции СОРМ3 с биллингом

Принцип работы

Система СмИТ Биллинг 1.6 не подключается напрямую к центрам оперативного управления ФСБ. Вместо этого используются сторонние сертифицированные решения, выступающие посредниками между биллинговой системой и органами.

Выгрузка данных реализована как Celery-задача и передаётся в базы данных СОРМ-систем по протоколу FTP в формате CSV и его модификациях:

Выгружаемые данные включают:

Интегрированные решения

С рядом поставщиков СОРМ-оборудования отлажены и протестированы интегрированные решения. Интеграция включает настроенные шаблоны выгрузки, протоколы передачи и форматы данных, соответствующие требованиям конкретного производителя.

Для настройки интеграции с конкретной СОРМ-системой обратитесь в техническую поддержку СмИТ. Специалисты помогут выбрать оптимальную схему и настроить выгрузку данных.

Ожидающие интеграции

СОРМ «Якорь» (компания НЕОС) — находится в процессе интеграции. Планируется поддержка стандартного протокола обмена данными. Для получения информации о статусе интеграции обращайтесь в техническую поддержку.

Настройка подключения

Содержание раздела

Перейдите в раздел Оборудование → Настройки СОРМ (/admin/equipment/sorm_list/) и нажмите «+ Добавить». Откроется модальное окно с формой создания новой конфигурации — без перехода на отдельную страницу.

Модальное окно «Добавить настройку СОРМ»

Форма разделена на 4 секции и содержит подсказки (серая иконка i рядом с подписью каждого поля) — наведите курсор для пояснения значения и формата.

Модальное окно «Добавить настройку СОРМ»

Tooltip-подсказка (пример для поля «Хост»):

Tooltip-подсказка у поля Хост

Секции и поля модалки

СекцияПолеОписание / подсказка из tooltip
ОсновныеНаименование *Произвольное имя конфигурации, используется в списке и в логах. Пример: «СОРМ-3 регион Волгоград» или «СОРМ резервный»
Вендор оборудования *Поставщик СОРМ-3 системы: СигналТек, НОРСИ 2020, СпецТехПитон, МФИ Софт, Элком НТ, VAS Experts. Влияет на список и формат отчётов
FTP-серверХостIP-адрес или DNS-имя FTP-сервера, куда заливаются CSV-файлы. Если пусто — выгрузка только локально, без отправки
ПортTCP-порт FTP. Стандартный — 21. Меняйте только если приёмная сторона использует нестандартный порт
ПользовательИмя FTP-аккаунта, выданное оператором СОРМ для загрузки файлов
ПарольПароль FTP-аккаунта. Хранится в БД в открытом виде, доступ к настройкам — только администратору
КаталогПуть к каталогу на FTP, куда сохраняются файлы. По умолчанию /. Указывается относительно корня FTP-аккаунта
Активный режимАктивный FTP (PORT) — соединение для данных открывает сервер. Пассивный (PASV, по умолчанию) — клиент. Включайте только если приёмная сторона требует именно PORT
Формат файловРазделительСимвол-разделитель колонок в CSV. Стандарт СОРМ-3 — точка с запятой ;. Для табуляции — \t
КодировкаUTF-8 — современный стандарт. Windows-1251 — для старых СОРМ-приёмников, не понимающих UTF
Формат датыШаблон вывода даты/времени по правилам Python strftime. По умолчанию %Y-%m-%d %H:%M:%S
Заключать в кавычкиЕсли включено — каждое значение оборачивается двойными кавычками. Включайте только если приёмник этого требует
РасписаниеЧасовой поясЗона из базы IANA (Europe/Volgograd, Europe/Moscow, Asia/Yekaterinburg и т. д.). Время выгрузки и метки в файлах считаются по этому поясу
Время выгрузкиКогда (по указанному поясу) запускается ежедневная выгрузка. Пустое поле — автозапуск отключён, доступен только ручной запуск кнопкой ▶
После сохранения модалка закроется и вы попадёте на карточку нового СОРМ-конфига (/admin/equipment/sorm_list/<id>/) — там можно создать отчёты, запустить «Первоначальную настройку» и проверить готовность данных.

Отчёты и SQL

Содержание раздела

Каждая СОРМ-запись содержит список отчётов — это именованные SQL-запросы, результат которых выгружается в CSV и отправляется на FTP.

Для каждого отчёта задаются:

SQL-запрос выполняется с правами приложения. Допускаются только SELECT-запросы к таблицам биллинга. Можно использовать JOIN, подзапросы и функции PostgreSQL.

Стандартные отчёты СОРМ-3

При нажатии кнопки «Первоначальная настройка отчётов» создаются 13 стандартных отчётов в формате, совместимом с Carbon 4:

Префикс файлаОписаниеФормат
ABONENTАбоненты (ФИО, договор, статус, тип)SORM-3: IDENT, ACTUAL_NAME, STATUS, NETWORK_TYPE
ABONENT_IDENTИдентификаторы (логин, IP, MAC)IP в hex (uf_ip2hex), маска FFFFFFFF
ABONENT_SRVУслуги абонентовID услуги, дата начала, договор
ABONENT_USERУчётные записиUSER_NUMBER, USER_NAME
ABONENT_ADDRАдреса подключенийCITY, STREET, BUILDING, APARTMENT
PAYMENTПлатежиСумма, телефон, адрес, тип
SUPPLEMENTARY_SERVICEКаталог услугMNEMONIC, скорость в описании
REGIONSРегионыID=3, ООО "СМИТ"
DOC_TYPESТипы документовИз USER_ATTRIBUTES
PAY_TYPESТипы оплатыЮKassa, Wallet One, SberPay, Касса, QIWI
IP_PLANIP-планIP в hex, маска в hex, REGION_ID=3
IP_GATEWAYIP шлюзовGATE_ID, IP hex, порт
GATEWAYШлюзы (NAS)GATE_ID, описание, тип=7
PostgreSQL-функции для СОРМ: uf_ip2hex(text) — IP в шестнадцатеричный формат, uf_mask2hex(int) — маска сети в hex, uf_date2sorm(timestamp) — дата в формате YYYY-MM-DD HH:MI:SS. Разделитель полей: ; (точка с запятой).

Расписание автоматической выгрузки

Celery Beat проверяет расписание каждые 10 минут и автоматически запускает отчёты согласно настроенной периодичности:

ЗначениеПериодичностьКогда запускается
ВручнуюТолько при ручном запуске из интерфейса
Каждые 10 минут600 секПри каждой проверке
Каждый час3600 секВ начале каждого часа (минута < 10)
Ежедневно86400 секВ 00:00 ночи
Ежемесячно1-го числа в 00:00

Каждый отчёт выполняется как отдельная Celery-задача billing.tasks.sorm_export.export_sorm_report. При ошибке задача повторяется до 2 раз с интервалом 60 секунд.

Админка: выгрузка на сервера РКН

Содержание раздела

Раздел: Оборудование → Настройки СОРМ (URL /admin/equipment/sorm_list/).

Оператор связи обязан передавать в Роскомнадзор данные об абонентах, платежах, услугах. Биллинг автоматически формирует CSV-отчёты по схеме поставщика СОРМ-3 оборудования и загружает их на FTP-сервер РКН по расписанию.

Список конфигураций

На главной странице раздела — таблица всех настроек СОРМ. В одной системе обычно одна конфигурация, но можно создать несколько (например, для разных регионов).

Список конфигураций СОРМ

Таблица показывает по каждой конфигурации:

Кнопки в строке: открыть настройки, запустить выгрузку сейчас, 🗑 удалить конфигурацию.

В шапке слева — кнопка Проверить готовность (анализирует пропуски обязательных полей у абонентов, см. 22.2). Результат проверки кешируется и виден в виде бейджа справа.

Проверка готовности данных

Перед выгрузкой полезно проверить — все ли обязательные поля заполнены у активных абонентов. Кнопка Проверить готовность запускает анализ UserAttributes и показывает список пропусков.

Модал проверки готовности данных

Например, если у юр.лиц не заполнены ИНН, КПП, ОГРН, Директор — система покажет точное число абонентов с каждым пропуском и в каком отчёте СОРМ это поле используется. Выгрузка не блокируется, но РКН может вернуть файл с замечанием.

Бейдж результата (рядом с кнопкой):

Бейдж сохраняется между сессиями — рядом показывается timestamp последней проверки.

Основные настройки

Открывается при клике на имя конфигурации. Содержит пять под-вкладок: Основные · FTP · Уведомления · Отчёты · История.

Вкладка Основные

Что задаётся:

ПолеОписание
НаименованиеПроизвольное имя конфигурации (видно в списке)
КодировкаUTF-8 (стандарт) или Windows-1251 (для legacy РКН-стендов)
РазделительОдин символ. Обычно ; для CSV, \t для TSV
Формат датыstrftime-spec. Рядом dropdown с шаблонами: ISO %Y-%m-%d %H:%M:%S, RU %d.%m.%Y %H:%M, compact %Y%m%d_%H%M%S
Часовой поясИз datalist (12 РФ часовых поясов от Калининграда до Камчатки) либо вписать вручную
Время выгрузкиЧас дня, когда Celery beat автоматически запускает выгрузку
Оборачивать значения в кавычкиВключить если в данных могут быть запятые/кавычки/переводы строк (защита от ошибок парсера РКН)
Вендор СОРМРадио-выбор из 6 поставщиков. Смена vendor требует подтверждения и сброса схемы отчётов

Кнопки внизу:

В шапке справа — кнопка ▶ Выгрузить сейчас запускает ручную выгрузку всех отчётов на FTP (см. 22.7).

Подключение к FTP-серверу РКН

Параметры доступа предоставляет поставщик СОРМ-оборудования. Запросите у их техподдержки: хост, пользователь, пароль, путь.

Вкладка FTP

Кнопка Проверить FTP запускает диагностику: открывает TCP-соединение, авторизуется, делает CWD по каждой части пути, листинг файлов. Результат показывает в модалке с этапами проверки и временем каждого шага в миллисекундах. При ошибке выводится тип исключения и сообщение FTP-сервера — можно скопировать диагностический JSON и отдать саппорту.

Уведомления в Telegram

После каждой выгрузки можно отправлять отчёт в Telegram-чат — удобно для оперативного контроля что СОРМ доходит до РКН.

Вкладка Уведомления Telegram

Кнопка Тест отправки отправляет тестовое сообщение в указанный чат — позволяет убедиться что бот добавлен и Chat ID/Thread ID верные.

Бот для отправки берётся из общих настроек: Настройки → Интеграции → Telegram. Прокси для api.telegram.org тоже наследуется оттуда.

Список отчётов

Стандартный набор — 14 отчётов СОРМ-3: ABONENT, ABONENT_IDENT, ABONENT_SRV, ABONENT_USER, ABONENT_ADDR, PAYMENT, SUPPLEMENTARY_SERVICE, REGIONS, DOC_TYPE, PAY_TYPE и другие. У каждого свой SQL-запрос и префикс имени файла.

Вкладка Отчёты

В каждой строке:

Кнопка Управление отчётами в правом верхнем углу — переход на список всех отчётов с возможностью добавить/удалить/восстановить.

Ручной запуск выгрузки

Кнопка ▶ Выгрузить сейчас в шапке detail-страницы запускает выгрузку всех отчётов конфигурации немедленно (минуя расписание).

Шапка карточки СОРМ с кнопкой «Выгрузить сейчас»

Что происходит:

  1. Создаётся запись в SormExportLog со статусом running
  2. Запись добавляется в журнал аудита (кто запустил)
  3. Celery-задача проходит по всем активным отчётам, выполняет SQL, формирует CSV, загружает на FTP
  4. По мере прогресса обновляется files_ok, total_rows, total_bytes
  5. В конце статус меняется на success / partial / failed
  6. Если включены Telegram-уведомления — отправляется сообщение с итогами

UI после запуска переключает на вкладку История и поллит endpoint каждые 5 секунд пока есть активная (running) выгрузка.

Внимание: выгрузка нагружает БД (большие SQL-запросы по всем абонентам) и FTP. Запускать вручную лучше в нерабочие часы или в диагностических целях — обычно достаточно ежедневной автоматической.

История выгрузок

Журнал последних 50 запусков — для compliance-аудита и быстрой диагностики «что выгружали и доходили ли файлы до РКН».

Вкладка История выгрузок

Колонки:

КолонкаЧто показывает
ДатаВремя начала выгрузки (по timezone сервера)
ТриггерРасписание / Вручную / API — кто или что запустил
Длит.Время выполнения (секунды или минуты)
ФайловСколько отчётов из общего числа выгружено успешно
СтрокСуммарно строк во всех файлах
РазмерСуммарный размер файлов (Б / КБ / МБ)
FTP✓ если файлы реально загружены на FTP-сервер РКН
TG✓ если Telegram-уведомление было отправлено
СтатусЦветовая иконка: ✓ Успех / ⚠ Частично / ✗ Провал / 🌀 Идёт
Ктоusername оператора (для ручных запусков)

Если в выгрузке были ошибки — под строкой раскрывается их текст (топ-20).

Кнопка ↻ в правом верхнем углу — обновить список вручную. Если в журнале есть выгрузка со статусом «Идёт» — список обновляется автоматически каждые 5 секунд.

Автоматическое расписание

Celery beat-задача run_scheduled_sorm_exports запускается каждые 10 минут и проверяет какие отчёты пора выгрузить:

Поле «Время выгрузки» на вкладке «Основные» влияет на удобство — обычно ставят утренние часы (например 09:00) чтобы при проблеме оператор увидел в начале рабочего дня.

Структуры данных

ТаблицаНазначение
sormКонфигурация (имя, vendor, FTP, разделитель, формат даты, часовой пояс)
sorm_reportОтчёт (имя, периодичность, SQL-запрос, префикс файла, расширение)
sorm_readiness_checkКеш проверки готовности (timestamp, has_problems, meta_issues_count, data_issues_count, summary_json)
sorm_export_logЖурнал выгрузок (started_at/finished_at, trigger, status, files_total/files_ok, total_rows/total_bytes, ftp_uploaded, telegram_sent, error_msg, started_by)

Таблицы sorm_readiness_check и sorm_export_log созданы миграцией 0099_sorm_readiness_export_log.

URL-эндпоинты

URLНазначение
GET /admin/equipment/sorm_list/Список конфигураций
GET /admin/equipment/sorm_list/<id>/Detail с под-вкладками
GET /admin/equipment/sorm_list/validate/Проверка готовности данных
POST /admin/equipment/sorm_list/<id>/run-now/Ручной запуск всех отчётов
GET /admin/equipment/sorm_list/<id>/export-log/?limit=NИстория выгрузок (JSON)
POST /admin/equipment/sorm_list/<id>/reports/<rid>/set-period/Изменить периодичность отдельного отчёта
POST /admin/equipment/sorm_list/<id>/reports/<rid>/ajax/run/Запустить один отчёт
POST /admin/settings/sorm/test_ftp/Проверка FTP-подключения
POST /admin/settings/sorm/save_tg/Сохранить настройки Telegram
POST /admin/settings/sorm/test_tg/Тестовое сообщение в Telegram

Команды управления

Из контейнера web (docker exec app-web-1 python manage.py ...):

Управление отчётами

Содержание раздела

Страница отчётов: /admin/equipment/sorm_list/1/reports/. Все операции выполняются через модальные окна без перехода на другие страницы.

Таблица показывает: название, описание содержимого, имя файла, периодичность. На мобильных устройствах дополнительные колонки компактно отображаются под названием.

Действия

Если FTP-хост не задан, при выборе «FTP» будет выведено сообщение об ошибке. Убедитесь что параметры FTP заполнены в настройках СОРМ-записи.

СОРМ-метаданные UserAttributes

Содержание раздела

SQL отчётов СОРМ генерируется автоматически через сервис billing.services.sorm_sql.SormReportBuilder, который читает метаданные прямо из записей UserAttributes. Это позволяет переименовывать атрибуты в /admin/dictionary/UserAttributes/ без поломки выгрузки — отчёт всегда обращается к актуальным записям через ID, а не по захардкоженным именам.

ПолеТипНазначение
is_sormBOOLEANАтрибут участвует в СОРМ-отчётности
sorm_field_codeVARCHAR(64)Техническое имя колонки в SQL/CSV: inn, kpp, legal_address, director, passport_issued_by...
sorm_report_typesVARCHAR(255)CSV-список типов отчётов: ABONENT,ABONENT_LEGAL,ABONENT_IDENT,ABONENT_USER,ABONENT_ADDR
sorm_requiredBOOLEANОбязательное поле — pre-flight предупредит о пропусках значений
sorm_alt_namesVARCHAR(512)Альтернативные имена через ; для исторических дублей графем (например р/с;р/c)

Builder выбирает все UserAttributes где is_sorm=True, sorm_field_code != '' и тип отчёта присутствует в sorm_report_types, упорядочивает по order_no и собирает SELECT-подзапросы. Для атрибутов с sorm_alt_names используется WHERE NAME IN (...) — это покрывает обе графемы одновременно (например на одной БД хранятся записи и с кириллической «р/с», и с латинской «р/c»).

Защита от случайного переименования: UI /admin/dictionary/UserAttributes/ показывает красный щит для СОРМ-атрибутов и блокирует переименование без явного подтверждения. Запрос изменения имени возвращает HTTP 400 с флагом sorm_rename_blocked: true; UI просит подтвердить через диалог с предупреждением. Поле sorm_field_code валидируется регэкспом ^[a-z][a-z0-9_]*$.

Управление метаданными в UI

Открыть атрибут в модалке /admin/dictionary/UserAttributes/ и включить чекбокс «Участвует в СОРМ-отчётах» — появится секция «СОРМ-метаданные» с 4 полями:

В таблице атрибутов цветовая индикация:

Текущая карта метаданных

Миграции 0097_user_attributes_sorm_meta и 0098_sorm_meta_extra_legacy заполняют метаданные для 23 атрибутов из коробки:

field_codeАтрибутОтчётыRequiredAlt names
innИННABONENT, ABONENT_LEGALда
kppКППABONENT_LEGALда
ogrnОГРНABONENT, ABONENT_LEGALда
legal_addressЮридический адресABONENT_LEGAL
physical_addressФизический адресABONENT_LEGAL
postal_addressПочтовый адресABONENT_LEGAL
bank_accountр/с (или р/c)ABONENT_LEGALр/с;р/c
bank_nameБанкABONENT_LEGAL
bikБИКABONENT_LEGAL
corr_accountк/с (или к/c)ABONENT_LEGALк/с;к/c
legal_personВ лицеABONENT_LEGAL
directorДиректорABONENT_LEGALда
passport_series_numberПаспорт серия-номерABONENT, ABONENT_IDENTда
passport_issue_dateПаспорт дата выдачиABONENT_IDENT
passport_issued_byПаспорт кем выданABONENT_IDENT
passport_issued_by_dateКогда выданABONENT_IDENT
passport_registrationПаспорт регистрацияABONENT_IDENT, ABONENT_USER
reg_addressАдрес регистрацииABONENT, ABONENT_USER
birth_dateДата рожденияABONENT, ABONENT_IDENTда
birth_placeМесто рожденияABONENT_IDENT
passport_series_legacyПаспорт серия (legacy)ABONENT_IDENT
passport_number_legacyПаспорт № (legacy)ABONENT_IDENT
passport_issue_date_legacyПаспорт когда выдан (legacy)ABONENT_IDENT
Legacy-поля: миграция 0098 пометила 5 устаревших атрибутов (id 13-17 на testbill — «Паспорт №», «Паспорт серия», «Паспорт регистрация», «Паспорт кем выдан», «Паспорт когда выдан») для совместимости. Главное — поле «Паспорт кем выдан» (3417 заполненных значений на проде), его отсутствие означало бы потерю данных для РКН.

Pre-flight валидация перед выгрузкой

Содержание раздела

На странице /admin/equipment/sorm_list/ добавлена кнопка «Проверить готовность». Она вызывает endpoint GET /admin/equipment/sorm_list/validate/ и показывает в модалке две группы проблем:

Проблемы метаданных (meta_issues)

Пропуски обязательных полей (data_issues)

Для каждого sorm_required=True атрибута проверяется сколько активных абонентов без заполненного значения. Юр-поля (ABONENT_LEGAL) проверяются только у юр.лиц (company=True); физ-поля (passport_series_number, birth_date) — только у физических лиц.

Пример вывода на проде testbill:

report_typefield_codeattribute_namemissing
ABONENT_LEGALdirectorДиректор280
ABONENT_LEGALinnИНН241
ABONENT_LEGALkppКПП280
ABONENT_LEGALogrnОГРН242
Pre-flight не блокирует выгрузку — это информационный сигнал. Оператор сам решает: дозаполнить пропуски в карточках абонентов или запустить выгрузку как есть. РКН может вернуть файл с замечанием, поэтому удобнее закрыть критичные пробелы заранее.

Бейдж готовности на странице

В верхней панели страницы /admin/equipment/sorm_list/ появился сводный бейдж готовности — показывает результат последней проверки и время:

Pre-flight в Celery-задаче выгрузки

Pre-flight также интегрирован в billing.tasks.sorm_export.run_report_export: перед запуском выгрузки в логах появляется warning:

EXPORT pre-flight: report=33 meta-issues=0
EXPORT pre-flight: report=33 missing-values=1043 in 4 fields

Сообщение в результате задачи также обогащается строкой pre-flight: пропуски в 4 полях (1043 абонентов) — оператор увидит её в UI запуска отчёта.

Дубликаты атрибутов и команда merge

На некоторых базах (миграция из EBS / Carbon 4) могут быть два атрибута с одинаковым именем — например «Директор» с id=10 и id=-219000. Без дедупликации builder выбирает значение через LIMIT 1 непредсказуемо — для одного абонента может выгрузиться значение из дубля, для другого — из канонической записи.

Команда manage.py merge_sorm_attribute_dups группирует атрибуты по sorm_field_code, выбирает каноническую запись (наименьший положительный pk) и переносит все AttributeValues с дублей через UPDATE attribute_id=...:

# Dry-run — только показать что будет сделано:
python manage.py merge_sorm_attribute_dups

# Применить (ОБЯЗАТЕЛЬНО pg_dump перед!):
python manage.py merge_sorm_attribute_dups --apply

# Только одна группа:
python manage.py merge_sorm_attribute_dups --field-code director --apply

# Группировка по name (для legacy без field_code):
python manage.py merge_sorm_attribute_dups --by-name --apply

Пример вывода (testbill):

Найдено 1 групп дубликатов:

  Группа «director» (2 записей):
    id= -219000  name='Директор'  values=97
    id=      10  name='Директор'  values=96  ←canonical
    → перенесено 97 AttributeValues, удалено 1 дублей

Готово: удалено 1 дубликатов, перенесено 97 значений на canonical-записи.

REST API проверки готовности

Endpoint GET /admin/equipment/sorm_list/validate/ возвращает JSON со структурой:

{
  "ok": true,
  "has_problems": true,
  "meta_issues": [
    {
      "kind": "missing_field_code",
      "attribute_id": 13,
      "attribute_name": "Паспорт №",
      "message": "СОРМ-атрибут без sorm_field_code"
    }
  ],
  "data_issues": [
    {
      "report_type": "ABONENT_LEGAL",
      "field_code": "inn",
      "attribute_name": "ИНН",
      "attribute_id": 4,
      "missing": 241
    }
  ]
}

Аутентификация: стандартная сессионная (Django @login_required). Доступен любому залогиненному пользователю; выдаёт информацию которая не зависит от прав абонент-папок.

Это удобный endpoint для интеграций — например, мониторинг (Zabbix / Grafana) может опрашивать его через cron и алёртить когда has_problems == true или когда data_issues содержит обязательные поля с большим числом пропусков.

Схемы настройки