Реестр Рособрнадзора не принимает ни JSON, ни XML, ни один HTTP-запрос от вашей учётной системы. Разбираем, что там на самом деле за протокол, и какую часть работы 1С всё-таки закрывает полностью.
Аннотация
Статья разбирает техническую сторону взаимодействия с ФИС ФРДО: какие каналы передачи существуют фактически, почему программного интерфейса нет ни для записи, ни для чтения, и где проходит граница автоматизации со стороны 1С.
Источники: руководство оператора подсистемы ДПО, инструкция по заполнению шаблона ПО в редакции от 21.07.2025, FAQ ЦИТиС, раздел госфункции на сайте Рособрнадзора. Все ссылки в конце.
Вынесено за рамки: организационная часть подключения (получение ключей ViPNet, привязка организации к ЕСИА), нормативные основания обязанности подавать сведения, отраслевые особенности школ и вузов. Примеры кода даны на подсистеме ДПО и ПО, для СПО и ВО меняется только состав колонок.
Отдельно предупреждаю: если вы пришли за строчкой HTTPСоединение к серверу Рособрнадзора, её не будет. Такого сервера нет.
Сокращения
| Сокращение | Расшифровка | Роль в статье |
|---|---|---|
| ФИС ФРДО | Федеральная информационная система «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» | Приёмник данных |
| ДПО | Дополнительное профессиональное образование | Подсистема ФРДО, основной пример |
| ПО | Профессиональное обучение | Подсистема ФРДО, второй пример |
| СПО / ВО | Среднее профессиональное / высшее образование | Подсистемы с другим составом колонок |
| ЦИТиС | Центр информационных технологий и систем органов исполнительной власти | Оператор ФИС ФРДО, техподдержка |
| ЕСИА | Единая система идентификации и аутентификации | Авторизация на портале open-dpo |
| УКЭП | Усиленная квалифицированная электронная подпись | Подпись пакета |
| CMS / PKCS#7 | Cryptographic Message Syntax | Контейнер подписи, attached |
| DER | Distinguished Encoding Rules | Бинарная кодировка контейнера |
| ОКСМ | Общероссийский классификатор стран мира | Справочник гражданства, колонка W |
| ViPNet | Продуктовая линейка ИнфоТеКС | Защищённый транспорт, сеть 3608 |
| СМЭВ | Система межведомственного электронного взаимодействия | Канал, недоступный коммерческой организации |
| БСП | Библиотека стандартных подсистем | Длительные операции, регламентные задания |
| ТЧ | Табличная часть | Хранение строк пакета |
| RPA | Robotic Process Automation | Автоматизация через эмуляцию браузера |
1. Что такое ФРДО с точки зрения протокола

Начнём с развенчания. У ФИС ФРДО нет REST, нет SOAP, нет очереди, нет эндпоинта, который принимает тело запроса. Ни для отправки сведений, ни для их получения. Это подтверждают и руководство оператора, и FAQ ЦИТиС, и практика всех LMS-вендоров, которые интегрировались с реестром: их «интеграция с ФИС ФРДО» заканчивается генерацией файла.
Фактических каналов три.
Канал первый: портал. Организации ДПО и ПО работают через open-dpo.obrnadzor.gov.ru, остальные подсистемы через frdocabinet.obrnadzor.gov.ru. Вход по учётной записи ЕСИА, привязанной к организации. Загружается один файл. Формат файла жёстко фиксирован, и это .xlsx.
Канал второй: ViPNet. Схема с ViPNet Client на рабочем месте, схема со своей сетью ViPNet, схема через ViPNet Coordinator. Ключи выдаёт ЦИТиС, сеть 3608. Здесь важно понимать: ViPNet это защищённый транспорт до АРМ, а не интерфейс. Внутри туннеля едет тот же самый xlsx.
Канал третий: публичная проверка документа. Форма на сайте Рособрнадзора с капчей. Публичного API проверки нет. Все коммерческие «API проверки диплома» на рынке это либо парсеры формы, либо посредники с ручным доступом. Юридически это серая зона, технически хрупкая конструкция, которая ломается при смене вёрстки или капчи.
Про СМЭВ спрашивают чаще всего. Подтверждённого вида сведений от ФРДО, доступного коммерческой организации, я не нашёл. Если такой ВС существует, он предназначен федеральным и региональным органам власти. Утверждение требует проверки: смотреть надо в реестре видов сведений СМЭВ через своего оператора взаимодействия, по названию поставщика «Рособрнадзор».
Практический вывод для продуктовой стратегии: продавать «онлайн-обмен 1С с ФРДО» нельзя, потому что обменивать не с чем. Продавать можно подготовку и валидацию пакета, и это как раз та часть, где сгорает рабочее время.
2. Реальный жизненный цикл пакета

данные в 1С
-> генерация Шаблон.xlsx по форме подсистемы
-> валидация (то, что реестр проверит на своей стороне)
-> подпись УКЭП: attached PKCS#7, ГОСТ Р 34.10-2012, DER
-> шифрование на открытом ключе сертификата сервера ФРДО
-> Шаблон.xlsx.sig.enc
-> ручная загрузка через веб-форму либо ViPNet
-> ожидание обработки
-> получение зашифрованного файла ошибок
-> расшифровка файла ошибок локально
-> разбор и повторная подача исправленных строк
Из этой цепочки 1С полностью закрывает всё, кроме шага загрузки и шага ожидания. Это примерно 80 процентов трудозатрат, потому что цикл «загрузил, получил ошибки, поправил, перезалил» повторяется по три-четыре раза на пакет, если данные не выверены заранее.
Отдельно про сроки. Постановление Правительства РФ от 07.06.2025 № 850 с 1 сентября 2025 сократило срок внесения сведений по программам высшего и дополнительного профессионального образования с 60 до 30 календарных дней. Тридцать дней это уже не «когда-нибудь до конца квартала». Три неудачных цикла подачи по неделе каждый съедают срок целиком, и организация уходит в нарушение. Именно поэтому валидация до отправки перестала быть удобством и стала обязательной частью процесса.
3. Структура шаблона: что проверяет реестр
Возьмём шаблон подсистемы ПО в редакции инструкции от 21.07.2025 как наиболее показательный. Требования к файлу:
- имя файла Шаблон.xlsx;
- ровно один лист, имя листа Шаблон;
- формат даты в ячейке дд.мм.гггг;
- порядок колонок менять нельзя, вставлять свои колонки нельзя.
Состав колонок и правила проверки:
| Кол. | Поле | Тип | Ключевые ограничения |
|---|---|---|---|
| A | Вид документа | справочник | значение строго из классификатора |
| B | Статус документа | справочник | «Оригинал» либо «Дубликат» |
| C | Подтверждение утраты | справочник | |
| D | Подтверждение обмена | справочник | |
| E | Подтверждение уничтожения | справочник | «Да» либо «Нет» |
| F | Серия документа | текст, 20 | «Нет» при отсутствии серии; необязательна для справок |
| G | Номер документа | текст, 40 | необязателен для справок об обучении |
| H | Дата выдачи | дата | дд.мм.гггг |
| I | Регистрационный номер | текст, 30 | допускаются скобки и подчёркивание |
| J | Программа обучения | справочник | пусто для предпрофессиональных программ в области искусств |
| K | Наименование программы | текст, 255 | допускаются кавычки, амперсанд, решётка |
| L | Профессия, должность | справочник | пусто для программ в области искусств |
| M | Квалификационный разряд | справочник | допускается «Нет» |
| N | Год начала обучения | число, 4 | не ранее 1978 для оригинала, 1955 для дубликата |
| O | Год окончания обучения | число, 4 | не меньше года начала, не больше текущего |
| P | Срок обучения, часов | число | не менее 6 |
| Q, R, S | Фамилия, Имя, Отчество | текст, 50 | кириллица, дефис, точка; «Нет» вместо пустого отчества |
| T | Дата рождения | дата | дд.мм.гггг |
| U | Пол | справочник | «Муж» либо «Жен» |
| V | СНИЛС | текст, 14 | формат ххх-ххх-ххх хх, проверка контрольной суммы |
| W | Гражданство | ОКСМ | «643» либо «000» |
| X | Форма обучения | справочник | очная, очно-заочная, заочная |
| Y | Источник финансирования | справочник | |
| Z | Форма получения образования | справочник | в организации либо вне организации |
| AA–AH | Реквизиты оригинала | смешанный | заполняются только при статусе «Дубликат» |
| AI | Номер документа для изменения | служебное | зелёное поле, при подаче всегда пустое |
Колонки V, W, X, Y, Z обязательны только для документов, выданных с 2021 года. СНИЛС при этом обязателен для документов 2021 года и позже с гражданством 643.
Три ловушки, которые дают больше всего отказов.
Ловушка «ё». Фамилия «Артёмов» в паспорте и «Артемов» в базе это две разные строки. Реестр не нормализует. Решение принимает организация, но принимать его надо один раз и на уровне кода, а не на уровне «как оператор напечатал».
Ловушка ведущего нуля. Номер документа 007 в Excel превращается в 7, если ячейка числовая. Дальше документ в реестре не найдётся никогда. Отсюда правило: все идентификаторы пишем текстом, тип ячейки принудительно текстовый.
Ловушка двойного пробела. Ограничение «не более двух подряд» в ФИО и запрет пробелов по краям означают, что данные, введённые оператором вручную, надо чистить программно. Оператор не увидит хвостовой пробел никогда.
Отдельно про зелёную колонку AI. Инструкции обеих подсистем говорят одно и то же: оставлять пустой. Механизм корректировки ранее поданной записи через шаблон в открытой документации не описан. Практика: корректировка идёт через личный кабинет либо через обращение в техподдержку ЦИТиС. Утверждение требует проверки на конкретной подсистеме, способ проверки: подать заведомо ошибочную запись на тестовом документе и запросить процедуру исправления у оператора.
4. Модель данных в 1С
Архитектура минимальная и от этого живучая.
Документ «ПакетФРДО» с реквизитами: Организация, Подсистема (перечисление: ДПО, ПО, СПО, ВО, Школа), ДатаФормирования, СостояниеПакета (Черновик, Проверен, Подписан, Отправлен, ОбработанСОшибками, Принят). Табличная часть «Строки» с колонками ровно по шаблону подсистемы, плюс служебные СсылкаНаИсточник (документ выдачи удостоверения в вашей конфигурации), ТекстОшибки, ОшибкаКритична.
Регистр сведений «ОтправкиФРДО» независимый, измерения: Организация, Подсистема, ИдентификаторДокумента (серия плюс номер плюс дата). Ресурсы: Пакет, ДатаПринятия, ХешСтроки. Регистр нужен ровно для одного: не подать один документ дважды. Повторная подача той же записи это не ошибка загрузки, это дубль в реестре, и убирать его придётся через техподдержку.
Общий модуль «ФРДОВалидация» серверный, повторное использование не используем. Общий модуль «ФРДОПодписьШифрование» серверный, вызывает внешнюю утилиту.
Строки пакета не храним в неструктурированном виде и не собираем xlsx «на лету» из запроса. Пакет это документ с состоянием, потому что цикл подачи растянут во времени, и через две недели надо понимать, что именно уехало и с какой ошибкой вернулось.
5. Валидация до отправки
Это ядро ценности. Реестр проверяет данные жёстко и сообщает об ошибках не всегда внятно. Каждую его проверку, которую можно воспроизвести локально, надо воспроизвести локально.
5.1 Контрольная сумма СНИЛС
Алгоритм стабилен и описан в открытых источниках ПФР: сумма цифр номера, умноженных на убывающие позиции с 9 до 1, дальше остаток по модулю 101 с двумя частными случаями. Проверка не применяется к номерам не старше 001-001-998.
// Проверяет СНИЛС по контрольной сумме. Возвращает пустую строку,
// если корректен, иначе текст ошибки для колонки V шаблона ФРДО.
Функция ОшибкаСНИЛС(Знач СНИЛС) Экспорт
Цифры = "";
Для Позиция = 1 По СтрДлина(СНИЛС) Цикл
Символ = Сред(СНИЛС, Позиция, 1);
Если СтрНайти("0123456789", Символ) > 0 Тогда
Цифры = Цифры + Символ;
КонецЕсли;
КонецЦикла;
Если СтрДлина(Цифры) <> 11 Тогда
Возврат "СНИЛС должен содержать 11 цифр, получено " + СтрДлина(Цифры);
КонецЕсли;
Номер = Лев(Цифры, 9);
// Номера до 001-001-998 включительно контрольной суммы не имеют.
Если Число(Номер) <= 1001998 Тогда
Возврат "";
КонецЕсли;
Сумма = 0;
Для Позиция = 1 По 9 Цикл
Сумма = Сумма + Число(Сред(Номер, Позиция, 1)) * (10 - Позиция);
КонецЦикла;
Если Сумма < 100 Тогда
Контрольное = Сумма;
ИначеЕсли Сумма = 100 Или Сумма = 101 Тогда
Контрольное = 0;
Иначе
Контрольное = Сумма % 101;
Если Контрольное = 100 Тогда
Контрольное = 0;
КонецЕсли;
КонецЕсли;
Если Контрольное <> Число(Прав(Цифры, 2)) Тогда
Возврат "СНИЛС не проходит проверку контрольной суммы";
КонецЕсли;
Возврат "";
КонецФункции
Обратите внимание на два частных случая суммы. Их регулярно теряют в самописных проверках, и тогда легитимный СНИЛС отбраковывается на стороне 1С, а оператор идёт править корректные данные. Второй исход хуже первого: пакет уходит с испорченным номером.
5.2 Форматирование СНИЛС под шаблон
Реестр ждёт ххх-ххх-ххх хх, ровно 14 символов, с дефисами и одним пробелом перед контрольным разрядом.
Функция СНИЛСВФорматеШаблона(Знач СНИЛС) Экспорт
Цифры = СтрСоединить(СтрРазделить(СНИЛС, "- ", Ложь), "");
Если СтрДлина(Цифры) <> 11 Тогда
Возврат "";
КонецЕсли;
Возврат Сред(Цифры, 1, 3) + "-" + Сред(Цифры, 4, 3) + "-"
+ Сред(Цифры, 7, 3) + " " + Сред(Цифры, 10, 2);
КонецФункции
5.3 Нормализация ФИО
Три правила из инструкции: только кириллица, дефис и точка; без пробелов и дефисов по краям; не более двух одинаковых разделителей подряд. Плюс решение по букве «ё», которое принимается один раз.
// ЗаменятьЁ = Истина приводит "ё" к "е". Решение фиксируется
// в учётной политике организации. Менять его в середине года нельзя:
// разъедутся ранее поданные записи.
Функция НормализованноеФИО(Знач Значение, Знач ЗаменятьЁ = Ложь) Экспорт
Результат = СокрЛП(Значение);
Пока СтрНайти(Результат, " ") > 0 Цикл
Результат = СтрЗаменить(Результат, " ", " ");
КонецЦикла;
Пока СтрНайти(Результат, "--") > 0 Цикл
Результат = СтрЗаменить(Результат, "--", "-");
КонецЦикла;
Результат = СтрЗаменить(Результат, Символы.НПП, " ");
Результат = СокрЛП(Результат);
Если ЗаменятьЁ Тогда
Результат = СтрЗаменить(Результат, "ё", "е");
Результат = СтрЗаменить(Результат, "Ё", "Е");
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ОшибкаСоставаФИО(Знач Значение) Экспорт
Если ПустаяСтрока(Значение) Тогда
Возврат "Поле не заполнено, при отсутствии отчества укажите ""Нет""";
КонецЕсли;
Если СтрДлина(Значение) > 50 Тогда
Возврат "Превышена длина 50 символов";
КонецЕсли;
Допустимые = "абвгдежзийклмнопрстуфхцчшщъыьэюяё-. ";
ЗначениеНРег = НРег(Значение);
Для Позиция = 1 По СтрДлина(ЗначениеНРег) Цикл
Символ = Сред(ЗначениеНРег, Позиция, 1);
Если СтрНайти(Допустимые, Символ) = 0 Тогда
Возврат "Недопустимый символ """ + Символ
+ """ в позиции " + Позиция;
КонецЕсли;
КонецЦикла;
Возврат "";
КонецФункции
Латинская c вместо кириллической с в фамилии это классика импортированных из Excel данных. Посимвольная проверка ловит её мгновенно, глазами оператор не найдёт никогда.
5.4 Кросс-полевые правила
Отдельная функция на строку целиком, потому что половина ограничений связывает поля между собой.
// СтрокаПакета - строка ТЧ документа ПакетФРДО.
// Возвращает массив строк с описанием ошибок.
// Пустой массив означает готовность к отправке.
Функция ОшибкиСтрокиПакета(СтрокаПакета) Экспорт
Ошибки = Новый Массив;
ТекущийГод = Год(ТекущаяДатаСеанса());
Если СтрокаПакета.ГодНачала < 1978
И СтрокаПакета.СтатусДокумента = "Оригинал" Тогда
Ошибки.Добавить("Год начала обучения раньше 1978 для оригинала");
КонецЕсли;
Если СтрокаПакета.ГодОкончания < СтрокаПакета.ГодНачала Тогда
Ошибки.Добавить("Год окончания раньше года начала");
КонецЕсли;
Если СтрокаПакета.ГодОкончания > ТекущийГод Тогда
Ошибки.Добавить("Год окончания в будущем");
КонецЕсли;
Если СтрокаПакета.СрокОбученияЧасов < 6 Тогда
Ошибки.Добавить("Срок обучения меньше 6 часов");
КонецЕсли;
// Блок полей, обязательный для документов, выданных с 2021 года.
Если Год(СтрокаПакета.ДатаВыдачи) >= 2021 Тогда
Если ПустаяСтрока(СтрокаПакета.Гражданство) Тогда
Ошибки.Добавить("Не заполнено гражданство (ОКСМ)");
КонецЕсли;
Если СтрокаПакета.Гражданство = "643" Тогда
ОшибкаНомера = ФРДОВалидация.ОшибкаСНИЛС(СтрокаПакета.СНИЛС);
Если Не ПустаяСтрока(ОшибкаНомера) Тогда
Ошибки.Добавить(ОшибкаНомера);
КонецЕсли;
КонецЕсли;
Если ПустаяСтрока(СтрокаПакета.ФормаОбучения) Тогда
Ошибки.Добавить("Не заполнена форма обучения");
КонецЕсли;
Если ПустаяСтрока(СтрокаПакета.ИсточникФинансирования) Тогда
Ошибки.Добавить("Не заполнен источник финансирования");
КонецЕсли;
КонецЕсли;
// Реквизиты оригинала обязательны только у дубликата
// и запрещены у оригинала.
Если СтрокаПакета.СтатусДокумента = "Дубликат" Тогда
Если ПустаяСтрока(СтрокаПакета.НомерОригинала) Тогда
Ошибки.Добавить("Для дубликата не заполнен номер оригинала");
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрокаПакета.ДатаВыдачиОригинала) Тогда
Ошибки.Добавить("Для дубликата нет даты выдачи оригинала");
КонецЕсли;
Иначе
Если Не ПустаяСтрока(СтрокаПакета.НомерОригинала) Тогда
Ошибки.Добавить("Реквизиты оригинала заполнены"
+ " у документа со статусом ""Оригинал""");
КонецЕсли;
КонецЕсли;
Возврат Ошибки;
КонецФункции
5.5 Защита от повторной подачи
Функция ДокументУжеОтправлен(Организация, Подсистема, СтрокаПакета) Экспорт
Идентификатор = ВРег(СокрЛП(СтрокаПакета.СерияДокумента)) + "|"
+ ВРег(СокрЛП(СтрокаПакета.НомерДокумента)) + "|"
+ Формат(СтрокаПакета.ДатаВыдачи, "ДФ=yyyyMMdd");
Отбор = Новый Структура("Организация, Подсистема, ИдентификаторДокумента",
Организация, Подсистема, Идентификатор);
Запись = РегистрыСведений.ОтправкиФРДО.Получить(Отбор);
Возврат Запись.Пакет <> Неопределено;
КонецФункции
Идентификатор строится по тройке серия, номер, дата выдачи, потому что именно она уникально задаёт документ. По ФИО сводить нельзя: однофамильцы с одинаковой датой рождения встречаются чаще, чем кажется.
6. Сборка файла xlsx
Здесь три пути, и выбор не очевиден.
Путь первый: ТабличныйДокумент. Платформа умеет писать xlsx штатно.
Функция СформироватьФайлШаблона(ПакетСсылка, ПутьКФайлу) Экспорт
Макет = Документы.ПакетФРДО.ПолучитьМакет("ШаблонДПО");
Табличный = Новый ТабличныйДокумент;
Табличный.Вывести(Макет.ПолучитьОбласть("Заголовок"));
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаПакета Из ПакетСсылка.Строки Цикл
ЗаполнитьЗначенияСвойств(ОбластьСтроки.Параметры, СтрокаПакета);
// Даты и номера выводим строкой, чтобы Excel не превратил их в число.
ОбластьСтроки.Параметры.ДатаВыдачи =
Формат(СтрокаПакета.ДатаВыдачи, "ДФ=dd.MM.yyyy");
ОбластьСтроки.Параметры.НомерДокумента =
СокрЛП(СтрокаПакета.НомерДокумента);
Табличный.Вывести(ОбластьСтроки);
КонецЦикла;
Табличный.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Возврат ПутьКФайлу;
КонецФункции
Тонкий момент, который стоит проверить на своей платформе перед внедрением: имя листа в получившемся файле. Реестр требует лист с именем Шаблон. У объекта ТабличныйДокумент есть свойство ИмяЛиста, но фактическое имя листа в записанном xlsx зависит от версии платформы и от наличия именованных областей печати. Проверка занимает минуту: сформируйте файл, переименуйте расширение в .zip, откройте xl/workbook.xml и посмотрите атрибут name элемента sheet. Если имя не то, применяйте путь второй или третий.
Второй тонкий момент: формат ячейки. Даже когда вы вывели дату строкой, ячейка может получить числовой формат, если в макете так задано. Тип ячейки в макете должен быть текстовым для всех идентификаторов и дат.
Путь второй: заполнение эталонного шаблона через COM. Скачанный с портала Шаблон.xlsx хранится в макете двоичных данных, распаковывается во временный каталог и заполняется через COMОбъект("Excel.Application"). Плюс: имя листа, форматы ячеек и скрытые справочники гарантированно те же, что ждёт реестр. Минус: требуется установленный Excel на сервере 1С, что на Linux-сервере отпадает сразу.
Процедура ЗаполнитьЭталонныйШаблонЧерезCOM(ПакетСсылка, ПутьКФайлу)
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = Ложь;
Попытка
Книга = Excel.Workbooks.Open(ПутьКФайлу);
Лист = Книга.Sheets("Шаблон");
НомерСтроки = 2; // первая строка занята шапкой шаблона
Для Каждого СтрокаПакета Из ПакетСсылка.Строки Цикл
// NumberFormat "@" - текстовый формат,
// снимает потерю ведущих нулей.
Лист.Cells(НомерСтроки, 7).NumberFormat = "@";
Лист.Cells(НомерСтроки, 7).Value =
СокрЛП(СтрокаПакета.НомерДокумента);
Лист.Cells(НомерСтроки, 8).Value =
Формат(СтрокаПакета.ДатаВыдачи, "ДФ=dd.MM.yyyy");
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
Книга.Save();
Книга.Close();
Исключение
Excel.Quit();
ВызватьИсключение;
КонецПопытки;
Excel.Quit();
Excel = Неопределено;
КонецПроцедуры
Путь третий: заполнение эталонного шаблона Python-скриптом. Тот же принцип, но без Excel и с работой на Linux. 1С кладёт данные в промежуточный JSON, вызывает python3 fill_frdo.py, скрипт правит sheet1.xml внутри архива через openpyxl. Для серверной 1С на Linux это единственный вариант, дающий гарантию по имени листа. Вызов из 1С:
Функция ЗапуститьГенераторШаблона(ПутьКJSON, ПутьКШаблону,
ПутьКРезультату) Экспорт
Команда = "python3 /opt/frdo/fill_frdo.py"
+ " --template " + ПутьКШаблону
+ " --data " + ПутьКJSON
+ " --out " + ПутьКРезультату;
КодВозврата = 0;
ВыводКоманды = "";
ЗапуститьПриложение(Команда, , Истина, КодВозврата);
Если КодВозврата <> 0 Тогда
ВызватьИсключение "Генератор шаблона ФРДО завершился"
+ " с кодом " + КодВозврата;
КонецЕсли;
Возврат ПутьКРезультату;
КонецФункции
Мы используем третий путь. Причина прагматичная: сервер на Linux, эталонный шаблон меняется примерно раз в год, и обновление сводится к замене одного файла в макете, а не к переписыванию макета ТабличныйДокумент под новый порядок колонок.
7. Подпись и шифрование

Требования из FAQ ЦИТиС и руководства оператора:
- подпись: attached PKCS#7, алгоритм ГОСТ Р 34.10-2012, выходная кодировка DER;
- шифрование: на открытом ключе сертификата сервера ФРДО, алгоритм ГОСТ 28147-89;
- итоговое имя файла: Шаблон.xlsx.sig.enc;
- инструменты: КриптоАРМ поверх КриптоПро CSP либо ViPNet PKI Client.
КриптоАРМ это GUI, и в автоматическом режиме он неудобен. Из 1С логичнее звать cryptcp из состава КриптоПро CSP.
// Отпечатки берём из констант, не из кода и не из настроек пользователя.
// ОтпечатокОрганизации - сертификат подписанта,
// ОтпечатокФРДО - сертификат сервера реестра.
Функция ПодписатьИЗашифровать(ПутьКФайлу) Экспорт
ОтпечатокПодписи =
Константы.ФРДООтпечатокСертификатаОрганизации.Получить();
ОтпечатокПолучателя =
Константы.ФРДООтпечатокСертификатаСервера.Получить();
ФайлПодписи = ПутьКФайлу + ".sig";
ФайлШифра = ФайлПодписи + ".enc";
// attached-подпись создаётся по умолчанию, -der задаёт бинарную кодировку
КомандаПодписи = "cryptcp -sign -thumbprint " + ОтпечатокПодписи
+ " -der """ + ПутьКФайлу + """ """ + ФайлПодписи + """";
ВыполнитьКоманду(КомандаПодписи, "подпись пакета ФРДО");
КомандаШифрования = "cryptcp -encr -thumbprint " + ОтпечатокПолучателя
+ " -der """ + ФайлПодписи + """ """ + ФайлШифра + """";
ВыполнитьКоманду(КомандаШифрования, "шифрование пакета ФРДО");
Возврат ФайлШифра;
КонецФункции
Процедура ВыполнитьКоманду(Знач Команда, Знач ОписаниеЭтапа)
КодВозврата = 0;
ЗапуститьПриложение(Команда, , Истина, КодВозврата);
Если КодВозврата <> 0 Тогда
ЗаписьЖурналаРегистрации("ФРДО." + ОписаниеЭтапа,
УровеньЖурналаРегистрации.Ошибка, , ,
"Код возврата " + КодВозврата);
ВызватьИсключение "Не выполнен этап: " + ОписаниеЭтапа
+ ". Код возврата " + КодВозврата;
КонецЕсли;
КонецПроцедуры
Точный набор ключей cryptcp отличается между версиями КриптоПро CSP. Проверяйте на своей: cryptcp -help sign и cryptcp -help encr выводят актуальный синтаксис за секунду. Приведённый вариант рабочий на линейке 5.0, для 4.0 сверяйте.
Что здесь легко испортить.
Порядок операций строго «сначала подписать, потом зашифровать». Обратный порядок даёт технически валидный файл, который реестр не примет: он ждёт подпись под содержимым, а не под шифротекстом.
Отпечаток сертификата сервера ФРДО меняется при плановой смене сертификата оператором. Держите его в константе, а не в коде, и логируйте дату получения. Когда пакеты начнут отбиваться все сразу без внятной причины, первым делом проверяется именно он.
Пароль контейнера закрытого ключа в командной строке передавать не надо. Ключ на токене с вводом PIN или контейнер без пароля в защищённом хранилище сервера, третьего безопасного варианта нет. Пароль в ЗапуститьПриложение попадёт в список процессов операционной системы целиком.
8. Разбор файла ошибок
Реестр возвращает результат обработки шифрованным файлом. Расшифровка локальная, тем же cryptcp:
Функция РасшифроватьОтвет(ПутьКФайлуОтвета) Экспорт
ФайлРезультата = СтрЗаменить(ПутьКФайлуОтвета, ".enc", "");
Команда = "cryptcp -decr -thumbprint "
+ Константы.ФРДООтпечатокСертификатаОрганизации.Получить()
+ " """ + ПутьКФайлуОтвета + """ """ + ФайлРезультата + """";
ВыполнитьКоманду(Команда, "расшифровка ответа ФРДО");
Возврат ФайлРезультата;
КонецФункции
Дальше расшифрованный xlsx читается обратно в табличную часть и сопоставляется со строками пакета. Сопоставление по номеру строки, а не по содержимому: реестр возвращает строки в исходном порядке.
Процедура ЗагрузитьОшибкиВПакет(ПакетОбъект, ПутьКФайлуОшибок)
Табличный = Новый ТабличныйДокумент;
Табличный.Прочитать(ПутьКФайлуОшибок,
СпособЧтенияЗначенийТабличногоДокумента.Значение);
// Первая строка - шапка, данные начинаются со второй.
Для НомерСтроки = 2 По Табличный.ВысотаТаблицы Цикл
ИндексСтроки = НомерСтроки - 2;
Если ИндексСтроки >= ПакетОбъект.Строки.Количество() Тогда
Прервать;
КонецЕсли;
ТекстОшибки = СокрЛП(Табличный.Область(НомерСтроки, 1).Текст);
СтрокаПакета = ПакетОбъект.Строки[ИндексСтроки];
СтрокаПакета.ТекстОшибки = ТекстОшибки;
СтрокаПакета.ОшибкаКритична = Не ПустаяСтрока(ТекстОшибки);
КонецЦикла;
ПакетОбъект.СостояниеПакета =
Перечисления.СостоянияПакетовФРДО.ОбработанСОшибками;
ПакетОбъект.Записать();
КонецПроцедуры
Номер колонки с текстом ошибки в возвращаемом файле зависит от подсистемы. Не берите его из статьи, посмотрите на первом же реальном ответе.
Ошибки реестра делятся на две группы, и обрабатывать их надо по-разному. Ошибки формата (тип поля, длина, недопустимый символ) означают, что ваш валидатор дырявый: добавьте проверку и закройте класс ошибок навсегда. Ошибки данных (значение отсутствует в классификаторе, дубль записи) означают проблему в учёте, и правится она в источнике, а не в пакете. Если править только пакет, следующий период принесёт то же самое.
9. Регламентное задание и фиксация отправки
Формирование пакета удобно вешать на регламентное задание с ежедневным запуском: собрать все документы выдачи за период, у которых не заполнена связь с принятым пакетом, прогнать валидацию, сформировать черновик и сообщить ответственному. Загрузку по-прежнему делает человек.
Процедура СформироватьЧерновикиПакетов() Экспорт
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВыдачаДокументов.Ссылка КАК Документ,
| ВыдачаДокументов.Организация КАК Организация
|ИЗ
| Документ.ВыдачаДокументаОбОбразовании КАК ВыдачаДокументов
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОтправкиФРДО КАК Отправки
| ПО ВыдачаДокументов.Ссылка = Отправки.ДокументОснование
|ГДЕ
| ВыдачаДокументов.Проведен
| И ВыдачаДокументов.Дата >= &НачалоПериода
| И Отправки.ДокументОснование ЕСТЬ NULL
|УПОРЯДОЧИТЬ ПО
| ВыдачаДокументов.Организация,
| ВыдачаДокументов.Дата";
// Срок подачи 30 календарных дней, берём запас в 45 дней назад,
// чтобы поймать документы, пропущенные в прошлых прогонах.
Запрос.УстановитьПараметр("НачалоПериода",
НачалоДня(ТекущаяДатаСеанса() - 45 * 86400));
Результат = Запрос.Выполнить().Выгрузить();
Если Результат.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ФРДОФормированиеПакетов.СоздатьПакетыПоОрганизациям(Результат);
КонецПроцедуры
Запись в регистр ОтправкиФРДО делается только после подтверждённого приёма пакета реестром, а не после его формирования и не после загрузки. Иначе при отказе документы выпадут из следующей выборки и не уедут никогда.
10. Про RPA и границы дозволенного

Соблазн понятен: браузерная автоматизация закрывает последний ручной шаг, и цепочка становится сквозной. Технически это выполнимо не полностью. На портале ЕСИА-авторизация, часто с подтверждением, и работа с УКЭП через браузерный плагин. Автоматизация такой связки хрупкая и ломается при любом изменении портала.
Правовая сторона весомее технической. Учётная запись ЕСИА привязана к конкретному физическому лицу, действия под ней совершает это лицо. Передача управления сессией скрипту это как минимум нарушение условий использования, и в случае разбора по некорректным сведениям в реестре объяснять придётся именно это. Продукт, в котором такой механизм зашит по умолчанию, продавать образовательным организациям я бы не стал.
Разумная граница: 1С формирует, валидирует, подписывает и шифрует пакет, кладёт готовый .sig.enc в каталог и пишет ответственному задачу с ссылкой на файл. Человек нажимает две кнопки в браузере. Экономия на цикле подачи от этого не меняется, потому что съедали время не эти две кнопки.
11. Контрольный перечень при внедрении
| Условие | Что будет, если не соблюсти |
|---|---|
| Эталонный Шаблон.xlsx скачан с портала и хранится в макете, а не воспроизведён вручную | Порядок или состав колонок разъедется после планового обновления формы, пакет отобьётся целиком |
| Имя листа в сформированном файле равно Шаблон | Реестр не найдёт данные, ошибка будет неинформативной |
| Все идентификаторы выводятся текстом, тип ячейки текстовый | Ведущие нули потеряются, документы в реестре не найдутся при проверке |
| Даты выводятся строкой в формате дд.мм.гггг | Excel-сериал вместо даты, отказ по формату поля |
| Решение по букве «ё» зафиксировано и применяется программно | Один и тот же человек попадёт в реестр под двумя написаниями |
| СНИЛС проверяется по контрольной сумме до отправки | Отказ на 3-4 сутки после подачи, при сроке 30 дней это дорого |
| Проверка на повторную подачу по тройке серия, номер, дата | Дубль в реестре, убирается только через техподдержку ЦИТиС |
| Отпечаток сертификата сервера ФРДО в константе, дата обновления логируется | При плановой смене сертификата все пакеты начнут отбиваться без внятной причины |
| Порядок «подписать, затем зашифровать» | Файл валиден технически и бессмыслен для реестра |
| Пароль контейнера не передаётся в командной строке | Пароль виден в списке процессов операционной системы |
| Запись в регистр отправок только после подтверждённого приёма | Отклонённые документы выпадут из выборки и не уедут никогда |
| Ошибки формата закрываются доработкой валидатора, ошибки данных правятся в источнике | Следующий период принесёт тот же набор отказов |
12. Заключение
ФИС ФРДО останется файловой системой обмена в обозримом будущем: ни в одном из опубликованных документов Рособрнадзора нет планов по программному интерфейсу. Строить архитектуру в расчёте на «скоро откроют API» не нужно.
При этом отсутствие API не означает отсутствие места для автоматизации. Ровно наоборот: чем примитивнее протокол на приёмной стороне, тем больше ручной работы вокруг него и тем ценнее её убрать. Сокращение срока подачи до 30 дней с сентября 2025 сделало эту работу срочной, а срочная ручная работа с персональными данными это гарантированные ошибки.
Реалистичная граница продукта на 1С выглядит так: сквозная автоматизация до готового .sig.enc, полная локальная валидация по правилам реестра, разбор возвращённых ошибок и защита от дублей. Ручными остаются два клика в браузере. Это честная постановка, и её можно продавать, не обещая невозможного.
Источники
- Рособрнадзор. Формирование и ведение Федерального реестра сведений о документах об образовании и (или) о квалификации, документах об обучении. Раздел госфункции, шаблоны и инструкции по подсистемам. https://obrnadzor.gov.ru/gosudarstvennye-uslugi-i-funkczii/7701537808-gosfunction/formirovanie-i-vedenie-federalnogo-reestra-svedenij-o-dokumentah-ob-obrazovanii-i-ili-o-kvalifikaczii-dokumentah-ob-obuchenii/
- Руководство оператора. ФИС ФРДО, подсистема сбора данных о ДПО. https://open-dpo.obrnadzor.gov.ru/data/manual/Instrukciya_dpo.pdf
- Часто задаваемые вопросы. ФИС ФРДО, подсистема сбора данных о ДПО. Требования к подписи и шифрованию. https://open-dpo.obrnadzor.gov.ru/data/manual/faqDPO.pdf
- Инструкция по заполнению шаблона. Профессиональное обучение, редакция от 21.07.2025. https://obrnadzor.gov.ru/wp-content/uploads/2025/07/instrukcziya-po-zapolneniyu-shablona_po-21072025.pdf
- Инструкция по заполнению файла-шаблона для ДПО. https://obrnadzor.gov.ru/wp-content/uploads/2020/10/Instruktsiya_po_zapolneniu_faila-shablona_dlya_DPO.pdf
- Постановление Правительства РФ от 07.06.2025 № 850. Сокращение срока внесения сведений с 60 до 30 календарных дней с 01.09.2025 для программ ВО и ДПО.
- Всё о подаче сведений в ФИС ФРДО. Обзор каналов подачи, портал и сеть ViPNet 3608. https://uchi.pro/blog/fis-frdo-dpo
- База знаний ООО «Открытые технологии». Интеграция с ФИС ФРДО. Пример файловой интеграции LMS с реестром. https://kb.opentechnology.ru/content/27/549/ru/integracia-s-fis-frdo.html
Вступайте в нашу телеграмм-группу Инфостарт