Имя: Пароль:
1C
 
Сравнение идентичности одинаковых объектов в 1С даёт неравенство
,
0 Darklight
 
24.09.14
12:44
Товарищи я в шоке
Написал вот такое сравнение
Если Метаданные.СвойстваОбъектов.Проведение=Метаданные.СвойстваОбъектов.Проведение Тогда
сообщить("Равны!");
КонецЕсли;

И оказалось - что они НЕ РАВНЫ! Имя свойства из коллекции Метаданные.СвойстваОбъектов значения не имеет!

Аналогично можно и так написать
ИмяСвойства = "Проведение"; //Любое имя свойства
Если Метаданные.СвойстваОбъектов[ИмяСвойства]=Метаданные.СвойстваОбъектов[ИмяСвойства] Тогда
сообщить("Равны!");
КонецЕсли;

Версия платформы 8.3.5.1119

Это вообще как так может быть?
1 YFedor
 
24.09.14
12:47
(0) А что тебе даст такое сравнение? Зачем сравнивать заведомо одно и то же?
2 Рэйв
 
24.09.14
12:48
Метаданные.СвойстваОбъектов.Проведение.Запретить=Метаданные.СвойстваОбъектов.Проведение.Запретить
3 Рэйв
 
24.09.14
12:48
значения сравнивай.Нахрена сравнивать ненужную фигню?
4 palpetrovich
 
24.09.14
12:48
(0) переходи на клюшки, там все правильно :)
5 Крошка Ру
 
24.09.14
12:50
(0) Объекты метаданных можно сравнивать на равенство. При этом проверяется идентичность объектов, а не совпадение значений свойств. То есть проверяется то, что сравнивается именно один и тот же объект конфигурации.

http://its.1c.ru/db/metod8dev#content:2318:1
6 Darklight
 
24.09.14
12:53
(1) Ну, проблема возникла в другом месте - я по этим значениям сортировал и сопоставлял два списка (иначе никак).
(4) Простите, куда переходить?
(5) Я не сравниваю метаданные...
7 Darklight
 
24.09.14
12:54
(1) И, как выяснилось, - это не совсем одно и тоже
8 Мимохожий Однако
 
24.09.14
12:57
Что ты хочешь сравнить?
9 Darklight
 
24.09.14
13:17
(8) Мне нужно сопоставить два ТЕКСТОВЫХ списка (из значений свойств метаданных). Один - идентификаторы на русском, другой  - на английском

алгоритм (исходные таблицы одинаковы, и отличаются только названиями идентификаторов)
Для каждого Строка из таблицаСвойствНаРусском Цикл
        Ключ = Строка.Владелец;
        Элемент = КешМетаданных.Получить(Ключ);
        Если Элемент = неопределено Тогда
            Элемент = Метаданные.СвойстваОбъектов[Ключ];
            КешМетаданных.Вставить(Ключ, Элемент);
        КонецЕсли;
        Строка.Элемент = Элемент;
    КонецЦикла;
    Для каждого Строка из таблицаСвойствНаАНглийском Цикл
        Ключ = Строка.Owner;
        Элемент = КешМетаданных.Получить(Ключ);
        Если Элемент = неопределено Тогда
            Элемент = Метаданные.СвойстваОбъектов[Ключ];
            КешМетаданных.Вставить(Ключ, Элемент);
        КонецЕсли;
        Строка.Элемент = Элемент;
    КонецЦикла;
    таблицаСвойствНаРусском.Сортировать("Элемент");
    таблицаСвойствНаАНглийском.Сортировать("Элемент");
    Данные = СоздатьПустойНаборДанныхОписанияМетаданныхПеречислений();
    таблицаСвойств = Данные.СтруктураДанных;
    таблицаСвойств.Колонки.Добавить("Значение");
    таблицаСвойств.Колонки.Добавить("Владелец");
    таблицаСвойств.Колонки.Добавить("ЗначениеСиноним");
    таблицаСвойств.Колонки.Добавить("ВладелецСиноним");
    ПредВладелец = неопределено;
    ТекВладелец = неопределено;
    Для л = 0 по таблицаСвойствНаРусском.Количество()-1 Цикл
        СтрокаРус = таблицаСвойствНаРусском[л];
        СтрокаИнг = таблицаСвойствНаАНглийском[л];

далее прочие алгоритмы
КонецЦикла;
10 Darklight
 
24.09.14
13:39
(9)Всё - поборол данную хрень (в рамках контекста моей задачи конечно) - код формирования колонки для сопоставления стал таким (кешировние повторного использования значения убирать не стал, но без него тоже всё должно работать):

КешМетаданных = Новый Соответствие;
    Для каждого Строка из таблицаСвойствНаРусском Цикл
        Ключ = Строка.Владелец;
        Элемент = КешМетаданных.Получить(Ключ);
        Если Элемент = неопределено Тогда
            Элемент = ТипЗнч(Метаданные.СвойстваОбъектов[Ключ][Строка.Значение]);
            КешМетаданных.Вставить(Ключ, Элемент);
        КонецЕсли;
        Строка.Элемент = Элемент;
    КонецЦикла;
    Для каждого Строка из таблицаСвойствНаАНглийском Цикл
        Ключ = Строка.Owner;
        Элемент = КешМетаданных.Получить(Ключ);
        Если Элемент = неопределено Тогда
            Элемент = ТипЗнч(Метаданные.СвойстваОбъектов[Ключ][Строка.Value]);
            КешМетаданных.Вставить(Ключ, Элемент);
        КонецЕсли;
        Строка.Элемент = Элемент;
    КонецЦикла;


То есть, я сравниваю (алгоритм сортировки сравнивает значения типов, а не сами коллекции) - это равносильно такому сравнению


Если ТипЗнч(Метаданные.СвойстваОбъектов.Проведение.Разрешить)=ТипЗнч(Метаданные.СвойстваОбъектов.Проведение.Разрешить) Тогда
сообщить("Равны!");
КонецЕсли;

Будут равны!


Но если  написать по-проще вот так
Если ТипЗнч(Метаданные.СвойстваОбъектов.Проведение)=ТипЗнч(Метаданные.СвойстваОбъектов.Проведение) Тогда
сообщить("Равны!");
КонецЕсли;

то равенство тоже будет достигнуто, НО - проблема в том, что и вот так оно тоже будет (хотя это не истина):

Если ТипЗнч(Метаданные.СвойстваОбъектов.Проведение)=ТипЗнч(Метаданные.СвойстваОбъектов.РежимУправленияБлокировкойДанныхПоУмолчанию) Тогда
сообщить("Равны!");
КонецЕсли;


а вот так уже не будут равны

Если ТипЗнч(Метаданные.СвойстваОбъектов.Проведение.Разрешить)=ТипЗнч(Метаданные.СвойстваОбъектов.РежимУправленияБлокировкойДанныхПоУмолчанию.Автоматический) Тогда
сообщить("Равны!");
КонецЕсли;

Тем самым вопрос исчерпан!
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший