Принцип работы 1С:ДиректБанк:
Запрашиваем выписку, авторизовываемся, подтверждаем авторизацию СМС паролем и получаем выписку. Все хорошо работает, но для того что бы спустя время повторно получить выписку, приходится опять проходить авторизацию.
Само подключение подключение к 1С:ДиректБанк - не рассматриваем, так как в интернете полно инструкций, да и встроенная обработка по подключению полностью автоматизирована.
О способе:
Эмпирически было замечено, что сбербанк после авторизации для получения выписки инициирует vpn соединение и завершает сессию при отсутствии активности спустя некоторого времени. Так что мы будем использовать эту особенность для многократного получения выписок, по сути постоянно генерируем активность в сессии не давай ей закрыться.
В общем этот способ хоть и костыль, но позволяет нам оперативно видеть движения по расчетному счету и минимизировать человеческий фактор.
Способ безопасен, ибо дает возможность только получения выписок, для отправки платежей все равно потребуется подписывание с помощью СМС.
Из минусов, придется держать открытым 1С с запущенной формой загрузки выписок
Добавленный или измененный код обернут в "////", большая часть изменений связана с отключением вывода предупреждений и прочих окон. Можете по этому принципе доработать любую типовую конфигурацию.
1. Добавляем новое расширением, называем как хотим и снимаем оба флажка в списке расширений.
2. Добавляем в расширение форму "Обработка.КлиентБанк.ФормаЗагрузка"
3. В расширяемой форме, добавляем новый реквизит "Таймер", тип Число. Установка Таймера - будет отключать все. Для удобства включаем у реквизита "Таймер" флаг "Сохранения", что бы значение таймера сохранялось.
4. Добавляем в удобное для вас место на форме, я добавил между кнопками запросить выписку и настройки. (скриншот 1cv8c_2018-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 секунд. Прошел день, все работает!
Готовое решение
1С обмен данными с клиентом банка для БП 3.0, ERP 2.4, ERP 2.5 с дополнительными правилами загрузки
Модуль представляет собой автоматизацию обмена данными 1С с банком для БП 3.0, ERP 2.4, ERP 2.5. Выписка клиент-банка загружается и обрабатывается по Вашим правилам. Заполнение реквизитов документов, анализ назначения платежа. Работа с клиент-банком не отличается от типового варианта, а документы автоматически заполняются так, как нужно вам. Дополнительная обработка, работающая совместно с основным расширением позволяет подключать собственные произвольные алгоритмы.