Проверка сертификата и декларации в реестре ЕАЭС из 1С: запрос, код и ловушки номера
Иван Недомолков · Жарияланды:
Проверить сертификат или декларацию по номеру в едином реестре Евразийского экономического союза можно прямо из 1С, без регистрации и без ключа. Реестр отдаёт даты начала и окончания действия, вид документа, страну и код статуса. Ниже запрос, функция на встроенном языке, список ответов, которые легко принять за “документа нет”, и порядок, в котором стоит начинать, если номеров в базе тысячи.
Запрос, поля ответа и примеры номеров перепроверены 25 сентября 2026 года.
Что отдаёт реестр по одному номеру
Человеку реестр показывают на tech.eaeunion.org. Под этим интерфейсом работает поиск, который принимает запрос в JSON и отвечает тоже JSON. Для одного документа полезны такие поля:
| Поле ответа | Что в нём | Пример |
|---|---|---|
docId | номер документа, как он записан в реестре | ЕАЭС RU С-RU.АЯ46.В.40025/25 |
docStartDate | дата начала действия | {"$date":"2025-04-10T00:00:00Z"} |
docValidityDate | дата окончания действия | {"$date":"2030-04-09T00:00:00Z"} |
conformityDocKindName | вид документа словами | сертификат соответствия ТР ЕАЭС |
unifiedCountryCode | страна, код в поле value | RU |
docStatusDetails | статус, код в поле docStatusCode | 01 |
matchedDocuments | сколько документов подошло под запрос | 1 |
Даты завёрнуты в объект с ключом $date, это расширенный JSON. Расшифровку кодов статуса реестр в ответе не даёт, поэтому для решения “действует или нет” мы опираемся на даты, а код статуса сохраняем рядом для справки.
Запрос
POST https://tech.eaeunion.org/spd2/find
?collection=kbdallread.service-prop-35_1-conformityDocDetailsType
&limit=1&skip=0
Content-Type: text/plain
{"docId":"ЕАЭС RU С-RU.АЯ46.В.40025/25"}
Ответ на такой запрос приходит примерно за полсекунды. Вместо точного номера в docId можно передать {"$regex":"^ЕАЭС\\.KZ\\."}: поиск по началу строки идёт быстро, без якоря ^ реестр перебирает почти девять миллионов записей и отвечает за 13-16 секунд. Для цикла по справочнику годится только точный номер.
Функция на встроенном языке
Функция принимает номер и возвращает структуру с датами. Если документ не найден, Найден будет Ложь.
Функция ДокументИзРеестраЕАЭС(Номер) Экспорт
Результат = Новый Структура("Найден, ДатаНачала, ДатаОкончания, Вид, Страна, КодСтатуса",
Ложь, Дата(1, 1, 1), Дата(1, 1, 1), "", "", "");
Соединение = Новый HTTPСоединение("tech.eaeunion.org", 443, , , , 30,
Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/spd2/find?collection=kbdallread.service-prop-35_1-conformityDocDetailsType"
+ "&limit=1&skip=0");
Запрос.Заголовки.Вставить("Content-Type", "text/plain");
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Новый Структура("docId", Номер));
// без третьего параметра в режиме совместимости уйдёт BOM, и реестр ответит 500
Запрос.УстановитьТелоИзСтроки(Запись.Закрыть(), КодировкаТекста.UTF8,
ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение "Реестр ЕАЭС ответил " + Ответ.КодСостояния;
КонецЕсли;
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));
Данные = ПрочитатьJSON(Чтение, Истина);
Если Данные["matchedDocuments"] = 0 Тогда
Возврат Результат;
КонецЕсли;
Документ = Данные["result"][0];
Результат.Найден = Истина;
Результат.ДатаНачала = ДатаИзРеестра(Документ["docStartDate"]);
Результат.ДатаОкончания = ДатаИзРеестра(Документ["docValidityDate"]);
Результат.Вид = Документ["conformityDocKindName"];
Если Документ["unifiedCountryCode"] <> Неопределено Тогда
Результат.Страна = Документ["unifiedCountryCode"]["value"];
КонецЕсли;
Если Документ["docStatusDetails"] <> Неопределено Тогда
Результат.КодСтатуса = Документ["docStatusDetails"]["docStatusCode"];
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ДатаИзРеестра(Значение)
// {"$date":"2025-04-10T00:00:00Z"}: берём первые 19 знаков без зоны
Если Значение = Неопределено Тогда
Возврат Дата(1, 1, 1);
КонецЕсли;
Возврат XMLЗначение(Тип("Дата"), Лев(Значение["$date"], 19));
КонецФункции
Тело собирается через ЗаписьJSON, а не склейкой строк: так кавычки и обратные косые в номере не сломают запрос. Паузу между вызовами в цикле держите в одну-две десятых секунды. На такой скорости отказов по частоте мы не получали.
Ответы, которые врут
На правильно оформленный запрос реестр отвечает 200, найден документ или нет. Отличает их только matchedDocuments, и ноль там бывает по двум причинам: документа нет или реестр не понял номер. Как это выглядит на одном и том же живом номере:
| Что ушло в реестр | Код ответа | Найдено |
|---|---|---|
| тело в UTF-8 без BOM | 200 | 1 |
| тело, где кириллица испорчена до одного байта на символ | 200 | 0 |
кириллица записана последовательностями \uXXXX | 200 | 1 |
| несуществующий номер | 200 | 0 |
| тело с BOM | 500, тело пустое | - |
заголовок application/json | 415 | - |
Вторая строка самая неприятная: ответ неотличим от “такого документа нет”. Кириллицу так портит любой промежуточный слой, который считает строку однобайтовой. Поэтому каждый прогон начинайте с номера, про который точно известно, что он в реестре есть, например с того, что в таблице полей выше. Не нашёлся он, значит сломана отправка, и результаты по вашим номерам пока ничего не значат.
Номер: три написания и буквы-близнецы
Реестр ищет по точному совпадению строки, а номер одного и того же вида документа в нём бывает записан по-разному. У казахстанских номеров мы насчитали три написания начала:
| Начало номера | Документов на 25.09.2026 | Пример из реестра |
|---|---|---|
ЕАЭС KZ через пробел | 267 457 | ЕАЭС KZ 02421.05.01.00001 |
ЕАЭС KZ. пробел, дальше точки | 83 040 | ЕАЭС KZ.1110033.13.12.00002 |
ЕАЭС.KZ. через точки | 10 099 | ЕАЭС.KZ.1110033.24.01.00691 |
Второе написание не опечатка: 82 425 номеров из 83 040 в нём устроены одинаково, цифровые группы через точку. Остальные это уже шум ввода, попадаются и двойная точка, и пробел внутри номера. Поиск по одной форме другие не находит. Хорошо видно на одном органе по сертификации, 1110033: через пробел у него ноль документов, через точки 17, через пробел и точки 33. Один орган, два написания. Отсюда правило: не приводите номер к “правильной” форме до запроса. Сначала спросите в том виде, как он записан в базе, и только при промахе пробуйте другие.
Вторая причина промахов опаснее, потому что её не видно глазами. Номер ЕАЭС пишется двумя алфавитами: коды стран латиницей, а маркерные буквы вроде С и В кириллицей. В учётной базе на их месте часто стоит латиница, и строка на экране не отличается от правильной:
ЕАЭС RU C-JP.МЕ10.В.01054/22 латинская C -> 0 найдено
ЕАЭС RU С-JP.МЕ10.В.01054/22 кириллическая С -> 1 найдено
Как найти латиницу в номере и почему площадки отказывают по такому номеру, разобрано в статье про сертификаты для маркетплейсов из 1С. Для запроса в реестр нужна обратная операция: перебрать варианты начертаний и спросить каждый.
Приставку ЕАЭС не трогайте. Если заменить в ней Е, А и С на латинские, не найдётся ни один номер, и промах будет выглядеть как подтверждение того, что начертание ни при чём. На этом легко обмануться при проверке собственной гипотезы, мы так и обманулись в первый раз.
// Варианты номера: все сочетания кириллица/латиница в буквах-близнецах после приставки
Функция ВариантыНачертаний(Номер, МаксБукв = 6) Экспорт
Кириллица = "АВЕКМНОРСТХ";
Латиница = "ABEKMHOPCTX";
Приставка = "ЕАЭС";
Хвост = Сред(Номер, СтрДлина(Приставка) + 1);
Позиции = Новый Массив;
Для Поз = 1 По СтрДлина(Хвост) Цикл
Символ = Сред(Хвост, Поз, 1);
Если СтрНайти(Кириллица, Символ) > 0 ИЛИ СтрНайти(Латиница, Символ) > 0 Тогда
Позиции.Добавить(Поз);
КонецЕсли;
КонецЦикла;
Варианты = Новый Массив;
Если Позиции.Количество() > МаксБукв Тогда
Варианты.Добавить(Номер); // слишком много сочетаний, перебор не делаем
Возврат Варианты;
КонецЕсли;
Для Маска = 0 По Pow(2, Позиции.Количество()) - 1 Цикл
Вариант = Хвост;
Для Инд = 0 По Позиции.Количество() - 1 Цикл
Поз = Позиции[Инд];
Символ = Сред(Хвост, Поз, 1);
ИндБуквы = СтрНайти(Кириллица, Символ);
Если ИндБуквы = 0 Тогда
ИндБуквы = СтрНайти(Латиница, Символ);
КонецЕсли;
// бит маски выбирает алфавит для этой позиции
Если Цел(Маска / Pow(2, Инд)) % 2 = 1 Тогда
Замена = Сред(Латиница, ИндБуквы, 1);
Иначе
Замена = Сред(Кириллица, ИндБуквы, 1);
КонецЕсли;
Вариант = Лев(Вариант, Поз - 1) + Замена + Сред(Вариант, Поз + 1);
КонецЦикла;
Варианты.Добавить(Приставка + Вариант);
КонецЦикла;
Возврат Варианты;
КонецФункции
Коды стран вроде RU и JP тоже попадут в перебор, это лишние запросы, но не ошибка: правильный вариант среди сочетаний всё равно есть. Ограничение МаксБукв держит число запросов в разумных пределах, шесть букв это 64 варианта на номер. Перебор имеет смысл только для номеров, которые не нашлись точным запросом.
Сначала замер, потом загрузчик
Если в базе тысячи документов без дат, первая мысль написать загрузчик: нормализация, обработка отказов, журнал, повторы. Это неделя работы. Сколько номеров из вашей базы реестр знает, выясняется за час, и от этого числа зависит, нужна ли неделя.
Порядок:
- Выберите три-четыре десятка номеров разных стран и форматов.
- Первым запросом отправьте заведомо живой номер.
- Спросите каждый номер точно в том виде, как он записан в базе.
- Для промахов переберите начертания функцией выше.
- Посчитайте долю найденных в разрезе стран.
Наш замер на 34 номерах из рабочих протоколов, сентябрь 2026:
| Страна документа | Номеров | Нашлось точным запросом |
|---|---|---|
| Россия | 16 | 8 |
| Казахстан | 11 | 5 |
| Киргизия | 7 | 2 |
| Всего | 34 | 15 |
Перебор начертаний добавил ещё три номера, стало 18 из 34, и у всех трёх в маркере стояла латинская C. Замена написания “через пробел” на “через точки” не вернула ни одного. У всех 18 найденных пришли обе даты. Оставшиеся 16 номеров реестр не знает ни в каком виде, и почему, мы не разбирали: вариантов несколько, от национального реестра до ошибки в номере, а проверка каждого стоит дороже пользы.
Выборка маленькая и не случайная, поэтому 53 % годятся как ориентир. Для вашей базы число будет своим. Решение принимается по своему числу: нашлось девять из десяти, загрузчик окупится; нашлась половина, сначала решите, закрывает ли половина исходную задачу.
Чего в реестре ЕАЭС нет
Реестр отвечает, что это за документ и на какой срок выдан. Статус с точки зрения надзора, например приостановку, для российских документов удобнее брать не отсюда. В 1С:Управление торговлей 11.5 у справочника СертификатыНоменклатуры есть реквизиты СтатусРосаккредитации, ДатаОбновленияСтатусаРосаккредитации и СсылкаНаСертификатРосаккредитации, их обновляет регламентное задание ОбновлениеСтатусовСертификатовНоменклатурыРосаккредитации с pub.fsa.gov.ru. Это описано в информации об обновлении версии 11.5.15.40.
Сроки действия это задание не заполняет, и за ними как раз стоит идти в реестр ЕАЭС функцией выше.
Когда документы уже надо везти на площадку
С 1 октября 2026 года маркетплейсы сверяют разрешительный документ с реестром, поэтому номер и даты в карточке товара начинают значить больше. Готовые обработки для трёх площадок:
- Сертификаты для Ozon: сверка с кабинетом и загрузка документа со сканом.
- Сертификаты для Wildberries: запись номеров в карточку и разбор отказа внутри ответа 200.
- Сертификаты для Яндекс Маркета: заведение документа в кабинете и исправление латиницы в номере.
Если нужен загрузчик дат из реестра в ваш справочник или обмен с площадкой под вашу конфигурацию, это задача для интеграции с маркетплейсами.