Проблема с отправкой электронных счетов-фактур (ЭСФ) через прямой обмен в 1С — одна из самых критичных ситуаций для бухгалтерии, особенно когда объем документов исчисляется сотнями и тысячами в день. Ошибка "Ошибка подписи" при попытке взаимодействия с порталом ИС ЭСФ часто возникает внезапно, даже если вчера все работало корректно. Рассмотрим подробно, почему это происходит и как мы можем решить данную проблему различными способами.
Проанализируем ситуацию: чаще всего подобные сбои происходят после проведения технических работ на стороне государственного портала (ИС ЭСФ). Разберем механизм: система 1С использует специализированные криптобиблиотеки (например, версии 1.7 или 1.8) для формирования хэша и подписи документа. Если на портале обновляются алгоритмы проверки или требования к структуре подписи, старые компоненты 1С начинают генерировать подпись, которую сервер портала признает невалидной. Особенно часто это касается ключей физических лиц (сотрудников), в то время как ключи юридических лиц (ГОСТ) могут продолжать работать. Это создает так называемый "кризис шестого дня", когда после обновлений в выходные, в понедельник работа встает.
Как показывает практика и советы технических специалистов, наиболее быстрым "обходным" решением является временная смена ответственного лица или типа используемой подписи. Посмотрим на этот метод подробнее:
Это решение подходит, если у вас небольшое количество ответственных лиц и есть доступ к ключам руководителя компании.
Если прямой обмен через API выдает ошибку, проанализируем альтернативный путь, рекомендованный официальной поддержкой 1С-Рейтинг. Рассмотрим шаги по реализации этого метода:
Важно: этот метод крайне неудобен при больших объемах, так как сервер портала при ручной загрузке часто зависает, но он является гарантированным способом отправить документы в срок, пока ведутся работы по исправлению API.
Рассмотрим более сложный, но эффективный технический способ для программистов 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 НУЦ. В нем обязательно должны присутствовать плейсхолдеры для текста подписи и данных ключа.
Разберем еще одну ситуацию, когда возникает ошибка Couldn't resolve host name или createSessionResponse. Это означает, что 1С не может "увидеть" сервер esf.gov.kz. Проанализируем порядок действий для системного администратора:
ping esf.gov.kz.esf.gov.kz добавлен в исключения или для него корректно прописаны авторизационные данные.Мы проанализировали основные причины возникновения ошибки подписи и рассмотрели три пути решения. Первый путь — самый быстрый (смена типа ключа). Второй путь — самый надежный (XML-обмен), но трудоемкий. Третий путь — технически совершенный (интеграция с SDK), позволяющий автоматизировать процесс даже в периоды нестабильности стандартных библиотек 1С.
Помните, что работа с ЭСФ требует регулярного обновления платформы (рекомендуется не ниже 8.3.8) и конфигурации. Всегда держите наготове действующий сертификат юридического лица как резервный инструмент для подписания критически важных документов. Для контроля текущего состояния документов и отслеживания неотправленных счетов-фактур можно использовать расширение для отображения статусов ЭСФ в списках первичных документов.