8.х Сортировка в табличной части документа по дочерним реквизитам поля

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

  1. TopicStarter Overlay
    Gulnaz
    Offline

    Gulnaz Опытный в 1С

    Регистрация:
    20 сен 2010
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Здраствуйте! У меня возникла необходимость создать нестандартную сортировку.
    В табличной части Материалы документа Требование накладная есть реквизит ЛимитнаяКарта, который является ссылкой на документ ЛимитнаяКарта (т.е. отпуск материала идет по лимитной карте). У документа ЛимитнаяКарта кроме номера и даты есть ВходящийНомер и ВходящаяДата. В форме документа в ТЧ пользователь видит эти входящие реквизиты, это реализовано так:

    Код:
    Процедура МатериалыПриПолученииДанных(Элемент, ОформленияСтрок)
    
    Для каждого ОформлениеСтроки из ОформленияСтрок Цикл 
    ЕстьЛимитка = (ОформленияСтрок[0].Ячейки.Найти("Софт_ЛимитнаяКарта")<>Неопределено);
    Если ЕстьЛимитка Тогда    ОформлениеСтроки.Ячейки.ЛимитнаяКарта.УстановитьТекст(Формат(ОформлениеСтроки.ДанныеСтроки.ЛимитнаяКарта.ВходящийНомер, "ЧГ=0") + " от " +формат(ОформлениеСтроки.ДанныеСтроки.ЛимитнаяКарта.ВходящаяДата,"ДФ=dd.MM.yyyy"));
    КонецЕсли;
    КонецЦикла;
    
    КонецПроцедуры;
    
    
    В форму я вставила кнопку для сортировки по этому полю:
    Код:
    Процедура Кнопка1Нажатие(Элемент)
    
    Материалы.Сортировать("ЛимитнаяКарта Возр");
    
    КонецПроцедуры
    
    
    Так сортировка происходит по основным реквизитам документа: по номеру и дате.

    Мне нужно отсортировать по входящим реквизитам так, как они визуально отображаются в ТЧ.
    Если пишу
    Код:
    Материалы.Сортировать("ЛимитнаяКарта.ВходящийНомер Возр");
    
    
    выдает ошибку, что поле не найдено.
    Как отсортировать строки в ТЧ по ЛимитнаяКарта.ВходящийНомер?
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    никак. по динамическим полям физически невозможно сортировать.
  3. TopicStarter Overlay
    Gulnaz
    Offline

    Gulnaz Опытный в 1С

    Регистрация:
    20 сен 2010
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Тогда придется входящий номер документа ввести как отдельный реквизит ТЧ и по нему сортировать?
  4. yzek
    Offline

    yzek Опытный в 1С

    Регистрация:
    13 окт 2010
    Сообщения:
    713
    Симпатии:
    0
    Баллы:
    26
    Если он будет иметь тип Строка или Число, то можно.
  5. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    да
  6. sgirg
    Offline

    sgirg Опытный в 1С

    Регистрация:
    25 дек 2008
    Сообщения:
    126
    Симпатии:
    0
    Баллы:
    26
    Gulnaz, лови решение))

    Код:
        МассивОС = ТЧ.ВыгрузитьКолонку("ОсновноеСредство");
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    ОсновныеСредства.Ссылка,
    |    ОсновныеСредства.ДатаВыпуска КАК ДатаВыпуска
    |ИЗ
    |    Справочник.ОсновныеСредства КАК ОсновныеСредства
    |ГДЕ
    |    ОсновныеСредства.Ссылка В (&МассивОС)
    |
    |УПОРЯДОЧИТЬ ПО
    |    ДатаВыпуска";
    Запрос.УстановитьПараметр("МассивОС", МассивОС);               
    Результат = Запрос.Выполнить();
    
    i = 0;
    Пока i < ТЧ.Количество() Цикл
    
    Если НЕ Результат.Пустой() Тогда    
    ТаблицаРезультата = Результат.Выгрузить();
    ОсновноеСредство = ТаблицаРезультата[i].Ссылка;
    
    СтрокаТЧ = ТЧ.Найти(ОсновноеСредство, "ОсновноеСредство");
    Если СтрокаТЧ <> Неопределено Тогда
    ИндексСтроки = ТЧ.Индекс(СтрокаТЧ);    
    Если НЕ ИндексСтроки = i Тогда
    ТЧ.Сдвинуть(ТЧ[ИндексСтроки], i - ИндексСтроки);
    КонецЕсли; 
    Иначе
    Возврат;             
    КонецЕсли;    
    
    i = i + 1;
    Иначе    
    Возврат;    
    КонецЕсли;    
    
    КонецЦикла;    
    
    
    
    
    Объясняю свой пример:
    Взял табличную часть (ТЧ)
    в ней 3 поля:
    1. номер по порядку,
    2. какое то наименование,
    3. основное средство.

    Требуется упорядочить ТЧ по дате производства Основного средства

    Запросом выбираю ОС, которые заполнены в ТЧ и в запросе же сортирую, как мне надо.
    Выгружаю результат запроса в ТЗ (Таблица результата)

    Ну а далее делаем перемещения в ТЧ на основе индексов, полученых в запросе.
    Т.е. беру первое основное средство из запроса, нахожу его в ТЧ, получаю индекс строки ТЧ и если он не совпадает с индексом из запроса то перемещаю строку ТЧ (i - ИндексСтроки это и есть количество на которое переместить строку).

    Код может и не самый красивый, но работающий))
  7. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.565
    Симпатии:
    716
    Баллы:
    204
    да, да....завтра будет необходимо сортировать по другому полю.....и пошло-поехало....

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