Как исправить Ошибку подписи при отправке ЭСФ в 1С:Бухгалтерия для Казахстана

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Налоговый учет
← На главную

Проблема с отправкой электронных счетов-фактур (ЭСФ) через прямой обмен в 1С — одна из самых критичных ситуаций для бухгалтерии, особенно когда объем документов исчисляется сотнями и тысячами в день. Ошибка "Ошибка подписи" при попытке взаимодействия с порталом ИС ЭСФ часто возникает внезапно, даже если вчера все работало корректно. Рассмотрим подробно, почему это происходит и как мы можем решить данную проблему различными способами.

Выясняем причину возникновения ошибки

Проанализируем ситуацию: чаще всего подобные сбои происходят после проведения технических работ на стороне государственного портала (ИС ЭСФ). Разберем механизм: система 1С использует специализированные криптобиблиотеки (например, версии 1.7 или 1.8) для формирования хэша и подписи документа. Если на портале обновляются алгоритмы проверки или требования к структуре подписи, старые компоненты 1С начинают генерировать подпись, которую сервер портала признает невалидной. Особенно часто это касается ключей физических лиц (сотрудников), в то время как ключи юридических лиц (ГОСТ) могут продолжать работать. Это создает так называемый "кризис шестого дня", когда после обновлений в выходные, в понедельник работа встает.

Вариант 1. Использование ключей юридического лица (ГОСТ)

Как показывает практика и советы технических специалистов, наиболее быстрым "обходным" решением является временная смена ответственного лица или типа используемой подписи. Посмотрим на этот метод подробнее:

  1. Перейдем в настройки криптографии и подписей в 1С.
  2. Вместо сертификата физического лица (сотрудника), выданного НУЦ, попробуем использовать сертификат юридического лица (GOST).
  3. Во многих случаях сервер портала принимает подпись от юридического лица более стабильно, так как механизмы проверки таких сертификатов на стороне ИС ЭСФ могут отличаться.

Это решение подходит, если у вас небольшое количество ответственных лиц и есть доступ к ключам руководителя компании.

Вариант 2. Переход на XML-обмен документами

Если прямой обмен через API выдает ошибку, проанализируем альтернативный путь, рекомендованный официальной поддержкой 1С-Рейтинг. Рассмотрим шаги по реализации этого метода:

  1. В журнале ЭСФ выгрузим необходимые документы в формате XML на локальный диск.
  2. Зайдем на портал ИС ЭСФ через браузер.
  3. Воспользуемся функцией "Импорт" и загрузим файлы.
  4. Подпишем и отправим их непосредственно в веб-интерфейсе портала.

Важно: этот метод крайне неудобен при больших объемах, так как сервер портала при ручной загрузке часто зависает, но он является гарантированным способом отправить документы в срок, пока ведутся работы по исправлению API.

Вариант 3. Программное решение через локальный сервер SDK (для разработчиков)

Рассмотрим более сложный, но эффективный технический способ для программистов 1С. Если встроенная компонента Криптопровайдер выдает некорректную подпись, мы можем заменить механизм подписания на использование внешнего SDK от Национального удостоверяющего центра (НУЦ).

Для реализации этого метода нам потребуется запустить локальный сервер из состава SDK (который умеет подписывать данные через метод generateSignature) и переписать часть кода в обработке ОбменЭСФ. Проанализируем пример кода, который перенаправляет запрос на подпись внешнему серверу.

В модуле объекта обработки ОбменЭСФ найдем функцию СоздатьЭЦП и внесем в нее изменения, чтобы использовать наш "локальный костыль":


Функция СоздатьЭЦП(Знач СтрокаДляПодписи, Знач КлючBase64, Знач ПарольКлюча) Экспорт
    Попытка
        // Стандартный механизм заменяем на обращение к локальному серверу SDK
        ЭЦП = "";
        ЗапросXML = ПолучитьМакет("ЗапросGenerateSignature").ПолучитьТекст;
        ЗапросXML = СтрЗаменить(ЗапросXML, "[%ТекстДляПодписи%]", СтрокаДляПодписи);
        
        // Указываем путь к нашему сертификату и пароль
        ЗапросXML = СтрЗаменить(ЗапросXML, "[%ПутьККлючу%]", "ecp.p12"); 
        ЗапросXML = СтрЗаменить(ЗапросXML, "[%Пароль%]", "ваш_пароль");

        ОтветXML = ВыполнитьМетодВебСервисаCУказаниемСервера(ЗапросXML, "generateSignature");
        
        Если НЕ ЭтоМодульнаяОшибка(ОтветXML) Тогда
            ОтветXDTO = ЭСФСервер.ОбъектXDTOИзСтрокиXML(ОтветXML, ФабрикаXDTO);
            invoiceHashList = ОтветXDTO.Body.signatureResponse.invoiceHashList;
            ЭЦП = ЭСФСервер.ПолучитьСвойство(invoiceHashList.invoiceHash, "signature", Неопределено);
        Иначе
            ВызватьИсключение "Ошибка при внешнем подписании.";
        КонецЕсли;
        
        Возврат ЭЦП;
    Исключение
        ЗаписьЖурналаРегистрации("ОшибкаЭЦП", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
        ВызватьИсключение "Не удалось сформировать подпись через SDK.";
    КонецПопытки;
КонецФункции

Также нам понадобится вспомогательная функция ВыполнитьМетодВебСервисаCУказаниемСервера, которая отправит HTTP-запрос на локальный адрес (обычно localhost или 127.0.0.1), где запущен SDK:


Функция ВыполнитьМетодВебСервисаCУказаниемСервера(Знач ТекстМетода, Знач ИмяВебСервиса) Экспорт
    ПараметрыПодключения = Новый Структура;
    ПараметрыПодключения.Вставить("СерверИСЭСФ_Адрес", "127.0.0.1");
    ПараметрыПодключения.Вставить("СерверИСЭСФ_Порт", 6666);
    
    HTTPСоединение = Новый HTTPСоединение(ПараметрыПодключения.СерверИСЭСФ_Адрес, ПараметрыПодключения.СерверИСЭСФ_Порт);
    HTTPЗапрос = Новый HTTPЗапрос("/LocalService/" + ИмяВебСервиса);
    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type", "text/xml;charset=UTF-8");
    HTTPЗапрос.Заголовки = Заголовки;
    
    HTTPЗапрос.УстановитьТелоИзСтроки(ТекстМетода, "UTF-8");
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    
    Возврат HTTPОтвет.ПолучитьТелоКакСтроку();
КонецФункции

Для корректной работы этого метода необходимо подготовить XML-макет ЗапросGenerateSignature, в котором будет описана структура SOAP-запроса к SDK НУЦ. В нем обязательно должны присутствовать плейсхолдеры для текста подписи и данных ключа.

Проблемы с доступом к серверу (DNS и IP)

Разберем еще одну ситуацию, когда возникает ошибка Couldn't resolve host name или createSessionResponse. Это означает, что 1С не может "увидеть" сервер esf.gov.kz. Проанализируем порядок действий для системного администратора:

  1. Проверим доступность портала через команду ping esf.gov.kz.
  2. Если имя не разрешается, попробуем временно прописать IP-адрес сервера в файл hosts (C:\Windows\System32\drivers\etc\hosts). Например, на момент сбоев использовались адреса из подсетей 92.46.122.x или 195.12.x.x.
  3. Убедимся, что в настройках 1С в разделе "Параметры подключения к ИС ЭСФ" не указаны устаревшие тестовые серверы.
  4. Проверим настройки прокси-сервера. Если компания использует прокси, убедитесь, что адрес esf.gov.kz добавлен в исключения или для него корректно прописаны авторизационные данные.

Подведем итоги

Мы проанализировали основные причины возникновения ошибки подписи и рассмотрели три пути решения. Первый путь — самый быстрый (смена типа ключа). Второй путь — самый надежный (XML-обмен), но трудоемкий. Третий путь — технически совершенный (интеграция с SDK), позволяющий автоматизировать процесс даже в периоды нестабильности стандартных библиотек 1С.

Помните, что работа с ЭСФ требует регулярного обновления платформы (рекомендуется не ниже 8.3.8) и конфигурации. Всегда держите наготове действующий сертификат юридического лица как резервный инструмент для подписания критически важных документов. Для контроля текущего состояния документов и отслеживания неотправленных счетов-фактур можно использовать расширение для отображения статусов ЭСФ в списках первичных документов.

← На главную