logotype

Получить значение перечисления из com соединения

- 25 Мая 2015.

если значение элемента перечисления получить через внешнее соединение, то оно будет являться COM объектом, и подобное сравнение будет всегда приводить к отрицательному результату.

Например, следующий код на встроенном языке 1С:Предприятия:



Соединитель = Новый COMОбъект("V8.COMConnector");
Соединение = Соединитель.connect("File=c:\InfoBaseDirectory");
ЭлементПеречисления1 = Соединение.Перечисления.Перечисление1.ЗначениеПеречисления1;
Сообщить(ЭлементПеречисления1);
ЭлементПеречисления2 = Соединение.Справочники.Справочник1.НайтиПоКоду(1).Реквизит1;
Сообщить(ЭлементПеречисления2);
Если ЭлементПеречисления1 = ЭлементПеречисления2 Тогда
    Сообщить("Равно");
Иначе
    Сообщить("Не равно");
КонецЕсли;



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

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



Соединитель = Новый COMОбъект("V8.COMConnector");
Соединение = Соединитель.connect("File=c:\InfoBaseDirectory");
ЭлементПеречисления = Соединение.Справочники.Справочник1.НайтиПоКоду(1).Реквизит1;
ВозможныеЗначения = ЭлементПеречисления.Метаданные().ЗначенияПеречисления;
НомерЭлементаПеречисления = ВозможныеЗначения.Индекс(ВозможныеЗначения.Найти(Соединение.XMLString(ЭлементПер
ечисления)));
Если НомерЭлементаПеречисления = 0 Тогда
    Сообщить("ЗначениеПеречисления1");
ИначеЕсли НомерЭлементаПеречисления = 1 Тогда
    Сообщить("ЗначениеПеречисления2");
КонецЕсли;


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



НомерЭлементаПеречисления = Соединение.Перечисления.Перечисление1.Индекс(ЭлементПеречисления);


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



Соединитель = Новый COMОбъект("V8.COMConnector");
Соединение = Соединитель.connect("File=c:\InfoBaseDirectory");
ЭлементПеречисления = Соединение.Справочники.Справочник1.НайтиПоКоду(1).Реквизит1;
СтрокаЭлементПеречисления = ЭлементПеречисления.Метаданные().Имя;
СтрокаЭлементПеречисления = СтрокаЭлементПеречисления + "." + Соединение.XMLString(ЭлементПеречисления);
Сообщить(СтрокаЭлементПеречисления);

Social Bookmarks