Приветствуем вас, уважаемые коллеги! При работе с обработкой автоматической загрузки банковских выписок из систем «Клиент-Банк» специалисты и бухгалтеры нередко сталкиваются со странной и крайне неприятной ошибкой: «При пересчете из валюты 'RUB' в валюту '' обнаружен нулевой курс. Пересчет не произведен!». Параллельно в окне сообщений выводится информация о том, что целевой документ (например, исходящее платежное поручение) не был создан из-за ошибок при записи в информационную базу.
Ситуация на первый взгляд кажется парадоксальной: расчетный счет организации ведется в рублях, контрагент отечественный, платеж стандартный (например, налоговый), и ранее аналогичные операции загружались без каких-либо затруднений. Почему же система вдруг начинает «требовать» курс для несуществующей или пустой валюты? Давайте подробно разберем эту проблему по шагам, выясним неочевидные технические причины и рассмотрим проверенные практические способы её решения.
Как показывает практика и обсуждения на профессиональных форумах 1С, наиболее частой причиной этой ошибки является банальный сбой нумерации документов в информационной базе. На первый взгляд связь между номером документа и курсом валюты кажется неочевидной, но давайте проанализируем внутренние технические механизмы платформы.
Когда обработка «Клиент-Банк» пытается создать и записать новый документ ПлатежноеПоручениеИсходящее (или аналогичный документ списания), система выполняет стандартную транзакцию записи в базу данных. Если в процессе записи выясняется, что документ с таким номером уже существует (или нарушена уникальность номеров из-за ручного редактирования номеров пользователями ранее), транзакция прерывается с ошибкой «Произошли ошибки при записи!».
Однако перед самой отменой транзакции или в процессе выполнения обработчиков событий ПередЗаписью и ПриЗаписи платформа пытается выполнить регламентные проверки и расчеты. В этот момент некоторые реквизиты объекта (включая ссылки на валюту договора или счета) могут быть не до конца инициализированы или сброшены в пустую ссылку. Алгоритм проведения натыкается на пустую целевую валюту, пытается получить её курс и выдает ложное сообщение о нулевом курсе. Эта ошибка маскирует истинную проблему — конфликт уникальности номеров.
Давайте разберем по шагам, как восстановить корректную автонумерацию документов:
Рассмотрим пример кода, который можно использовать во внешней обработке для программного исправления сбитых номеров у документов за выбранный период:
Выборка = Документы.ПлатежноеПоручениеИсходящее.Выбрать(НачалоГода(ТекущаяДата()), КонецДня(ТекущаяДата()));
Пока Выборка.Следующий() Цикл
ОбъектДок = Выборка.ПолучитьОбъект();
// Сбрасываем номер для автоматической генерации платформой по порядку
ОбъектДок.УстановитьНовыйНомер();
Попытка
ОбъектДок.Записать(РежимЗаписиДокумента.Запись);
Исключение
Сообщить("Не удалось перезаписать документ: " + Выборка.Ссылка + " Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
В типовых конфигурациях 1С (особенно прошлых поколений, таких как «Управление производственным предприятием 1.3» или «Комплексная автоматизация 1.1») существует официально зарегистрированный баг с кодом 30009619.
Суть этой ошибки заключается в следующем: при импорте текстового файла выписки обработка «Клиент-Банк» некорректно сопоставляет виды операций для определенных типов платежей (например, для налоговых перечислений или возвратов от поставщиков). Программа автоматически назначает документу вид операции «Перевод на другой счет».
Даже если вы визуально замечаете эту нестыковку в форме предварительного просмотра выписки и вручную меняете вид операции перед нажатием кнопки «Выполнить загрузку», в коде обработки при непосредственной программной записи объекта все равно срабатывает жестко зашитый алгоритм, который ищет реквизиты, характерные для перевода между счетами. Поскольку валюта второго (несуществующего) расчетного счета не определена, возникает ошибка пересчета в пустую валюту.
Давайте рассмотрим пути решения этой проблемы:
Давайте проанализируем еще одну частую причину сбоя — настройки справочника банковских счетов организации. Программа 1С при чтении выписки сопоставляет банковские реквизиты, указанные в файле импорта, с карточками счетов в вашей базе данных.
Если в карточке расчетного счета вашей организации по какой-то причине не заполнено поле «Валюта учета» или значение этого реквизита «слетело» при обновлении либо некорректном обмене данными, алгоритм загрузки получит пустую ссылку вместо валюты. Программа попытается пересчитать сумму платежа из валюты документа (RUB) в валюту счета (которая пуста), что мгновенно приведет к ошибке нулевого курса.
Выполним проверку реквизитов счета по шагам:
RUB (или руб.). Если поле пустое, выберите валюту из классификатора и сохраните изменения в карточке счета.При загрузке выписок 1С пытается автоматически определить контрагента по ИНН/КПП или расчетному счету и подобрать для него подходящий договор. Договор является ключевым аналитическим разрезом взаиморасчетов, и у него обязательно должна быть заполнена валюта.
Если у контрагента, по которому проводится платеж, в базе данных создан договор по умолчанию, но в нем не заполнена (или очищена) валюта расчетов, программа при попытке проведения платежа столкнется с конфликтом. Алгоритм проведения попытается пересчитать сумму платежа из рублей в валюту взаиморасчетов по договору. Поскольку валюта договора пустая (''), система выдаст нам уже знакомое сообщение об ошибке нулевого курса.
Давайте проверим договоры контрагентов по шагам:
RUB. Если поле пустое или содержит неверную валюту, исправьте значение и запишите договор.Несмотря на то, что рубль является национальной валютой, для корректной работы математических функций пересчета в платформе 1С в регистре сведений КурсыВалют обязательно должна присутствовать запись для валюты RUB.
Иногда при импорте архивных документов за прошлые периоды или при операциях будущей датой программа обращается к регистру курсов на дату документа. Если на эту дату (или на более раннюю дату, выполняющую роль начальной точки отсчета) в регистре нет записи по рублю с курсом 1 и кратностью 1, функция получения курса вернет пустые параметры. Это приведет к ошибке нулевого курса при пересчете.
Проверим и исправим записи в регистре сведений:
RUB (код 643 или 810).Если визуальный осмотр номеров и реквизитов не дал результатов, рассмотрим, как локализовать ошибку с помощью встроенного отладчика 1С. Это самый надежный путь, позволяющий точно определить, на какой строчке кода программа теряет валюту.
ПредприятиеКлиент или общий модуль РаботаСВалютами).ПолучитьКурсИКратность()) и установите точку останова в самом начале этой функции.Пример отладочного кода в процедуре пересчета валюты выглядит следующим образом:
Функция ПолучитьКурсИКратность(Валюта, Дата) Экспорт
Если Не ЗначениеЗаполнено(Валюта) Тогда
// Точка останова сработает здесь, когда вместо валюты передается ''
ЗаписатьВЖурналРегистрации("ОшибкиЗагрузки", УровеньЖурналаРегистрации.Ошибка,,, "Пустая валюта при пересчете!");
Возврат Неопределено;
КонецЕсли;
...
КонецФункции
Запустите отладку (клавиша F5), откройте обработку загрузки выписки в режиме предприятия и запустите процесс импорта. Когда выполнение программы прервется на вашей точке останова, откройте табло (Ctrl + Alt + W) и проанализируйте стек вызовов. Вы увидите, какая именно процедура верхнего уровня передала пустую валюту в качестве параметра.
Подводя итог, если вы столкнулись с ошибкой нулевого курса при импорте выписки через клиент-банк, рекомендуем придерживаться следующего пошагового алгоритма совместной диагностики:
Применяя эти комплексные методы, вы гарантированно решите проблему с загрузкой банковских выписок и обеспечите стабильную работу вашей учетной системы 1С.