1с получить значение перечисления com объект

Обновлено: 10.08.2022

В ТЗ можно передавать только значения примитивных типов.

при условии, что и идентификатор вида объекта и сама ссылка в двух базах совпадают;

если совпадают только ссылки;

если ни идентификатор вида объекта ни ссылка на объект не совпадают, то остается поиск по коду, наименованию и прочим полям.

Чтение листа Excel через OLE соединение

Получение значений перечислений через внешнее соединение или Automation сервер

Системные перечисления и их элементы

Системные перечисления предназначены для определения некоторого набора предопределенных значений и используются в качестве значений параметров некоторых методов, а также в качестве значений некоторых свойств объектов 1С:Педприятия. Доступ к системным перечислениям осуществляется как к свойствам глобального контекста. Значения элементов системных перечислений указываются через точку от имени системного перечисления. Например:

В качестве значений параметров метода Записать() заданы два значения элементов системных перечислений: элемент «Проведение» системного перечисления «РежимЗаписиДокумента» и элемент «Оперативный» системного перечисления «РежимПроведенияДокумента».

И системные перечисления, и значения их элементов являются объектами, и могут быть переданы в другие приложения через COM посредством интерфейса IDispatch. При этом любое системное перечисление имеет набор свойств, каждое из которых позволяет получить соответствующее значение элемента данного системного перечисления. Элемент системного перечисления также является объектом и доступен через интерфейс IDispatch, однако ни свойств, ни методов он не имеет.

По этой причине анализ полученных значений системных перечислений возможен только посредством их сравнения со значениями системных перечислений, полученными через свойства глобального контекста. Например, на встроенном языке 1С:Предприятия проверка значений системных перечислений, полученных через внешнее соединение, может быть выполнена так:

Важно иметь в виду, что значения одних и тех же системных перечислений, полученные из разных экземпляров клиентского приложения или внешнего соединения 1С:Предприятия, являются разными объектами и между собой несравнимы.

Перечисления, определенные в конфигурации

В отличие от системных перечислений, определенные в конфигурации перечисления являются объектами базы данных. Элемент такого перечисления является ссылкой на объект базы данных. Например, если в конфигурации определено перечисление «Перечисление1» с элементами «ЗначениеПеречисления1» и «ЗначениеПеречисления2», а реквизит «Реквизит1» справочника «Справочник1» имеет тип «ПеречислениеСсылка.Перечисление1», то следующий код на встроенном языке 1С:Предприятия:

выведет «Равно», если значением реквизита «Реквизит1» является «ЗначениеПеречисления1» и «Не равно» в противном случае.

Однако если значение элемента перечисления получить через внешнее соединение, то оно будет являться COM объектом, и подобное сравнение будет всегда приводить к отрицательному результату. Например, следующий код на встроенном языке 1С:Предприятия:

будет всегда выводить «Не равно». Это происходит потому, что значение элемента перечисления является объектом типа ссылка на объект базы данных. Для объектов ссылок определена операция сравнения значений, которая может работать только для «своих» объектов 1С:Предприятия. Объекты, полученные через внешнее соединение «своими» не являются, поэтому операция их сравнения является проверкой идентичности. Поскольку для объектов ссылок идентичность не поддерживается, их сравнение может дать отрицательный результат, даже если значения ссылок, заключенные в этих объектах, одинаковые.

Для сравнения значений элементов перечислений, определенных в конфигурации, необходимо выполнить преобразование этих элементов к одному из примитивных типов, сравнение которых не вызывает трудности. Такими типами могут быть либо числовой, либо строковый тип. Преобразовать значение элемента перечисления к числовому типу можно так:

Если тип перечисления, значение которого может содежать переменная «ЭлементПеречисления», известен заранее, то приведенный выше пример может быть записан проще:

Значение элемента перечисления может быть приведено к строковому типу, например, при помощи следующего фрагмента кода на встроенном языке 1С:Предприятия:

При написании обработок обмена между конфигурациями 1С часто возникает необходимость определения типа принимаемых данных справочник, документ, ПланСчетов или т.д. Эта информация разбросана по интернету но я решил систематизировать и показать Вам.

Для подключения и работы с ком соединением рекомендуется объявить переменную к которой будет подствлено значение соединение и проверять на данное подключение в каждой процедуре, ниже приведен текст процедуры/функции и способы подключения в конфигурациях

СтруктураПодключения - эта переменная в которой имеется Строка соединения с СОМ объектом

Часто возникает необходимость проверка наличия реквизита или свойства объекта, при этом понятия не имееш есть данный реквизит или нет

но использование Попытки .. Исключение .. КонецПопытки не желательно то в даном варианте можно использовать подстановку реквизита в структуру

и тем самым использовать следующую процедуру:

Теперь вопрос который многих интересует: "Мы получили СОМ объект тоесть ТИП("СомОбъект"), какое значение и что с ним делать?

для этого приходят метаданные и мы можем получить любую информацию используя метаданные не только текущей конфигурации, но и конфигурации источника к примеру РеквCOM это реквизит который мы должны изучить:

УИД объекта имеет определенный формат даных поэтому для выяснения что мы имеем то необходимо доп проверка

т.к. _СтрокаXML имеет формат "00000000-0000-0000-0000-000000000000" то актуальна проверка

Рассмотрим что можно получить от объекта если по нему есть УИД

Имея данные объекта мы можем использовать их в конфигурациях переноса создав процедуру сопоставления объектов, здесь можно будет уже

развернуться как Вам больше нравится

В случае если наш объект является ХранилищеЗначений то для переноса данного объекта либо получение значения можно воспользоваться функцией

Если объект является перечислением то вместо УИД кода будет выведено наименование перечисления

Также для получения списка реквизитов объекта СОМ используется обращение

Для работы с удаленой базой через COM соединение также часто возникает необходимость получения функциональных опций объекта

для этих целей можно использовать функцию которая выведет список соответствий функциональных опций

Так же при работе с переносом документов возникает необходимость определения списка регистров движения данного документа

Все процедуры, используемые в статье, являются работающими и готовы к использованию.

ИмяЗначенияПеречисления = Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления[ИндексЗначенияПеречисления].Имя
Перебор коллекции значений перечисления
Для каждого знач из КолекцияЗначенийПеречисления Цикл
Сообщить(знач.Имя);
КонецЦикла;
ПредставлениеПеречисления=Строка(СсылкаНаПеречисление); //синоним

полезной будет функция:

Функция ПолучитьИмяЗначенияПеречисления(Ссылка) Экспорт

ИмяПеречисления = Ссылка.Метаданные().Имя;
Индекс = Перечисления[ИмяПеречисления].Индекс(Ссылка);

альтернативный способ получения имени значения перечисления:

Полезный прием для работы с перечислениями при COM соединении с другой ИБ 8.0 (например при обмене данных):

надо передать ссылку на перечисление:
Здесь
V8 - COM объект "V8.Application" - ИБ внешнего соединения
СсылкаНаПеречислениеCOM - COM объект - ссылка на перечисление в ИБ внешнего соединения

ИмяЗначенияПеречисленияCOM= V8.XMLString(СсылкаНаПеречислениеCOM);
ПредставлениеПеречисленияCOM= V8.String(СсылкаНаПеречислениеCOM); //синоним
ИмяПеречисленияCOM= СсылкаНаПеречислениеCOM.Метаданные().Имя;
СсылкаНаПеречисление = XMLЗначение(Тип("ПеречислениеСсылка."+ИмяПеречисленияCOM),ИмяЗначенияПеречисленияCOM);

разумеется имена перечислений в обоих базах должны быть идентичными.

Пример получения значений перечисления запросом


Запрос=новый запрос;
запрос.Текст="ВЫБРАТЬ
| ВидыОС.Ссылка,
| ВидыОС.Порядок КАК Индекс
|ИЗ
| Перечисление.ВидыОС КАК ВидыОС";
Выборка=Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() цикл
Сообщить(""+Выборка.ссылка+" : "+Выборка.индекс);
конецЦикла;

Пример для отбора на стороне COMсервера:

Отбор = v8.Новый ("Структура");
МД=v8.XMLTypeOf(v8.Перечисления[ИмяПеречисления].ПустаяСсылка());
Отбор.Вставить("ВидДоговора", v8.XMLЗначение(v8.FromXMLType(МД),ИмяЗначенияПеречисления));

ИмяЗначенияПеречисления = Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления[ИндексЗначенияПеречисления].Имя
Перебор коллекции значений перечисления
Для каждого знач из КолекцияЗначенийПеречисления Цикл
Сообщить(знач.Имя);
КонецЦикла;
ПредставлениеПеречисления=Строка(СсылкаНаПеречисление); //синоним

полезной будет функция:

Функция ПолучитьИмяЗначенияПеречисления(Ссылка) Экспорт

ИмяПеречисления = Ссылка.Метаданные().Имя;
Индекс = Перечисления[ИмяПеречисления].Индекс(Ссылка);

альтернативный способ получения имени значения перечисления:

Полезный прием для работы с перечислениями при COM соединении с другой ИБ 8.0 (например при обмене данных):

надо передать ссылку на перечисление:
Здесь
V8 - COM объект "V8.Application" - ИБ внешнего соединения
СсылкаНаПеречислениеCOM - COM объект - ссылка на перечисление в ИБ внешнего соединения

ИмяЗначенияПеречисленияCOM= V8.XMLString(СсылкаНаПеречислениеCOM);
ПредставлениеПеречисленияCOM= V8.String(СсылкаНаПеречислениеCOM); //синоним
ИмяПеречисленияCOM= СсылкаНаПеречислениеCOM.Метаданные().Имя;
СсылкаНаПеречисление = XMLЗначение(Тип("ПеречислениеСсылка."+ИмяПеречисленияCOM),ИмяЗначенияПеречисленияCOM);

разумеется имена перечислений в обоих базах должны быть идентичными.

Пример получения значений перечисления запросом


Запрос=новый запрос;
запрос.Текст="ВЫБРАТЬ
| ВидыОС.Ссылка,
| ВидыОС.Порядок КАК Индекс
|ИЗ
| Перечисление.ВидыОС КАК ВидыОС";
Выборка=Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() цикл
Сообщить(""+Выборка.ссылка+" : "+Выборка.индекс);
конецЦикла;

Пример для отбора на стороне COMсервера:

Отбор = v8.Новый ("Структура");
МД=v8.XMLTypeOf(v8.Перечисления[ИмяПеречисления].ПустаяСсылка());
Отбор.Вставить("ВидДоговора", v8.XMLЗначение(v8.FromXMLType(МД),ИмяЗначенияПеречисления));

Анна Викулина

Одним из способов перенести данные из одной конфигурации 1С в другую является программное подключение с помощью COM. Многие компании используют несколько различных баз, между которыми должны быть определенные связи и зависимости. Если необходимо не только перенести данные, но и выполнить определенную обработку данных, то COM соединение будет оптимальным механизмом. Умение анализировать данные из другой базы 1С пригодиться любому разработчику.

Подключаемся через COM к базе 1С

Помните, что на время COM соединения к базе тратиться лицензия – не стоит увлекаться одновременным выполнением нескольких подключений. Особенно это важно для организаций, у которых количество лицензий ограничено. Решиться этот вопрос может при помощи регламентных заданий, выполняющихся во время отсутствия активных подключений пользователей к информационной базе.

Чтобы иметь возможность подключиться к другой базе и запросить нужную информацию вы должны знать следующие данные:

  1. Какого она типа – файловая или клиент-серверная;
  2. Где она располагается;
  3. Под каким именем и паролем в нее можно зайти;
  4. Какие данные вас интересуют.

Из первых трех пунктов для реализации COM соединения необходимо сформировать строку параметров. В зависимости от типа ИБ она будет отличаться внешним видом. Используя полученную строку, происходит подключение, с помощью которого можно собирать для анализа и обработки данные из другой базы любыми методами.

Функция подключения проста и не должна вызвать вопросов, если все параметры указаны верно. Для ускорения отладки и анализа возможных ошибок лучше заключить подключение в конструкцию «Попытка». Возвращать функция будет значение типа «COM объект», с которым и предстоит работать, получая нужные данные.

Через COM соединение вы можете не только выбирать данные, но и добавлять их в базу, к которой подключаетесь. Помните, что передавать через COM объект мы можем 4 примитивных типа данных. Другие типы придется задавать с помощью встроенных в платформу функций поиска. Учтите, что глобальные функции платформы вызываются тоже через COM-соединение.

Получаем данные из базы 1С

После того как получили нужный объект, необходимо прочитать данные из другой базы. Для этого мы применяем запрос через COM соединение в 1С 8.3 с помощью полученного значения типа «COM объект» из функции. Важно сначала подключиться к базе, а затем уже выполнять запрос. Выполнение происходит через метод NewObject с указанием в качестве параметра типа объекта в строковом виде – «Запрос».

К примеру, чтобы получить информацию о пользователях определенного подразделения, зададим условие в запрос через параметры. Один параметр будет простого типа – строка, а подразделение – ссылкой элемента справочника «Структура предприятия». Результат запроса является таблицей с перечисленными полями того типа, какого они существуют в базе, к которой произошло COM соединение. Если необходимо их преобразовать в другие типы – воспользуйтесь стандартными функциями платформы:

Если нужно передать в базу массив для отбора по нескольким параметрам, например, подразделениям, тоже используется команда NewObject. Аналогично можно передавать список или таблицу значений, заполняя их элементами другой базы через соединение. Для поиска вам доступны все существующие методы объектов и механизмов платформы.

При переносе документов или элементов справочников всегда возникает вопрос о контроле переноса определенного объекта. С помощью COM соединений можно решить подобные проблемы через уникальный идентификатор. Нужно найти объект в подключаемой базе по идентификатору из текущей ИБ с помощью функции «ПолучитьСсылку», используя идентификатор в виде строки. Если такового не нашлось, вы можете создать его с помощью COM соединения.

Также COM соединение имеет право использовать процедуры и функции из общих модулей 1С с включенным свойством «Внешнее соединение». Кроме этого условия, вызываемая функция или процедура должна быть экспортная и не включать интерактивные действия, выполняемые на сервере. В противоположном случае вы увидите ошибку о недопустимости операции.

Рис.1 Внешнее соединение

Рис.1 Внешнее соединение

Возможности внешнего соединения с другой базой в 1С достаточно обширны и могут позволить выполнить множество задач. Важно уметь правильно оценить инструментарий и выбрать оптимальное решение. В большинстве случаев это умение появляется лишь с опытом или при изучении примеров работ опытных специалистов, поэтому при возникновении потребности в таком подключении мы рекомендуем воспользоваться услугами по обслуживанию и техподдержке 1С.

Читайте также: