Каталог решений - 1С 7.7 и новый 1С:Контрагент

1С 7.7 и новый 1С:Контрагент

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);
		
	КонецЕсли;
			
	Возврат РеквизитыКонтрагента;
	
КонецФункции	

 

has been added to your cart:
Оформление заказа