В работе бухгалтера и технического специалиста 1С часто возникает ситуация, когда при загрузке курсов валют за определенный период обнаруживаются «пробелы». Типичный пример — отсутствие данных за выходные дни, такие как 11 ноября 2018 года. В этой статье мы подробно разберем, почему это происходит, как устроена логика получения данных от Центрального Банка РФ и что делать, если привычные сервисы (например, РБК) перестают отдавать информацию.
Прежде чем искать техническую ошибку в коде 1С или конфигурации, нам необходимо понять, как формируются курсы валют на государственном уровне. Центральный Банк Российской Федерации (ЦБ РФ) устанавливает официальные курсы валют только по рабочим дням. В выходные и праздничные дни новые курсы не назначаются.
Рассмотрим стандартный цикл обновления курсов:
Проанализируем ситуацию пользователя: 11 ноября 2018 года было воскресеньем. Следовательно, отдельной записи в базе самого ЦБ за эту дату просто не существует. Для учетных систем это означает, что должен использоваться последний актуальный курс, установленный ранее (обычно за 10 ноября, который был утвержден еще 9 ноября в пятницу).
В старых конфигурациях 1С и самописных решениях часто использовался сервис cbrates.rbc.ru. Однако со временем этот ресурс стал работать нестабильно, выдавая ошибки 404 Not Found или 500 Internal Server Error. Выясним причину: это связано с изменением политики РБК по предоставлению данных и переходом на новые протоколы взаимодействия.
Если ваша программа 1С настроена на получение данных с РБК, вы можете столкнуться с тем, что за выходные дни файлы просто не формируются на стороне сервера-источника, либо структура запроса больше не поддерживается. Рассмотрим альтернативу — сервисы компании 1С. Начиная с определенных версий БСП (Библиотеки стандартных подсистем), загрузка данных осуществляется через шлюзы 1С, которые агрегируют информацию напрямую с сайта ЦБ РФ и кешируют ее для стабильной отдачи пользователям.
Чтобы исправить ситуацию с загрузкой, нам нужно проверить, какой именно источник данных используется в программе. В современных типовых решениях (БП 3.0, УТ 11, ERP 2) это делается в разделе администрирования. Разберем по шагам:
Если у вас «самописка» на базе старой БСП, как упоминалось в обсуждении, проблема может быть глубже — в жестко прописанном URL-адресе в коде обработки. Проанализируем, как это можно исправить программно.
Если вы столкнулись с тем, что стандартная обработка загрузки не справляется, рассмотрим пример того, как можно организовать получение данных напрямую с сайта ЦБ РФ (cbr.ru), используя их XML-сервис. Это надежнее, чем использование сторонних посредников.
Для реализации загрузки нам понадобится объект HTTPСоединение и парсинг полученного XML-файла. Посмотрим на логику формирования запроса:
// Пример формирования запроса к шлюзу ЦБ
Соединение = Новый HTTPСоединение("www.cbr.ru");
АдресРесурса = "scripts/XML_daily.asp?date_req=" + Формат(НужнаяДата, "ДФ=dd/MM/yyyy");
Запрос = Новый HTTPЗапрос(АдресРесурса);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
// Далее следует логика обхода узлов XML и записи в регистр "КурсыВалют"
КонецЕсли;
Важно помнить, что в 1С РегистрСведений.КурсыВалют является периодическим. Если за 11 число курса нет в файле, система должна уметь брать данные за предыдущий день. Проанализируем ситуацию: если мы программно создадим запись за 11-е число, скопировав данные за 10-е, это решит проблему «пустот» в отчетах, но технически правильнее использовать методы получения последнего значения.
Многие пользователи переживают, что отсутствие записи в регистре именно за 11-11-2018 приведет к ошибкам в документах. Выясним, почему это не так, если обращение к курсу написано правильно. В системе 1С при получении курса из периодического регистра сведений рекомендуется использовать метод ПолучитьПоследнее().
Рассмотрим пример кода, который гарантированно вернет курс, даже если на конкретную дату (выходной) записи нет:
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Валюта", СсылкаНаВалюту);
КурсНаДату = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ДатаДокумента, ПараметрыОтбора);
Сообщить("Актуальный курс: " + КурсНаДату.Курс);
Этот метод автоматически «просмотрит» историю назад и возьмет значение за пятницу или субботу, если за воскресенье данных нет. Именно так работают все типовые механизмы проведения документов.
Подведем итог и составим план действий, если курсы за выходные не подгружаются или сервис выдает ошибку:
РаботаСКурсамиВалют из состава актуальной Библиотеки стандартных подсистем.РегламентныеЗадания по загрузке курсов выполняются ежедневно. Это позволит системе своевременно получать курсы на субботу (которые действуют всё воскресенье).cbr.ru и 1c.ru по протоколам HTTP/HTTPS.Таким образом, ситуация с «пропавшими» курсами за 11.11.2018 чаще всего объясняется сочетанием естественного отсутствия данных в выходные дни и технического сбоя на стороне устаревшего шлюза РБК. Переход на современные механизмы 1С и правильное использование программных методов получения данных из регистров полностью решают эту проблему.