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

Тема в разделе "1C и всё что с ней связано", создана пользователем Дайнеко, 5 май 2012.

  1. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Пытаюсь построить Соответствие, в котором в качестве ключа выступает не единичный объект, вроде Ссылка.Товар
    а структура, состоящая из нескольких ссылок.

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

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

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

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

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

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

    unknown181538 НеГуру
    1C Team

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

    Дайнеко Well-Known Member
    1C Team

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

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

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Сделал. С поиском все нормально.

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    А как сделали?
    И как получилось, что ключи заполняются, а значения нет?
    Есть уверенность, что через соответствие работает быстрее, чем через ТЗ?
     
  6. Дайнеко

    Дайнеко Well-Known Member
    1C Team

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

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

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

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

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

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    http://infostart.ru/public/79285/ - статья по теме. Да, соответствие должно быть побыстрее.
    Но с этими запаковываниями/распаковываниями еще надо проверять, что быстрее.
     
  8. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Вспомнил я слезы девочки в Сочи много лет назад : "Ну, вы такие умные, а я - такая глупая..."
     
  9. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Спасибо, почитал. Я верил в это Соответствие!
     
Загрузка...

Поделиться этой страницей