7.7 Сортировка строк в табличной части документа

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

  1. TopicStarter Overlay
    new1
    Offline

    new1

    Регистрация:
    12 ноя 2010
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    1
    В табличной части документа надо сортировать строки не по возрастанию, не по убыванию, а по первым нескольким символам реквизита . Символы определяются по вводу в шапке документа пользователем. Заранее спасибо.
  2. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    не понятно, что надо, приведите пример
  3. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Выгрузите табличную часть в таблицу значений. Сортируйте как вам заблагорассудится. Загружайте обратно
  4. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    не.. тут по хитрее, на сколько я понял:

    Код:
    Procedure СортироватьПоБуквам()
    ТЧДокумента = CreateObject("ValueTable");
    НоваяТЧДокумента = CreateObject("ValueTable");
    UnloadTable(ТЧДокумента); //выгружаем тч
    UnloadTable(НоваяТЧДокумента); //копия тч, в которой будет новый порядок сортировки
    НоваяТЧДокумента.DeleteLines(); //очистили
    //Допустим - РеквизитСортировки = "MSK" и сортировка нужна типа сначала все на М, далее на S и т.д.
    //Допустим  - сортируем по названию номенклатуры
    For i = 1 To StrLen(TrimAll(РеквизитСортировки)) Do //для каждой буквы по порядку
    ТЧДокумента.SelectLines();
    While ТЧДокумента.GetLine() = 1 Do
    If UPPER(Mid(TrimAll(ТЧДокумента.Номенклатура.Description),1,1)) = UPPER(Mid(TrimAll(РеквизитСортировки),i,1)) Then //сравниваем первый символ с символом по порядку сортировки
    НоваяТЧДокумента.NewLine(); //заполняем новую тч
    For j = 1 To ТЧДокумента.ColumnCount() Do
    НоваяТЧДокумента.SetValue(НоваяТЧДокумента.LineNum,j,ТЧДокумента.GetValue(ТЧДокумента.LineNum,j)); //заполняем все реквизиты в новой строке
    EndDo;
    EndIf;
    EndDo;		
    EndDo;
    LoadTable(НоваяТЧДокумента);
    EndProcedure
    
    вот такие семечки для мозгов
  5. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Под фразой "сортируйте как вам заблагорассудится" я как раз вышеприведенный алгоритм и имел ввиду))))
    К тому же в алгоритме есть "недостатки"...
    1) Ну что будет если юзер ведет сортировку ММСК (дубль появится)
    2) КудЫ девать строчки которые начинаются с символов не включенных в сортировку
  6. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    [off]согласен :) это для примера, задача-то специфическая[/off]
  7. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    проще через доп реквизит....
    1) Выгружаем в ТЗ
    2)Создаем доп. реквизит (число)
    3)Заполняем значением ДлинаСтрокиСортировки+1
    4) Один раз проходим по строкам и если первый символ совпадает - присваиваем порядковый номер его из строки сортировки..

    Все. Достаточно просто отсортировать штатным методом.... И не нужно вложенных циклов и доп. условий.
  8. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Код:
    ТЗ=СоздатьОбъект("ТаблицаЗначений");
    ВыгрузитьТабличнуюЧасть(ТЗ);
    ТЗ.НоваяКолонка("Сорт","Число");
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
    Поз=Найти(ВРег(Лев(СокрЛП(ТЗ.РеквСортировки),1)),СтрПоиска); 
    ТЗ.Сорт=?(Поз=0,СтрДлина(СтрПоиска)+1, Поз);
    КонецЦикла;
    ТЗ.Сортировать("Сорт");
    ЗагрузитьТабличнуюЧасть(ТЗ);
    
    
  9. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    ну, тоже вариант :)
    а вообще, цикл дорабатывается так:

    Код:
    Procedure СортироватьПоБуквам()
    ТЧДокумента = CreateObject("ValueTable");
    НоваяТЧДокумента = CreateObject("ValueTable");
    UnloadTable(ТЧДокумента);
    UnloadTable(НоваяТЧДокумента);
    НоваяТЧДокумента.DeleteLines();
    For i = 1 To StrLen(TrimAll(РеквизитСортировки)) Do
    For k = 1 to ТЧДокумента.LinesCnt()
    If UPPER(Mid(TrimAll(ТЧДокумента.Номенклатура.Description),1,1)) = UPPER(Mid(TrimAll(РеквизитСортировки),i,1)) Then
    НоваяТЧДокумента.NewLine();
    For j = 1 To ТЧДокумента.ColumnCount() Do
    НоваяТЧДокумента.SetValue(НоваяТЧДокумента.LineNum,j,ТЧДокумента.GetValue(k,j));
    EndDo;
    ТЧДокумента.DeleteLine(k);
    k = k-1;
    EndIf;
    EndDo;	
    EndDo;
    If ТЧДокумента.LinesCnt()>0 Then //отстатки пихаем в конец ТЧ
    For k = 1 to ТЧДокумента.LinesCnt()
    НоваяТЧДокумента.NewLine();
    For j = 1 To ТЧДокумента.ColumnCount() Do
    НоваяТЧДокумента.SetValue(НоваяТЧДокумента.LineNum,j,ТЧДокумента.GetValue(k,j));
    EndDo;
    ТЧДокумента.DeleteLine(k);
    k = k-1;
    EndDo;	
    EndIf;
    LoadTable(НоваяТЧДокумента);
    EndProcedure
    
    повторения символов или их отсутствие игнорируется. по желанию можно остаток не попавший под условие сортирануть по алфавиту или по внутр. преставлению.
    хоть циклов и много, думаю, за пару сек отсортирует 1000 строк для 10 символов
  10. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Ну не знаю... Громоздко как-то и не удобно мне кажется... К тому же думаю мой алгоритм все же быстрее))) У вас вложенный цикл + еще один. В моем же - всего один

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