Практика 1С: Заполняем данные контрагента по УНП автоматически на основании государственного реестра РБ
В этой статье разберем решение следующей практической задачи.
В информационной базе 1С есть справочник «Контрагенты», который предназначен для хранения списка всех контрагентов, с которыми взаимодействует организация (покупатели, поставщики, банки и прочие). Для того, чтобы ускорить создание новых контрагентов, а также исключить ошибки ручного ввода данных пользователем, нужно обеспечить автоматические заполнение данных контрагента по УНП, используя данные из государственного реестра плательщиков Республики Беларусь.
Нажимаем «Поиск» и получаем полные сведения об этом контрагенте: наименование (краткое и полное юридическое), юридический адрес, дата регистрации и пр.
Обратите внимание на колонку XML, в которой находится гиперссылка. Если навести курсор на эту гиперссылку, то в нижней части окна браузера можно увидеть следующую ссылку: При нажатии на гиперссылку «XML» открывается отдельная закладка, где те же самые данные контрагента представлены в формате XML: Обратите внимание на адрес, который указан в адресной строке браузера, если указать другой УНП, то получим данные другого контрагента: Если указать некорректный УНП, то результат будет следующий:
Схема решения поставленной задачи
Вернемся к поставленной задаче: нужно заполнить данные контрагента на основании сведений в гос. реестре плательщиков. Для того, чтобы получить сведения о контрагенте из реестра нам достаточно сформировать следующий запрос:
где УНП — это введенная пользователем строка в поле «УНП» в карточке контрагента. После обращения к реестру мы получим от сервера ответ в формате XML, который в последующем сможем обработать и заполнить необходимые данные в карточке контрагента.Схематично решение задачи выглядит следующим образом: Шаг 1. При нажатии на кнопку отправляем запрос HTTP-серверу, в качестве значения параметра unp устанавливаем введенный пользователем УНП
Шаг 2. Получаем ответ от HTTP-сервера в формате XML
Шаг 3. Выделяем из строки ответа необходимые данные (краткое и полное наименование, юридический адрес) и заполняем данные контрагента в 1С.
Программная реализация
Для начала в форме элемента справочника «Контрагенты» создадим команду «ЗаполнитьПоУНП» и соответствующий этой команде элемент формы: Теперь нужно создать обработчик действия для этой команды. Для работы с HTTP-сервером нам понадобятся два объекта встроенного языка 1С: HTTPCоединение и HTTPЗапрос: Простыми словами объект 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С:Предприятие» получим следующий результат: Если согласиться с установкой реквизитов по данным реестра карточка контрагента автоматически заполнится сведениями: Таким образом, поставленная задача решена.
В этой статье мы подробно разобрали решение задачи автоматического заполнения реквизитов контрагента по данным государственного реестра Республики Беларусь.
Попробуйте реализовать такой же функционал в своей конфигурации и напишите в комментариях к этому посту все ли получилось. Если у вас остались вопросы, можете также их оставить в комментариях.