1С 7.7 и новый 1С:Контрагент
Получение реквизитов контрагентов из 1С:Контрагент для старых конфигураций под 1с 7.7.
- Описание
- Подробнее
Описание
Попросили поделиться своим кодом для получения и разбора данных из 1С:Контрагент по их новому rest интерфейсу. Ничего сложного там нет, для разбора json использован и немного переработан код из Парсер JSON для платформы 7.7
Для работы нужен 1с++
Основная функция — глПолучитьРеквизитыКонтрагентаПоИНН(ИНН), ИНН нужно передавать уже "очищенный" от КПП.
Результат — Структура с данными, по коду, думаю, разберётесь какие свойства заполняются.
В моей конфигурации в справочнике "Контрагенты" есть реквизиты "Страна" и "Город", "Страна" — это обычный "ОКСМ", "Город" — это по сути аналог справочника "Регионы" в каких то типовых, у вас может ничего этого не быть
Ах да, ещё, я не смогла найти список кодов статуса, которые выдаёт сервис, поэтому добавила в конфигурацию справочник, куда добавляю коды статуса, которые являются допустимыми для добавления контрагента, на сегодняшний день я смогла "вычислить" три таких: 001,112,132
Функция НайтиГородПоНаименованию(НаимГорода)
НаимГорода = глПреобразоватьРегистр(НаимГорода);
спрГорода = СоздатьОбъект("Справочник.Города");
Если спрГорода.НайтиПоНаименованию(наимГорода, 0, 1) = 1 Тогда
Возврат спрГорода.ТекущийЭлемент();
КонецЕсли;
Возврат "";
КонецФункции
Функция НайтиСтрануПоКоду(КодСтраны)
спрСтраны = СоздатьОбъект("Справочник.ОКСМ");
Если спрСтраны.НайтиПоКоду(КодСтраны, 0) = 1 Тогда
Возврат спрСтраны.ТекущийЭлемент();
КонецЕсли;
Возврат "";
КонецФункции
Функция jsonВСтруктуру(obj)
scriptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
scriptCtrl.Language="jscript";
код = "
|
| // Получить элемент массива
| function aGet(Array, index) {
| return(Array[index]);
| }
|
| // Получить ключ пары по индексу
| function oKey(Obj, index) {
| var size = 0, key;
| for (key in Obj) {
| if (size == index) break;
| if (Obj.hasOwnProperty(key)) size++;
| }
| return(key);
| }
|
| // Получить значение пары по ключу
| function oValueByKey(Obj, key) {
| return(Obj[key]);
| }
|
| //Получить количество пар в объекте
| Object.size = function(obj) {
| var size = 0, key;
| for (key in obj) {
| if (obj.hasOwnProperty(key)) size++;
| }
| return(size);
| }
|
| //Получить размер объекта (количество пар в нём)
| function oSize(Obj) {
| return(Object.size(Obj));
| }
|
| // Получить тип объекта (number, string, object, array)
| function eType(Element) {
| if (Element instanceof Array) {
| return(""array"");
| } else if (Object.prototype.toString.call(Element) === '[object Array]') {
| return(""array"");
| } else {
| return(typeof(Element));
| }
| }
|";
scriptCtrl.AddCode(код);
РезультатРазбора = СоздатьОбъект("Структура");
ТипОбъекта = scriptCtrl.run("eType", obj);
Если ТипОбъекта = "object" Тогда
Для н=0 По scriptCtrl.run("oSize", obj)-1 Цикл
Ключ = scriptCtrl.run("oKey", obj, н);
Значение = scriptCtrl.run("oValueByKey", obj, Ключ);
ТипЗнач = scriptCtrl.run("eType", Значение);
//Сообщить(Ключ + " = " + Значение + " ("+ ТипЗнач +")");
Если Найти("number, string", ТипЗнач) > 0 Тогда
РезультатРазбора.Вставить(Ключ, Значение);
ИначеЕсли Найти("object, array", ТипЗнач) > 0 Тогда
РезультатРазбора.Вставить(Ключ, jsonВСтруктуру(Значение));
КонецЕсли;
КонецЦикла;
ИначеЕсли ТипОбъекта = "array" Тогда
Для н=0 По obj.length-1 Цикл
Ключ = СокрЛП(Строка(н));
Значение = scriptCtrl.run("aGet", obj, н);
ТипЗнач = scriptCtrl.run("eType", Значение);
Если Найти("number, string", ТипЗнач) > 0 Тогда
РезультатРазбора.Вставить(Ключ, Значение);
ИначеЕсли Найти("object, array", ТипЗнач) > 0 Тогда
РезультатРазбора.Вставить(Ключ, jsonВСтруктуру(Значение));
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат РезультатРазбора;
КонецФункции //jsonВСписок(obj)
Функция глРазборJSON(Знач Стр) Экспорт //На входе строка в текущей системной кодировке
scriptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
scriptCtrl.Language="jscript";
Рез = scriptCtrl.Eval("("+СтрЗаменить(стр, РазделительСтрок,"")+");");
РезультатРазбора = jsonВСтруктуру(Рез);
Возврат РезультатРазбора;
КонецФункции //глРазборJSON(Знач Стр)
Функция глПолучитьРеквизитыКонтрагентаПоИНН(ИНН) Экспорт
РеквизитыКонтрагента = СоздатьОбъект("Структура");
РеквизитыКонтрагента.Вставить("КодСтатус", 0);
РеквизитыКонтрагента.Вставить("ЗапретитьОтгрузку", 0);
спрКодСтатусаКонтрагента = СоздатьОбъект("Справочник.КодыСтатусаКонтрагента");
Если СтрДлина(СокрЛП(ИНН)) = 10 Тогда
Ресурс = "/rest/corporation/v1/find-corporation-by-inn";
Иначе
Ресурс = "/rest/person/v1/find-person-by-inn"
КонецЕсли;
Параметр = "?inn=" + ИНН;
Запрос = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
Запрос.Open("GET", "https://api.orgregister.1c.ru" + Ресурс + Параметр, 0);
Запрос.SetCredentials(СокрЛП(Константа.ЛогинИТС), СокрЛП(Константа.ПарольИТС), 0);
Запрос.Send("");
Если Запрос.Status = 200 Тогда
РезультатРазбора = глРазборJSON(Запрос.ResponseText);
Если РезультатРазбора.Количество() = 1 Тогда
Предупреждение("Контагента с ИНН = " + ИНН + " не существует!");
РеквизитыКонтрагента.ЗапретитьОтгрузку = 1;
Возврат РеквизитыКонтрагента;
КонецЕсли;
Если СтрДлина(СокрЛП(ИНН)) <= 10 Тогда
Наименование = РезультатРазбора.name;
РеквизитыКонтрагента.Вставить("Наименование", Наименование.commonName);
РеквизитыКонтрагента.Вставить("ПолнНаименование", Наименование.fullName);
Статус = РезультатРазбора.status;
РеквизитыКонтрагента.Вставить("КодСтатус", Статус.code);
Если спрКодСтатусаКонтрагента.НайтиПоКоду(РеквизитыКонтрагента.КодСтатус) = 0 Тогда
РеквизитыКонтрагента.ЗапретитьОтгрузку = 1;
Предупреждение("Контрагент в статусе " + Статус.name);
Возврат РеквизитыКонтрагента;
КонецЕсли;
РеквизитыКонтрагента.Вставить("ОГРН", РезультатРазбора.ogrn);
КПП = РезультатРазбора.kpp;
РеквизитыКонтрагента.Вставить("КПП", КПП.value);
Если РезультатРазбора.Свойство("headPersonInfo") = 1 Тогда
Руководители = РезультатРазбора.headPersonInfo;
Директор = Руководители.director;
Контакт = СоздатьОбъект("Структура");
Контакт.Вставить("Должность", Директор.position);
Контакт.Вставить("ФИО", Директор.lastName + " " + Директор.name + " " + Директор.patronymic);
РеквизитыКонтрагента.Вставить("Контакт", Контакт);
КонецЕсли;
Адрес = РезультатРазбора.address;
//{Юридический адрес
//1.Страна
Страна = Адрес.country;
КодСтраны = Адрес.countryCode;
спрСтрана = НайтиСтрануПоКоду(КодСтраны);
Если ПустоеЗначение(спрСтрана) = 0 Тогда
РеквизитыКонтрагента.Вставить("Страна", спрСтрана);
КонецЕсли;
Если Адрес.Свойство("city") = 1 Тогда
Город = Адрес.city;
Иначе
Город = Адрес.area;
КонецЕсли;
спрГород = НайтиГородПоНаименованию(Город);
Если ПустоеЗначение(спрГород) = 0 Тогда
РеквизитыКонтрагента.Вставить("Город", спрГород);
КонецЕсли;
РеквизитыКонтрагента.Вставить("ЮридическийАдрес", Адрес.valueWithPostalCode);
//}
Иначе
СвФЛ = РезультатРазбора.person;
РеквизитыКонтрагента.Вставить("Наименование", СвФЛ.lastName + " " + Лев(СвФЛ.name, 1) + ". " + Лев(СвФЛ.patronymic, 1) + ". ИП");
РеквизитыКонтрагента.Вставить("ПолнНаименование", "ИП " + СвФЛ.fio);
РеквизитыКонтрагента.Вставить("Пол", СвФЛ.gender);
Информация = РезультатРазбора.registrationInfo;
Статус = Информация.status;
РеквизитыКонтрагента.Вставить("КодСтатус", Статус.code);
Если спрКодСтатусаКонтрагента.НайтиПоКоду(РеквизитыКонтрагента.КодСтатус) = 0 Тогда
РеквизитыКонтрагента.ЗапретитьОтгрузку = 1;
Предупреждение("Контрагент в статусе " + Статус.name);
Возврат РеквизитыКонтрагента;
КонецЕсли;
Гражданство = РезультатРазбора.citizenship;
Страна = Гражданство.countryName;
КодСтраны = Гражданство.countryCode;
спрСтрана = НайтиСтрануПоКоду(КодСтраны);
Если ПустоеЗначение(спрСтрана) = 0 Тогда
РеквизитыКонтрагента.Вставить("Страна", спрСтрана);
КонецЕсли;
КонецЕсли;
Иначе
Предупреждение("Не удалось связазться с сервером: " + Запрос.statusText);
КонецЕсли;
Возврат РеквизитыКонтрагента;
КонецФункции

