Вопрос интеграции устаревших систем на платформе 1С 7.7 с современными веб-приложениями является сложной технической задачей. В отличие от 1С 8.3, где веб-сервисы являются нативным объектом конфигурации, в "семерке" штатные механизмы практически отсутствуют. Однако существует несколько проверенных временем и практикой способов реализовать "единую точку входа" для получения данных (например, справочника номенклатуры) из множества разрозненных баз 7.7. Рассмотрим эти методы подробно, проанализируем их плюсы и минусы, а также разберем технические нюансы реализации.
Это классический подход, при котором между внешней системой и 1С 7.7 устанавливается "прокладка" в виде скрипта на стороне веб-сервера (например, Apache или IIS). Скрипт принимает HTTP-запрос, инициирует COM-соединение (OLE) с базой 1С 7.7, выполняет код на языке 1С и возвращает результат.
Разберем по шагам, как это работает на примере PHP:
V77.Application (или V77S.Application для SQL-версии).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;
}
Если нам нужно только получать данные (чтение), то использование 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).
В ситуации, когда у заказчика уже есть базы на 8.3, можно использовать одну из них в качестве центрального узла (шлюза). Посмотрим на эту схему:
V77.Application).Этот способ позволяет реализовать единообразие: внешняя система всегда "общается" только с современными веб-сервисами 8.3, а вся логика взаимодействия с устаревшими базами 7.7 скрыта внутри кода 1С.
Иногда проще не заставлять 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);
КонецЕсли;
Исключение
Сообщить("Не удалось установить соединение!");
КонецПопытки;
КонецПроцедуры
Для продвинутых разработчиков существует возможность поднять HTTP-сервер прямо внутри процесса 1С 7.7. С помощью внешней компоненты 1С++ и её возможностей по работе с низкоуровневыми объектами (например, через класс Socket), можно написать обработку, которая будет слушать определенный TCP-порт и обрабатывать входящие HTTP-запросы.
Это самый сложный в реализации, но и самый "автономный" метод, не требующий внешних веб-серверов. Однако стоит учитывать, что однопоточность 1С 7.7 может стать узким местом: пока база отвечает на веб-запрос, интерфейс пользователя может "подмерзать".
При реализации веб-сервисов для 1С 7.7 мы неизбежно столкнемся с двумя проблемами:
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.