Почему в 1С загружаются старые курсы валют и как исправить проблему?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Многие пользователи и администраторы систем 1С периодически сталкиваются с ситуацией, когда автоматическая загрузка курсов валют выдает данные за вчерашний день или вовсе не обновляет их в начале рабочего дня. Давайте разберем, почему это происходит и как настроить систему для корректной работы.

Разбор причин возникновения ошибки

Основная причина заключается в специфике работы Центрального банка Российской Федерации. Важно понимать, что ЦБ РФ устанавливает официальный курс валют не утром, а во второй половине дня (около 17:00 по московскому времени). При этом опубликованный курс вступает в силу на следующий календарный день.

Использование сторонних агрегаторов или устаревших настроек в конфигурациях 1С (например, использование «альтернативного сервера» для загрузки) часто приводит к тому, что система пытается получить данные до их официальной публикации, либо сервис-агрегатор работает с задержкой. В результате в учетную систему попадают неактуальные данные.

Решение для типовых конфигураций

Если вы используете типовое решение, такое как «Бухгалтерия предприятия» или «УПП», первым делом проверьте настройки источника загрузки. Часто проблема решается простым отключением использования сторонних серверов.

  1. Откройте константы или настройки параметров учета в вашей конфигурации.
  2. Найдите настройку с названием типа Использовать альтернативный сервер для загрузки курсов валют.
  3. Переведите значение в положение «Ложь» (выключить).
  4. После отключения попробуйте повторно запустить обработку загрузки курсов валют — система переключится на стандартный механизм, работающий напрямую с официальными ресурсами.

Техническое решение: прямая загрузка с сайта ЦБ РФ (пример на 1С 7.7)

Если типовые механизмы не обеспечивают нужного результата, наиболее надежным способом является написание собственной процедуры загрузки, обращающейся напрямую к 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 Банка России — это наиболее профессиональный и стабильный метод, который избавит вас от зависимости от сторонних сервисов, часто работающих нестабильно.

← На главную