Как загружать выписки напрямую из банков Точка и Авангард в 1С 7.7 без создания промежуточных файлов?

Программист 1С v7.7 Бухгалтерский учет Финансы и профессиональные услуги
← На главную

В современных реалиях требования корпоративной безопасности становятся всё более жесткими. Службы безопасности многих компаний справедливо выражают недовольство классическим файловым обменом между 1С и клиент-банками. Текстовые файлы выгрузки (обычно в формате 1CClientBankExchange), временно записываемые на жесткий диск или сетевую шару, хранят конфиденциальные данные в открытом виде. Злоумышленник или вредоносное ПО может перехватить, прочитать или даже модифицировать файл перед его загрузкой в учетную систему.

Для платформы 1С v8 давно существует стандартный механизм DirectBank, который позволяет обмениваться данными с банками напрямую через защищенное TLS-соединение. Однако для устаревшей, но все еще активно используемой платформы 1С 7.7 (например, в конфигурации "Торговля и Склад") штатных механизмов прямого бесфайлового обмена нет. В этой статье мы подробно разберем, как решить данную задачу программными средствами Windows и банковских API.

В чем сложность интеграции DirectBank в 1С 7.7?

Прежде чем перейти к реализации, проанализируем основные технические препятствия, с которыми сталкивается разработчик на платформе "семерки":

  1. Отсутствие встроенных HTTP-клиентов. В отличие от 1С 8.3, где есть объект HTTPСоединение, в 1С 7.7 отсутствуют встроенные средства для выполнения сетевых запросов.
  2. Проблема с обработкой JSON. Современные банковские REST API (включая Точка Банк и Авангард) возвращают данные в формате JSON. Платформа 1С 7.7 не умеет работать с JSON "из коробки" — в ней нет соответствующих объектов парсинга.
  3. Криптография и ЭЦП. Для работы с банковскими сервисами часто требуется авторизация по сертификатам (ГОСТ-криптография), поддержка которой в 1С 7.7 крайне затруднена без специализированных внешних компонент.

Тем не менее, эти проблемы успешно решаются с использованием встроенных системных COM-объектов операционной системы Windows и стандартных библиотек.

Решение 1. Прямой HTTP-обмен с API банков через WinHttp

Для отправки запросов к банковским серверам по протоколу HTTPS мы можем использовать встроенный в Windows системный объект WinHttp.WinHttpRequest.5.1. Он поддерживает современные протоколы шифрования TLS 1.2/1.3, передачу заголовков авторизации и работу через прокси-серверы.

Рассмотрим по шагам процесс получения данных на примере интеграции с API банка Точка:

Шаг 1. Инициализация HTTP-соединения и отправка запроса

Для начала нам необходимо настроить авторизацию (обычно по протоколу OAuth 2.0 с использованием Bearer-токена) и получить данные выписки в виде JSON-строки в оперативную память 1С, минуя сохранение на жесткий диск.


// Создаем системный объект для выполнения HTTPS-запросов
Попытка
    HttpЗапрос = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
Исключение
    Предупреждение("В системе не установлен компонент WinHttp!");
    Возврат;
КонецПопытки;

// Адрес API банка Точка для получения выписок
АдресРесурса = "https://enter.tochka.com/api/v1/statement/incoming";
ТокенДоступа = "ВАШ_BEARER_TOKEN_ИЗ_ЛИЧНОГО_КАБИНЕТА";

// Настраиваем GET-запрос (0 - асинхронный режим выключен)
HttpЗапрос.Open("GET", АдресРесурса, 0);

// Устанавливаем заголовки авторизации и формата данных
HttpЗапрос.SetRequestHeader("Authorization", "Bearer " + ТокенДоступа);
HttpЗапрос.SetRequestHeader("Content-Type", "application/json");

// Отправляем запрос на сервер банка
Попытка
    HttpЗапрос.Send();
Исключение
    Предупреждение("Не удалось связаться с сервером банка: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Проверяем статус ответа сервера
Если HttpЗапрос.Status <> 200 Тогда
    Предупреждение("Ошибка банка: " + HttpЗапрос.Status + " " + HttpЗапрос.StatusText);
    Возврат;
КонецЕсли;

// Получаем JSON-ответ напрямую в переменную
JSONОтвет = HttpЗапрос.ResponseText;

Шаг 2. Парсинг JSON-данных внутри 1С 7.7

Поскольку парсить JSON регулярными выражениями или строковыми функциями неэффективно и чревато ошибками, мы задействуем еще один системный компонент Windows — MSScriptControl.ScriptControl с языком JavaScript. Это позволит нам безопасно обработать структуру данных в оперативной памяти.


// Создаем объект выполнения сценариев ScriptControl
Попытка
    ScriptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
    ScriptCtrl.Language = "javascript";
Исключение
    Предупреждение("Не удалось запустить MSScriptControl!");
    Возврат;
КонецПопытки;

// Пишем вспомогательные JS-функции для безопасного извлечения свойств
// Это необходимо, так как прямое обращение к свойствам JS-объектов из 1С 7.7 может вызывать ошибки типов
ScriptCtrl.AddCode("
|function parseJSON(jsonStr) {
|    return JSON.parse(jsonStr);
|}
|function getArrayLength(arr) {
|    return arr.length;
|}
|function getElementByIndex(arr, index) {
|    return arr[index];
|}
|function getProperty(obj, propName) {
|    return obj[propName];
|}
|");

// Выполняем парсинг JSON-строки
Попытка
    JSObject = ScriptCtrl.Run("parseJSON", JSONОтвет);
Исключение
    Предупреждение("Ошибка разбора JSON-структуры ответа банка!");
    Возврат;
КонецПопытки;

Шаг 3. Обработка транзакций и создание документов в 1С 7.7

Теперь мы можем обойти массив транзакций, полученный из банка, и заполнить документы поступления или списания безналичных денежных средств непосредственно в информационной базе 1С.


// Предположим, банк вернул объект, где транзакции лежат в массиве "payments"
МассивПлатежей = ScriptCtrl.Run("getProperty", JSObject, "payments");
КоличествоПлатежей = ScriptCtrl.Run("getArrayLength", МассивПлатежей);

Если КоличествоПлатежей = 0 Тогда
    Сообщить("Новых движений по счету не обнаружено.");
    Возврат;
КонецЕсли;

Для Номер = 0 По КоличествоПлатежей - 1 Цикл
    ТекущийПлатеж = ScriptCtrl.Run("getElementByIndex", МассивПлатежей, Номер);
    
    // Получаем реквизиты платежа
    СуммаПлатежа = Число(ScriptCtrl.Run("getProperty", ТекущийПлатеж, "amount"));
    Назначение   = Строка(ScriptCtrl.Run("getProperty", ТекущийПлатеж, "purpose"));
    ДатаПлатежа  = Строка(ScriptCtrl.Run("getProperty", ТекущийПлатеж, "date"));
    ИННКонтрагента = Строка(ScriptCtrl.Run("getProperty", ТекущийПлатеж, "counterparty_inn"));
     КППКонтрагента = Строка(ScriptCtrl.Run("getProperty", ТекущийПлатеж, "counterparty_kpp"));
    
    // Алгоритм поиска контрагента в справочнике 1С по ИНН/КПП
    СпрКонтрагенты = СоздатьОбъект("Справочник.Контрагенты");
    Если СпрКонтрагенты.НайтиПоРеквизиту("ИНН", ИННКонтрагента, 1) = 1 Тогда
        КонтрагентСсылка = СпрКонтрагенты.ТекущийЭлемент();
    Иначе
        Сообщить("Контрагент с ИНН " + ИННКонтрагента + " не найден в базе!");
        Продолжить;
    КонецЕсли;
    
    // Создаем и заполняем документ "Строка выписки (Приход)"
    ДокВыписка = СоздатьОбъект("Документ.СтрокаВыпискиПриход");
    ДокВыписка.Новый();
    ДокВыписка.ДатаДок = РабочаяДата(); // или преобразуем дату из API
    ДокВыписка.Сумма = СуммаПлатежа;
    ДокВыписка.Субконто1 = КонтрагентСсылка;
    ДокВыписка.НазначениеПлатежа = Назначение;
    
    Попытка
        ДокВыписка.Записать();
        Сообщить("Успешно загружен платеж на сумму " + СуммаПлатежа + " руб. от " + СпрКонтрагенты.Наименование);
    Исключение
        Сообщить("Ошибка записи документа для платежа от ИНН " + ИННКонтрагента);
    КонецПопытки;
КонецЦикла;

Решение 2. Гибридный подход с использованием скрипта-посредника (Python / PowerShell)

Если служба безопасности вашего предприятия требует работы по сложным протоколам авторизации (например, с использованием аппаратных USB-токенов Рутокен/JaCarta и криптопровайдера КриптоПро CSP), написать такое решение чисто средствами 1С 7.7 крайне затруднительно.

В этом случае отличным выходом будет использование скрипта-посредника на языке Python или Windows PowerShell. Схема работы выглядит следующим образом:

  1. 1С 7.7 запускает внешний скрипт (например, через команду ЗапуститьПриложение).
  2. Скрипт-посредник самостоятельно выполняет защищенное соединение с банком (Авангард или Точка), используя библиотеки криптографии (такие как PyCrypto или встроенные командлеты PowerShell с доступом к хранилищу сертификатов Windows).
  3. Скрипт скачивает выписку в оперативную память.
  4. Передача данных в 1С 7.7 осуществляется через **OLE/COM-соединение**: скрипт инициализирует OLE-сессию с запущенной 1С 7.7 (через объект V1CEnterprise.Application) и напрямую заполняет документы "на лету", вообще не сохраняя данные на диск компьютера.

Рассмотрим пример реализации такого посредника на Python:


import win32com.client
import requests

# 1. Получаем данные из API банка в память скрипта
api_url = "https://enter.tochka.com/api/v1/statement/incoming"
headers = {"Authorization": "Bearer ВАШ_ТОКЕН"}
response = requests.get(api_url, headers=headers)

if response.status_code == 200:
    payments = response.json().get("payments", [])
    
    # 2. Подключаемся к работающей сессии 1С 7.7 по OLE
    try:
        one_c = win32com.client.GetActiveObject("V1CEnterprise.Application")
    except Exception:
        print("Запущенная копия 1С 7.7 не найдена!")
        exit()
        
    # 3. Передаем данные напрямую в документы 1С
    for payment in payments:
        inn = payment.get("counterparty_inn")
        amount = payment.get("amount")
        purpose = payment.get("purpose")
        
        # Находим контрагента средствами 1С
        contr_sprav = one_c.CreateObject("Справочник.Контрагенты")
        if contr_sprav.FindByAttribute("ИНН", inn, 1) == 1:
            # Создаем документ поступления
            doc = one_c.CreateObject("Документ.СтрокаВыпискиПриход")
            doc.New()
            doc.Сумма = amount
            doc.Субконто1 = contr_sprav.CurrentItem()
            doc.НазначениеПлатежа = purpose
            doc.Write()
            print(f"Документ на сумму {amount} успешно создан в 1С!")

Какое решение выбрать?

Выбор конкретного метода зависит от технических условий вашей задачи:

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

← На главную