В крупных компаниях и на режимных объектах часто возникает ситуация, когда рабочая база 1С развернута в закрытом локальном сегменте сети, полностью изолированном от интернета. В таких условиях стандартный механизм автоматического получения курсов валют с серверов фирмы 1С перестает работать. Бухгалтеру или администратору приходится искать альтернативные пути решения этой задачи.
В рамках этой статьи мы подробно разберем несколько проверенных практических способов загрузки курсов валют в информационную базу «1С:Бухгалтерия предприятия КОРП 3.0» (и любые другие конфигурации на базе Библиотеки стандартных подсистем — БСП) в режиме офлайн.
Если в вашей организации есть хотя бы один компьютер или «зеркальная» база 1С в сегменте с доступом в интернет, вы можете настроить регулярный экспорт и импорт данных без изменения конфигурации. Для этого мы будем использовать стандартный инструмент — обработку «Универсальный обмен данными в формате XML».
Давайте разберем этот процесс по шагам:
РегистрыСведений.КурсыВалют.Центральный Банк РФ ежедневно публикует актуальные курсы валют в формате XML. Мы можем написать простую внешнюю обработку, которая будет считывать эти файлы и автоматически записывать данные в регистр сведений 1С. Это позволит полностью исключить ручной ввод показателей.
Для начала проанализируем структуру XML-файла, предоставляемого Центробанком. Ссылка для получения ежедневных курсов выглядит следующим образом: XML_daily.asp?date_req=ДД/ММ/ГГГГ. Файл содержит перечень валют, их номиналы и курсы по отношению к рублю.
Рассмотрим пример кода, который выполняет чтение сохраненного файла и запись данных в базу 1С. Этот код вы можете использовать при создании собственной внешней обработки:
Процедура ЗагрузитьКурсыИзФайла(ПутьКФайлу) Экспорт
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если Не ФайлНаДиске.Существует() Тогда
ВызватьИсключение "Указанный файл не найден на диске!";
КонецЕсли;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
// Переходим к чтению структуры документа
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Valute" Тогда
КодВалюты = "";
Номинал = 1;
КурсЧислом = 0;
// Читаем внутренние элементы узла валюты
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "Valute" Тогда
Прервать;
КонецЕсли;
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ИмяЭлемента = ЧтениеXML.Имя;
ЧтениеXML.Прочитать(); // Переходим к значению
Если ИмяЭлемента = "CharCode" Тогда
КодВалюты = СокрЛП(ЧтениеXML.Значение);
ИначеЕсли ИмяЭлемента = "Nominal" Тогда
Номинал = Число(ЧтениеXML.Значение);
ИначеЕсли ИмяЭлемента = "Value" Тогда
// Заменяем запятую на точку для корректного преобразования в число
СтрокаКурса = СтрЗаменить(ЧтениеXML.Значение, ",", ".");
КурсЧислом = Число(СтрокаКурса);
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Если нашли нужную валюту в справочнике, записываем курс
СсылкаНаВалюту = Справочники.Валюты.НайтиПоКоду(КодВалюты);
Если Не СсылкаНаВалюту.Пустая() Тогда
ЗаписатьКурсВРегистр(СсылкаНаВалюту, ТекущаяДата(), КурсЧислом, Номинал);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
Сообщить("Загрузка курсов валют успешно завершена!");
КонецПроцедуры
Для записи полученных данных в регистр сведений воспользуемся менеджером записи. Проанализируем вспомогательную процедуру ЗаписатьКурсВРегистр, которая предотвратит дублирование данных на одну и ту же дату:
Процедура ЗаписатьКурсВРегистр(ВалютаСсылка, ДатаКурса, ЗначениеКурса, ЗначениеНоминала)
МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = НачалоДня(ДатаКурса);
МенеджерЗаписи.Валюта = ВалютаСсылка;
// Пытаемся прочитать существующую запись
МенеджерЗаписи.Прочитать();
// Заполняем ресурсы
МенеджерЗаписи.Курс = ЗначениеКурса;
МенеджерЗаписи.Кратность = ЗначениеНоминала;
// Записываем данные с замещением существующей строки
Попытка
МенеджерЗаписи.Записать(Истина);
Исключение
ЗаписьЖурналаРегистрации("Загрузка курсов", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Иногда под термином «офлайн» пользователи подразумевают ситуацию, когда физическое подключение к интернету на сервере присутствует, но стандартный механизм загрузки выдает ошибку. Это происходит из-за отсутствия подключенной интернет-поддержки (активной подписки 1С:ИТС) в закрытом корпоративном контуре.
В БСП (Библиотеке стандартных подсистем), на которой построена «1С:Бухгалтерия 3.0», разработчики заложили скрытую возможность обхода этой проблемы без изменения программного кода. Выясним, как ее активировать:
ИспользоватьАльтернативныйСерверДляЗагрузкиКурсовВалют).Что это дает? После активации этой опции система перестанет обращаться к закрытым серверам авторизации Портала 1С, требующим логин и пароль ИТС. Вместо этого программа будет отправлять запросы напрямую к открытым веб-сервисам РБК или Центробанка РФ. Для успешной загрузки вам потребуется настроить только прокси-сервер в разделе «Администрирование» (если доступ в интернет в вашей компании осуществляется через него).
Мы рассмотрели три эффективных метода работы с курсами валют в условиях ограничений сети. Для полной изоляции идеально подходит Способ 1 или автоматизация на базе Способа 2. Если же проблема кроется лишь в отсутствии авторизации на серверах 1С, то самым быстрым решением станет применение Способа 3.