При автоматизации учетных систем часто возникает необходимость загружать и поддерживать в актуальном состоянии классификатор населенных пунктов Российской Федерации. В платформе 1С версии 7.7 отсутствуют современные штатные механизмы прямой работы с REST-сервисами и фоновыми заданиями, поэтому задача получения списка городов требует особого подхода.
Рассмотрим подробнее основные способы решения этой задачи, их преимущества и технические особенности реализации.
Основным государственным источником адресной информации в РФ является Государственный адресный реестр (ГАР), пришедший на смену классическому ФИАС и КЛАДР. Реестр содержит полные сведения о всех административно-территориальных и муниципальных образованиях.
Проанализируем особенности работы с официальными реестрами:
Если нет необходимости хранить гигабайты данных на локальном сервере, оптимальным решением становится использование сторонних веб-сервисов и веб-API адресных подсказок (например, сервисов Kladr-API, Dadata и других аналогичных REST-ресурсов).
Разберем по шагам, как организовать взаимодействие с внешним API из платформы 1С 7.7:
WinHttp.WinHttpRequest.5.1 или MSXML2.ServerXMLHTTP.MSScriptControl.ScriptControl с языком VBScript или JScript.Посмотрим на пример реализации HTTP-запроса к внешнему API с помощью объекта WinHttp.WinHttpRequest.5.1:
// Создаем COM-объект для отправки HTTP-запросов
HTTPЗапрос = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
URL = "https://api.example.com/v1/cities";
HTTPЗапрос.Open("GET", URL, 0);
HTTPЗапрос.SetRequestHeader("Content-Type", "application/json");
HTTPЗапрос.Send();
Если HTTPЗапрос.Status = 200 Тогда
ОтветСтрокой = HTTPЗапрос.ResponseText;
// Далее выполняем разбор JSON-строки
Иначе
Сообщить("Ошибка выполнения запроса: " + HTTPЗапрос.Status);
КонецЕсли;
Для разбора JSON-строки с полученным списком городов разберем следующий пример с использованием MSScriptControl.ScriptControl:
Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.Language = "JScript";
// Добавляем функцию-обертку для парсинга JSON
Скрипт.AddCode("function parseJson(str) { return eval('(' + str + ')'); }");
JSОбъект = Скрипт.Run("parseJson", ОтветСтрокой);
// Далее организуем обход полученного массива объектов в цикле
Если задачу требуется решить без сложных загрузок и обращений к внешним сервисам, можно использовать Общероссийский классификатор территорий муниципальных образований (ОКТМО). Он содержит иерархическую структуру регионов, районов и городов, при этом его объем значительно меньше полных адресных реестров.
Таким образом, выбор конкретного решения зависит от требований к автономности базы: для онлайн-работы подходят REST API и веб-сервисы, а для автономных баз — регулярная загрузка дельта-файлов ГАР/ФИАС.