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


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


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

    ОбъектФормы.Товары.Загрузить(Запрос.Выполнить().Выгрузить());
    ЗначениеВДанныеФормы(ОбъектФормы, ВладелецФормыОбъект);
    
КонецПроцедуры
1 palsergeich
 
08.11.19
13:51
(0) Зачем? У тч из коробки есть метод сортировать

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

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

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

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


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

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


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


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


В обработку добавить ТЧ со структурой как в документе.
Всем спасибо.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.