В разработке на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с жесткими ограничениями синтаксиса. Одним из таких ограничений является невозможность прямого обращения к методам внешних объектов (COM-серверов или внешних компонент) так, будто они являются встроенными функциями языка. В отличие от глобальных функций конфигурации, методы объектов всегда требуют обращения через точку, например: Объект.Метод().
В этой статье мы разберем, как обойти это ограничение, создав иллюзию "чистого" синтаксиса, и рассмотрим продвинутые инструменты расширения платформы, такие как библиотека 1С++. Также мы затронем актуальную проблему работы с современными протоколами безопасности (HTTPS), которая часто становится причиной создания собственных внешних библиотек для 1С 7.7.
Самый простой и штатный способ имитации глобального вызова метода — это создание прокси-функции в Глобальном модуле конфигурации. Этот метод позволяет один раз инициализировать объект и в дальнейшем обращаться к его функционалу из любой точки программы короткими командами.
Разберем этот процесс по шагам:
Экспорт, которая будет транслировать вызов к методу объекта.Проанализируем пример реализации такого подхода для библиотеки работы с курсами валют:
// В Глобальном модуле
Перем глНБРБ Экспорт;
Процедура ПриНачалеРаботыСистемы()
// Инициализируем объект один раз
Попытка
глНБРБ = СоздатьОбъект("AddIn.НБРБ");
Исключение
Сообщить("Ошибка загрузки компоненты НБРБ!");
КонецПопытки;
КонецПроцедуры
Функция КурсыВалютВXML() Экспорт
// Проверяем, инициализирован ли объект, и вызываем его метод
Если ПустоеЗначение(глНБРБ) = 0 Тогда
Возврат глНБРБ.КурсыВалютВXML();
КонецЕсли;
Возврат "";
КонецФункции
Теперь в любом месте кода — в модуле формы документа, справочника или в отчете — мы можем написать просто КурсыВалютВXML() без создания объектов и использования точки. Это делает код более читаемым и похожим на встроенные механизмы платформы.
Если задача стоит шире — например, нужно не просто пробросить пару функций, а полностью изменить логику работы с объектами или внедрить синтаксис, схожий с 1С 8.x, — стандартных средств Глобального модуля будет недостаточно. Здесь на помощь приходит мощнейшее расширение 1С++.
Рассмотрим, что дает использование этой библиотеки в контексте управления контекстами:
Классы и объекты (КОП): Библиотека позволяет создавать полноценные классы внутри 1С 7.7. Вы можете создать класс-обертку вокруг вашей COM-библиотеки. Благодаря механизмам наследования и агрегации, вы можете "подмешивать" методы одних объектов к другим.
TurboBL: Это компонент 1С++, предназначенный для ускорения работы программного кода. Он позволяет манипулировать контекстами модулей. Хотя это сложный инструмент, он дает возможность выполнять код в контексте определенного объекта, что сокращает цепочки вызовов.
Для реализации глубокой интеграции, как планировал автор темы (использование синтаксиса 1С 8 внутри 7.7), 1С++ предоставляет механизмы перехвата событий. Мы можем перехватить штатные процедуры 1С и внедрить в них выполнение стороннего кода через объект Перехватчик.
Часто программисты создают свои внешние компоненты (как упомянутая AddIn.НБРБ) не из-за любви к кастомному синтаксису, а по технологической необходимости. Одной из острейших проблем 1С 7.7 является работа с протоколом HTTPS и современными сертификатами (TLS 1.2+).
Выясним причину, по которой стандартные средства "семерки" пасуют:
v7plus.dll использует устаревшие системные вызовы, которые не поддерживают современные алгоритмы шифрования.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. Это актуально для использования коллекций, которых нет в 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 на сегодняшний день морально устарела и не обеспечивает должного уровня безопасности и совместимости.