Автоматическая загрузка выписок Сбербанк-бизнес онлайн с помощью 1С:ДиректБанк



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

Принцип работы 1С:ДиректБанк: 
Запрашиваем выписку, авторизовываемся, подтверждаем авторизацию СМС паролем и получаем выписку. Все хорошо работает, но для того что бы спустя время повторно получить выписку, приходится опять проходить авторизацию.
Само подключение подключение к 1С:ДиректБанк — не рассматриваем, так как в интернете полно инструкций, да и встроенная обработка по подключению полностью автоматизирована.

О способе: 
Эмпирически было замечено, что сбербанк после авторизации для получения выписки инициирует vpn соединение и завершает сессию при отсутствии активности спустя некоторого времени. Так что мы будем использовать эту особенность для многократного получения выписок, по сути постоянно генерируем активность в сессии не давай ей закрыться.
В общем этот способ хоть и костыль, но позволяет нам оперативно видеть движения по расчетному счету и минимизировать человеческий фактор.

Способ безопасен, ибо дает возможность только получения выписок, для отправки платежей все равно потребуется подписывание с помощью СМС.

Из минусов, придется держать открытым 1С с запущенной формой загрузки выписок

Добавленный или измененный код обернут в "////", большая часть изменений связана с отключением вывода предупреждений и прочих окон. Можете по этому принципе доработать любую типовую конфигурацию. 

1. Добавляем новое расширением, называем как хотим и снимаем оба флажка в списке расширений.

2. Добавляем в расширение форму "Обработка.КлиентБанк.ФормаЗагрузка"

3. В расширяемой форме, добавляем новый реквизит "Таймер", тип Число. Установка Таймера — будет отключать все. Для удобства включаем у реквизита "Таймер" флаг "Сохранения", что бы значение таймера сохранялось.

4. Добавляем в удобное для вас место на форме, я добавил между кнопками запросить выписку и настройки. (скриншот 1cv8c_2024-03-14_17-26-28.png)

5. Вставляем код в модуль расширяемой формы  "Обработка.КлиентБанк.ФормаЗагрузка"

 
 //  Эту процедура инициирует создание и если настроено, проведение документов на основе загруженной выписки.
// в этой процедур мы отключаем все окна, предупреждения и прочие открываемые формы
&Вместо("ЗагрузитьВыполнить")
&НаКлиенте
Процедура hands_center_ЗагрузитьВыполнить(Команда)

ПослеЗагрузкиВыписокВ1С = Истина;

Если НЕ ПроверитьЗаполнениеРеквизитовФормы() Тогда

Возврат;

КонецЕсли;

Если Объект.Загрузка.Количество() > 0 Тогда

ЕстьОтмеченныеСтроки = Ложь;
Для Каждого ТекущаяСтрока Из Объект.Загрузка Цикл
Если ТекущаяСтрока.Загружать Тогда
ЕстьОтмеченныеСтроки = Истина;
Прервать;
КонецЕсли;
КонецЦикла;

Если Не ЕстьОтмеченныеСтроки Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = НСтр("ru = 'Не отмечено ни одной строки! Выписки не будут загружены. Нужно установить отметку в загружаемых строках и нажать кнопку еще раз.'");
Сообщение.Поле = "Объект.Загрузка[0].Загружать";
Сообщение.Сообщить();
Возврат;
КонецЕсли;

ТаблицаРезультата.Очистить();

Состояние(
НСтр("ru='Выполняется загрузка выписки из файла в 1С...'"),
,
НСтр("ru='Пожалуйста, подождите'"),
БиблиотекаКартинок.ЗагрузкаДанных32
);

СтруктураДанныхЗагрузки = ЗагрузитьВыполнитьНаСервере();

Если СтруктураДанныхЗагрузки.Свойство("ТекстПредупреждения") И НЕ ПустаяСтрока(СтруктураДанныхЗагрузки.ТекстПредупреждения) Тогда
ПоказатьПредупреждение(Неопределено, СтруктураДанныхЗагрузки.ТекстПредупреждения);
КонецЕсли;

ПараметрыЗавершения = Новый Структура("ЕстьПредупржедения, ОбработаноСтрок, ВсегоСтрок, СообщенияПользователю",
СтруктураДанныхЗагрузки.ЕстьПредупржедения, СтруктураДанныхЗагрузки.ОбработаноСтрок, СтруктураДанныхЗагрузки.ВсегоСтрок, СтруктураДанныхЗагрузки.СообщенияПользователю);

////Добавляем дополнительное условие вывода предупреждений, пусть только когда отключена автозагрузка
Если Таймер > 0 Тогда
возврат
КонецЕсли;
////
#Если ВебКлиент Тогда

ЛеваяЧастьПредупреждения = "Загрузка платежных документов завершена";
ПраваяЧастьПредупреждения = НСтр("ru = 'Обработано строк: '")+ПараметрыЗавершения.ОбработаноСтрок+НСтр("ru = '. Всего строк: '")+ПараметрыЗавершения.ВсегоСтрок+".";
ТекстПредупреждения = ЛеваяЧастьПредупреждения + Символы.ПС + Символы.ПС + ПраваяЧастьПредупреждения;
ПоказатьПредупреждение(Неопределено, ТекстПредупреждения);

РезультатЗавершения = Неопределено; // Новый Структура("ПоказатьПротокол", Истина);
ЗагрузкаПлатежныхДокументовЗавершение(РезультатЗавершения, ПараметрыЗавершения);

#Иначе

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

#КонецЕсли

Иначе
////Добавляем дополнительное условие вывода предупреждений, пусть только когда отключена автозагрузка
Если Таймер > 0 Тогда
возврат
КонецЕсли;
////
ПоказатьПредупреждение(Неопределено, НСтр("ru = 'Список документов для загрузки пуст.'"));

КонецЕсли;

КонецПроцедуры // ЗагрузитьВыполнить()


//// Эта процедура выполняется после получения загруженных выписок
//// Вносим внее изменения для того что отключить все всплывающие окна и предупреждения, когда у нас включен таймер

&Вместо("ПрочитатьЭлектронныеВыпискиБанка")
&НаКлиенте
Процедура hands_center_ПрочитатьЭлектронныеВыпискиБанка()

СтекОповещений = Новый Массив;
ТекстПредупреждения = "";

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

Если Не ЗначениеЗаполнено(ИмпортТекстДляРазбора) Тогда
ТекстСообщения = НСтр("ru = 'Файл загрузки не содержит данных!'");
УправлениеНебольшойФирмойКлиент.СообщитьОбОшибке(ЭтаФорма, ТекстСообщения);
Возврат;
КонецЕсли;

СтрокаСообщения = ЗаполнитьДокументыНаИмпорт(ИмпортТекстДляРазбора);
Если ЗначениеЗаполнено(СтрокаСообщения) Тогда
ТекстПредупреждения = ТекстПредупреждения + ?(ЗначениеЗаполнено(ТекстПредупреждения), Символы.ПС, "") + СтрокаСообщения;
КонецЕсли;

Для каждого Сообщение Из СтекОповещений Цикл
УправлениеНебольшойФирмойКлиент.СообщитьОбОшибке(ЭтаФорма, Сообщение.Текст);
КонецЦикла;

//// Если у нас установлен Таймер повторного запроса выписки
Если Таймер > 0  тогда
ЗагрузитьВыполнить(Неопределено); //// запускаем обработку документов выписки
ПодключитьОбработчикОжидания("hands_center_ЗапроситьЭлектроннуюВыпискуБанка", Таймер, Истина); //// Устанавливаем Таймер на повторную загрузку выписки.
возврат;
КонецЕсли;
////

Если ЗначениеЗаполнено(ТекстПредупреждения) Тогда
ПоказатьПредупреждение(Неопределено, ТекстПредупреждения);
КонецЕсли;


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

//// "нажимаем" кнопку "Запросить выписку"
&НаКлиенте
Процедура hands_center_ЗапроситьЭлектроннуюВыпискуБанка() экспорт
ЗапроситьЭлектроннуюВыпискуБанка(Неопределено);
КонецПроцедуры

 

6. Добавляем в расширение "ОбщийМодуль.ОбменСБанкамиСлужебныйКлиент"

7. Вставляем в модуль код, вносимые изменения выделены

 
 //// Подменяем стандартную процедуру выполняемую после авторизации клиент-банка

&Вместо("ПослеФормированияИОтправкиЗапросовВыпискиСбербанк")
Процедура хц_ПослеФормированияИОтправкиЗапросовВыпискиСбербанк(Результат, ДополнительныеПараметры) Экспорт

ПараметрыЖурналирования = ОбменСБанкамиСлужебныйВызовСервера.ПараметрыЖурналирования(
ДополнительныеПараметры.НастройкаОбмена);

Если ПараметрыЖурналирования.ИспользоватьЖурналирование Тогда
СохранитьЖурналВФайл(ДополнительныеПараметры.НастройкаОбмена, ПараметрыЖурналирования.КаталогДляЖурналирования);
КонецЕсли;

Если Результат = Неопределено Тогда // задание было отменено пользователем
Возврат;
КонецЕсли;

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


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

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

КонецЕсли;

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

 

Для себя я установил таймер в 600 секунд. Прошел день, все работает!

6 Comments

  1. Proplus74

    можно как-то запустить без программирования?

    Reply
  2. handscenter

    расширение прикреплено, но я его не проверял на последней версии УНФ

    Reply
  3. user1199510

    «Из минусов, придется держать открытым 1С с запущенной формой загрузки выписок»

    Здравствуйте. Я правильно понимаю, что просто в 1С, должна быть постоянно открыта эта вкладка, и пока она открыта, в он-лайне выписки будут подгружаться? Если закроется, надо снова открыть.

    «В расширяемой форме, добавляем новый реквизит «Таймер», тип Число. Установка Таймера — будет отключать все. Для удобства включаем у реквизита «Таймер» флаг «Сохранения», что бы значение таймера сохранялось.» Для чего таймер нужен? Зачем указывать значения, я к сожалению суть этого не уловил….

    Reply
  4. handscenter

    (3) другого пути нет, впн сессия до сбера поднимается на клиенте, была бы на сервере — можно было сделать регламентное задание.

    Цель таймера установить время автоперезапуска обмена с банком.

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

    У меня эта схема работает уже почти 1.5 года. Удобно.

    Reply
  5. yuliya1985

    Добрый день, для на БП 3.0 (3.0.74.63) будет работать или может быть есть отдельная обработка?

    Reply
  6. handscenter

    (5) не будет, под БП нужно писать свой код

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *