Заполнение реквизитов контрагентов по ИНН

Обработки - Обработка справочников

Обработка получает данные юридического лица или ИП с бесплатного сервиса https://огрн.онлайн/. Заполняет реквизиты: ИНН, КПП, наименования, юр. адрес, ФИО директора.

Работает со всеми стандартными конфигурациями. Есть управляемая и обычная формы. Можно встроить в конфигурацию, можно использовать самостоятельно.

Процедура обработки для заполнения реквизитов по ИНН:

//ИНН(строка) - номер по которому ищем контрагента 
//ТекстОтвета(строка) - переменная в которой будет текст ответа с сервиса в формате JSON после поиска
//Результат(структура) - переменная в которой будет распарсенный текст ответа после поиска. Данных больше, чем может предусмотрено полей в справочнике "Контрагенты"
//Контрагент(справочникОбъект.Контрагенты) - переменная в которой будет заполненный элемент справочника после поиска. Если параметр не передавать, элемент не заполняется.
//ТекстОшибки(строка) - переменная в которой будет текст возникшей ошибки при после поиска.
Процедура Заполнить(ИНН, ТекстОтвета = Неопределено, Результат = Неопределено, Контрагент = Неопределено, ТекстОшибки = "")

Пример кода для встраивания в УТ 10:

Процедура ЗаполнитьПОИНННажатие(Элемент)
    ОбработкаЗаполнения = Обработки.ДанныеКонтрагентаПоИНН.Создать();
    ТекстОшибки = "";
    
    Результат = Новый Структура;
    ТекстОтвета = "";

    ОбработкаЗаполнения.Заполнить(ИНН, ТекстОтвета, Результат, ЭтотОбъект, ТекстОшибки);//параметры 
    Если Не ТекстОшибки = "" Тогда
        Сообщить(ТекстОшибки);
    Иначе
        ПриОткрытии();
        КонтактныеЛицаКонтрагента.Отбор.Владелец.Значение      = Ссылка;
        КонтактныеЛицаКонтрагента.Отбор.Владелец.Использование = Истина;
        УправлениеКонтактнойИнформацией.ПрочитатьКонтактнуюИнформацию(НаборКонтактнойИнформации, Ссылка);
    КонецЕсли;
КонецПроцедуры

После загрузки данных программа возвращает:

  1. Текст ответа с сервера в формате JSON для самостоятельной обработки.
  2. Распарсенный текст в виде структуры 1С
  3. Заполненный элемент справочника "Контрагенты"

Для работы необходима версия платформы не ниже 8.3.6.1977

Тестирование производилось на конфигурациях:

  • Управление торговлей, редакция 10.3.40.1, 11.2.3.200
  • Бухгалтерия предприятия, редакция 2.0.66.36, 3.0.52.35.

Скачать файлы

Наименование Файл Версия Размер
Заполнение реквизитов контрагентов по ИНН:
.epf 13,95Kb
03.10.17
64
.epf 13,95Kb 64 Скачать

См. также

Комментарии
1. Дмитрий К (InzPtic) 26.09.17 10:59 Сейчас в теме
После загрузки данных программа возвращает:

1. Текст ответа с сервера в формате JSON для самостоятельной обработки.
2. Распарсенный текст в виде структуры 1С
3. Заполненный элемент справочника "Контрагенты"

1. Зачем бухгалтеру (я так понимаю именно он будет использовать обработку) пункты 1 и 2?
2. Что будет, если элемента справочника "Контрагенты" в базе нет? Будет создан новый/выдаст сообщение об ошибке/прочее?
3. Элемент справочника "Контрагенты" открывается пользователю уже записанным или у пользователя есть возможность отменить то, что обработка наделала?
2. Василий Василий (vasya_vasechkin) 6 26.09.17 11:54 Сейчас в теме
1. текст ответа бухгалтеру не нужен, это для программиста. Может он захочет сам обработать ответ.
2. обработка не ищет контрагента в справочнике.
3. элемент справочника будет записан, иначе невозможно заполнить адрес и контактные лица.

если нет необходимости заполнять элемент справочника, можно вызвать процедуру без соответствующего параметра, получить в ответ структуру данных и обрабатывать эти данные по своему усмотрению.
3. Дмитрий К (InzPtic) 26.09.17 13:32 Сейчас в теме
(2)
1. Я про то и говорю. Не будет программист работать с этой обработкой. Только на этапе отладки. После этого он передаст её бухгалтеру и тогда текст ответа будет избыточным
2. Если не ищет, как тогда? Пользователь сам выбирает нужный элемент?
3. Возможно всё. Например делать в транзакции и откатывать её если пользователь не хочет изменений. Есть ещё масса других вариантов. Смысл в том, что пользователь должен иметь возможность отказаться от перезаполнения данных если считает их неверными.
4. Василий Василий (vasya_vasechkin) 6 26.09.17 14:19 Сейчас в теме
Уважаемый, я сделал просто функцию по заполнению реквизитов контрагента. Если Вам нужны дополнительные возможности, Вы можете сделать их сами.
5. serpent Пентюхов С. Г. (serpent) 40 26.09.17 15:32 Сейчас в теме
не интересно, модуль закрыт.
6. Евгений Басевич (Atrocity) 27 01.10.17 10:08 Сейчас в теме
Зря потратил 1 стартмани. Сожалею. Сочувствую разрабочикам, которые стесняются открывать свои модули.
7. Ден (lion11) 139 03.10.17 10:31 Сейчас в теме
Обработка работает, пожелание для исправления: при повторном заполнении дублируются записи контактных лиц.
8. Oksana Subbotina (OksanaSub) 50 03.10.17 11:39 Сейчас в теме
Модуль объекта запаролен(((( У меня не стандартная конфа, ничего поправить не могу...
9. Василий Василий (vasya_vasechkin) 6 03.10.17 14:46 Сейчас в теме
файл обработки обновил, пароль на модуль отсутствует. Для тех у кого старая версия, с паролем, вот пароль - asdfosdeKews9qwhadsfileqqwqIIisov
10. Ден (lion11) 139 10.10.17 09:41 Сейчас в теме
Можете подсказать почему для ИП не заполняет адрес?
11. Василий Василий (vasya_vasechkin) 6 10.10.17 14:19 Сейчас в теме
(10) сервис в интернете для ИП не выдаёт адрес.
12. Ильдар Тагиров (pentanom) 13 16.10.17 15:48 Сейчас в теме
(11)Адрес заполняется только в конфигурациях БП 3.0 ?
13. Василий Василий (vasya_vasechkin) 6 17.10.17 08:15 Сейчас в теме
(12) если сервис выдал адрес, он заполняется в любой конфигурации.
14. Ильдар Тагиров (pentanom) 13 17.10.17 09:28 Сейчас в теме
(13) Разобрался. У меня версия 11.3, а в коде 11.2.
	ИначеЕсли Версия = "11.2" ИЛИ Версия = "3.0" Тогда
			НоваяСтрокаКонтактов = Владелец.КонтактнаяИнформация.Добавить();
			НоваяСтрокаКонтактов.Представление = ЧтениеЖСН.ТекущееЗначение;
			НоваяСтрокаКонтактов.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
			НоваяСтрокаКонтактов.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;


Еще. Можно ли получить адрес в формате КЛАДР ?
15. Василий Василий (vasya_vasechkin) 6 17.10.17 13:03 Сейчас в теме
(14)была мысль сделать процедуру "вытаскивания" адреса из ответа сервиса в формате КЛАДРа, но сходу не получилось, и ещё ходят слухи, что с нового года КЛАДР заменят на что-то другое.
16. Ильдар Тагиров (pentanom) 13 17.10.17 16:21 Сейчас в теме
(15)
что-то другое
- Это, скорее всего, ФИАС.
31. Ильдар Тагиров (pentanom) 13 22.10.17 00:18 Сейчас в теме
(15)
						Результат.Вставить("company", СтруктураОбъекта);
						
	Результат.Вставить("KladrCode", СтруктураОбъекта.address.street.kladrcode);
	Результат.Вставить("flat", СтруктураОбъекта.address.flat);
	Результат.Вставить("house", СтруктураОбъекта.address.house);

А потом из этих данных получить адрес. Так получиться ?
34. Ильдар Тагиров (pentanom) 13 12.11.17 19:44 Сейчас в теме
(15)Попытался заполнить в формате КЛАДР так:
	ТекстЗапроса = "ВЫБРАТЬ
	               |	АдресныеОбъекты.Код,
	               |	АдресныеОбъекты.Наименование,
	               |	АдресныеОбъекты.Сокращение
	               |ИЗ
	               |	РегистрСведений.АдресныйКлассификатор КАК АдресныеОбъекты
	               |ГДЕ
	               |	АдресныеОбъекты.Код = &Идентификатор";
	
	Адрес = Результат.Company.address;
	
	тРегион					=ПолучитьНаименованиеВАдресе(Адрес,"region",ТекстЗапроса);
	КодРегиона				=ПолучитьНаименованиеВАдресе(Адрес,"regionCode",ТекстЗапроса);			
	Автономия				=ПолучитьНаименованиеВАдресе(Адрес,"auto",ТекстЗапроса);			
	Район					=ПолучитьНаименованиеВАдресе(Адрес,"area",ТекстЗапроса);			
	Город					=ПолучитьНаименованиеВАдресе(Адрес,"city",ТекстЗапроса);			
	ВнутригородскойРайон	=ПолучитьНаименованиеВАдресе(Адрес,"cityArea",ТекстЗапроса);			
	НаселенныйПункт			=ПолучитьНаименованиеВАдресе(Адрес,"Place",ТекстЗапроса);			
	Улица					=ПолучитьНаименованиеВАдресе(Адрес,"street",ТекстЗапроса);			
	ДополнительныйЭлемент	=ПолучитьНаименованиеВАдресе(Адрес,"ext",ТекстЗапроса);			
	ПодчиненныйЭлемент		=ПолучитьНаименованиеВАдресе(Адрес,"sext",ТекстЗапроса);			
		
	Дом							=Адрес.house;
	Корпус						="";
	Квартира					=Адрес.flat;
	Индекс						=Адрес.postalIndex;
	
	Представление=Индекс+", "+тРегион+", "+Район+", "+Город+", "+НаселенныйПункт+", "+Улица+", "+
					"Дом "+Дом+", "+"корп "+Корпус+", "+"Квартира "+Квартира;
		СтруктураАдреса = Новый Структура;
		СтруктураАдреса.Вставить("Представление",  Представление);		
		СтруктураАдреса.Вставить("Поле1",  Индекс);		
		СтруктураАдреса.Вставить("Поле2",  тРегион);		
		СтруктураАдреса.Вставить("Поле3",  Район);		
		СтруктураАдреса.Вставить("Поле4",  Город);		
		СтруктураАдреса.Вставить("Поле5",  НаселенныйПункт);		
		СтруктураАдреса.Вставить("Поле6",  Улица);		
		СтруктураАдреса.Вставить("Поле7",  Дом);		
		СтруктураАдреса.Вставить("Поле8",  Корпус);		
		СтруктураАдреса.Вставить("Поле9",  Квартира);		
		СтруктураАдреса.Вставить("Поле10",  "");		
		СтруктураАдреса.Вставить("Комментарий",  "Заполнено по ИНН");		

	МенеджерЗаписи = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
	МенеджерЗаписи.Представление = Представление;
	МенеджерЗаписи.Объект = ЭтотОбъект.Ссылка;
	МенеджерЗаписи.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
	МенеджерЗаписи.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
	Ном=0;
	Для каждого Ресурс Из Метаданные.РегистрыСведений.КонтактнаяИнформация.Ресурсы Цикл
		Ном=Ном+1;
		Если Ном<=12 Тогда
			МенеджерЗаписи[Ресурс.Имя] = СтруктураАдреса[Ресурс.Имя];
		Иначе
			Прервать;
		КонецЕсли;
	КонецЦикла;

	МенеджерЗаписи.Записать();

Показать


Функция ПолучитьНаименованиеВАдресе(Адрес,Секция,ТекстЗапроса)
	
	Рез="";
	Если Адрес.Свойство(Секция) Тогда
		КодКладр=СокрЛП(Адрес[Секция].KladrCode);
		ДлинаКода	=СтрДлина(КодКладр);
		Идентификатор	=Число(Лев(КодКладр+"000000000000",25));
		Запрос =Новый Запрос;
		Запрос.Текст=ТекстЗапроса;
		Запрос.УстановитьПараметр("Идентификатор",Идентификатор);
		Выборка=Запрос.Выполнить().Выбрать();
		Если Выборка.Следующий() Тогда
			Рез = СокрЛП(Выборка.Наименование)+" "+СокрЛП(Выборка.Сокращение);
		КонецЕсли;
	КонецЕсли;
	
	Возврат Рез;
	
КонецФункции
Показать

Проверил на "укороченном адресе" (в адресе был только регион и улица).
Делал такое же и для УТ 11, но поиск делал по GUIN. Тоже работает. Если интересно, могу выложить код.
17. Ильдар Тагиров (pentanom) 13 17.10.17 17:32 Сейчас в теме
С УТ 10.3 все получается хорошо, а с УТ 11.3 что-то никак не получается встроить отработку. Подскажите как это сделать.
18. Василий Василий (vasya_vasechkin) 6 17.10.17 19:50 Сейчас в теме
(17)а как Вы хотите использовать её в УТ 11.3? Её можно открыть через меню "файл", можно встроить через конфигуратор, но тогда надо точно знать в каком месте Вы будете вызывать процедуру заполнения. А можно ещё адаптировать её для справочника "ДополнительныеОтчетыИОбработки". Вам какой вариант больше подходит? И что именно не получается?
19. Ильдар Тагиров (pentanom) 13 17.10.17 21:51 Сейчас в теме
(18) Хочу встроить в конфигуратор и в форме элемента "Контрагенты" привязать к кнопке "Заполнить по ИНН".
20. Василий Василий (vasya_vasechkin) 6 18.10.17 08:19 Сейчас в теме
(19) Попробую Вам помочь. Напишите пожалуйста полный номер релиза конфигурации и текст ошибки которая возникает. А так же было бы не плохо увидеть код, в который вносите изменения в конфигурации.
pentanom; +1 Ответить
21. Ильдар Тагиров (pentanom) 13 18.10.17 09:37 Сейчас в теме
(20) Релиз 11.3.4.103. Я взял пример кода для 10.3 из вашей публикации. В обработке везде, где было упоминание о 11.2, добавил и 11.3. Но в ОФ и УФ свойство "ЭтотОбъект" имеют разный смысл.
Ошибки не возникает, но новые данные в форму не записывается.
22. Василий Василий (vasya_vasechkin) 6 18.10.17 13:24 Сейчас в теме
(21)в обработке есть управляемая форма, в ней код, который можно адаптировать для УТ 11.
23. Ильдар Тагиров (pentanom) 13 18.10.17 16:11 Сейчас в теме
(22)Мне хотелось узнать, что нужно написать вместо ЭтотОбъект в выражении:
    ОбработкаЗаполнения.Заполнить(ИНН, ТекстОтвета, Результат, ЭтотОбъект, ТекстОшибки);//параметры 
и что добавить, чтобы результат обработки сохранился.
24. Василий Василий (vasya_vasechkin) 6 19.10.17 15:26 Сейчас в теме
(23)примерно так:
&НаКлиенте
Процедура ЗаполнитьРеквизиты(Команда)
	ДанныеФормы = ЭтаФорма.Объект;
	ЗаполнитьНаСервере(ДанныеФормы);
	КопироватьДанныеФормы(ДанныеФормы, ЭтаФорма.Объект);
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьНаСервере(ДанныеФормы)
	ТекстОтвета = "";
	ТекстОшибки = "";
	Результат = Новый Структура;//структура данных контрагента
	Контрагент = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Контрагенты"));
	ОбработкаОбъект = Обработки.ДанныеКонтрагентаПоИНН.Создать();
	ОбработкаОбъект.Заполнить(Объект.ИНН, ТекстОтвета, Результат, Контрагент, ТекстОшибки);
	ЗначениеВДанныеФормы(Контрагент,ДанныеФормы);
КонецПроцедуры
Показать
pentanom; +1 Ответить
25. Ильдар Тагиров (pentanom) 13 19.10.17 20:10 Сейчас в теме
(24) Спасибо ! Все получилось.
26. Василий Василий (vasya_vasechkin) 6 20.10.17 08:21 Сейчас в теме
(25)проверьте заполнение адреса. Сохраните и закройте окно клиента, потом заново откройте и проверьте адрес.
27. Ильдар Тагиров (pentanom) 13 20.10.17 12:28 Сейчас в теме
(26)А и действительно адрес-то не заполняется :(
Я как-то не обратил на это внимание.
29. Ильдар Тагиров (pentanom) 13 20.10.17 12:55 Сейчас в теме
(26)Если запускаю как внешнюю обработку, то адрес появляется после второго открытия окна контрагента. Если как подключенную в конфигурацию, то вообще нет.
30. Ильдар Тагиров (pentanom) 13 21.10.17 22:13 Сейчас в теме
(26)
&НаКлиенте
Процедура ЗаполнитьРеквизитыПоИНН(Команда)
    ДанныеФормы = ЭтаФорма.Объект;
    ЗаполнитьРеквизитыПоИНН_НаСервере(ДанныеФормы);
    КопироватьДанныеФормы(ДанныеФормы, ЭтаФорма.Объект);
	Этаформа.Записать();
	ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьРеквизитыПоИНН_НаСервере(ДанныеФормы)
    ТекстОтвета = "";
    ТекстОшибки = "";
    Результат = Новый Структура;//структура данных контрагента
    Контрагент = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Контрагенты"));
//    Контрагент = Объект.Ссылка.ПолучитьОбъект();
    ОбработкаОбъект = Обработки.ДанныеКонтрагентаПоИНН.Создать();
    ОбработкаОбъект.Заполнить(Объект.ИНН, ТекстОтвета, Результат, Контрагент, ТекстОшибки);
	
	Если Не ТекстОшибки = "" Тогда
        Сообщить(ТекстОшибки);
	Иначе
	КонецЕсли;
	
	Контрагент.Записать();
	
    ЗначениеВДанныеФормы(Контрагент,ДанныеФормы);
	
КонецПроцедуры
Показать

Что здесь лишнее ?
Адрес записывается, но не отражается в форме сразу. Нужно закрыть и открыть форму снова.
Кроме того, вылезает окно с сообщением: "Данные были изменены или удалены другим пользователе". Но все запускается в однопользовательском режиме. И, на всякий случай, я еще запустил полное тестирование и исправление.
32. Василий Василий (vasya_vasechkin) 6 24.10.17 19:26 Сейчас в теме
(30)чтобы адрес сразу обновился, надо "пнуть" какую-то процедуру в форме, которая заведует адресом. А сообщение выскакивает, потому, что обработка записывает объект, а в форме он старый остаётся, вот она и ругается.
33. Ильдар Тагиров (pentanom) 13 24.10.17 20:52 Сейчас в теме
(32) Сделал так, чтобы в форме ввода адреса, он раскладывался по места (это для УТ 11.3):
&НаКлиенте
Процедура ЗаполнитьРеквизитыПоИНН(Команда)
    ДанныеФормы = ЭтаФорма.Объект;
    ЗаполнитьРеквизитыПоИНН_НаСервере(ДанныеФормы);
    КопироватьДанныеФормы(ДанныеФормы, ЭтаФорма.Объект);
	ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьРеквизитыПоИНН_НаСервере(ДанныеФормы)
    ТекстОтвета = "";
    ТекстОшибки = "";
    Результат = Новый Структура;//структура данных контрагента
    Контрагент = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Контрагенты"));
    ОбработкаОбъект = Обработки.ДанныеКонтрагентаПоИНН.Создать();
    ОбработкаОбъект.Заполнить(Объект.ИНН, ТекстОтвета, Результат, Контрагент, ТекстОшибки);
	
	Если Не ТекстОшибки = "" Тогда
        Сообщить(ТекстОшибки);
	Иначе
	КонецЕсли;
	
	ТекстЗапроса = "ВЫБРАТЬ
	               |	АдресныеОбъекты.Идентификатор,
	               |	АдресныеОбъекты.Наименование,
	               |	АдресныеОбъекты.Сокращение
	               |ИЗ
	               |	РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
	               |ГДЕ
	               |	АдресныеОбъекты.Идентификатор = &Идентификатор";
	
	Адрес = Результат.Company.address;
	
	Регион					=ПолучитьНаименованиеВАдресе(Адрес,"region",ТекстЗапроса);			
	Автономия				=ПолучитьНаименованиеВАдресе(Адрес,"auto",ТекстЗапроса);			
	Район					=ПолучитьНаименованиеВАдресе(Адрес,"area",ТекстЗапроса);			
	Город					=ПолучитьНаименованиеВАдресе(Адрес,"city",ТекстЗапроса);			
	ВнутригородскойРайон	=ПолучитьНаименованиеВАдресе(Адрес,"cityArea",ТекстЗапроса);			
	НаселенныйПункт			=ПолучитьНаименованиеВАдресе(Адрес,"Place",ТекстЗапроса);			
	Улица					=ПолучитьНаименованиеВАдресе(Адрес,"street",ТекстЗапроса);			
	ДополнительныйЭлемент	=ПолучитьНаименованиеВАдресе(Адрес,"ext",ТекстЗапроса);			
	ПодчиненныйЭлемент		=ПолучитьНаименованиеВАдресе(Адрес,"sext",ТекстЗапроса);			
		
	Дом							=Адрес.house;
	Квартира					=Адрес.flat;
	Индекс						=Адрес.postalIndex;
	
	Представление=Индекс+", "+Регион+", "+Район+", "+Город+", "+НаселенныйПункт+", "+Улица+", "+
					"Дом "+Дом+", "+"Квартира "+Квартира;
	
	КонтактнаяИнформация=Контрагент.КонтактнаяИнформация;
	СтрокаКИ=КонтактнаяИнформация.Добавить();
	СтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
	СтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
	СтрокаКИ.Представление = Представление;

	Контрагент.Записать();
	
    ЗначениеВДанныеФормы(Контрагент,ДанныеФормы);
	
КонецПроцедуры

Функция ПолучитьНаименованиеВАдресе(Адрес,Секция,ТекстЗапроса)
	
	Результат="";
	Если Адрес.Свойство(Секция) Тогда
		Идентификатор	=Новый УникальныйИдентификатор(Адрес[Секция].GUID);
		Запрос =Новый Запрос;
		Запрос.Текст=ТекстЗапроса;
		Запрос.УстановитьПараметр("Идентификатор",Идентификатор);
		Выборка=Запрос.Выполнить().Выбрать();
		Если Выборка.Следующий() Тогда
			Результат = СокрЛП(Выборка.Наименование)+" "+СокрЛП(Выборка.Сокращение);
		КонецЕсли;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции
Показать

А вот чем "пнуть" и какую процедуру не нашел :(
28. Алексей Иванов (alexbla) 20.10.17 12:34 Сейчас в теме
Кто-нибудь тестировал в КА 1.1???
35. Ильдар Тагиров (pentanom) 13 12.11.17 19:46 Сейчас в теме
(28)к сожалению КА 1.1 не имеется, но может быть с небольшими изменениями подойдет и для этой конфигурации.
Оставьте свое сообщение