Имя: Пароль:
1C
1С v8
поделитесь - как грамотно обрабатывать колонки ТЧ!
0 ASimonova
 
24.10.16
13:46
1С:Предприятие 8.3 (8.3.8.1964)
Часто нужно обработать одну-две колонки ТЧ. Я всегда сувала их в запрос и в запросе обрабатывала и загружала обратно в ТЧ. А если у меня 50 полей, зачем я их буду туда-сюда гонять, может, можно как-нибудь попроще?
Если засунуть одну колонку в запрос, обработать и загрузить обратно, тогда велика вероятность потери соответствия между строками, и я так никогда не рисковала.
Обрабатывать построчно в цикле - слишком долго для больших ТЧ.

Поделитесь - как вы делаете? Как это будет максимально грамотно?
1 Жан Пердежон
 
24.10.16
13:51
в чем обработка заключается?
если данные тянуть из базы - запросом;
чтобы порядок сохранился - добавляешь порядковый номер и сортируешь по нему;
какие ещё риски на ровном месте?
2 DrShad
 
24.10.16
13:52
(0) обычно делаем один раз - заполняем и больше не трогаем
3 ASimonova
 
24.10.16
14:00
(1) то есть просто сортирую по НомерСтроки, который есть в любой ТЧ и вставляю нужные мне колонки и все, верно? все равно как-то непрозрачно получается. вдруг у нас случайно лишние строки появятся в запросе, а контроля нет.
(2) не поняла, что значит делаем один раз?
4 Мойдодыр
 
24.10.16
14:08
Выбираешь запросом номера строк и обрабатываешь
5 Мойдодыр
 
24.10.16
14:11

Дерево  = мРезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
Колво   = Дерево.Строки.Количество();
Счетчик = 0;
Для каждого Строка1 Из Дерево.Строки Цикл
    
    Счетчик = Счетчик + 1;
    ОбработкаПрерыванияПользователя();
    Состояние(Строка(Счетчик) + " из " + Строка(Колво) + " " + Строка(Строка1.Ссылка));
    
    ДокументОбъект = Строка1.Ссылка.ПолучитьОбъект();
    
    Для каждого Строка2 Из Строка1.Строки Цикл
        
        СтрокаТЧ = ДокументОбъект.Товары[Строка2.НомерСтроки - 1];
        
        
    КонецЦикла;    
    
    ДокументОбъект.ОбменДанными.Загрузка = Истина;
    ДокументОбъект.Записать();
    
    Если ДокументОбъект.Проведен Тогда
    
        ДокументОбъект.ОбменДанными.Загрузка = Ложь;
        ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

    КонецЕсли;
    
КонецЦикла;
6 Жан Пердежон
 
24.10.16
14:12
(3) пиши запрос так, чтобы он не выдавал лишние строки;
7 ptiz
 
24.10.16
14:14
(3) Зачем сортировать? Добавляй в запрос и нужные поля, и номер строки документа. При обходе результата запроса пихай всё в нужную строку обратно по номеру.
8 Жан Пердежон
 
24.10.16
14:33
(7) сортировать есть смысл, если обрабатывается таблица на форме, не привязанная к ТЧ, или чтобы использовать ЗагрузитьКолонку();
9 ASimonova
 
24.10.16
14:39
(5) (7) ну и получится та же обработка ТЧ построчно, которая ну никак, я в (0) писала. это очень долго. засовывание ВСЕХ данных в запрос и загрузка Объект.Товары.Загрузить() проходит на порядки быстрее.
10 ASimonova
 
24.10.16
14:39
(6) ну если лучше нет варианта, то ок, спасибо
11 Жан Пердежон
 
24.10.16
14:49
(10) делюсь запросом, лишних строк не будет 100%:

ВЫБРАТЬ Максимум(Поле1), Максимум(Поле2),...
ИЗ втПочтиГотово
СГРУППИРОВАТЬ ПО НомерСтроки
УПОРЯДОЧИТЬ ПО НомерСтроки
12 ptiz
 
24.10.16
15:49
(9) Секунда на 10000 строк - это долго?
13 Dotoshin
 
24.10.16
16:24
(0) А можно пример обработки ТЧ, которую вы делаете через запрос?
14 ASimonova
 
24.10.16
22:48
(11) это понятно, но тогда лишние строки могут пропасть и не дать о себе знать... ну в общем я поняла, что надо просто дополнительно прописывать контроль
(12) честно, не замеряла, по ощущениям
(13)  ну например Для Каждого СтрокаТовары Цикл СтрокаТовары.Номенклатура = Справочники.Номенклатура.НайтиПоКоду(СтрокаТовары.НоменклатураКодСтрока); КонецЦикла. Ну это так, что первое в голову пришло
15 Йохохо
 
24.10.16
22:59
(14) то о чем и писали, ВТ (номерстроки, НоменклатураКодСтрока) одно соединение и потом по индексу строки