Консультация Беларусь
Консультация Россия
Блог

Практика 1С: Заполняем данные контрагента по УНП автоматически на основании государственного реестра РБ

В этой статье разберем решение следующей практической задачи.

В информационной базе 1С есть справочник «Контрагенты», который предназначен для хранения списка всех контрагентов, с которыми взаимодействует организация (покупатели, поставщики, банки и прочие). Для того, чтобы ускорить создание новых контрагентов, а также исключить ошибки ручного ввода данных пользователем, нужно обеспечить автоматические заполнение данных контрагента по УНП, используя данные из государственного реестра плательщиков Республики Беларусь.

Принцип работы с реестром плательщиков

image
  1. Переходим на сайт: http://www.portal.nalog.gov.by/grp/
  2. Вводим УНП контрагента
  3. Нажимаем «Поиск» и получаем полные сведения об этом контрагенте: наименование (краткое и полное юридическое), юридический адрес, дата регистрации и пр.
Обратите внимание на колонку XML, в которой находится гиперссылка. Если навести курсор на эту гиперссылку, то в нижней части окна браузера можно увидеть следующую ссылку:
image
При нажатии на гиперссылку «XML» открывается отдельная закладка, где те же самые данные контрагента представлены в формате XML:
image
Обратите внимание на адрес, который указан в адресной строке браузера, если указать другой УНП, то получим данные другого контрагента:
image
Если указать некорректный УНП, то результат будет следующий:
image

Схема решения поставленной задачи

Вернемся к поставленной задаче: нужно заполнить данные контрагента на основании сведений в гос. реестре плательщиков. Для того, чтобы получить сведения о контрагенте из реестра нам достаточно сформировать следующий запрос:

http://www.portal.nalog.gov.by/grp/getData?unp=УНП

где УНП — это введенная пользователем строка в поле «УНП» в карточке контрагента. После обращения к реестру мы получим от сервера ответ в формате XML, который в последующем сможем обработать и заполнить необходимые данные в карточке контрагента.Схематично решение задачи выглядит следующим образом:
image
Шаг 1. При нажатии на кнопку отправляем запрос HTTP-серверу, в качестве значения параметра unp устанавливаем введенный пользователем УНП

Шаг 2. Получаем ответ от HTTP-сервера в формате XML

Шаг 3. Выделяем из строки ответа необходимые данные (краткое и полное наименование, юридический адрес) и заполняем данные контрагента в 1С.

Программная реализация

Для начала в форме элемента справочника «Контрагенты» создадим команду «ЗаполнитьПоУНП» и соответствующий этой команде элемент формы:
image
Теперь нужно создать обработчик действия для этой команды. Для работы с HTTP-сервером нам понадобятся два объекта встроенного языка 1С: HTTPCоединение и HTTPЗапрос:
image
image
Простыми словами объект HTTPСоединение нужен для того, чтобы мы могли «общаться» с HTTP-сервером. Само «общение» с ним построено на HTTP-запросах, для работы с которыми предназначен объект HTTPЗапрос. Запрос — это инструкция для сервера в определенном формате, который он понимает, и в соответствии с которым возвращает ответ. Например, запрос «верни данные контрагента по УНП 123456789» на языке, который понимает HTTP-сервер выглядит так: http://www.portal.nalog.gov.by/grp/getData?unp=123456789

Можно провести ещё такую аналогию с мессенджерами (viber, telegram, skype и т.д.) . Для того чтобы общаться с кем-нибудь в мессенджере сначала нужно создать чат, а потом в этот чат можно отправлять сообщения адресату. В приведенной аналогии объект HTTPСоединение нужен для «создания чата», а HTTPЗапрос — для «отправки сообщений» в этот чат.

Ниже приведен код обработчика действия команды «ЗаполнитьПоУНП»:
---------------------------------------------------------------------------------
&НаКлиенте
Процедура ЗаполнитьПоУНП(Команда)
//проверка на заполненность "УНП"
Если НЕ ЗначениеЗаполнено(Объект.УНП) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Операция невозможна: не заполнен УНП!";
Сообщение.Поле = "Объект.УНП";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
Хост = "www.portal.nalog.gov.by";
Ресурс = "grp/getData?unp="+СокрЛП(Объект.УНП);
//создание HTTP-соединения и HTTP-запроса
Соединение = Новый HTTPСоединение(Хост);
Заголовки = Новый Соответствие;
Заголовки.Вставить("host", Хост);
Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
//отправка HTTP-запроса серверу и получение ответа
Ответ = Неопределено;
Попытка
Ответ = Соединение.Получить(Запрос);
Исключение
Возврат;
КонецПопытки;
//чтение ответа HTTP-сервера
СведенияXML = Неопределено;
Попытка
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());

СведенияXML = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
Исключение
Возврат;
КонецПопытки;
Если ТипЗнч(СведенияXML) = Тип("ОбъектXDTO") Тогда
Если СведенияXML.Свойства().Получить("ROW")=Неопределено Тогда
Иначе
НаименованиеПолноеПортал = СокрЛП(СведенияXML.ROW.VNAIMP);
НаименованиеПортал = СокрЛП(СведенияXML.ROW.VNAIMK);
ЮрАдресПортал = СокрЛП(СведенияXML.ROW.VPADRES);
Если Лев(ЮрАдресПортал, 2) = ", " Тогда
ЮрАдресПортал = Прав(ЮрАдресПортал, СтрДлина(ЮрАдресПортал) - 2);
КонецЕсли;
КонецЕсли;
Иначе
Возврат;
КонецЕсли;
//проверка реквизитов на изменение, если изменились - задаем вопрос пользователю
Если НаименованиеПолноеПортал <> Объект.ПолноеНаименование
ИЛИ НаименованиеПортал <> Объект.Наименование
ИЛИ ЮрАдресПортал <> Объект.ЮридическийАдрес Тогда

ТекстВопроса = "Для УНП "+Объект.УНП+" в государственном реестре плательщиков соответствует юридическое лицо со следующими реквизитами
|
| Наименование: " + НаименованиеПортал + "
| Полное наименование: " + НаименованиеПолноеПортал + "
| Юридический адрес: " + ЮрАдресПортал + "
|
|Установить данные реквизиты для текущего контрагента?";

ДопПараметры = Новый Структура("НаименованиеПортал, НаименованиеПолноеПортал, ЮрАдресПортал",
НаименованиеПортал, НаименованиеПолноеПортал, ЮрАдресПортал);

ОписаниеОповещения = Новый ОписаниеОповещения("ЗаполнитьПоУНПЗавершение", ЭтотОбъект, ДопПараметры);
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет);

КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоУНПЗавершение(Результат, ДополнительныеПараметры) Экспорт
//если пользователь ответил "Да" - заменяем данные контрагента сведениями из реестра
Если Результат = КодВозвратаДиалога.Да Тогда
Объект.Наименование = ДополнительныеПараметры.НаименованиеПортал;
Объект.ПолноеНаименование = ДополнительныеПараметры.НаименованиеПолноеПортал;
Объект.ЮридическийАдрес = ДополнительныеПараметры.ЮрАдресПортал;
КонецЕсли;
КонецПроцедуры
---------------------------------------------------------------------------------
В результате при нажатии на кнопку «Заполнить по УНП» в режиме «1С:Предприятие» получим следующий результат:
image
Если согласиться с установкой реквизитов по данным реестра карточка контрагента автоматически заполнится сведениями:
image
Таким образом, поставленная задача решена.

В этой статье мы подробно разобрали решение задачи автоматического заполнения реквизитов контрагента по данным государственного реестра Республики Беларусь.

Попробуйте реализовать такой же функционал в своей конфигурации и напишите в комментариях к этому посту все ли получилось. Если у вас остались вопросы, можете также их оставить в комментариях.
Программирование