Имя: Пароль:
1C
1С v8
Сортировка строк в печатной форме документа по выбору пользователя
0 10vital08
 
17.02.17
14:54
Добрый день!
Ситуация такая:
я хочу организовать сортировку строк в печатной форме документа по выбору пользователя, а именно по: наименованию номенклатуры, длине наименования номенклатуры.
Подскажите пожалуйста, что для этого нужно сделать?

Вот исходный модуль печати:
Процедура Печать(ТабДок, Ссылка) Экспорт
   //{{_КОНСТРУКТОР_ПЕЧАТИ(Печать)
   Макет = Документы.Реализация_товаров.ПолучитьМакет("Печать");
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   |   Реализация_товаров.Дата,
   |   Реализация_товаров.Контрагент,
   |   Реализация_товаров.Номер,
   |   Реализация_товаров.Товары.(
   |      НомерСтроки,
   |      Номенклатура,
   |      Количество,
   |      Цена,
   |      Сумма
   |   )
   |ИЗ
   |   Документ.Реализация_товаров КАК Реализация_товаров
   |ГДЕ
   |   Реализация_товаров.Ссылка В (&Ссылка)";
   Запрос.Параметры.Вставить("Ссылка", Ссылка);
   Выборка = Запрос.Выполнить().Выбрать();

   ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
   Шапка = Макет.ПолучитьОбласть("Шапка");
   ОбластьТоварыШапка = Макет.ПолучитьОбласть("ТоварыШапка");
   ОбластьТовары = Макет.ПолучитьОбласть("Товары");
   ТабДок.Очистить();

   ВставлятьРазделительСтраниц = Ложь;
   Пока Выборка.Следующий() Цикл
      Если ВставлятьРазделительСтраниц Тогда
         ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
      КонецЕсли;

      ТабДок.Вывести(ОбластьЗаголовок);

      Шапка.Параметры.Заполнить(Выборка);
      ТабДок.Вывести(Шапка, Выборка.Уровень());

      ТабДок.Вывести(ОбластьТоварыШапка);
      ВыборкаТовары = Выборка.Товары.Выбрать();
      Пока ВыборкаТовары.Следующий() Цикл
         ОбластьТовары.Параметры.Заполнить(ВыборкаТовары);
         ТабДок.Вывести(ОбластьТовары, ВыборкаТовары.Уровень());
      КонецЦикла;

      ВставлятьРазделительСтраниц = Истина;
   КонецЦикла;
   //}}
КонецПроцедуры
1 Любопытная
 
17.02.17
14:58
А как пользователь будет указывать, какую он хочет сортировку?
2 HardBall
 
17.02.17
14:59
Пятничный слет студентов.
3 10vital08
 
17.02.17
15:00
(1) В задании четко не прописано. Поэтому, буду рад предложению решения от вас)
4 Любопытная
 
17.02.17
15:04
(3) Предполагаю, что ему надо какую-то форму показать, чтобы он выбрал. Ну хотя бы вопрос задать. Типа "Будем сортировать по длине наименования?" Если нет, то сортируем по наименованию.
Следующий квест - как вы будете сортировать по длине? Это надо всю таблицу прошерстить, длину каждого наименования посчитать, а потом уже сортировать... фигня какая
5 HardBall
 
17.02.17
15:05
Выгружать запрос в ТЗ.
Если сортировка по наименованию то сортировать ТЗ
Если сортировка по длине то добавить колонку в ТЗ с длиной перебирать ТЗ считать длину наименования, сортировать.
6 10vital08
 
17.02.17
20:25
Сделал по наименованию:

Сортировка = Документы.Реализация_товаров.НайтиПоРеквизиту("СортировкаПоНаименованиюНоменклатуры", 1);
Макет = Документы.Реализация_товаров.ПолучитьМакет("Печать");
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Реализация_товаров.Дата,
    |    Реализация_товаров.Контрагент,
    |    Реализация_товаров.Номер,
    |    Реализация_товаров.Товары.(
    |        НомерСтроки,
    |        Номенклатура КАК Номенклатура,
    |        Количество,
    |        Цена,
    |        Сумма
    |    )
    |ИЗ
    |    Документ.Реализация_товаров КАК Реализация_товаров
    |ГДЕ
    |    Реализация_товаров.Ссылка В(&Ссылка)
    |УПОРЯДОЧИТЬ ПО
    |    Номенклатура УБЫВ";

Если ЗначениеЗаполнено(Сортировка) тогда
        Запрос.Текст = СтрЗаменить(Запрос.Текст,"УБЫВ","ВОЗР");
    КонецЕсли;

А с длиной наименования как быть?
7 h-sp
 
17.02.17
21:57
|УПОРЯДОЧИТЬ ПО
    |    Номенклатура.ДлинаНаименования УБЫВ";
8 10vital08
 
17.02.17
22:05
(7) Не работает так, ошибка
9 10vital08
 
17.02.17
22:09
(7) Пробовал так:
Если ЗначениеЗаполнено(СортировкаПоДлине) тогда
         Запрос.Текст = СтрЗаменить(Запрос.Текст,"Номенклатура УБЫВ","Номенклатура.ДлинаНаименования УБЫВ");
    КонецЕсли;

Ошибка на ДлинаНаименования
10 olegves
 
17.02.17
22:54
(0) сделай разные варианты, каждый со своей туалетовкой, тьфу, СОРТИРовкой
11 10vital08
 
18.02.17
14:23
(5) Что то типа такого?
НовыйЗапрос = Новый Запрос;
        НовыйЗапрос.Текст =
        "ВЫБРАТЬ
    |    Реализация_товаров.Дата,
    |    Реализация_товаров.Контрагент,
    |    Реализация_товаров.Номер,
    |    Реализация_товаров.Товары.(
    |        НомерСтроки,
    |        Номенклатура КАК Номенклатура,
    |        Количество,
    |        Цена,
    |        Сумма
    |    )
    |ИЗ
    |    Документ.Реализация_товаров КАК Реализация_товаров";
        ТЗ = НовыйЗапрос.Выполнить().Выгрузить();
        
        ТЗ = Новый ТаблицаЗначений;
        ТЗ.Колонки.Добавить("КоличествоСимволов");
        ТЗ.Колонки.Добавить("Номенклатура");
        ВыборкаТовары = Справочники.Номенклатура.Выбрать();
        ОбластьТовары = Документы.Реализация_товаров.Выбрать();
        
        Пока ВыборкаТовары.Следующий() Цикл
            НоваяСтрока = ТЗ.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока,ВыборкаТовары);
            КолСимволов = СтрДлина(ВыборкаТовары.Наименование);
            НоваяСтрока.КоличествоСимволов = КолСимволов;
            КонецЦикла;
        ТЗ.Сортировать("КоличествоСимволов Возр");
        для каждого СтрокаТаб из ТЗ Цикл      
            
        КонецЦикла;
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан