Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Получить данные из формы документа
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
alexkhua
Нужно из табличного поля формы документа получить колонку отсортировать ее и выбрать макс. значение. Есть ли возможность это сделать до записи документа., т.е. получить данные колонки из формы документа, выгрузить их в таблицу значений и т.д.
asd34

 i 

Вредный совет. Удалил специально.
 
Vofka
МаксимальноеЗначение = Неопределено;
Если ТабличнаяЧасть.Количество() > 0 Тогда
     ТЗ = ТабличнаяЧасть.Выгрузить();
     ТЗ.Сортировать("ИмяКолонки Убыв");
     МаксимальноеЗначение = ТЗ[0];
КонецЕсли;
alexkhua
Цитата(Vofka @ 02.07.13, 8:55) необходимо зарегистрироваться для просмотра ссылки
МаксимальноеЗначение = Неопределено;
Если ТабличнаяЧасть.Количество() > 0 Тогда
     ТЗ = ТабличнаяЧасть.Выгрузить();
     ТЗ.Сортировать("ИмяКолонки Убыв");
     МаксимальноеЗначение = ТЗ[0];
КонецЕсли;

Спасибо за ответы, буду разбираться.
asd34
Logist, в чем вредность?
pablo
Цитата
в чем вредность?
Лишний цикл => дольше работать будет
logist
Цитата(asd34 @ 02.07.13, 10:31) необходимо зарегистрироваться для просмотра ссылки
в чем вредность?

Вредность в том, что не надо совершать лишних действий. Ваш код создает список, затем перебирает всю таблицу добавляя в список одно поле, это все равно что пожарить отдельно каждый кусочек картошки до готовности, а потом смешать их и до жарить пару секунд, результат вы получите правильный но время на сам процесс уйдет гораздо больше, согласитесь, что лучше сразу пожарить всю картошку. Посмотрите что написал Vofka, есть методы позволяющие работать оптимизировано и производительно.
asd34
Т.е. выгружать все табличное поле в ТЗ всегда быстрее чем в цикле вставить значения одной колонки, даже если колонок очень много? Вот процедурка из типовой УПП:
// Процедура проверяет максимальное значение ключа связи. 
//
Процедура ПроверитьМаксЗначениеКлюча(ПараметрыСвязиСтрокТЧ, ДокументОбъект, ИмяТЧ) Экспорт
    
    Если ПараметрыСвязиСтрокТЧ[ИмяТЧ].СвободныйКлюч <> Неопределено Тогда
        Возврат; // «не занятый» ключ уже был определен ранее.
    КонецЕсли;
    
    // При первом обращении «свободный» ключ необходимо рассчитать.
    Если ДокументОбъект[ИмяТЧ].Количество() = 0 Тогда
        ПараметрыСвязиСтрокТЧ[ИмяТЧ].СвободныйКлюч = 1; // отсчет начинается с нуля
    Иначе
        
        // Если в табл. части уже присутствуют строки, то новое «свободное» значение ключа
        // рассчитывается от максимального существующего значения.
        СписокКлючей = Новый СписокЗначений;                
        Для каждого ЭлКоллекции Из ДокументОбъект[ИмяТЧ] Цикл
            СписокКлючей.Добавить(ЭлКоллекции.КлючСвязи);
        КонецЦикла;
        СписокКлючей.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
        ПараметрыСвязиСтрокТЧ[ИмяТЧ].СвободныйКлюч = СписокКлючей[0].Значение + 1;
        
    КонецЕсли;
    
КонецПроцедуры // ПроверитьМаксЗначениеКлюча()
Vofka
logist, ну зачем же удалять? На то у нас и форум, что каждый может высказать свое мнение. Мне тоже не всегда нравятся советы, которые одни участники дают другим (независимо от группы пользователей). Но, на то у нас и форум, что каждый может высказать свое мнение и, если это не спам или не бред сивой кобылы, то удалению оно не подлежит. Кто-то привел код, который вам не нравится? Напишите про это ниже, укажите человеку почему его код, с вашей точки зрения, не айс, напишите свой вариант. Тем более я лично не проверял его код на практике и не замерял производительность. Возможно, код asd34-а в конкретных условиях (в реалиях ТС-а) будет работать даже быстрее чем мой код, откуда ж мы можем знать? А мы взяли и запилили его помощь. Нельзя же так.

asd34, приведите ещё раз свой код. Как я писал выше, каждый имеет право высказать свое мнение.
pablo
Я бы предложил и третий вариант исключительно для того, чтобы сверить быстродействие
МаксимальноеЗначение = Неопределено;
Если ТабличнаяЧасть.Количество() > 0 Тогда
     ТЗ = ТабличнаяЧасть.ВыгрузитьКолонки("ИмяКолонки");
     ТЗ.Сортировать("ИмяКолонки Убыв");
     МаксимальноеЗначение = ТЗ[0];
КонецЕсли;
logist
Vofka, я посчитал, что в данном конкретном случае это вредный совет. Если ТЧ будет содержать много (или очень много) строк, то копирование таблицы произойдет быстрее чем ее построчный перебор (не надо требовать замеры, думаю это должно быть и так понятно). Если не прав, ну значит не прав, в следующий раз не буду так реагировать, хотя останусь тут при своем мнении.
Насчет типовых процедур УПП, там можно встретить процедуры которые написаны миллион лет назад, и на их оптимизацию никто не обращает внимания, потому,что работает (по принципу: работает - не трогай), просто не попался еще прецедент для возникновения необходимости оптимизации.
Vofka
Цитата(logist @ 02.07.13, 11:31) необходимо зарегистрироваться для просмотра ссылки
Vofka, я посчитал, что в данном конкретном случае это вредный совет.

Тем не менее, это не повод удалять чужой пост.

Цитата(logist @ 02.07.13, 11:31) необходимо зарегистрироваться для просмотра ссылки
Если ТЧ будет содержать много (или очень много) строк, то копирование таблицы произойдет быстрее чем ее построчный перебор (не надо требовать замеры, думаю это должно быть и так понятно).

Нет, непонятно. И вообще, на слово я не верю, в конкретно этом вопросе. Никому. Я даже сам не возьмусь утверждать что-то. Единственныая группа людей, мнению которых я доверил бы больше остальных, в конкретно этом вопросе - это разработчики платформы. И, помнится мне, как-то была тема, где как раз у нас с вами smile.gif зашел спор о производительности какого-то кода. Так вот, насколько я помню, я лично провел замеры и предоставил цифры, где было видно, что неоптимальный, с вашей точки зрения, код работает не хуже оптимального, опять таки, с вашей точки зрения.

Цитата(logist @ 02.07.13, 11:31) необходимо зарегистрироваться для просмотра ссылки
Если не прав, ну значит не прав, в следующий раз не буду так реагировать, хотя останусь тут при своем мнении.

У каждого свое мнение. И я ещё раз скажу, что у нас же тут форум, а не блог одного автора, поэтому каждый имеет право высказать конкретно свое мнение. Если вы с кем-то не согласны - напишите об этом и каждый сделает, как это не странно, свои выводы в поддержку вашего мнения либо мнения кого-то другого. Я лично тоже, иногда, не согласен с вашим мнением. Но максимум что я сделаю - так это напишу о своем несогласиии и выражу свое мнение по данному вопросу. И не смотря на то, что наши мнения расходятся - это не повод оставлять лишь одно из них. В общем, можно сказать, что у нас на форуме демократия и свобода слова smile.gif .

Цитата(logist @ 02.07.13, 11:31) необходимо зарегистрироваться для просмотра ссылки
просто не попался еще прецедент для возникновения необходимости оптимизации.

Прецедент может никогда в жизни не попасться, поэтому даже повода не будет задумываться об оптимизации. И да, может быть, определенный код можно было бы написать оптимальнее, но на самом деле разница в работе оптимального и не оптимального кода будет такая, что ней можно пренебречь.
logist
Цитата(Vofka @ 02.07.13, 11:52) необходимо зарегистрироваться для просмотра ссылки
Тем не менее, это не повод удалять чужой пост.

Я понял свою ошибку, можно не акцентировать каждый раз. Вероятно я уже стал старым для модератора.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.