Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Сортировка табличной части внешней обработкой

Сортировка табличной части  внешней обработкой
Я
   егаис
 
08.11.19 - 13:50
Запутался в 3 соснах
Обработка табличной части, нужно отсортировать ТЧ по Номенклатура.Код


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    
    СортироватьНаСервере(ВладелецФормы.Объект);
    
КонецПроцедуры


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

    ОбъектФормы.Товары.Загрузить(Запрос.Выполнить().Выгрузить());
    ЗначениеВДанныеФормы(ОбъектФормы, ВладелецФормыОбъект);
    
КонецПроцедуры
 
 
   palsergeich
 
1 - 08.11.19 - 13:51
(0) Зачем? У тч из коробки есть метод сортировать
Табличная часть.Сортировать (Tabular section.Sort)
Сортировать (Sort)
Синтаксис:
Сортировать(<Колонки>, <ОбъектСравнения>)
Параметры:
<Колонки> (обязательный)
Тип: Строка.
Список имен колонок, разделенных запятыми, по которым производится сортировка таблицы. После каждого имени колонки через пробел может быть указано направление сортировки. Направление определяется: "Убыв" ("Desc") - упорядочивать по убыванию; "Возр" ("Asc") - упорядочивать по возрастанию. По умолчанию сортировка производится по возрастанию. Порядок указания имен колонок таблицы определяет порядок сортировки. Это означает, что сначала таблица сортируется по колонке, указанной первой. Затем группы строк с одинаковым значением в этой колонке сортируются по колонке, которая указана второй, и так далее.
<ОбъектСравнения> (необязательный)
Тип: СравнениеЗначений.
   palsergeich
 
2 - 08.11.19 - 13:53
(1) Понял, код у тебя не реквизит ТЧ.
ТАк то должно работать на первый взляд, в чем проблема?
   ale-sarin
 
3 - 08.11.19 - 13:58
НомерСтроки может мешает?
   егаис
 
4 - 08.11.19 - 13:58
{ВнешняяОбработка.СортировкаПоКоду.Форма.Форма.Форма(5)}: Ошибка при установке значения атрибута контекста (Объект)
    СортироватьНаСервере(ВладелецФормы.Объект);
по причине:
Нельзя изменять поле, содержащее объект данных формы
   palpetrovich
 
5 - 08.11.19 - 13:59
(4) дык, ссылку получи
   егаис
 
6 - 08.11.19 - 14:01
(5) имеешь в виду?
    СортироватьНаСервере(ВладелецФормы.Объект.Ссылка);
   palpetrovich
 
7 - 08.11.19 - 14:04
(6) сорьки, не дочитал что это обработка
   егаис
 
8 - 08.11.19 - 14:06
(7) вот и я сижу втыкаю на простой, казалось бы, задаче
   ale-sarin
 
9 - 08.11.19 - 14:13
Процедура СортироватьНаСервере(Знач ВладелецФормыОбъект) 
Не?
   palpetrovich
 
10 - 08.11.19 - 14:15
вот это работает, может поможет...
обработка с ТЧ "ТабличнаяЧасть1" с одним реквизитом Реквизит1

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

&НаКлиенте
Процедура выгрузить(Команда)
    выгрузитьНаСервере();
КонецПроцедуры
   prostoya
 
11 - 08.11.19 - 16:16
Можно добавить реквизит формы обработки типа таблица значений повторяющая колонки табличной части владельца формы. Передать СортироватьНаСервере(ВладелецФормы.Объект.Ссылка). В этой процедуре на сервере отсортировать запросом и загрузить в реквизит формы обработки (таблица значений). после на клиенте очистить табличную часть владельца и записать циклом данные из реквизита формы обраьотки (таблица значений)…
я так делала.
   егаис
 
12 - 08.11.19 - 16:23
(10) я извиняюсь, что такое объект? Это для формы, а не внешней обработки?
это повторяет изначальный код

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    
    СортироватьНаСервере(ВладелецФормы.Объект);
    
КонецПроцедуры


&НаСервереБезКонтекста
Процедура СортироватьНаСервере(ВладелецФормыОбъект)
    
    //ОбъектФормы = ДанныеФормыВЗначение(ВладелецФормыОбъект, Тип("ДокументОбъект.ИнвентаризацияТоваровНаСкладе"));

    
    //ТЗ = ОбъектФормы.Товары.Выгрузить();

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

        |ВЫБРАТЬ
        |    ВТ.НомерСтроки КАК НомерСтроки,
        |    ВТ.Номенклатура КАК Номенклатура,
        |    ВТ.СчетУчета КАК СчетУчета,
        |    ВТ.Количество КАК Количество,
        |    ВТ.КоличествоУчет КАК КоличествоУчет,
        |    ВТ.Цена КАК Цена,
        |    ВТ.ЦенаВРознице КАК ЦенаВРознице,
        |    ВТ.Сумма КАК Сумма,
        |    ВТ.СуммаУчет КАК СуммаУчет,
        |    ВТ.ПартияМатериаловВЭксплуатации КАК ПартияМатериаловВЭксплуатации,
        |    ВТ.ФизЛицо КАК ФизЛицо
        |ИЗ
        |    ВТ КАК ВТ
        |
        |УПОРЯДОЧИТЬ ПО
        |    ВТ.Номенклатура.Код";
    Запрос.УстановитьПараметр("ТЗ", ТЗ);

    //ОбъектФормы.Товары.Загрузить(Запрос.Выполнить().Выгрузить());

    ВладелецФормыОбъект.Товары.Загрузить(Запрос.Выполнить().Выгрузить());
    //ЗначениеВДанныеФормы(ОбъектФормы, ВладелецФормыОбъект);

    
КонецПроцедуры
   егаис
 
13 - 08.11.19 - 16:29
(11) с ТЗ не интересно
   FIXXXL
 
14 - 08.11.19 - 16:32
(0) так не выйдет...
передавай ТЗ и загружай результат
изменять платформа не даёт вне контекста :(
   FIXXXL
 
15 - 08.11.19 - 16:40
(14) вернее так: передавать клиент-сервер и обратно не даст вне контекста
   егаис
 
16 - 08.11.19 - 16:41
(14) ну ок
тогда так, для будущих поколений, рабочий вариант


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    
    ЗаполнитьТаблицуИзДокумента(ВладелецФормы.Объект.Ссылка);
    
    ВладелецФормы.Объект.Товары.Очистить();
    Для Каждого СтрТовары Из Объект.Товары Цикл
        НоваяЗапись = ВладелецФормы.Объект.Товары.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяЗапись, СтрТовары);     
    КонецЦикла;
    ВладелецФормы.Модифицированность = Истина;
    
КонецПроцедуры


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


В обработку добавить ТЧ со структурой как в документе.
Всем спасибо.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.