Работа с сервисом 1С-ДиректБанк в конфигурации Управление нашей фирмой (УНФ) значительно упрощает жизнь бухгалтера, позволяя отправлять платежные поручения напрямую в банк без выгрузки промежуточных файлов. Однако пользователи часто сталкиваются с технической преградой: система выдает ошибку валидации номера документа, хотя визуально в печатной форме номер выглядит корректно. Разберем детально, почему это происходит и как устранить проблему программными и административными методами.
Рассмотрим ситуацию, когда при попытке формирования электронного документа система выдает сообщение следующего вида: «Номер документа: должен содержать только цифры. Номер документа: неверный тип значения "А-1У-000055" (ожидаемый тип: строка до 6 символов)». Проанализируем, почему стандартный механизм обмена файлами («Клиент-Банк») может пропускать такой номер, а ДиректБанк — нет.
Сервис ДиректБанк работает по протоколу ASOE (или аналогичным API банков), где данные передаются в строго структурированном формате (XML или JSON). Большинство банковских шлюзов (например, Сбербанк, Точка, ВТБ) имеют жесткие требования к полю Номер. Оно должно быть либо чисто числовым, либо строковым, но не содержать лишних символов, таких как префиксы информационных баз или организаций. Если в файл обмена 1C выгружает «очищенный» номер, то при прямой передаче через ДиректБанк в некоторых релизах УНФ механизм очистки может давать сбой из-за нестандартной префиксации.
Выясним причину некорректной очистки номера. В системе 1С дефис - часто используется как технический разделитель между префиксом и номером. Если в поле «Префикс» в карточке организации или в настройках обмена указан символ тире (например, А-1), стандартные функции «Библиотеки стандартных подсистем» (БСП) могут ошибочно идентифицировать только часть префикса, оставляя остальные нецифровые символы в теле номера.
Для исправления ситуации выполним следующие действия:
А1 вместо А-1).Платежное поручение не изменятся автоматически. Вам потребуется вручную перезаписать номер документа (например, стереть его и нажать «Записать», чтобы программа сформировала новый номер по новым правилам).Как показывает практика, использование префикса из двух букв без дополнительных символов полностью решает проблему в 90% случаев, так как стандартные алгоритмы очистки номера начинают работать корректно.
Если специфика учета не позволяет изменить префиксы (например, накоплена огромная история документов), необходимо вмешаться в работу механизмов очистки номера. В конфигурации УНФ за подготовку номера для передачи в банк отвечает общий модуль или функции клиент-серверного взаимодействия.
Проанализируем ситуацию в коде. Основная функция, отвечающая за «красивое» представление номера, — это ПрефиксацияОбъектовКлиентСервер.НомерНаПечать. Однако при выгрузке через ДиректБанк может вызываться специфическая логика из модуля УчетДенежныхСредствКлиентСервер. Рассмотрим пример того, как можно принудительно очистить номер от любых префиксов с помощью расширения конфигурации.
Создадим расширение и добавим в него процедуру, перехватывающую формирование номера для выгрузки. Пример логики, которую можно реализовать:
&ИзменениеИКонтроль("НомерНаПечать")
Функция Мой_НомерНаПечать(Знач НомерОбъекта, УдалитьПрефиксИнформационнойБазы = Ложь, УдалитьПользовательскийПрефикс = Ложь) Экспорт
// Принудительно устанавливаем параметры удаления всех префиксов для банковских операций
УдалитьПрефиксИнформационнойБазы = Истина;
УдалитьПользовательскийПрефикс = Истина;
// Вызываем стандартную логику, которая теперь гарантированно отсечет лишнее
Возврат ПродолжитьВызов(НомерОбъекта, УдалитьПрефиксИнформационнойБазы, УдалитьПользовательскийПрефикс);
КонецФункции
Посмотрим на альтернативный вариант. Если стандартная функция НомерНаПечать все равно не справляется с «двойными» префиксами вида А-1У-000055, можно использовать регулярные выражения или простую очистку строки от всех нецифровых символов непосредственно в модуле УчетДенежныхСредствКлиентСервер.НомерОбъектаБезПрефикса. Рассмотрим фрагмент кода, который поможет оставить только цифры:
Функция ОчиститьНомерДляБанка(Знач ВходнойНомер)
Результат = "";
Для Индекс = 1 По СтрДлина(ВходнойНомер) Цикл
Символ = Сред(ВходнойНомер, Индекс, 1);
Если Найти("0123456789", Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
// Удаляем лидирующие нули, часто банки требуют именно короткий номер
Пока Лев(Результат, 1) = "0" И СтрДлина(Результат) > 1 Цикл
Результат = Сред(Результат, 2);
КонецЦикла;
Возврат Результат;
КонецФункции
Многих пользователей сбивает с толку тот факт, что обычный обмен через txt-файл проходит успешно. Проанализируем ситуацию: при выгрузке в файл 1С использует старые алгоритмы формирования 1CClientBankExchange, где в поле Номер часто попадает уже преобразованное значение. Более того, при импорте файла «Клиент-Банк» на стороне банковского ПО часто стоят менее жесткие фильтры. ДиректБанк — это современная интеграция, работающая в режиме реального времени, и она требует идеального соответствия типов данных. Если поле описано как числовое, передача любой буквы приведет к отказу всей транзакции.
Для стабильной работы интеграций с банками и другими внешними сервисами рекомендуем придерживаться следующих правил оформления документов:
DirectBank и БСП, исправляя ошибки парсинга префиксов. Если вы столкнулись с проблемой на релизе 1.6.23, велика вероятность, что в актуальных версиях (например, линейки 3.0) эта ситуация уже обработана штатно.Организации, Контрагента и Договора/Заказа. Если акт сверки «не видит» входящее сальдо, проверьте аналитику учета — часто остаток висит на пустом договоре или на другом объекте расчетов.Таким образом, решение проблемы с выгрузкой платежек заключается в приведении системы нумерации к стандартам, которые «понимают» банковские API. Начните с удаления лишних символов из префиксов, и только если это не поможет, переходите к программной корректировке функций очистки номера через расширения.