В современных реалиях требования корпоративной безопасности становятся всё более жесткими. Службы безопасности многих компаний справедливо выражают недовольство классическим файловым обменом между 1С и клиент-банками. Текстовые файлы выгрузки (обычно в формате 1CClientBankExchange), временно записываемые на жесткий диск или сетевую шару, хранят конфиденциальные данные в открытом виде. Злоумышленник или вредоносное ПО может перехватить, прочитать или даже модифицировать файл перед его загрузкой в учетную систему.
Для платформы 1С v8 давно существует стандартный механизм DirectBank, который позволяет обмениваться данными с банками напрямую через защищенное TLS-соединение. Однако для устаревшей, но все еще активно используемой платформы 1С 7.7 (например, в конфигурации "Торговля и Склад") штатных механизмов прямого бесфайлового обмена нет. В этой статье мы подробно разберем, как решить данную задачу программными средствами Windows и банковских API.
Прежде чем перейти к реализации, проанализируем основные технические препятствия, с которыми сталкивается разработчик на платформе "семерки":
HTTPСоединение, в 1С 7.7 отсутствуют встроенные средства для выполнения сетевых запросов.Тем не менее, эти проблемы успешно решаются с использованием встроенных системных COM-объектов операционной системы Windows и стандартных библиотек.
Для отправки запросов к банковским серверам по протоколу 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 = КонтрагентСсылка;
ДокВыписка.НазначениеПлатежа = Назначение;
Попытка
ДокВыписка.Записать();
Сообщить("Успешно загружен платеж на сумму " + СуммаПлатежа + " руб. от " + СпрКонтрагенты.Наименование);
Исключение
Сообщить("Ошибка записи документа для платежа от ИНН " + ИННКонтрагента);
КонецПопытки;
КонецЦикла;
Если служба безопасности вашего предприятия требует работы по сложным протоколам авторизации (например, с использованием аппаратных USB-токенов Рутокен/JaCarta и криптопровайдера КриптоПро CSP), написать такое решение чисто средствами 1С 7.7 крайне затруднительно.
В этом случае отличным выходом будет использование скрипта-посредника на языке Python или Windows PowerShell. Схема работы выглядит следующим образом:
ЗапуститьПриложение).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С!")
Выбор конкретного метода зависит от технических условий вашей задачи:
Использование любого из этих методов позволяет полностью исключить небезопасную выгрузку промежуточных текстовых файлов на диски компьютеров, что гарантированно удовлетворит требованиям ИТ-безопасности вашей компании.