• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Дайнеко
  • Дата начала
Д

Дайнеко

Пытаюсь построить Соответствие, в котором в качестве ключа выступает не единичный объект, вроде Ссылка.Товар
а структура, состоящая из нескольких ссылок.

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

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

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

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

Однако столкнулся с тем, что не извлекает данных из соответствия.
Все работает, если в качестве ключа использовать "Выборка.Товар".
Такое ощущение, что в соответствие записыватся не значения структуры, а ссылка на нее.
Таким образом 2-ой и следующий проход цикла меняет структуру и портит все элементы соответствия.

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

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

unknown181538

Получается, что Структура - это ссылка. Т.е. можно будет заполнить соответствие, если каждую структуру помещать в свою переменную, но искать не получится. Разве что сначала искать ссылку на структуру.
А вообще, используйте таблицу значений, и не выпендривайтесь)
 
Д

Дайнеко

А вообще, используйте таблицу значений, и не выпендривайтесь)
Спасибо, за ласковый совет. Через ТЗ я давно сделал, но это не есть совершенство, будет тратится время на поиск нужной строки. А душа требует красоты.
Получается, когда я вставляю в соответствие структуру, то, говоря низкоуровневым языком, в соответствии запоминается только адрес структуры. А как только из процедуры вышел, все структуры пропадают, по их адресам записывается всякая чушь.

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

Дайнеко

Сделал. С поиском все нормально.

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

unknown181538

Сделал. С поиском все нормально.

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

Дайнеко

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

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

Возврат Рез;
КонецФункции	//

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

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

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

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

unknown181538

- статья по теме. Да, соответствие должно быть побыстрее.
Но с этими запаковываниями/распаковываниями еще надо проверять, что быстрее.
 
V

vbs

Вспомнил я слезы девочки в Сочи много лет назад : "Ну, вы такие умные, а я - такая глупая..."
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!