1С: работа с регистром «АдресныйОбъект»
Намедни прилетела интересная задача: создать визуальный построитель адреса доставки счёта клиента согласно данным ФИАС в древней не обновляемой конфигурации 1С. Первоначально подумал покопать в сторону сервиса https://fias-public-service.nalog.ru/api/spas/v2.0/swagger/index.html, написал заявку на генерацию ключа API для доступа, отправил её на указанную электронную почту…и тишина. Тащить самому адреса ФИАС и файлов и создавать для этого обвязку в конфигурараторе — трудоёмко. Но неожиданно возникла идея — а есть же обновляемая регулярно конфигурация 1С «Бухгалтерия», где этот справочник вполне используется и регулярно обновляется. Следовательно мы можем просто создать..ну например WEB сервис, при помощи которого будем тянуть данные для построения адреса из Бухгалтерии. Можно данные тянуть из регистров АдресныйОбъект, ДополнительныеАдресныеСведения, ИерархияАдресов и т.д, а можно покопать БСП, найти все нужные функции. За сим и оформил сервис:
&НаСервере
Функция ПолучитьПрокси()
Определение = Новый WSОпределения(
Константы.СК_БУХURLВебСервиса.Получить(),
Константы.СК_БУХИмяПользователя.Получить(),
Константы.СК_БУХПароль.Получить()
//,ИнтернетПрокси
);
Прокси = Новый WSПрокси(
Определение,
Константы.СК_БУХURIПространстваИмен.Получить(),
"sk_SOAP_Services",
"sk_SOAP_ServicesSoap"
);
Прокси.Пользователь = Константы.СК_БУХИмяПользователя.Получить();
Прокси.Пароль = Константы.СК_БУХПароль.Получить();
Возврат Прокси;
КонецФункции
Функция sk_gr_fias_exchange(request, params)
params=JSONВСтруктуру(params);
МассивДляВозврата=Новый Массив();
if (request="GetAdresses") тогда
//Parent,Level,TypeAddress,Counts,Poz,FindStr
ДополнительныеПараметры=Новый Структура("КоличествоЗаписей,Позиция,СтрокаПоиска",params.Counts,params.Poz,params.FindStr);
ТЗ=АдресныйКлассификаторСлужебный.АдресаДляИнтерактивногоВыбора(Новый УникальныйИдентификатор(params.Parent), params.Level, params.TypeAddress, ДополнительныеПараметры);
МассивДляВозврата=Новый Массив();
для каждого стр из ТЗ.Данные цикл
инф=Новый Структура("Идентификатор,Представление",Строка(стр.Идентификатор),Строка(стр.Представление));
МассивДляВозврата.Добавить(инф);
конеццикла;
конецесли;
if (request="GetHomes") тогда
ТЗ=АдресныйКлассификаторСлужебный.СписокДомов(Новый УникальныйИдентификатор(params.Parent),params.FindStr,params.Counts);
МассивДляВозврата=Новый Массив();
для каждого стр из ТЗ цикл
инф=Новый Структура("Идентификатор,Представление,Индекс",Строка(стр.Идентификатор),Строка(стр.Представление),Строка(стр.Значение.Индекс));
МассивДляВозврата.Добавить(инф);
конеццикла;
конецесли;
Возврат СтруктураВСтрокуJSON(МассивДляВозврата);
КонецФункции
На целевой конфигурации, остаётся только дергать вызовы:
&НаСервере
Функция ПолучитьСписокАдресов(Родитель,Уровень)
// Уровень: 1- регион,2 - район, 3 - муниципальный район, 4-поселение, 5-город, 6 -нс, 7 - территория, 8 - улица
Прокси=ПолучитьПрокси();
params=Новый Структура("Parent,Level,TypeAddress,Counts,Poz,FindStr");
params.Parent=Строка(Родитель);
params.Level=Уровень;
params.TypeAddress="Административно-территориальный";
params.Counts=500;
params.FindStr="";
Результат=Прокси.sk_gr_fias_exchange("GetAdresses",СтруктураВСтрокуJSON(params));
//сообщить(Результат);
возврат JSONВСтруктуру(Результат);
КонецФункции
&НаСервере
Функция ПолучитьСписокДомов(Родитель)
Прокси=ПолучитьПрокси();
params=Новый Структура("Parent,Level,TypeAddress,Counts,Poz,FindStr");
params.Parent=Строка(Родитель);
params.Counts=500;
params.FindStr="";
Результат=Прокси.sk_gr_fias_exchange("GetHomes",СтруктураВСтрокуJSON(params));
//сообщить(Результат);
возврат JSONВСтруктуру(Результат);
КонецФункции
И визуализировать всё подобным образом:
