Научите Работать С "соответствие"

Дайнеко

Well-Known Member
19.11.2009
951
0
53
Минск
#1
Пытаюсь построить Соответствие, в котором в качестве ключа выступает не единичный объект, вроде Ссылка.Товар
а структура, состоящая из нескольких ссылок.

Код:
	ОстаткиТоваров		= Новый Соответствие;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
СтруктураПараметров	= Новый Структура("Товар,Склад,Партия");
СтруктураРезультата		= Новый Структура("Кол,Сум");

СтруктураПараметров.Товар	= Выборка.Товар;
СтруктураПараметров.Склад	= Выборка.Склад;
СтруктураПараметров.Партия	= Выборка.Партия;

СтруктураРезультата.Кол		= Выборка.Кол;
СтруктураРезультата.Сум		= Выборка.Сум;

ОстаткиТоваров.Вставить(СтруктураПараметров, СтруктураРезультата);
// тестовая проверка
Остатки = ОстаткиТоваров.Получить(СтруктураПараметров);
//ОстаткиТоваров.Вставить(Выборка.Товар, СтруктураРезультата);
КонецЦикла;
Однако столкнулся с тем, что не извлекает данных из соответствия.
Все работает, если в качестве ключа использовать "Выборка.Товар".
Такое ощущение, что в соответствие записыватся не значения структуры, а ссылка на нее.
Таким образом 2-ой и следующий проход цикла меняет структуру и портит все элементы соответствия.

Наталкивает на размышления второй непонятный глюк: если команду
СтруктураПараметров = Новый Структура("Товар,Склад,Партия");
вынести перед циклом, то работает, но несмотря на количество циклов,
ОстаткиТоваров.Количество() всегда = 1

Выскажите соображения, возможен ли вообще поиск по такому ключу.
 

unknown181538

НеГуру
28.12.2008
1 417
0
30
Москва
#2
Получается, что Структура - это ссылка. Т.е. можно будет заполнить соответствие, если каждую структуру помещать в свою переменную, но искать не получится. Разве что сначала искать ссылку на структуру.
А вообще, используйте таблицу значений, и не выпендривайтесь)
 

Дайнеко

Well-Known Member
19.11.2009
951
0
53
Минск
#3
А вообще, используйте таблицу значений, и не выпендривайтесь)
Спасибо, за ласковый совет. Через ТЗ я давно сделал, но это не есть совершенство, будет тратится время на поиск нужной строки. А душа требует красоты.
Получается, когда я вставляю в соответствие структуру, то, говоря низкоуровневым языком, в соответствии запоминается только адрес структуры. А как только из процедуры вышел, все структуры пропадают, по их адресам записывается всякая чушь.

Нужна мысль. Совсем ничего не получится - пойду на символьное представление. :crash:
 

Дайнеко

Well-Known Member
19.11.2009
951
0
53
Минск
#4
Сделал. С поиском все нормально.

Разочарование №2
А ведь в качестве значения мне нужны также 2 числа. И они реально ни черта не сохраняются!
 

unknown181538

НеГуру
28.12.2008
1 417
0
30
Москва
#5
Сделал. С поиском все нормально.

Разочарование №2
А ведь в качестве значения мне нужны также 2 числа. И они реально ни черта не сохраняются!
А как сделали?
И как получилось, что ключи заполняются, а значения нет?
Есть уверенность, что через соответствие работает быстрее, чем через ТЗ?
 

Дайнеко

Well-Known Member
19.11.2009
951
0
53
Минск
#6
Соответствие обманул вот такой ф-ий:
Код:
//----------------------------------------------------------
//	Возвращает строку с идентификаторами
Функция КлючПоиска(П_Товар, П_Склад = Неопределено, П_Партия = Неопределено)
Перем Рез; 

Рез = "";
Если НЕ(П_Товар = Неопределено) И НЕ(П_Товар = Null) Тогда
Рез = Рез + П_Товар.УникальныйИдентификатор();
КонецЕсли;
Если НЕ(П_Склад = Неопределено) И НЕ(П_Склад = Null) Тогда
Рез = Рез + П_Склад.УникальныйИдентификатор();
КонецЕсли;
Если НЕ(П_Партия = Неопределено) И НЕ(П_Партия = Null) Тогда
Рез = Рез + П_Партия.УникальныйИдентификатор();
КонецЕсли;

Возврат Рез;
КонецФункции	//
Ее использую для заполнения и для поиска.
На окончательный вывод натолкнуло описание объекта "ФиксированноеСоответствие":
В качестве ключа может выступать любое значение. Рекомендуется, чтобы в качестве ключа выступало значение примитивного типа или другого типа, значение которого может только присваиваться, но не может менять свое содержимое.

Теперь прихожу к печальному выводу: в соответствии Значением также можно запихнуть только простые типы или ссылки на неизменные объекты, просто говоря, на записи в базе. Для хранения нескольких чисел придется изобретать аналогичную ключу фигню методом "запаковал/распаковал". Но во что преобразовывать? Массив и список значений наверняка также не подходят. В сроку с разделителями пошло.

Ради чего бьюсь? Во-первых для изучения этого зверя. Во-вторых, наверное же быстрей работает, чем поиск по ТЗ. Иначе, для чего он нужен? Разве что попробовать сравнить тестом. Может сравнивали?

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