При интеграции 1С с системами дистанционного банковского обслуживания (ДБО) и «Клиент-банк» разработчики часто сталкиваются с ошибкой: банк отклоняет исходящие платежные поручения или списания безналичных денежных средств, если их номер оканчивается на «000» (например, 1000, 2000, 5000). Попытка найти место в коде конфигурации, где формируется числовая часть номера, вызывает затруднения, так как номер не присваивается явным оператором присваивания.
Разберем детально, почему возникает эта ошибка со стороны банков, как именно устроен механизм автонумерации платформы 1С и какими способами можно скорректировать правила формирования номеров.
Выясним первопричину проблемы. Согласно правилам Банка России по заполнению реквизитов распоряжений о переводе денежных средств, номер платежного документа в расчетной сети идентифицируется по трем последним цифрам, если общая длина номера превышает три знака. При этом установлены строгие требования: три последних разряда номера платежного поручения обязательно должны быть отличны от «000».
Когда из 1С выгружается документ с номером 5000, банковский шлюз отсекает старшие разряды и получает номер 000, что приводит к системной ошибке валидации и отказу в приеме платежа.
Проанализируем работу встроенного механизма нумерации. В типовых конфигурациях 1С (таких как 1С:Управление торговлей, 1С:ERP, 1С:Комплексная автоматизация и 1С:Бухгалтерия) код конфигурации отвечает только за расчет префиксов (организации, информационной базы или узла РИБ), а сам порядковый номер генерируется непосредственно ядром платформы.
Рассмотрим жизненный цикл формирования номера:
ПриУстановкеНовогоНомера: вызывается платформой при первой попытке генерации номера. Здесь выполняется расчет префикса (например, через подписку на события в общем модуле ПрефиксацияОбъектовСобытия). В этот момент сам числовой номер еще отсутствует — доступен только префикс.ПередЗаписью и ПриЗаписи.ПриЗаписи: в этом обработчике номер уже полностью заполнен платформой и доступен в реквизите ЭтотОбъект.Номер.Наиболее надежный и безопасный подход — не вмешиваться в сквозную нумерацию бухгалтерских и управленческих документов базы данных, а преобразовывать номер непосредственно в момент формирования файла выгрузки в «Клиент-банк» или при отправке через сервис прямого обмена с банком (DirectBank).
Посмотрим на пример логики в обработке выгрузки:
Функция ПолучитьНомерДляБанка(ИсходныйНомер) Экспорт
// Извлекаем только значащую числовую часть номера
ЧисловойНомер = ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(ИсходныйНомер);
// Проверяем, оканчивается ли номер на 000
Если Прав(ЧисловойНомер, 3) = "000" Тогда
// Смещаем номер на единицу вперед для банковского реестра
ЧисловойНомер = Лев(ЧисловойНомер, СтрДлина(ЧисловойНомер) - 1) + "1";
КонецЕсли;
Возврат ЧисловойНомер;
КонецФункции
Такой вариант гарантирует целостность внутренней нумерации документов в 1С и исключает появление пропусков или коллизий в регистрах учета.
Если специфика учета требует, чтобы номер был изменен непосредственно в самом документе базы, мы можем принудительно вызвать платформенный генератор номера заранее с помощью метода УстановитьНовыйНомер() в модуле объекта или в подписке на событие ПередЗаписью.
Разберем реализацию этого алгоритма по шагам:
ЭтотОбъект.УстановитьНовыйНомер(), заставляя платформу рассчитать очередной номер с учетом префикса."000", модифицируем строку номера, заменяя их на "001".Посмотрим на пример кода в модуле документа или обработчике подписки:
Процедура ОбработкаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если Источник.ЭтоНовый() И ПустаяСтрока(Источник.Номер) Тогда
// Платформа формирует стандартный очередной номер
Источник.УстановитьНовыйНомер();
// Проверяем окончание номера
Если Прав(СокрЛП(Источник.Номер), 3) = "000" Тогда
Длина = СтрДлина(СокрЛП(Источник.Номер));
// Заменяем 000 на 001
Источник.Номер = Лев(Источник.Номер, Длина - 3) + "001";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
При таком подходе платформа при создании следующего документа автоматически продолжит автоинкремент со значения "002", и механизм нумерации не будет заблокирован.
Если требуется полностью управлять генерацией номеров для конкретного вида документов, рассмотрим обработчик ПриУстановкеНовогоНомера.
Синтаксис процедуры:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
// Отключаем стандартную платформенную генерацию
СтандартнаяОбработка = Ложь;
// Рассчитываем уникальный номер собственным запросом или алгоритмом
ЭтотОбъект.Номер = СформироватьПользовательскийНомер(Префикс);
КонецПроцедуры
Установка параметра СтандартнаяОбработка = Ложь полностью отключает встроенный платформенный расчет, возлагая контроль уникальности и отсутствие суффиксов "000" на программный код разработчика.