Proxy

Введение

Proxy является базовым механизмом для работы с платформой 1С:Предприятие в библиотеке Vanessa Sharp. Proxy предоставляет удобные базовые сервисы для управления временем жизни COM-объектов 1С, их вызовов, и двухсторонней конвертации данных, если это необходимо. Хотя Proxy является вспомогательным компонентом, который позволяет работать компонентам ADO.Net Provider и Linq Provider, предоставляющих высокоуровневые программные интерфейсы, его можно также использовать и самостоятельно в своих приложениях для низкоуровневого доступа к объектам 1С, если в этом есть необходимость. На данный момент публичный API компонента Proxy нельзя считать стабильным и хорошо продуманным, так как создавался он по принципу KISS, только для нужд ADO.Net-провайдера. Однако в связи с этим не стоит отказываться от использования данного компонента, так как он может оказаться очень полезным для прямой манипуляции объектами 1С. Просто нестабильность API Proxy означает наличие вероятности отсутствия обратной совместимости будущих версий публичного API Proxy до выпуска версии Vanessa Sharp 1.0.0. На данный момент высокоуровневые компоненты Vanessa Sharp ADO.Net Provider и LINQ Provider работают только на чтение данных из 1С. Для записи данных в 1С придется использовать низкоуровневые объекты Proxy.

Низкоуровневое взаимодействие с 1С

Как уже говорилось библиотека Vanessa Sharp взаимодействует с платформой 1С:Предприятие, через специальный механизм интеграции 1С называемый COM-соединение. Подробнее о нем можно прочитать здесь. С точки зрения реализации взаимодействия c CLR необходимо сделать несколько замечаний. Первое - каждой версии платформы 1С:Предприятия (8.0, 8.1, 8.2, 8.3) соответствует собственная COM-библиотека со своей библиотекой COM-типов. Каждая новая версия расширяет возможности предыдущей. Для подключения к Информационной БД 1С необходим COM-интерфейс IV8COMConnector. (На самом деле Vanessa Sharp использует интерфейс IV8COMConnector2 для поддержки свойств PoolCapacity и PoolTimeout. Возможно это будет изменено в следующих версиях.) Каждая версия платформы 1С:Предприятия предоставляет свою реализацию интерфейса IV8COMConnector в виде co-класса COMConnector с CLSID (уникальным идентификатором) зависящим от версии 1С:Предприятия. В связи с этим компонент Proxy был разделен на две части: версионно-независимую и версионно-зависимую. Версионно-независимая часть представлена DLL: VanessaShap.Proxy.Common. Для версионно-зависимой части предполагается создание DLL для каждой версии 1С:Предприятия (Внимание! Начиная с версии 0.3.1 это изменено). Сейчас реализована только Proxy DLL для версии 8.2 1С:Предприятия под названием VanessaSharp.Proxy.V82. Подробнее о том, как реализовать Proxy DLL для других версий 1С:Предприятия будет описано далее. COM-соединение предоставляет несколько строго типизированных интерфейсов, важным и пока единственно используемым Vanessa Sharp является IV8COMConnector. Целью данного интерфейса является подключение к информационной базе 1С вызовом метода интерфейса Connect. В случае успешного подключения к информационной базе 1С данный метод возвращает COM-объект глобального контекста 1С. Объект глобального контекста 1С, а также другие прикладные объекты 1С, которые можно получить через глобальный контекст не имеют строго типизированных COM-интерфейсов, описываемых в библиотеке типов. Данные объекты реализуют только COM-интерфейс IDispatch, известный как интерфейс Automation (ранее называемой OLE Automation). Automation своего рода COM-реализация идеи рефлексии объектов и динамического взаимодействия с ними. Поскольку для взаимодействия с прикладными объектами 1С приходится использовать механизмы позднего связывания Vanessa Sharp работает с COM-соединением 1С через среду DLR (Dynamic Language Runtime), а точнее с ее реализацией для взаимодействия с COM-технологией позднего связывания Automation. DLR это относительно новая технология от Microsoft, которая реализована начиная только с версии 4.0 Microsoft .Net Framework. Поэтому, к сожалению, для более ранних версий Vanessa Sharp Proxy работать не будет. Однако это не означает, что ADO.Net Provider и LinqTo1C не будут совсем работать. Vanessa Sharp спроектирована достаточно гибко и для работы со старыми версиями просто потребуется реализация нескольких базовых интерфейсов для выполнения запросов в 1С с помощью старого подхода реализации позднего взаимодействия с COM через механизм .Net Reflection. DLR это очень удобная среда, которая позволяет писать динамический код используя динамические конструкции языка, такого как C# и позволяет избежать лишнюю работу с литералами и конвертациями, делая программный код более понятным и лаконичным. Увы, есть достаточно большая ложка дегтя в этой сладкой бочке меда под названием DLR. Дело в том, что если вызываемый метод COM-соединения сообщает об ошибке выполнения, среда DLR некорректно ее обрабатывает и вместо того, чтобы выкинуть CLR-исключение с первоначальным сообщением 1С, DLR ожидая наличия ненулевой ссылки на объект Error (который по всей видимости ожидался от 1С) получает популярное исключение NullReferenceException, которое не перехватывает и выбрасывает наружу прямо в клиентский код. При таком поведении DLR увы теряется исходное сообщение об ошибке от 1С. В результате Vanessa Sharp Proxy выдает неверную диагностику о причине ошибки, возникшей в результате неправильного вызова 1С (например, неправильного SQL-запроса к 1С). В текущей версии данная проблема пока не решена.