Как вызвать методы внешней библиотеки или COM-объекта в 1С 7.7 без явного указания ссылки на объект

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

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

В этой статье мы разберем, как обойти это ограничение, создав иллюзию "чистого" синтаксиса, и рассмотрим продвинутые инструменты расширения платформы, такие как библиотека 1С++. Также мы затронем актуальную проблему работы с современными протоколами безопасности (HTTPS), которая часто становится причиной создания собственных внешних библиотек для 1С 7.7.

Решение 1: Использование функций-оберток в Глобальном модуле

Самый простой и штатный способ имитации глобального вызова метода — это создание прокси-функции в Глобальном модуле конфигурации. Этот метод позволяет один раз инициализировать объект и в дальнейшем обращаться к его функционалу из любой точки программы короткими командами.

Разберем этот процесс по шагам:

  1. Объявим экспортную переменную в разделе описания переменных Глобального модуля для хранения ссылки на объект.
  2. Создадим экземпляр объекта (например, при начале работы системы).
  3. Напишем функцию с ключевым словом Экспорт, которая будет транслировать вызов к методу объекта.

Проанализируем пример реализации такого подхода для библиотеки работы с курсами валют:


// В Глобальном модуле
Перем глНБРБ Экспорт;

Процедура ПриНачалеРаботыСистемы()
    // Инициализируем объект один раз
    Попытка
        глНБРБ = СоздатьОбъект("AddIn.НБРБ");
    Исключение
        Сообщить("Ошибка загрузки компоненты НБРБ!");
    КонецПопытки;
КонецПроцедуры

Функция КурсыВалютВXML() Экспорт
    // Проверяем, инициализирован ли объект, и вызываем его метод
    Если ПустоеЗначение(глНБРБ) = 0 Тогда
        Возврат глНБРБ.КурсыВалютВXML();
    КонецЕсли;
    Возврат "";
КонецФункции

Теперь в любом месте кода — в модуле формы документа, справочника или в отчете — мы можем написать просто КурсыВалютВXML() без создания объектов и использования точки. Это делает код более читаемым и похожим на встроенные механизмы платформы.

Решение 2: Использование возможностей библиотеки 1С++ (1CPP)

Если задача стоит шире — например, нужно не просто пробросить пару функций, а полностью изменить логику работы с объектами или внедрить синтаксис, схожий с 1С 8.x, — стандартных средств Глобального модуля будет недостаточно. Здесь на помощь приходит мощнейшее расширение 1С++.

Рассмотрим, что дает использование этой библиотеки в контексте управления контекстами:

Классы и объекты (КОП): Библиотека позволяет создавать полноценные классы внутри 1С 7.7. Вы можете создать класс-обертку вокруг вашей COM-библиотеки. Благодаря механизмам наследования и агрегации, вы можете "подмешивать" методы одних объектов к другим.

TurboBL: Это компонент 1С++, предназначенный для ускорения работы программного кода. Он позволяет манипулировать контекстами модулей. Хотя это сложный инструмент, он дает возможность выполнять код в контексте определенного объекта, что сокращает цепочки вызовов.

Для реализации глубокой интеграции, как планировал автор темы (использование синтаксиса 1С 8 внутри 7.7), 1С++ предоставляет механизмы перехвата событий. Мы можем перехватить штатные процедуры 1С и внедрить в них выполнение стороннего кода через объект Перехватчик.

Почему возникает необходимость в таких библиотеках (Проблема HTTPS)

Часто программисты создают свои внешние компоненты (как упомянутая AddIn.НБРБ) не из-за любви к кастомному синтаксису, а по технологической необходимости. Одной из острейших проблем 1С 7.7 является работа с протоколом HTTPS и современными сертификатами (TLS 1.2+).

Выясним причину, по которой стандартные средства "семерки" пасуют:

  1. Компонента v7plus.dll использует устаревшие системные вызовы, которые не поддерживают современные алгоритмы шифрования.
  2. Объект XMLHTTP зависит от версии MSXML, установленной в системе, и часто требует сложной настройки реестра для работы с TLS 1.2.

В таких случаях правильным решением будет использование объекта WinHttp.WinHttpRequest.5.1. Посмотрим на пример кода, который позволяет обойти ограничения старой платформы при получении данных с сервера банка:


WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Open("GET", "https://www.nbrb.by/api/exrates/rates?periodicity=0", 0);
// Установка параметров безопасности для поддержки TLS 1.2
// 128 - это флаг включения TLS 1.2 в некоторых версиях библиотеки
WinHttp.Option(9, 128); 
WinHttp.Send();
Результат = WinHttp.ResponseText;

Если же программист хочет скрыть эту сложность от конечного кода конфигурации, он упаковывает этот код в Delphi или C# компоненту (AddIn), методы которой потом и пытается вызвать максимально коротким путем, как обсуждалось выше.

Интеграция синтаксиса 1С 8 в среду 1С 7.7

Рассмотрим амбициозную задачу интеграции движка, понимающего синтаксис 1С 8. Это актуально для использования коллекций, которых нет в 7.7 (Структура, Соответствие, Массив). Для реализации такой интеграции обычно используется один из двух путей:

1. Использование MSScriptControl.ScriptControl: Это стандартный COM-объект Windows, который позволяет выполнять произвольный код на языках VBScript или JScript. Разработчики пишут транслятор, который переводит код из синтаксиса 1С 8 в JScript, выполняет его и возвращает результат в 1С 7.7.

2. Внешняя компонента на C++: Это путь, по которому пошел автор темы. Создается виртуальная машина, которая парсит код и выполняет его. Главная сложность здесь — разделение контекста. Чтобы переменная, объявленная в 1С 7.7, стала доступна внутри "внешнего" синтаксиса, компонента должна получить доступ к таблице символов текущего модуля 1С. Это достижимо только через низкоуровневые хаки памяти или через использование интерфейсов 1С++, предоставляющих доступ к внутренним структурам платформы.

Выводы и рекомендации

Подведем итог: если вам нужно упростить вызов методов внешней библиотеки в 1С 7.7, у вас есть два пути. Первый (простой) — создание функций-оберток в Глобальном модуле. Это надежно, понятно любому программисту и легко поддерживается. Второй (продвинутый) — использование 1С++ для создания полноценной объектной модели и расширения самого языка платформы.

При работе с внешними сервисами через HTTPS всегда отдавайте предпочтение WinHttp или современным внешним компонентам, так как штатная v7plus.dll на сегодняшний день морально устарела и не обеспечивает должного уровня безопасности и совместимости.

← На главную