Для создания модуля используется конфигуратор,так как я писала данную разработку для дипломной работы, не име лицензионной программы, я использовала учебную версию программы 1С Предприятие 8.3.11, после написания обработки и проверки его руководителем, обработка была успешно внедрена в лицензионную программу 1С:УправлениеТорговлей3 и работала исправно. Так как учебная версия не особо отличается от лицензионной, я буду сразу описывать пошаговые действия для программы 1С:Управление Торговлей. Для того чтобы запустить 1С в режиме конфигуратор нам нужно сначала открыть 1С:УправлениеТорговлей и в открывшемся окне добавить базу данных на основе которой будет написан данный модуль, нажав на кнопку «Добавить», затем указав путь и название. Далее нужно будет выбрать режим. Нам потребуется конфигуратор. Все нужные объекты конфигурации уже есть в базе, мне остается лишь создать общий модуль, где я буду прописывать код для проверки контрагента и сделать подписку на событие, чтобы при определенном событии, срабатывал мой модуль. Но для начала я сделала простую обработку в учебной версии базы, где проверяла работает ли моя разработка или ее надо было доработать.В первую очередь, я создаю обработку «ПроверкаКонтрагентаПоИНН». В ней я добавляю форму. (Рис.1) Далее создаю кнопку «проверить контрагентов» и вывожу ее на командную панель. Сразу добавляю несколько реквизитов, а именно «Контрагент», «Наименование», «ИНН», «КПП». В свойствах реквизита «Контрагент» в графе Вид указываю «Поле ввода». Благодаря данному виду, мы сможем выбирать из базы контрагентов. Для остальных реквизитов также выбираю вид «поле ввода».
Рисунок 3 - Форма обработки
После того, как мы создали элементы формы и расставили их, приступаем к разделу «Модуль», в котором будем описывать несколько процедур для проверки контрагентов через сервис ФНС. Начинаем мы с того, что создаем команду на кнопке «ПроверитьКонтрагента», делаем мы это на сервере и на клиенте. Данная команда на клиенте выглядит следующим образом:
&НаКлиенте
Процедура ПроверитьКонтрагента (Команда)
ОчиститьСообщения();
ПроверитьКонтрагентаСервере();
КонецПроцедуры.
На сервере мы создаем некую таблицу значений «ДанныеКонтрагента», в которой прописываем 4 колонки:
- «Контрагент»
- ИНН
- КПП
- Состояние
Рисунок 4. - Проверка Контрагента На Сервере, таблица «ДанныеКонтрагента».
Далее описываем цикл, где в таблице «ДанныеКонтрагента» добавляем параметр НоваяСтрока, который указывает, что происходит редактирование новой строки. (Рис.2)
Рисунок 5. -Проверка Контрагента На Сервере, Цикл.
Потом прописываем код для получения результата проверки с веб сервисом. Если данные получены, и они не имеют пустое значение, т.е. они должны быть заполненные, то для каждого строки из таблицы «ДанныеКонтрагента» сообщаем ее состояние, иначе сообщается, что не чего проверять, это сообщение будет тогда, когда данные в таблице пустые. Рис.3
Рисунок 6. - Получение результата проверки.
Итак, с командой для кнопки я закончила, теперь прописываю остальные, нужные мне, процедуры и функции. Сейчас мы прописываем процедуру, благодаря ей, в журнале будет записываться информация об ошибке.
Процедура ФиксацияОшибкиВЖурналеРегистрации(ИмяСобытия,ИнформацияОбОшибке)
ЗаписьЖурналаРегистрации(НСтр("ru = '"+ИмяСобытия+"'"),УровеньЖурналаРегистрации.Ошибка,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
КонецПроцедуры
Дальше мы описываем функцию «ДатаСторокой». В ней мы указываем тип даты, что если в свойствах выбран тип «строка», то на выходе мы получим слово «дата», но в случае, если тип указан «дата», ты в результате мы получим числовую дату.
Функция ДатаСтрокой(Дата)
Результат = Неопределено;
Если ТипЗнч(Дата) = Тип("Строка") Тогда
Результат = Дата;
ИначеЕсли ТипЗнч(Дата) = Тип("Дата") Тогда
Результат = Формат(Дата, "ДФ=dd.MM.yyyy");
КонецЕсли;
Возврат Результат;
КонецФункции
Следом идет функция Состояние ответа сервера. (Рис.5). В ней мы получаем ответ от сервера, при определенном ответе, выходит разное сообщение клиенту. Так клиент будет знать верны ли реквизиты и если выходит ошибка, то в чем причина. Всего ответов от сервера 14.
Рисунок 7. - Состояние ответа от сервера.
Данный код будет выполняться, но для наглядности, клиенту лучше ответ от сервиса расписать понятнее, а именно мы подкорректируем значение состояния. Для каждого состояния, кроме, когда ответ равен «0», мы допишем «Проведение невозможно.». Выглядеть это будет данным образом:
ИначеЕсли Ответ = "1" Тогда
Если СтрДлина(ДанныеКонтрагента.ИНН) = 12 Тогда
Состояние = "Не действует";
Иначе
Состояние = "Проведение невозможно. Не действует или изменен КПП";
КонецЕсли;
ИначеЕсли Ответ = "3" Тогда
Состояние = "Проведение невозможно. КПП не соответствует данным базы ФНС";
ИначеЕсли Ответ = "4" Тогда
Состояние = "Проведение невозможно. Контрагент отсутствует в базе ФНС";
ИначеЕсли Ответ = "5" ИЛИ Ответ = "6" ИЛИ Ответ = "8" Тогда Состояние = "Проведение невозможно. Ошибка. Некорректный ИНН";
ИначеЕсли Ответ = "7" ИЛИ Ответ = "9" Тогда
Состояние = "Проведение невозможно. Ошибка. Некорректный КПП";
ИначеЕсли Ответ = "11" ИЛИ Ответ = "12" Тогда
Состояние = "Проведение невозможно. Ошибка. Некорректная дата проверки";
ИначеЕсли Ответ = "10" Тогда
Состояние = "Проведение невозможно. Ошибка. ИП заведено как юридическое лицо";
ИначеЕсли Ответ = "W" Тогда
Состояние = "Проведение невозможно. Возникла ошибка заполнения данных контрагента";
КонецЕсли;
Возврат Состояние;
Так будет очень наглядно и понятно. В самой программе это будет выглядеть виде сообщения внизу, будет выводится значение состояние в зависимости от ответа сервиса ФНС.
Рисунок 8 – Сообщение от сервиса
Теперь прописываем функцию проверить контрагента. В этой функции мы пишем, что нас интересует проверка на текущую дату, создаем виртуальную таблицу, куда будем записывать значения реквизитов контрагента. Отправляем это запросом на сервер ФНС и ждем ответ, если ответ получен, то мы автоматически переходим на предыдущую функцию и расшифровываем, полученный нами, ответ, если ответ от сервера все же не пришел, тогда у нас выводится сообщение о том, что сервер не доступен и мы можем проверить контрагента чуть позже, либо же причиной того, что ответ нам не пришел, может послужить пустое значение реквизита ИНН. Саму функцию можно подробно рассмотреть на рисунке 6.
Рисунок 9. -Проверить контрагента.
Нам надо сделать процедуру - результат проверки веб сервиса. Для начала проверяем есть ли доступ к серверу, описываем что за раз можно проверить 10000 контрагентов, делаем порциональный расчет, создаем запрос на сервер, обрабатываем его ответ. (см. приложение 1).
Создаем процедуру «ДобавитьКонтрагентаВЗапросКСервису». Здесь мы разрабатываем сам запрос к сервису налоговой. Делаем попытку подключения к прокси серверу. Передаем ИНН, КПП контрагента и устанавливаем, что нам надо получить информацию о контрагенте новую, на сегодняшний день (для этого помечаем ДатаСтрокой(текущая дата)). И прописываем исключение, что есть ошибка при заполнении запроса, поэтому запрос не отправляется на обработку на сервер. (Рис.7) После это мы создаем процедуру обработка ответа сервиса.
Рисунок 10 - Добавление запроса.
Затем приступаем к функции доступа к сервису ФНС. Вот так она выглядит:
Функция ЕстьДоступКВебСервисуФНС()
Возврат ПолучитьWSПрокси() <> Неопределено;
КонецФункции
Последняя функция в моей обработке будет поучение прокси сервера:
Функция ПолучитьWSПрокси()
WSПрокси = Неопределено;
Попытка
Определение = Новый WSОпределения("http://npchk.nalog.ru/FNSNDSCAWS_2?wsdl");
WSПрокси = Новый WSПрокси(Определение, "http://ws.unisoft", "FNSNDSCAWS2", "FNSNDSCAWS2_Port");
Исключение
ФиксацияОшибкиВЖурналеРегистрации("Проверка контрагентов. Ошибка подключени WSПрокси.",ИнформацияОбОшибке())
КонецПопытки;
Возврат WSПрокси;
КонецФункции
Данная обработка отлично работает. Она проверяет уже существующих в базе и новых контрагентов. Для этого нам надо просто указать наименование организации и ИНН, если мы хотим проверить, тех контрагентов, которые есть в базе, и убедиться, что их не прикрыли и они до сих пор являются действующими компаниями или ИП. Чтобы проверить новых контрагентов, нам достаточно просто ввести ИНН. Внизу на форме, после того, как нажать на кнопку, выйдет сообщение клиенту, о том есть он в базе ФНС или нет, или может что-то некорректно было введено. Также эта обработка позволяет проверить сразу несколько контрагентов, что заметно сократит время этой процедуры. (См. приложение). Для крупных фирм эта обработка станет отличным решением для автоматизации сервиса проверки контрагентов через ФНС. Но это я сделала в пробной базе, чтобы посмотреть работает или нет, теперь мне надо это переместить в конфигурацию 1С:УТ 11 в общий модуль, кое где исправить реквизиты, чтобы мы могли нормально работать и сделать подписку на событие , а именно при изменении статуса будет срабатывать проверка. В данной базе подписка на событие – это моя главная задача, так как основную работу я проделала только что в пробной базе и мне ее остается только переместить.
Перед тем как начинать создавать подписку на событие для документа «ЗаказКлиента», необходимо сначала создать общий модуль «ПроверкаКонтрагента», куда я помещу свою обработку.
Общий модули в 1С — объект метаданных конфигурации, хранящий в себе программный код, который часто вызывается в конфигурации. Функцию/процедуру можно вызвать из любого места конфигурации (если она экспортная). Добавляем новый модуль, называем его, в свойствах убираем галочку рядом с «глобальный» и ставим их напротив «сервер» и «внешнее соединение». Если флаг будет стоять на «глобальны», то, когда мы начнем создавать подписку, наш модуль может не показаться. Перемещаем нашу обработку. Сначала убираем везде &НаКлиенте и &НаСервере, в общем модуле такое никогда не пишется. Теперь нам надо убрать лишнее в коде, так некоторые реквизиты есть и их описывать не надо. Первая процедура нам не понадобится, так как тут уже есть справочник и документ, созданные со всеми реквизитами, поэтому первые две процедуры мы удаляем (они взаимосвязаны). Также удаляем процедуру КонтрагентПриИзмененииНаСервере, нам она тоже не понадобится.
Рисунок 11- Свойства общего модуля
Подписка на событие 1С 8.3 — объект конфигурации, позволяющий назначить обработчик на определенное событие объекта. Такой обработчик можно назначить сразу на несколько объектов конфигурации, например, сразу на все документы. Перед созданием подписки необходимо обдумать два момента – после какого события процедура должна быть выполнена и для каких объектов. После того как перечень объектов конфигурации для подписки определен, необходимо выбрать событие, после которого выполнится наша процедура. Список возможных событий для выбранных объектов система предложит вам при создании.
Обработчики подписки на события вызываются после обработчика объекта, т.е. если подписка на события установлена на событие «ОбработкаПроведение», то вначале отработает обработчик из модуля объекта, а потом уже обработчик из подписки.
Использовать подписки очень удобно, например, для регистрации изменений для плана обмена. Или какое-то другое действие, которое одинаковое для различных объектов конфигурации.
Я часто использую подписки на событие для того, чтобы не менять обработчики типовых документов. Это очень удобно, например, мы в подписке можем корректировать движения документа или добавлять движения по новым регистрам, не меняя при этом конфигурацию.
Рисунок 12- Свойства подписки на событие
В первую очередь необходимо заполнить поля «Имя» и «Синоним». Называем нашу подписку «ПроверкаКонтрагента». Синоним автоматически заполнится. Свойство «Источник» указывает, какие узлы конфигурации участвуют в подписке. В свойстве «Обработчик» необходимо указать один из присутствующих в конфигурации модулей с установленным свойством «Серверный». Здесь мы указываем, подготовленный мной, общий модуль «ПроверкаКонтрагента».
Рисунок 13. Подписка на событие
В источнике мы выбираем документ «ЗаказКлиента», для которого и делаем подписку. В событие указываем «ПриЗаписи». После выбора модуля и перехода в него, остается лишь описать действия процедуры, и на этом создание подписки в конфигурации будет закончено.
Переходим к созданию подписки на событие. Прописываем, если статус имеет значение «К обеспечению» (к выполнению) или «К отгрузке», тогда выполняется наша процедура и выводится сообщение (информация о контрагенте).
Рисунок 14. Добавление запроса
Проверяем на работоспособность.
Рисунок 15. Добавление запроса
Можно еще улучшить нашу доработку, чтобы сообщение с ошибкой выходило только тогда, когда контрагента нет в базе ФНС, либо же когда что-то не корректно введено. Для это нам надо переделать последнюю процедуру. Прописываем в процедуре Проверить контрагента по ссылке структуру: РезультатПроверки = Новый Структура ("Ответ,СостояниеФНС","",""); , после нам надо изменить в этой же процедуре «ответ» и «состояниеФНС» на РезультатПроверки.Ответ и РезультатПроверки.СостояниеФНС. После изменяем процедуру подписки на событие. В ней мы дописываем строку, в которой ссылаемся на процедуру ПроверитьКонтрагентаПоСсылке и создаем условие: если ответ не равен «0» (контрагент есть в базе ФНС), то мы выводим сообщение и ошибку, иначе мы ничего не выводим. Данную процедуру, можно рассмотреть ниже:
Процедура ПроверкаКонтрагента(Источник, Отказ) Экспорт
Если Источник.Статус = Перечисления.СтатусыЗаказовКлиентов.КОбеспечению
ИЛИ Источник.Статус = Перечисления.СтатусыЗаказовКлиентов.КОтгрузке Тогда
РезультатПроверки = ПроверитьКонтрагентаПоСсылке(Источник.Контрагент);
Если РезультатПроверки.Ответ <> "0" Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = РезультатПроверки.СостояниеФНС;
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
На этом моя разработка закончена.