Идея взята из этой публикации Загрузка выписок в УНФ и адаптирована под УТ 11
Принцип работы 1С:ДиректБанк:
Запрашиваем выписку, авторизовываемся, подтверждаем авторизацию СМС паролем и получаем выписку. Все хорошо работает, но для того что бы спустя время повторно получить выписку, приходится опять проходить авторизацию.
Само подключение подключение к 1С:ДиректБанк - не рассматриваем, так как в интернете полно инструкций, да и встроенная обработка по подключению полностью автоматизирована.
О способе:
Эмпирически было замечено, что сбербанк после авторизации для получения выписки инициирует vpn соединение и завершает сессию при отсутствии активности спустя некоторого времени. Так что мы будем использовать эту особенность для многократного получения выписок, по сути постоянно генерируем активность в сессии не давай ей закрыться.
В общем этот способ хоть и костыль, но позволяет нам оперативно видеть движения по расчетному счету и минимизировать человеческий фактор.
Способ безопасен, ибо дает возможность только получения выписок, для отправки платежей все равно потребуется подписывание с помощью СМС.
Из минусов, придется держать открытым 1С с запущенной формой загрузки выписок
1. Добавляем новое расширение, называем как хотим и снимаем оба флажка в списке расширений.
2. Добавляем в расширение форму "Обработка.КлиентБанк.ФормаЗагрузка"
3. В расширяемой форме, добавляем новый реквизит "Таймер", тип Число. Установка Таймера - будет отключать все. Для удобства включаем у реквизита "Таймер" флаг "Сохранения", что бы значение таймера сохранялось.
4. Добавляем в удобное для вас место на форме. (смотри скриншот )
5. Вставляем код в модуль расширяемой формы "Обработка.КлиентБанк.ФормаЗагрузка"
// "нажимаем" кнопку "Запросить выписку"
&НаКлиенте
Процедура РоботСбербанк_ЗапроситьЭлектроннуюВыпискуБанка() экспорт
// Делаем отметку счетов для загрузки
Для каждого Счет Из Объект.БанковскиеСчета Цикл
Если Счет.Загружается Тогда
Продолжить;
КонецЕсли;
Если Счет.ПрямойОбмен Тогда
Счет.Пометка = Истина;
КонецЕсли;
КонецЦикла;
//Программно нажимаем кнопку запросить выписку
ИмяНужнойКоманды = "ЗагрузитьДокументы";
// Тут просто имя команды как в конфигураторе.
НужнаяКоманда = ЭтаФорма.Команды.Найти(ИмяНужнойКоманды); // Находим команду на форме
ЗагрузитьДокументы(НужнаяКоманда);
КонецПроцедуры
&НаКлиенте
&После ("ЗавершитьЗагрузку")
Процедура РоботСбербанк_После_ЗавершитьЗагрузку()
// Если у нас установлен Таймер повторного запроса выписки
Если Таймер > 0 тогда
ПодключитьОбработчикОжидания("РоботСбербанк_ЗапроситьЭлектроннуюВыпискуБанка", Таймер, Истина); // Устанавливаем Таймер на повторную загрузку выписки.
возврат;
КонецЕсли;
КонецПроцедуры
6. Добавляем в расширение "ОбщийМодуль.ОбменСБанкамиСлужебныйКлиент"
7. Вставляем в модуль код, чтобы убрать не нужный интерактивный вопрос.
&Вместо ("ПослеФормированияИОтправкиЗапросовВыпискиСбербанк")
// Асинхронный обработчик, вызываемый из ОбменСБанкамиКлиент.ПолучитьВыпискуБанка
//
// Параметры:
// Результат - Структура - см. описание в ДлительныеОперацииКлиент.ОжидатьЗавершение
// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения.
//
Процедура РоботСбербанк_ПослеФормированияИОтправкиЗапросовВыпискиСбербанк(Результат, ДополнительныеПараметры) Экспорт
ПараметрыЖурналирования = ОбменСБанкамиСлужебныйВызовСервера.ПараметрыЖурналирования(
ДополнительныеПараметры.НастройкаОбмена);
Если ПараметрыЖурналирования.ИспользоватьЖурналирование Тогда
СохранитьЖурналВФайл(ДополнительныеПараметры.НастройкаОбмена, ПараметрыЖурналирования.КаталогДляЖурналирования);
КонецЕсли;
Если Результат = Неопределено Тогда // задание было отменено пользователем
Возврат;
КонецЕсли;
Если Результат.Статус = "Ошибка" Тогда
ВидОперации = НСтр("ru = 'Отправка запросов выписок в Сбербанк'");
ОбработатьОшибку(ВидОперации, Результат.ПодробноеПредставлениеОшибки, Результат.КраткоеПредставлениеОшибки,
ДополнительныеПараметры.НастройкаОбмена);
Иначе // выполнено
РезультатОперации = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
Если РезультатОперации.ГотовыеВыписки.Количество() Тогда
ДополнительныеПараметры.Вставить("ГотовыеВыписки", РезультатОперации.ГотовыеВыписки);
ОписаниеОповещенияОЗавершении = Новый ОписаниеОповещения(
"ПолучитьВыпискуСбербанкаПослеВопросаОбИхНаличии", ЭтотОбъект, ДополнительныеПараметры);
ТекстВопроса = НСтр("ru = 'В базе уже есть выписки банка за указанный период.
|Загрузить выписки из базы или получить новые из банка?'");
Кнопки = Новый СписокЗначений;
Кнопки.Добавить(Истина, НСтр("ru = 'Загрузить из базы'"));
Кнопки.Добавить(Ложь, НСтр("ru = 'Получить из банка'"));
Кнопки.Добавить(КодВозвратаДиалога.Отмена);
Заголовок = НСтр("ru = 'Выбор способа получения выписки'");
// ПоказатьВопрос(ОписаниеОповещенияОЗавершении, ТекстВопроса, Кнопки, , Истина, Заголовок);
//Сразу грузим выписки без вопроса
ПолучитьВыпискуСбербанкаПослеВопросаОбИхНаличии(Ложь, ДополнительныеПараметры)
ИначеЕсли РезультатОперации.МассивТикетов.Количество() Тогда // запросы были отправлены в банк и получены тикеты
ВладелецФормы = ДополнительныеПараметры.Владелец;
ПараметрыФормы = Новый Структура("МассивСообщенийОбмена, НастройкаОбмена, ГотовыеВыписки, ДатаНачала, ДатаОкончания,
|ПринудительноеПолучениеВыписки, НомерСчета");
ЗаполнитьЗначенияСвойств(ПараметрыФормы, ДополнительныеПараметры);
ПараметрыФормы.Вставить("ВидОперации", "ПолучениеВыписки");
ПараметрыФормы.Вставить("МассивТикетов", РезультатОперации.МассивТикетов);
ПараметрыФормы.Вставить("МассивСообщенийОбмена", РезультатОперации.МассивСообщенийОбмена);
ПараметрыФормы.Вставить("ГотовыеВыписки", Новый Массив);
ОткрытьФорму("Обработка.ОбменСБанками.Форма.ЗапросВБанк", ПараметрыФормы, ВладелецФормы);
ИначеЕсли РезультатОперации.ИспользуетсяТокен Тогда
ДополнительныеПараметры.Вставить("ГотовыеВыписки", Новый Массив);
ДополнительныеПараметры.Вставить("МассивСообщенийОбмена", РезультатОперации.МассивСообщенийОбмена);
ОбработчикПослеПодписания = Новый ОписаниеОповещения(
"ОтправитьЗапросВыпискиПослеПодписанияСбербанк", ЭтотОбъект, ДополнительныеПараметры);
ПодписатьЭДСбербанк(
ОбработчикПослеПодписания, ДополнительныеПараметры.НастройкаОбмена, РезультатОперации.МассивСообщенийОбмена);
Иначе //отправка по логину, требуется установка сессии.
ДополнительныеПараметры.Вставить("МассивСообщенийОбмена", РезультатОперации.МассивСообщенийОбмена);
Обработчик = Новый ОписаниеОповещения(
"ПолучитьВыпискиПослеБазовойАутентификацииСбербанк", ЭтотОбъект, ДополнительныеПараметры);
ВыполнитьБазовуюАутентификациюСбербанк(Обработчик, ДополнительныеПараметры.РеквизитыНастройкиОбмена.ИмяВнешнегоМодуля,
ДополнительныеПараметры.НастройкаОбмена, ДополнительныеПараметры.НастройкаОбмена);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Тестировалось на версии УТ 11.4.8.92