В начало

Обмен документа ПРС из БП в CRM

 

            Нужно перенести документ «Поступление на расчетный счет» из конфигурации БП в табличную часть бизнес-процесса в конфигурации CRM.

            Предварительно создаем объекты метаданных в данных конфигурациях.

            В конфигурации БП создаем расширение «ДЗФЛ», в котором создаем HTTP-сервис «ДЗФЛ», как показано ниже.

Рис. HTTP-сервис «ДЗФЛ» в конфигурации БП

 

Листинг. Модуль HTTP-сервиса «ДЗФЛ»

 

Функция PingGET(Запрос)                           

             //Строка для браузера

             //http://localhost:8080/bp_reu6_test/hs/DZ/ping

             Ответ = Новый HTTPСервисОтвет(200);

             Ответ.УстановитьТелоИзСтроки("OK");

             Возврат Ответ;

 КонецФункции

 

 

Функция ПолучитьДокиGET(Запрос)                                    

            //Строка для браузера:

            //http://localhost:8080/bp_reu6_test/hs/DZFL/doki/20240125/20240126

            ДатаНачала = Дата(Запрос.ПараметрыURL["DataNachala"]);

            ДатаОкончания = Дата(Запрос.ПараметрыURL["DataOkonchaniya"]);

           

            Запрос2 = Новый Запрос;

            Запрос2.Текст =

                        "ВЫБРАТЬ

                        |           ПоступлениеНаРасчетныйСчет.Ссылка КАК Ссылка,

                        |           ПоступлениеНаРасчетныйСчет.Дата КАК Дата,

                        |           ПоступлениеНаРасчетныйСчет.Номер КАК Номер,

                        |           ПоступлениеНаРасчетныйСчет.ВидОперации КАК ВидОперации,

                        |           ПоступлениеНаРасчетныйСчет.ДатаВходящегоДокумента КАК ДатаВходящегоДокумента,

                        |           ПоступлениеНаРасчетныйСчет.ДЗФЛ_ДатаСП КАК ДЗФЛ_ДатаСП,

                        |           ПоступлениеНаРасчетныйСчет.ДЗФЛ_НомерСП КАК ДЗФЛ_НомерСП,

                        |           ПоступлениеНаРасчетныйСчет.ДЗФЛ_НомерСудебногоУчастка КАК ДЗФЛ_НомерСудебногоУчастка,

                        |           ПоступлениеНаРасчетныйСчет.ДоговорКонтрагента КАК ДоговорКонтрагента,

                        |           ПоступлениеНаРасчетныйСчет.Комментарий КАК Комментарий,

                        |           ПоступлениеНаРасчетныйСчет.НазначениеПлатежа КАК НазначениеПлатежа,

                        |           ПоступлениеНаРасчетныйСчет.НомерВходящегоДокумента КАК НомерВходящегоДокумента,

                        |           ПоступлениеНаРасчетныйСчет.Организация КАК Организация,

                        |           ПоступлениеНаРасчетныйСчет.Ответственный КАК Ответственный,

                        |           ПоступлениеНаРасчетныйСчет.СтатьяДвиженияДенежныхСредств КАК СтатьяДвиженияДенежныхСредств,

                        |           ПоступлениеНаРасчетныйСчет.СуммаДокумента КАК СуммаДокумента,

                        |           ПоступлениеНаРасчетныйСчет.СчетБанк КАК СчетБанк,

                        |           ПоступлениеНаРасчетныйСчет.СчетОрганизации КАК СчетОрганизации

                        |ИЗ

                        |           Документ.ПоступлениеНаРасчетныйСчет КАК ПоступлениеНаРасчетныйСчет

                        |ГДЕ

                        |           ПоступлениеНаРасчетныйСчет.Дата >= &ДатаНачала

                        |           И ПоступлениеНаРасчетныйСчет.Дата <= &ДатаОкончания

                        |           И ПоступлениеНаРасчетныйСчет.ДЗФЛ_НомерСП <> """"

                        |           И ПоступлениеНаРасчетныйСчет.ДЗФЛ_ДатаСП <> ДАТАВРЕМЯ(1, 1, 1)

                        |           И ПоступлениеНаРасчетныйСчет.ДЗФЛ_НомерСудебногоУчастка <> """"

                        |           И ПоступлениеНаРасчетныйСчет.Организация.Наименование <> """"";

           

            Запрос2.УстановитьПараметр("ДатаНачала", ДатаНачала);

            Запрос2.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));

           

            Результат = Запрос2.Выполнить(); 

            Выборка = Результат.Выбрать();

           

    МассивСтруктур = Новый Массив;

           

    Пока Выборка.Следующий() Цикл

                         струкДок = Новый Структура;

                         

                         струкДок.Вставить("ДатаДокумента", Выборка.Дата);

                         струкДок.Вставить("НомерДокумента", Выборка.Номер);

                         струкДок.Вставить("Организация", Выборка.Организация.Наименование);

                         струкДок.Вставить("СуммаДокумента", Выборка.СуммаДокумента);

 

                         струкДок.Вставить("ДатаСП", Выборка.ДЗФЛ_ДатаСП);

                         струкДок.Вставить("НомерСП", Выборка.ДЗФЛ_НомерСП);

                         струкДок.Вставить("НомерСудебногоУчастка", Выборка.ДЗФЛ_НомерСудебногоУчастка);

                                                 

                         МассивСтруктур.Добавить(струкДок);

    КонецЦикла;

           

           

            ЗаписьJSON = Новый ЗаписьJSON;

            ЗаписьJSON.УстановитьСтроку();

            ЗаписатьJSON(ЗаписьJSON, МассивСтруктур);

            СтрокаДляОтвета = ЗаписьJSON.Закрыть();

                   

            Ответ = Новый HTTPСервисОтвет(200);   

            Ответ.Заголовки.Вставить("Content-type", "application/json;  charset=utf-8");

            Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

           

            Возврат Ответ;

           

КонецФункции

 

 

 

Рис. Справочник «Параметры подключения к сервису ДЗФЛ» в конфигурации CRM

 

Листинг. Общий модуль «ОбменЧерезСервисДЗФЛ» в конфигурации CRM

             

&НаСервере

Функция ПолучитьСсылкуНаБП(Знач НомерСП, Знач ДатаСП, Знач НомерСУ, Знач Организация)

            Запрос = Новый Запрос;

            Запрос.Текст =

                        "ВЫБРАТЬ

                        |           CRM_БизнесПроцесс.Ссылка КАК Ссылка

                        |ИЗ

                        |           БизнесПроцесс.CRM_БизнесПроцесс КАК CRM_БизнесПроцесс

                        |ГДЕ

                        |           CRM_БизнесПроцесс.НомерДелаСП = &НомерДелаСП

                        |           И CRM_БизнесПроцесс.ДатаПодачиВСудСП = &ДатаПодачиВСудСП

                        |           И CRM_БизнесПроцесс.СудебныйУчасток.Номер = &НомерСудебногоУчастка

                        |           И CRM_БизнесПроцесс.Истец.Наименование = &Истец";

           

            Запрос.УстановитьПараметр("НомерДелаСП", НомерСП);

            Запрос.УстановитьПараметр("ДатаПодачиВСудСП", ДатаСП);

            Запрос.УстановитьПараметр("НомерСудебногоУчастка", НомерСУ);

            Запрос.УстановитьПараметр("Истец", Организация);

           

            Результат = Запрос.Выполнить();  

            Выборка = Результат.Выбрать();

           

            Если Выборка.Следующий() Тогда

                        Возврат Выборка.Ссылка;

            Иначе

                        Возврат Неопределено;

            КонецЕсли;

                       

КонецФункции

 

Функция ПроверитьСтрокуТаблицы(Знач ДатаДокумента, Знач НомерДокумента, Знач СуммаДокумента)

            Запрос = Новый Запрос;

            Запрос.Текст =

                        "ВЫБРАТЬ

                        |           CRM_БизнесПроцессВзысканоПоИП.Ссылка КАК Ссылка

                        |ИЗ

                        |           БизнесПроцесс.CRM_БизнесПроцесс.ВзысканоПоИП КАК CRM_БизнесПроцессВзысканоПоИП

                        |ГДЕ

                        |           CRM_БизнесПроцессВзысканоПоИП.Период = &Период

                        |           И CRM_БизнесПроцессВзысканоПоИП.НомерДокумента = &НомерДокумента

                        |           И CRM_БизнесПроцессВзысканоПоИП.Сумма = &Сумма";

           

            Запрос.УстановитьПараметр("НомерДокумента", НомерДокумента);

            Запрос.УстановитьПараметр("Период", НачалоДня(ДатаДокумента));

            Запрос.УстановитьПараметр("Сумма", СуммаДокумента);

           

            Результат = Запрос.Выполнить();

            Выборка = Результат.Выбрать();

           

            Если Выборка.Следующий() Тогда

                        Возврат Истина;

            Иначе

                        Возврат Ложь;

            КонецЕсли;

                       

КонецФункции

 

&НаСервере

Процедура ДобавитьЗаписиВТабличнуюЧастьБП(Знач МассивДоков)

           

            Для Каждого Эл Из МассивДоков Цикл

                       

                        ДатаДокумента = XMLЗначение(Тип("Дата"), Эл.ДатаДокумента);

                        ДатаСП = XMLЗначение(Тип("Дата"), Эл.ДатаСП);

                       

                        СсылкаНаБП = ПолучитьСсылкуНаБП(Эл.НомерСП, ДатаСП, Эл.НомерСудебногоУчастка, Эл.Организация);

                       

                        Если ЗначениеЗаполнено(СсылкаНаБП) Тогда

                                   Если НЕ ЗначениеЗаполнено(СсылкаНаБП.ВзысканоПоИП) ИЛИ

                                                НЕ ПроверитьСтрокуТаблицы(ДатаДокумента, Эл.НомерДокумента, Эл.СуммаДокумента) Тогда

                                                

                                               //Добавляем запись в таблицу БП

                                               ОбБп = СсылкаНаБП.ПолучитьОбъект();

                                              

                                               НоваяСтр = ОбБп.ВзысканоПоИП.Добавить();

                                               НоваяСтр.Период = ДатаДокумента;

                                               НоваяСтр.НомерДокумента = Эл.НомерДокумента;

                                               НоваяСтр.Сумма = Эл.СуммаДокумента;

                                              

                                               ОбБп.Записать();           

                                              

                                               //Добавляем запись в РС

                                               МЗ = РегистрыСведений.РезультатОбменаЧерезСервисДЗФЛ.СоздатьМенеджерЗаписи();

                                              

                                               МЗ.НомерДокумента = Эл.НомерДокумента;

                                               МЗ.ДатаДокумента = XMLЗначение(Тип("Дата"), Эл.ДатаДокумента); 

                                               МЗ.БизнесПроцесс = СсылкаНаБП;

                                               МЗ.Организация = Эл.Организация;

                                               МЗ.СуммаДокумента = Эл.СуммаДокумента;

                                       МЗ.ДатаСП = XMLЗначение(Тип("Дата"), Эл.ДатаСП);

                                               МЗ.НомерСП = Эл.НомерСП;

                                               МЗ.НомерСудебногоУчастка = Эл.НомерСудебногоУчастка;

                                  

                                               МЗ.Записать();

                                              

                                   КонецЕсли;  

                        КонецЕсли;  

                       

            КонецЦикла;

           

КонецПроцедуры

 

 

&НаСервере

Процедура ЗаписатьРезультатОбменаВРегистр(Знач МассивСтатистики)

           

            Для Каждого Эл Из МассивСтатистики Цикл

                                              

                        Если НЕ ЗначениеЗаполнено(Эл.НомерДокумента) ИЛИ

                                    НЕ ЗначениеЗаполнено(Эл.ДатаДокумента) Тогда

                                   Продолжить;

                        КонецЕсли;

                       

                        МЗ = РегистрыСведений.РезультатОбменаЧерезСервисДЗФЛ.СоздатьМенеджерЗаписи();

        МЗ.НомерДокумента = Эл.НомерДокумента;

                        МЗ.ДатаДокумента = XMLЗначение(Тип("Дата"), Эл.ДатаДокумента);

        МЗ.Прочитать();

                       

                        Если НЕ МЗ.Выбран() Тогда//Нет такой записи

            МЗ.НомерДокумента = Эл.НомерДокумента;

                                   МЗ.ДатаДокумента = XMLЗначение(Тип("Дата"), Эл.ДатаДокумента);

                                   МЗ.Организация = Эл.Организация;

                                   МЗ.СуммаДокумента = Эл.СуммаДокумента;

                                  

                                   МЗ.ДатаСП = XMLЗначение(Тип("Дата"), Эл.ДатаСП);

                                   МЗ.НомерСП = Эл.НомерСП;

                                   МЗ.НомерСудебногоУчастка = Эл.НомерСудебногоУчастка;

                                  

                                   МЗ.Записать();

                                  

                        Иначе

                                   Если МЗ.СуммаДокумента <> Эл.СуммаДокумента ИЛИ//Не все данные совпадают

                                               МЗ.ДатаСП <> XMLЗначение(Тип("Дата"), Эл.ДатаСП) ИЛИ

                                               МЗ.НомерСП <> Эл.НомерСП ИЛИ

                                               МЗ.НомерСудебногоУчастка <> Эл.НомерСудебногоУчастка ИЛИ

                                               МЗ.Организация <> Эл.Организация Тогда

                                              

                        МЗ.НомерДокумента = Эл.НомерДокумента;

                                               МЗ.ДатаДокумента = XMLЗначение(Тип("Дата"), Эл.ДатаДокумента);

                                               МЗ.Организация = Эл.Организация;

                                               МЗ.СуммаДокумента = Эл.СуммаДокумента;

                                              

                                               МЗ.ДатаСП = XMLЗначение(Тип("Дата"), Эл.ДатаСП);

                                               МЗ.НомерСП = Эл.НомерСП;

                                               МЗ.НомерСудебногоУчастка = Эл.НомерСудебногоУчастка;

 

                                               МЗ.Записать();

                                   Иначе

                                               Продолжить;//Все данные совпадают      

                                   КонецЕсли;              

                        КонецЕсли;                          

            КонецЦикла;            

           

КонецПроцедуры

 

&НаСервере

Процедура ДляРегламентногоЗадания() Экспорт

 

            Выборка = Справочники.ПараметрыПодключенияКСервисуДЗФЛ.Выбрать();

           

            Пока Выборка.Следующий() Цикл 

                        Если Выборка.ПометкаУдаления = Ложь Тогда

                                   Соединение = Новый HTTPСоединение(Выборка.АдресПубликации, Выборка.Порт, Выборка.Логин, Выборка.Пароль,,30,,);

                                  

                                   ДатаНачала = НачалоГода(ТекущаяДата());

                                   ДатаОкончания = ТекущаяДата();

                                  

                                   Заголовки = Новый Соответствие;             

                                   Заголовки.Вставить("Content-Type", "application/json");

                                                                      

                                   Запрос = Новый HTTPЗапрос("/" + Выборка.Наименование + "/hs/DZFL/doki/" + ДатаНачала + "/" + ДатаОкончания, Заголовки);

                                   Результат2 = Соединение.ВызватьHTTPМетод("GET", Запрос);

                                  

                                  

                                   Если Результат2.КодСостояния = 200 Тогда

                                               ЧтениеJSON = Новый ЧтениеJSON();

                                               ЧтениеJSON.УстановитьСтроку(Результат2.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));

                                               РезСтруктура = ПрочитатьJSON(ЧтениеJSON);  

                                               ЧтениеJSON.Закрыть();

                                              

                                               //Вариант записи документов в табличную часть бизнес-процесса 

                                               // и регистр сведений

                                               ДобавитьЗаписиВТабличнуюЧастьБП(РезСтруктура);

 

                                               //Вариант записи документов в регистр сведений                           

                                               //ЗаписатьРезультатОбменаВРегистр(РезСтруктура);

                                   Иначе

                                   КонецЕсли;

                                  

                        КонецЕсли;

            КонецЦикла;

           

КонецПроцедуры

 

Рис. Регистр сведений для отслеживания переносимых документов в конфигурации CRM


Рейтинг@Mail.ru