8.х Найти последний справочник в цепочке

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Itsys, 6 фев 2011.

  1. TopicStarter Overlay
    Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Добрый день,

    Есть справочник состояний, в нем есть реквизит со ссылкой на "предыдущее" состояние, т.е. реквизит с этим же типом. Необходимо найти "последнее" состояние. Сортировка по коду и т.д. не подходит.
    Для примера:
    Код Наименование Предыдущее
    1 "Состояние 1"
    2 "Состояние 2" "Состояние 1"
    3 "Состояние 3" "Состояние 4"
    4 "Состояние 4" "Состояние 2"

    В данном случае "последним" состоянием "Состояние 3". Мне приходит только на ум выборка всех состояний и объединение со второй выборкой состояний по
    Код:
    ПерваяВыборка.Ссылка = ВтораяВыборка.Предыдущее
    
    Но это не очень красиво и накладно, если состояний много, может кто уже решал подобную задачу?
  2. Isberg
    Offline

    Isberg Опытный в 1С

    Регистрация:
    4 май 2010
    Сообщения:
    52
    Симпатии:
    0
    Баллы:
    26
    Реквизиты можно добавлять в справочник? Допустим добавить время, где время записи реквизита = ТекущееВремя(), так легко можно найти последний добавленный реквизит в справочник. Либо, инфу записывать в регистр накопления.
  3. TopicStarter Overlay
    Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Вся суть в том, что пользователь может поменять порядок в цепочке, изменив реквизит "предыдущее", а в каком порядке он их будет менять никому не известно, главное чтобы цепочка не зацикливалась :)
  4. Isberg
    Offline

    Isberg Опытный в 1С

    Регистрация:
    4 май 2010
    Сообщения:
    52
    Симпатии:
    0
    Баллы:
    26
    А чем со временем не нравится идея? Пусть меняет когда угодно и что угодно, по времени найти последний измененный реквизит и следовательно вывести его родителя.
  5. HexaD
    Offline

    HexaD Опытный в 1С

    Регистрация:
    19 июн 2010
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    Я попробую поразмышлять. Если подумать, чем отличается искомая нами строка 3 от остальных, то видно, что элемент справочника "Состояние 3" не встречается в третьей колонке, в отличие, от остальных. Т.е., получается, что нам нужны те элементы справочника, ссылок на которые нет ни у одного элемента в третьей колонке.

    Если всё так, то код, наверное, будет таким:

    // выбираем элементы справочника, ссылка на которые не встречается ни в одной строке в колонке № 3
    Выбрать
    СпрХХХ.Наименование
    Из Справочник.ХХХ КАК СпрХХХ,
    Где Не СпрХХХ.Ссылка В
    (
    // выбираем все уникальные значения из 3-ей колонки (если встречаем пустую ссылку, то сразу
    // отбрасываем, т.к. это самое первое значение состояния.
    Выбрать Различные
    СпрХХХ.Предыдущее
    Из Справочник.ХХХ КАК СпрХХХ
    Где
    (НЕ СпрХХХ.Предыдущее = ЗНАЧЕНИЕ(Справочник.ХХХ.ПустаяСсылка))
    )
  6. TopicStarter Overlay
    Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Так компактнее, но то же самое, перебор всех элементов.
    Код:
    ВЫБРАТЬ
    Состояния.Ссылка
    ИЗ
    Справочник.Состояния КАК Состояния
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Состояния КАК Состояния1
    ПО Состояния.Ссылка = Состояния1.Предыдущее
    ГДЕ
    Состояния1.Ссылка ЕСТЬ NULL 
    
    
  7. HexaD
    Offline

    HexaD Опытный в 1С

    Регистрация:
    19 июн 2010
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    Думаю, принципиально лучше, чем у вас сделать нельзя. Мы можем отыскать конец всех цепочек только если попытаемся отыскивать продолжения у всех элементов. По-другому понять конечный это элемент, или ещё нет - нельзя. Конечно, хотелось бы отбрасывать весь мусор раньше, но приходится это делать только в самый последний момент. Наверное, можно было бы игнорировать в дальнейшем записи, концы которых нам попались в самом начале поиска, но в запросе такого, вроде, не сделаешь.

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