Как реализовать веб-сервисы в 1С 7.7 для обмена данными со сторонними системами

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Вопрос интеграции устаревших систем на платформе 1С 7.7 с современными веб-приложениями является сложной технической задачей. В отличие от 1С 8.3, где веб-сервисы являются нативным объектом конфигурации, в "семерке" штатные механизмы практически отсутствуют. Однако существует несколько проверенных временем и практикой способов реализовать "единую точку входа" для получения данных (например, справочника номенклатуры) из множества разрозненных баз 7.7. Рассмотрим эти методы подробно, проанализируем их плюсы и минусы, а также разберем технические нюансы реализации.

Метод 1: Использование веб-сервера (PHP/Python/ASP.NET) и OLE-соединения

Это классический подход, при котором между внешней системой и 1С 7.7 устанавливается "прокладка" в виде скрипта на стороне веб-сервера (например, Apache или IIS). Скрипт принимает HTTP-запрос, инициирует COM-соединение (OLE) с базой 1С 7.7, выполняет код на языке 1С и возвращает результат.

Разберем по шагам, как это работает на примере PHP:

  1. Веб-сервер получает GET или POST запрос с параметрами (например, текст запроса или код товара).
  2. Скрипт создает объект V77.Application (или V77S.Application для SQL-версии).
  3. Выполняется авторизация в базе.
  4. С помощью метода EvalExpr() или выполнения заранее подготовленной обработки в 1С извлекаются данные.

Важный нюанс: запуск нового процесса 1С при каждом HTTP-запросе — это очень медленная операция, которая может занимать несколько секунд. Для высоконагруженных систем проанализируем возможность использования "пула соединений", когда несколько сессий 1С постоянно запущены и ждут команд.

Пример кода на PHP для подключения к 1С 7.7:


$v7 = new COM("V77.Application") or die("Ошибка создания объекта 1С");
$result = $v7->Initialize($v7->RMTrade, "/d\"C:\Bases\Trade\" /nUser /pPassword", "NO_WINDOW");
if ($result) {
    $nomenclatureName = $v7->EvalExpr("СокрЛП(Константа.НазваниеОрганизации)");
    echo "Организация: " . $nomenclatureName;
}

Метод 2: Прямой доступ к базе данных (SQL или DBF)

Если нам нужно только получать данные (чтение), то использование OLE — не самый эффективный путь. Рассмотрим более быстрый способ: обращение напрямую к таблицам базы данных. Если база 1С 7.7 работает на MS SQL Server, мы можем поднять стандартный веб-сервис (например, на .NET или Python), который будет выполнять SQL-запросы к таблицам SC* (справочники) и DH*/DT* (документы).

Выясним причину, почему это эффективно: мы минуем уровень приложения 1С, не тратим лицензии и не зависим от скорости работы интерфейса. Для DBF-версий проанализируем использование драйвера Visual FoxPro OLE DB Provider (VFPOLEDB). Он позволяет работать с файлами .dbf как с полноценной реляционной базой через SQL-запросы.

Пример прямого SQL-запроса для получения списка номенклатуры (для SQL-версии):


SELECT 
    SC.Code as Код, 
    SC.Description as Наименование 
FROM 
    SC123 as SC (NOLOCK) 
WHERE 
    SC.IsFolder = 0

Здесь SC123 — это имя таблицы справочника номенклатуры в вашей конкретной базе (его можно узнать в файле 1cv7.dd).

Метод 3: 1С 8.3 как "прокси-сервер"

В ситуации, когда у заказчика уже есть базы на 8.3, можно использовать одну из них в качестве центрального узла (шлюза). Посмотрим на эту схему:

  1. Сторонняя система обращается к веб-сервису 1С 8.3.
  2. База 8.3, выступая в роли клиента, подключается к нужной базе 7.7 через COM-соединение (V77.Application).
  3. 8.3 забирает данные из 7.7, упаковывает их в JSON или XML и отдает внешней системе.

Этот способ позволяет реализовать единообразие: внешняя система всегда "общается" только с современными веб-сервисами 8.3, а вся логика взаимодействия с устаревшими базами 7.7 скрыта внутри кода 1С.

Метод 4: Реверсивная интеграция (7.7 как клиент)

Иногда проще не заставлять 7.7 "слушать" порт, а научить её саму отправлять данные. Проанализируем ситуацию: если внешней системе нужны данные по расписанию, 1С 7.7 может инициировать HTTP-запрос к стороннему веб-сервису.

Для этого в 1С 7.7 обычно используют объект MSXML2.ServerXMLHTTP или компоненту v7plus.dll. Разберем пример реализации отправки данных на языке 1С 7.7:


Процедура ОтправитьДанные(ТекстДанных)
    Попытка
        HttpЗапрос = СоздатьОбъект("MSXML2.ServerXMLHTTP");
        HttpЗапрос.Open("POST", "http://external-system.com/api/data", 0);
        HttpЗапрос.SetRequestHeader("Content-Type", "application/json; charset=windows-1251");
        HttpЗапрос.Send(ТекстДанных);
        
        Если HttpЗапрос.Status = 200 Тогда
            Сообщить("Данные успешно отправлены: " + HttpЗапрос.ResponseText);
        Иначе
            Сообщить("Ошибка: " + HttpЗапрос.StatusText);
        КонецЕсли;
    Исключение
        Сообщить("Не удалось установить соединение!");
    КонецПопытки;
КонецПроцедуры

Метод 5: Использование внешних компонент (1С++ и сокеты)

Для продвинутых разработчиков существует возможность поднять HTTP-сервер прямо внутри процесса 1С 7.7. С помощью внешней компоненты 1С++ и её возможностей по работе с низкоуровневыми объектами (например, через класс Socket), можно написать обработку, которая будет слушать определенный TCP-порт и обрабатывать входящие HTTP-запросы.

Это самый сложный в реализации, но и самый "автономный" метод, не требующий внешних веб-серверов. Однако стоит учитывать, что однопоточность 1С 7.7 может стать узким местом: пока база отвечает на веб-запрос, интерфейс пользователя может "подмерзать".

Проблема кодировок и формата JSON

При реализации веб-сервисов для 1С 7.7 мы неизбежно столкнемся с двумя проблемами:

  1. Кодировка: 1С 7.7 работает в Windows-1251, в то время как современные веб-сервисы ожидают UTF-8. При передаче данных обязательно нужно использовать конвертацию.
  2. Формат JSON: В 7.7 нет встроенных функций для парсинга и генерации JSON. Рассмотрим решение: использование объекта MSScriptControl.ScriptControl с языком JScript.

Пример функции для формирования JSON в 1С 7.7:


Функция СформироватьJSON(Имя, Значение)
    Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
    Скрипт.Language = "JScript";
    ТекстКода = "var obj = {" + Имя + ": '" + Значение + "'}; JSON.stringify(obj);";
    // Примечание: Для работы JSON.stringify в старых ОС может потребоваться библиотека json2.js
    Вернуть Скрипт.Eval(ТекстКода);
КонецФункции

Итоги и рекомендации

Подводя итог, выберем оптимальную стратегию в зависимости от условий:

Развертывание полноценных веб-сервисов для 1С 7.7 — это всегда создание "моста" между технологиями разных поколений. Выбор конкретного пути зависит от ваших требований к скорости, безопасности и возможности вносить изменения в конфигурацию 7.7.

← На главную