1с определить тип соединения
При использовании для доступа к данным 1С:Предприятия 8.0 COM -соединения имеются следующие преимущества по сравнению с использованием Automation сервера:
- Более быстрая установка соединения, так как не требуется создания отдельного процесса операционной системы, а все действия производятся в рамках вызывающего процесса;
- Более быстрое обращение к свойствам и методам объектов 1C:Предприятия, так как для организации обращения не требуется организации межпроцессной коммуникации;
- Меньший расход ресурсов операционной системы.
В общем и целом работа с 1С:Предприятием 8.0 через COM -соединение подобна работе с 1С:Предприятием в режиме Automation сервера. Основные отличия заключаются в следующем:
- В случае Automation сервера запускается полноценное приложение 1С:Предпприятия 8.0, а в случае COM -соединения запускается относительно небольшой внутрипроцессный COM -сервер.
- При работе через COM -соединение недоступны функциональные возможности так или иначе связанные с организацией пользовательского интерфейса 1С:Предприятия 8.0;
- При работе COM -соединения не используется модуль приложения конфигурации 1С:Предприятия 8.0. Его роль при работе с COM -соединением играет модуль внешнего соединения.
1.1 Порядок установки COM-соединения
Для организации доступа к данным 1С:Предприятия 8.0 через COM -соединение, выполняется следующая последовательность действий:
Важно! В связи с отсутствием пользовательского интерфейса в COM-соеденении не все объекты, а также свойства и методы можно использовать в COM -соединении.
Объекты 1С:Предприятия, доступные извне через COM -соединение:
- Экспортируемые переменные и процедуры/функции модуля внешнего соединения
- Экспортируемые переменные и процедуры/функции общих модулей
- Включение и исключение модулей целиком с помощью установки свойств общих модулей
- Включение и исключение фрагментов общих модулей с помощью препроцессора
- Глобальный контекст 1С:Предприятия 8.0, за исключением объектов, жестко связанных с клиентским приложением (ТекстовыйДокумент, ТабличныйДокумент, . )
1.2 Модуль внешнего соединения
Как уже отмечалось обязанности модуля приложения при работе через COM -соединение, выполняет модуль внешнего соединения. Данный модуль может иметь процедуры-обработчики событий ПриНачалеРаботыСистемы() и ПриЗавершенииРаботыСистемы(), в которых могут быть размещены действия, выполняемые при инициализации и завершении соединения, соответственно.
Процедуры, функции и глобальные переменные, определенные в модуле внешнего соединения с ключевым словом Экспорт становятся, как и в случае модуля приложения, частью глобального контекста.
1.3 Общие модули
Для общих модулей введены свойства "Клиент", "Сервер" и "ВнешнееСоединение". Они предназначены для определения в конфигурации использования модулей в клиент - серверном варианте и в режиме COM -соединения.
1.4 Объект "V8.COMConnector"
Строка соединения с ИБ представляет собой цепочку фрагментов вида Параметр=Значение. Фрагменты отделяются друг от друга символами ';'. Если значение содержит пробельные символы, то оно должно быть заключено в двойные кавычки (").
Usr - имя пользователя;
Pwd - пароль.
Для файлового варианта определен параметр:
File - каталог информационной базы.
Для клиент-серверного варианта определены параметры:
Srvr - имя сервера 1С:Предприятия;
Ref - имя информационной базы на сервере.
Метод Connect возвращает ссылку на созданный объект COM -соединения.
Метод Connect устанавливает COM -соединение с информационной базой 1С:Предприятия 8.0 и возвращает ссылку на объект COM -соединение.
// Создается объект-коннектор
V8 = Новый COMObject ("V8.COMConnector");
// создается объект COM -соединение
Соединение = V8.Connect ("File=""c:\InfoBases\Trade""; Usr =""Director"";")
Авторизация доступа через COM -соединение возможна как с помощью параметров строки соединения «Usr» и «Pwd», так и через пользователя Windows, в любом случае должно быть право на «Внешнее соединение».
1.5 Объект "COM-соединение"
COM -соединение с информационной базой 1С:Предприятия предоставляет полный доступ к своему глобальному контексту (см. «Контекст выполнения программного модуля»). Поэтому COM -соединение в качестве своих методов может иметь: системные константы, значения заданных в конфигураторе объектов, доступ к которым осуществляется с помощью менеджеров (например, константы, перечисления, справочники, документы, журналы документов, отчеты, обработки, планы видов характеристик, планы счетов, планы видов расчета, регистры), а также переменные, объявленные в модуле внешнего соединения с ключевым словом Экспорт.
Кроме того, COM -соединение имеет дополнительный метод NewObject, с помощью которого можно создавать значения определенных типов.
тз = Соединение. NewObject ("ТаблицаЗначений");
Метод String Позволяет получать строковые представления значений 1С:Предприятия.
1.6. Особенности работы с COM -соединением
В Automation и в COM -соединении TRUE и FALSE имеют соответственно значения: -1 (минус единица) и 0.
Имеется возможность организации пула COM-соединений. При этом на принимающей на сервере 1С:Предприятия ЗАРАНЕЕ создаются несколько объектов COM-соединения и на установку соединения требуется еще меньше времени, поскольку не нужно создавать новый объект.
Реализован новый объект ПостроительЗапроса, предназначенный для генерации текстов запросов на основании указанных настроек. Данный объект поддерживает функциональность построителя отчета, не относящуюся к выводу отчета в табличный документ и другим задачам, связанным с пользовательским интерфейсом. Данный объект может использоваться на сервере 1С:Предприятия и в COM -соединении.
Доступно использование COM -объектов при работе встроенного языка на сервере 1С:Предприятия.
Конфигуратор в режиме отладки позволяет выбрать предмет отладки (Тонкий/Толстый клиенты/HTTP-Сервис/Фоновое задание и т.д.), консоль кластера также отображает тип подключения сеанса (колонка "приложение"), ну и наконец стандартная обработка "Активные пользователи" также умеет это делать.
Контекст сеанса 1С хранит в параметре ИмяПриложения соединениий с информационной базой, для того чтобы получить список сеансов текущей информационной базы можно воспользоваться фунцией ПолучитьСеансыИнформационнойБазы(), а номер текущего соединения - НомерСоединенияИнформационнойБазы().
Для простоты и удобства пример функции, которая получает контекст сеанса:
Вызвать функцию можно так:
Реализация, найденная в интернете и не решающая задачу:
Специальные предложения
Кажется, что предложенное решение тоже не до конца справляется.
Например для толстого клиента оно так и не ответит на вопрос - где же я нахожусь. На сервере толстого клиента, или на клиенте.
Но с оговорками да.. вполне себе вариант.
(3)Почему не скажет? Скажет. Проблема только с файловой базой и толстым клиентом. Но. в этом случае "Серверного контекста" НЕ СУЩЕСТВУЕТ - все вызовы идут только под контекстом "Толстого клиента" (под обычным или управляемым приложением), даже, если в указан переход в контекст сервера (например через общи модуль с вызовом сервера) - контекст останется "Толстый клиент". А зачем Вам иное - ведь - реально контекст именно и будет "Толстый клиент" - никакого серверного контекста ВООБЩЕ не будет - будет доступно всё то, что доступно толстому клиенту - т.е. ВСЁ! В отладчике контекст будет "Толстый клиент". Более того, в толстом клиенте игнорируется не только директива "Вызов сервера", но и директива "Сервер" - т.е. будут доступны и функции чисто серверных модулей - прямо с клиента. Так устроена платформа. Вот, для тонкого клиента в файловой базе - контексты уже будут разделены.
А для толстого клиента остаётся только проверить, что он толстый клиент и это файловая база. Это можно проверить ещё и так
Аналогично толстому клиенту, в файловой базе, ведёт себя и внешнее соединение (только вместо директивы "Клиент" отрабатывает директива "ВнешнееСоединение ", а директива "Сервер" по-прежнему отрабатывает, вернее игнорируется - серверный контекст полностью доступен в контексте внешнего соединения без "вызова сервера"). Разве что интерфейсные вызовы не доступны (доступно всё то, что доступно для внешнего соединения).
При написании обработок обмена между конфигурациями 1С часто возникает необходимость определения типа принимаемых данных справочник, документ, ПланСчетов или т.д. Эта информация разбросана по интернету но я решил систематизировать и показать Вам.
Для подключения и работы с ком соединением рекомендуется объявить переменную к которой будет подствлено значение соединение и проверять на данное подключение в каждой процедуре, ниже приведен текст процедуры/функции и способы подключения в конфигурациях
СтруктураПодключения - эта переменная в которой имеется Строка соединения с СОМ объектом
Часто возникает необходимость проверка наличия реквизита или свойства объекта, при этом понятия не имееш есть данный реквизит или нет
но использование Попытки .. Исключение .. КонецПопытки не желательно то в даном варианте можно использовать подстановку реквизита в структуру
и тем самым использовать следующую процедуру:
Теперь вопрос который многих интересует: "Мы получили СОМ объект тоесть ТИП("СомОбъект"), какое значение и что с ним делать?
для этого приходят метаданные и мы можем получить любую информацию используя метаданные не только текущей конфигурации, но и конфигурации источника к примеру РеквCOM это реквизит который мы должны изучить:
УИД объекта имеет определенный формат даных поэтому для выяснения что мы имеем то необходимо доп проверка
т.к. _СтрокаXML имеет формат "00000000-0000-0000-0000-000000000000" то актуальна проверка
Рассмотрим что можно получить от объекта если по нему есть УИД
Имея данные объекта мы можем использовать их в конфигурациях переноса создав процедуру сопоставления объектов, здесь можно будет уже
развернуться как Вам больше нравится
В случае если наш объект является ХранилищеЗначений то для переноса данного объекта либо получение значения можно воспользоваться функцией
Если объект является перечислением то вместо УИД кода будет выведено наименование перечисления
Также для получения списка реквизитов объекта СОМ используется обращение
Для работы с удаленой базой через COM соединение также часто возникает необходимость получения функциональных опций объекта
для этих целей можно использовать функцию которая выведет список соответствий функциональных опций
Так же при работе с переносом документов возникает необходимость определения списка регистров движения данного документа
Все процедуры, используемые в статье, являются работающими и готовы к использованию.
Соединение в запросе 1С 8.3 - это соединение строк двух таблиц по определенному признаку. Используется, когда нужно собрать одну таблицу из нескольких. Соединения бывают 4 типов:
- Левое соединение - это внутреннее соединение, результат которого выбранные поля обеих таблиц (полностью первой - главной таблицы + совпадающие по ключам соединения второй), количество строк больше или равно количеству в первой таблице (условие соединения может вызывать дубли, если в правой таблице поля соединения дублируются)
- Правое соединение - это внутреннее соединение, результат которого выбранные поля обеих таблиц (полностью второй - главной таблицы + совпадающие по ключам соединения первой), количество строк больше или равно количеству во второй таблице (условие соединения может вызывать дубли, если в левой таблице поля соединения дублируются)
- Полное соединение - это левое соединение + правое соединение, в результате которых, получается одна таблица, содержащая все выбранные колонки, число строк обычно равняется количеству совпадающих строк по ключам + все несовпадающие.
- Внутреннее соединение - это соединение, результат которого выбранные поля обеих таблиц , которые смогли соединиться по заданному условию.
✔ Внутреннее соединение двух таблиц
&НаСервере
Процедура ВнутреннееСоединениеДвухТаблиц ()
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Металлы.Наименование КАК НаименованиеИзТаблицы1,
| ПрайсЛист.Наименование КАК НаименованиеИзТаблицы2,
| ПрайсЛист.Цена КАК ЦенаИзТаблицы2
|ИЗ
| Справочник.Металлы КАК Металлы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| Справочник.ПрайсЛист КАК ПрайсЛист
| ПО
| Металлы.Наименование = ПрайсЛист.Наименование" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Соединения в запросах 1С, пожалуй, наиважнейшая операция с таблицами базы данных. Именно от корректности применения нужного соединения, в каждом конкретном случае, зависят получаемые итоговые данные из базы.
При помощи соединений, мы сопоставляем записи одной таблицы, с записями другой. Прежде чем приступить к рассмотрению соединений, подготовим небольшую базу данных. (Демонстрационную базу данных можно скачать внизу страницы.)
Итак, мы имеем несколько справочников, а именно:
Справочник «Люди».
Справочник «Цвета».
Справочник «Ассоциации».
Мы будем получать данные об ассоциациях людей, беря за основу цвет.
К примеру, для Ольги ассоциацией будет трава, так как она предпочитает зелёный цвет. Для Александра и Василия, подходящих им ассоциаций, нет, по причине того, что они предпочитают синий и красный цвета. А вот ассоциаций для этих цветов, в базе не указано. Нужно ещё обратить внимание, что белый цвет никто не предпочитает, хотя в базе он указан и ассоциация ему — мел. Запомните это, дальше эти сведения нам пригодятся.
Давайте получим имена людей, с предпочитаемыми ими, цветами.
Теперь получим ассоциации с их цветами.
Перекрёстное соединение в запросах 1С.
Выполним перекрёстное соединение. Здесь мы получим получим все записи из всех таблиц.
Как видите, никакой информативности.
Внутреннее соединение в запросах 1С.
Всё же, давайте получим интересующие нас результаты, где значение предпочитаемого цвета, равно значению цвета ассоциации. Для этого, нам нужно добавить к запросу, конструкцию ГДЕ.
Ещё один вариант внутреннего соединения, в котором конструкция ГДЕ не применяется. Вместо неё, мы укажем в запросе, само выражение ВНУТРЕННЕЕ СОЕДИНЕНИЕ.
Как видите, в том и другом случае, полученные нами данные, абсолютно идентичны.
Схематично:
Левое соединение в запросах 1С.
Как видно из предыдущего запроса, в результирующие данные не попали Василий и Александр, по причине того, что они предпочитают синий и красный цвета. А ассоциаций для этих цветов, в нашей базе данных нет.
Нам необходимо переписать запрос так, чтобы эти люди, всё же, были представлены в результатах, не смотря на то, что для их любимых цветов, ассоциации не сопоставлены.
Левое соединение представляет из себя:
Схематично:
Правое соединение в запросах 1С.
Давайте ещё раз взглянем на внутреннее соединение:
Как видно, здесь отсутствует ассоциация Мел с белым цветом, так как этот цвет никто из наших людей не предпочитает.
Нам необходимо переписать запрос так, чтобы мы получили записи из второй таблицы, которые не имеют пар (не сопоставлены) с первой.
Правое соединение представляет из себя:
Схематично:
Полное соединение в запросах 1С.
А теперь представим, что возникла необходимость получить все записи из двух таблиц. Независимо от того, есть ли у них сопоставленные пары или нет. Для этой цели, нам нужно будет совместить результаты левого и правого соединений. Как раз для таких случаев существует полное соединение.
Полное соединение представляет из себя:
Схематично:
Как видно выше, некоторые поля у нас пустые. На самом деле эти данные являются очень коварными значениями NULL. NULL означает отсутствие значения, любая операция с ним приведёт к ошибке. Даже, если сравнить NULL с NULL, результатом этого сравнения будет Ложь. Не даром, во всех конфигурациях, в обязательном порядке, требуется проводить обработку такого значения, в местах возможного его возникновения.
Мы так же, не оставим это без внимания и в запросе с полным соединением, применим функцию ЕСТЬNULL. Эта функция проверяет результаты запроса на NULL и если, она получает такое значение, то возвращает другое значение, указанное нами в параметрах этой функции.
Читайте также: