Многие пользователи и администраторы систем 1С периодически сталкиваются с ситуацией, когда автоматическая загрузка курсов валют выдает данные за вчерашний день или вовсе не обновляет их в начале рабочего дня. Давайте разберем, почему это происходит и как настроить систему для корректной работы.
Основная причина заключается в специфике работы Центрального банка Российской Федерации. Важно понимать, что ЦБ РФ устанавливает официальный курс валют не утром, а во второй половине дня (около 17:00 по московскому времени). При этом опубликованный курс вступает в силу на следующий календарный день.
Использование сторонних агрегаторов или устаревших настроек в конфигурациях 1С (например, использование «альтернативного сервера» для загрузки) часто приводит к тому, что система пытается получить данные до их официальной публикации, либо сервис-агрегатор работает с задержкой. В результате в учетную систему попадают неактуальные данные.
Если вы используете типовое решение, такое как «Бухгалтерия предприятия» или «УПП», первым делом проверьте настройки источника загрузки. Часто проблема решается простым отключением использования сторонних серверов.
Использовать альтернативный сервер для загрузки курсов валют.Если типовые механизмы не обеспечивают нужного результата, наиболее надежным способом является написание собственной процедуры загрузки, обращающейся напрямую к XML-интерфейсу Банка России. Рассмотрим алгоритм, который позволяет получать актуальные курсы с сайта cbr.ru.
Для парсинга XML-ответа мы будем использовать объект Microsoft.XMLDOM. Основная логика заключается в формировании правильного URL-запроса и последующей обработке полученных данных.
Рассмотрим пример кода, который можно адаптировать для ваших задач:
Функция ЗагрузитьУзлыXMLвСЗ(Корень, Узлы)
сзРезультат = СоздатьОбъект("СписокЗначений");
АтрибутыУзла = Корень.Attributes;
Если АтрибутыУзла.length <> 0 Тогда
Для атр = 0 По АтрибутыУзла.length - 1 Цикл
узелАтрибута = АтрибутыУзла.item(атр);
ИмяАтрибута = узелАтрибута.nodename;
сзРезультат.ДобавитьЗначение(узелАтрибута.text, ИмяАтрибута);
КонецЦикла;
КонецЕсли;
Для инд = 0 По Узлы.length - 1 Цикл
узел = Узлы.item(инд);
ИмяУзла = узел.nodename;
ПодчиненныеУзлы = узел.childNodes;
Если ПодчиненныеУзлы.length = 0 Тогда
Если ИмяУзла = "#text" Тогда
сзРезультат = узел.text;
Иначе
сзРезультат.ДобавитьЗначение(узел.text, ИмяУзла);
КонецЕсли;
Иначе
сзРезультат.ДобавитьЗначение(ЗагрузитьУзлыXMLвСЗ(узел, ПодчиненныеУзлы), ИмяУзла);
КонецЕсли;
КонецЦикла;
Возврат сзРезультат;
КонецФункции
Для преобразования полученных данных в таблицу, удобную для записи в регистр сведений или периодические реквизиты, используем функцию ПреобразоватьОтвет, где происходит приведение типов и замена разделителей дробной части:
Функция ПреобразоватьОтвет(ОтветСервера)
тзРезультат = глСоздатьТаблицу("Дата,Курс,Кратность");
сзСтруктураОтвета = ЗагрузитьXMLвСЗ(ОтветСервера);
Для инд = 1 По сзСтруктураОтвета.РазмерСписка() Цикл
ИмяУзла = "";
ЭлементОтвета = сзСтруктураОтвета.ПолучитьЗначение(инд, ИмяУзла);
Если ИмяУзла <> "Record" Тогда
Продолжить;
КонецЕсли;
тзРезультат.НоваяСтрока();
тзРезультат.Дата = Дата(ЭлементОтвета.Получить("Date"));
тзРезультат.Курс = Число(СтрЗаменить(ЭлементОтвета.Получить("Value"), ",", "."));
тзРезультат.Кратность = Число(СтрЗаменить(ЭлементОтвета.Получить("Nominal"), ",", "."));
КонецЦикла;
Возврат тзРезультат;
КонецФункции
При самостоятельной разработке механизма загрузки обязательно учитывайте следующие нюансы:
Периодический реквизит.ДД/ММ/ГГГГ) и корректным преобразованием строкового значения курса в числовой тип с учетом запятой как разделителя.Периодический для записи данных. Перед записью всегда проверяйте, изменился ли курс, чтобы не создавать избыточных записей в истории изменений.Перевод интеграции на прямые запросы к API Банка России — это наиболее профессиональный и стабильный метод, который избавит вас от зависимости от сторонних сервисов, часто работающих нестабильно.