Имя: Пароль:
1C
1С v8
Сравнение перечисления в COM-базе
0 Sam1C
 
29.09.17
07:58
Всем доброе утро! Как сравнить в одной базе перечисление через COM-соединение, вот так не работает:
СкладВПриемнике.ВидСклада = мВнешниеСоеденение.Перечисления.ВидыСкладов.Розничный - Возвращает ЛОЖЬ
Выкручиваюсь пока таким образом мВнешниеСоеденение.String(СкладВПриемнике.ВидСклада) = "Розничный"
Какой есть способ сравнить еще кроме как преобразовывать в строку?
1 h-sp
 
29.09.17
08:04
(0) ну если там ложь, почему вы думаете, что преобразовав в строку вдруг получите истина?
2 Мимохожий Однако
 
29.09.17
08:05
В любом случае надо преобразовывать в те типы, которые можно передать через COM. Можешь преобразовывать и числа, если договоришься какому перечислению соответствует определенное число.
3 Рэйв
 
29.09.17
08:16
(0)в качестве примера

//-----------
СсылкаНаПеречислениеCOM=Соединение.Перечисления.ВидыАкций.Ретробонус;
СсылкаНаПеречислениеТут=Перечисления.ВидыАкций.Ретробонус;
ИмяЗначенияПеречисленияCOM= Соединение.XMLString(СсылкаНаПеречислениеCOM);
ПредставлениеПеречисленияCOM= Соединение.String(СсылкаНаПеречислениеCOM);
ИмяПеречисленияCOM= СсылкаНаПеречислениеCOM.Метаданные().Имя;
СсылкаНаЗначениеВТекБазе = XMLЗначение(Тип("ПеречислениеСсылка."+ИмяПеречисленияCOM), ИмяЗначенияПеречисленияCOM);
Сообщить("Равно? ->"+(СсылкаНаЗначениеВТекБазе=СсылкаНаПеречислениеТут) );
4 Sam1C
 
29.09.17
08:25
(1) Потому что там Значение Перечисления "Розничный" и даст он Истина, если в конфигурации не переименовать это значение Перечисления
5 Sam1C
 
29.09.17
08:26
(4) Имею ввиду не Идентификатор значения перечисления, а представление
6 Sam1C
 
29.09.17
08:28
(3) Не совсем по теме, сравнение идет в одной и той же базе, а не в разных
7 Рэйв
 
29.09.17
08:29
(6)Перечисление берется из COM подключения, находится его соответствие в тек базе и сравнивается .Тебе разве не это нужно?
8 Sam1C
 
29.09.17
08:31
(7)  Нет, нужно в базе к которой подключен через COM узнать вид склада. СкладВПриемнике.ВидСклада - Это COMОбъект и мВнешниеСоеденение.Перечисления.ВидыСкладов.Розничный - COMОбъект
9 Михаил Козлов
 
29.09.17
08:32
Можно через Индекс (если они совпадают).
Еще пользуюсь:
Функция знПеречисленияПоИдентификатору(источник, значение, приемник) ЭКСПОРТ
    знч = приемник.ПустаяСсылка();
    ПОПЫТКА
        знч = приемник.Получить(источник.Индекс(значение));
    ИСКЛЮЧЕНИЕ
    КОНЕЦПОПЫТКИ;    
    Возврат знч;
КонецФункции

Обращение, примерно такое:
вид.ТипНоменклатуры = знПеречисленияПоИдентификатору(ОФ.глТорговля.Перечисления.ТипыНоменклатуры, видИсточник.ТипНоменклатуры, ОФ.БД.Перечисления.ТипыНоменклатуры);
10 Sam1C
 
29.09.17
08:33
(7) С текущей ничего сравнивать ни надо
11 h-sp
 
29.09.17
08:35
(10) как у тебя написано в (0)

СкладВПриемнике.ВидСклада = мВнешниеСоеденение.Перечисления.ВидыСкладов.Розничный

прекрасно работает. Не нужно ничего через задницу придумывать.
12 Sam1C
 
29.09.17
08:45
(11) Не работает, сча кину скрин
13 Sam1C
 
29.09.17
08:50
https://www.dropbox.com/s/89o77gb75w5lovp/Отладка.jpg?dl=0

1) Проверка ну пустое значение
2)Преобразование к строке, что там именно розничный.
3)Сравнение по теме
4 и 5 сравнение с остальными значениями перечисления ВидыСкладов для полноты теста
6 и 7 типы объектов, что это COM
14 Numerus Mikhail
 
29.09.17
09:23
в (3) рабочий пример. Хз что тебе в нем не нравится.
15 Cyberhawk
 
29.09.17
09:28
(14) Ему надо во внешней ИБ сравнить реквизит тамошнего склада с тамошним же значением тамошнего перечисления )
16 ColonelAp4u
 
29.09.17
09:34
В коме же только строки и числа.
17 Sam1C
 
29.09.17
09:38
(14) Ну не по теме там, там сравнение в двух базах источника и Приемника. В теме сравнение в одной и той же базе.
18 Numerus Mikhail
 
29.09.17
09:40
(15) А, понял.

(17) Для себя я делал так:
В нужной базе создал процедуру что-то типа такой:

Функция СравнитьСсылки(Ссылка1, Ссылка2) Экспорт
    Возврат (Ссылка1 = Ссылка2);
КонецФункции
19 Лефмихалыч
 
29.09.17
09:40
Хорошая статья про то, как готовить COM

http://wiki.mista.ru/doku.php?id=1c:v8:obmen_i_integracija:oxota_na_comov
20 Sam1C
 
29.09.17
09:45
(16) Походу сравнивать можно числа, строки, проверка на Булево и Неопределено. Пробовал сравнить ссылки справочников тоже не равно:
мВнешниеСоеденение.Справочники.Организации.НайтиПоКоду("000000001")= мВнешниеСоеденение.Справочники.Организации.НайтиПоКоду("000000001")
Возвращает ЛОЖЬ. Вывод: в COM нет возможности сравнивать ссылки. Это для  h-sp (11), у него как-то работает
21 Sam1C
 
29.09.17
09:46
(18) Хороший вариант, но нужно вносить изменения в конфу
22 arsik
 
гуру
29.09.17
10:11
(21) Делай через вычислить
23 Sam1C
 
29.09.17
10:26
(22) мВнешниеСоеденение.Вычислить("1=1") или мВнешниеСоеденение.Eval("1=1")
Метод объекта не обнаружен. Не хочет через COM выполнить эту функцию
24 DmitrO
 
29.09.17
10:51
(0)для решения задачи можно воспользоваться специальным объектом:
Сравнение = мВнешниеСоеденение.NewObject("СравнениеЗначений");
Если Сравнение.Сравнить(мВнешниеСоеденение.Справочники.Организации.НайтиПоКоду("000000001"), мВнешниеСоеденение.Справочники.Организации.НайтиПоКоду("000000001"))=0 Тогда
  Сообщить("А равны ведь, епта!");
КонецЕсли;
25 Sam1C
 
29.09.17
11:36
(24) Вот это огонёк, работает все отлично! Спасибо!
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший