![]() |
![]() |
![]() |
|
Лучший вариант на удаление строк из ТЗ Ø |
☑ | ||
---|---|---|---|---|
0
Vacony
17.11.04
✎
17:20
|
Это был вопрос :)
пока вариантов не много. 1 - делать обход исходной и копировать строки в другую таблицу 2 - обход исходной, копирование в другую номера строк что надо удалить, сортировка второй таблицы по убыванию, поиск строки в исходной и удаление 3 - обход исходной, исходная.УдалитьСТроку();Исходная.ВыбратьСтроки(); После окончания обхода проверить на условие 1 строку. 4 - Обход исходной, удаление строки. Если текущая строка >1 , тогда текущая строка=тек.строка - 1. После обхода проверить 1 строку на условие. еще варианты ? |
|||
1
Альфред Эрикс
17.11.04
✎
17:22
|
0. В клубе проффесионалов в свое времы был целый конкурс на эту темы и решения там же валяются. Там же и ищи.
|
|||
2
Vera new
17.11.04
✎
17:22
|
а тз.очистить() не пробовали? :)
|
|||
3
IAm
17.11.04
✎
17:23
|
||||
4
MetaEditor
17.11.04
✎
17:26
|
вот тебе ещё вариантов...
http://www.sinor.ru/~my1c/knowhow/delstrtz.html<br>зы, второй раз за сегодня копирую... ещё ленивее.... |
|||
5
Мелена
17.11.04
✎
17:27
|
НомСтроки = 1;
Пока НомСтроки <= Таб.КоличествоСтрок() Цикл Таб.ПолучитьСтрокуПоНомеру(НомСтроки); Если ....... Тогда Таб.УдалитьСтроку(); Продолжить; КонецЕсли; НомСтроки = НомСтроки + 1; КонецЦикла; |
|||
6
NS
17.11.04
✎
17:28
|
||||
7
NS
17.11.04
✎
17:31
|
(5) Вы точно уверены, что это лучший вариант???
а не так? ТЗ.НоваяКолонка("_Уд"); КолСтр=0; ТЗ.ВыбратьСтроки(); Пока ТЗ.Получитьстроку()=1 Цикл Если УсловиеВыполняется(ТЗ.К)=1 Тогда ТЗ._Уд=1; колстр=колстр+1; КонецЕсли; КонецЦикла; ТЗ.Сортировать("-_Уд"); ТЗ.УдалитьКолонку("_Уд"); ТЗ.Выгрузить(ТЗ_СЛУЖ,1,1); ТЗ_СЛУЖ.КоличествоСтрок(колстр); ТЗ_СЛУЖ.Заполнить(ТЗ); ТЗ=ТЗ_Служ; |
|||
8
Громов
17.11.04
✎
17:32
|
Функция гФильтр(М,Колонка,Значение,ФлагУдаления=0) Экспорт
Перем Граница; Ф=СоздатьОбъект("ТаблицаЗначений"); Ф.Загрузить(М); //пометка Ф.НоваяКолонка("СлужебнаяКолонка","Число",1); Для i=1 По Ф.КоличествоСтрок() Цикл Если Ф.ПолучитьЗначение(i,Колонка)=Значение Тогда Ф.УстановитьЗначение(i,"СлужебнаяКолонка",1); КонецЕсли; КонецЦикла; //сортировка Ф.Сортировать("СлужебнаяКолонка"); Ф.НайтиЗначение(1,Граница,"СлужебнаяКолонка"); Ф.УдалитьКолонку("СлужебнаяКолонка"); //фильтр Если ФлагУдаления=0 Тогда Если Граница=0 Тогда Ф.УдалитьСтроки(); Иначе Ф.Выгрузить(Ф,Граница); КонецЕсли; Иначе Если Граница=1 Тогда Ф.УдалитьСтроки(); ИначеЕсли Граница>1 Тогда Ф.Выгрузить(Ф,1,Граница-1); КонецЕсли; КонецЕсли; // Возврат(Ф); КонецФункции |
|||
9
NS
17.11.04
✎
17:36
|
(8) ---
(7) Быстрее ;-) Можно еще сверить колСтр с нулем и количеством строк... Но это уже не принципиально. |
|||
10
Мелена
17.11.04
✎
17:36
|
(7) Ну , не хуже. Работает за один проход цикла и без всяких дополнительных таблиц и переписываний туда и обратно.
|
|||
11
Vacony
17.11.04
✎
17:37
|
1 - адрес ? :)
2 - не всех строк. а только нужных, по условию |
|||
12
NS
17.11.04
✎
17:46
|
(10) Уважаемая Мелена, пройдитесь по ссылке в (6)
(5) Работает не хуже, но на ТЗ в 1000000 строк - всего в 1000 раз медленней, но это несущественно... за сутки с небольшим отфильтрует. |
|||
13
Vacony
17.11.04
✎
17:46
|
7-9 - не пойму а где строки то удаляются ? Мы получим в итоге ТЗ где будут строки которые надо удалить, кажется...
|
|||
14
alt
17.11.04
✎
17:52
|
13: кажется!
|
|||
15
Vacony
17.11.04
✎
18:03
|
7 - сортировать надо по +, а выгребать по КоличествоСтрок()-колстр+1
|
|||
16
NS
17.11.04
✎
20:27
|
(15) Поучи еще меня.
|
|||
17
maxdale
17.11.04
✎
21:11
|
(16) а почему (5) медленее(7)? Основное же время будет уходить на (Если Условие=1 Тогда), а оно и там и там есть. На ТЗ.УдалитьСтроку()?
|
|||
18
NS
17.11.04
✎
21:25
|
Потому, что скорость работы метода удалитьстроку() пропорционально количеству строк в ТЗ.
То есть Для удаления одной строки из ТЗ с тысячью строк требуется времени в 1000 раз меньше, чем на удаление строки из ТЗ с 1000000 строк. То есть сложность всего алгоритма с фильтрацией - методом удалитьстроку - Эн квадрат (удалитьстроку()), а через сортировать - эн логарифмов Эн (сортировать()) соответственно на миллионе строк - к=(С1*(1000000*1000000))/(С2*(1000000*40))=50000 * С1/С2. |
|||
19
maxdale
17.11.04
✎
21:33
|
(С1*(1000000*1000000))/(С2*(1000000*40))=25000*С1/С2 это раз.
нихфига не понял - два. просни про алгоритм это три... (чей-то засиделся я на работе :) |
|||
20
maxdale
17.11.04
✎
21:37
|
откуда взялась цыфирь 1000?
что такое 40? (имхо что-то связано с логарифмом, но не помню даже как он пишется) С1, С2 - тоже совершенно не понятно... т.е. УдалитьСтроку() работает перебором в лоб, без индексов? |
|||
21
Guk
17.11.04
✎
21:39
|
Если кому надо найти NS'а, а не получается, необходимо завести ветку на любом известном форуме по 1С, о несовершенстве существующих методов удаления строк из ТЗ ;)...
|
|||
22
NS
17.11.04
✎
21:39
|
О(функцию "О" большое) в институте проходили?
О(F(x))=G(x) такая, что Lim(F(x)/G(x))=Const (при х стремящемся к бесконечности) Сложность(О) "нормальных" сортировок всегда была Эн логарифмов Эн (x*log(x)) сложность удаления одной строки - равна х. Сложность удаления х строк (Для примера) равна (х)+(х-1)+....(2)+(1) = х*(х+1)/2; |
|||
23
maxdale
17.11.04
✎
22:41
|
действительно, (7) ГОРАЗДО быстрее даже при удалении 10000 строк из 100000 :)
|
|||
24
Пудель
18.11.04
✎
00:42
|
NS, а откуда ты узнал зависимость скорости работы УдалитьСтроку от количества строк, экспериментально?
|
|||
25
Eugene G
18.11.04
✎
05:32
|
(24) Существует структур данных и сложности алгоритма. Они общеизвестны, особенно олимпийцам, в числе которых NS.
|
|||
26
Eugene G
18.11.04
✎
05:46
|
(+25) пропущено слово "понятие" :))
|
|||
27
Vacony
18.11.04
✎
10:37
|
а вы уверены что то самый быстрый алгоритм ? .. что-то задели мое самолюбие :)
в том примере - что тестит, кажется нет варианта когда всего 1 условие в общем наборе. Т.е. я хочу сказать, что по сумме баллов по всем алгоритмам это не самый быстрый вариант. К тому же хаточенный под конкретную ситуацию (когда знаешь что строк не больше 100 к примеру) - алгоритм один, а вот при работе с 1 млн. или млрд. строк ( ПРИМЕР в студию, где такое надо ?!) - совсем иной. |
|||
28
Eugene G
18.11.04
✎
10:57
|
(27) у меня в таблице ra1130 (партии товаров) 302 000 строк.
|
|||
29
koord
18.11.04
✎
10:59
|
(21) А ещё он быстро программирует в 8. Не шутка.
|
|||
30
NS
18.11.04
✎
11:03
|
(29) Угу, напомни еще про периодику, которую ты в 7.7 плодил.
А для нормальной работы, в 7.7 - как раз приходилось делать аналог регистра сведений. |
|||
31
NS
18.11.04
✎
11:06
|
(27) Это самый быстрый алгоритм.
Удаление строки на миллиарде - читай ветку. Баллы - для тех, кто не понимает длинный код - баллы считаются через длину кода. Чтоб не было заточено под конкретный вариант - тот же алгоритм, что и в тесте - только резанный (7) Этот вариант - то же самое, что и вариант TDV (по длине), но более быстрый, ввиду того, что Заполнить() работает в два раза быстрее, чем Выгрузить() |
|||
32
koord
18.11.04
✎
11:07
|
Я с большим уважением отношусь к людям, которые достигают отличных результатов за короткий срок. Ничего более.
|
|||
33
Vacony
18.11.04
✎
11:21
|
мое ИМХО, что в 7.7 можно все что угодно, и 8ка ничем не лучше в пределах разумного (имею в виду интерфейс и удобство кода). Т.е. на любом языке где есть =, если и цикл и структура можно решить почти любую задачу
|
|||
34
NS
18.11.04
✎
11:24
|
(33) Да, только
1) Другая скорость работы решения. 2) Другая скорость разработки. Одно только наличие многомерных массивов (с переменным размером!)- очень облегчает жизнь. |
|||
35
Eugene G
18.11.04
✎
11:25
|
(33) Мальчик, открою тебе маленькую тайну: ты заблуждаешься :))
|
|||
36
Vacony
18.11.04
✎
11:53
|
34 - ну все упирается в так сказать "не весомые" вещи в программном плане - скорость работы и разработки. Интеллектуал решения от этого не зависит.
35 - это голословно, - приведи пример ... |
|||
37
Сияющий асинхраль
18.11.04
✎
12:52
|
А если строки из (7)
. ТЗ.Выгрузить(ТЗ_СЛУЖ,1,1); ТЗ_СЛУЖ.КоличествоСтрок(колстр); ТЗ_СЛУЖ.Заполнить(ТЗ); ТЗ=ТЗ_Служ; . заменить одной строкой ТЗ.КоличествоСтрок(колстр); . То должно работать еще быстрее НовоеКолвоСтр = ТЗ.КоличествоСтрок() |
|||
38
NS
18.11.04
✎
13:21
|
(37) А если учесть, что во всех релизах 1С ТЗ.КоличествоСтрок() на уменьшение работает неправильно, то лучше так не делать.
|
|||
39
Сияющий асинхраль
18.11.04
✎
13:32
|
(38) Понял. Без вопросов.
|
|||
40
cathode
18.11.04
✎
13:38
|
(38) А можно поподробнее о неправильности работы КоличествоСтрок() в ТЗ? Что конкретно проиходит?
|
|||
41
op
18.11.04
✎
13:55
|
(37) да чего-то и не быстрее :(
|
|||
42
Eugene G
18.11.04
✎
14:04
|
(38) Да, NS расскажи про кол-во строк, потому что я его использовал в нескольких методах своего класса (наследника от Таблицы Значений).
|
|||
43
который не честный
18.11.04
✎
14:09
|
18 - получается, что при удалении строки происходит физичиский сдвиг в памяти всех последующих строк?
|
|||
44
Сияющий асинхраль
18.11.04
✎
15:10
|
(41) Сколько я представляю разницу в скорости реально заметить едва ли удасться. Просто так было бы красивей. Но, по-видимому, не судьба. А что некорректно работает во встроенном количествострок() и правда было бы интересно узнать (потому что иногда использую).
|
|||
45
VictorB
18.11.04
✎
15:57
|
//Тогда уж можно и так
// Колонки ТЗ "Код", "Имя", "Сумма" ТЗ.НоваяКолонка("флУд","Число",1); колСтр=0; ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Если НужноУдалять(СокрЛП(ТЗ.Код))=1 Тогда ТЗ.флУд=1; колСтр=колСтр+1; КонецЕсли; КонецЦикла; ТЗ.Сортировать("-флУд"); // ,Код ТЗДоп=СоздатьОбъект("ТаблицаЗначений"); ТЗ.Выгрузить(ТЗДоп,колСтр+1,,"Код,Имя,Сумма,флУд"); // В ТЗДоп - только нужные, но если сильно хочется можно ТЗ.Загрузить(ТЗДоп); |
|||
46
NS
18.11.04
✎
22:46
|
(42)
ТЗ=создатьобъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("а","Число",10,2); ТЗ.Новаястрока(); ТЗ.а=5; ТЗ.НоваяСтрока(); тз.а=10; ТЗ.Новаястрока(); ТЗ.а=1; ТЗ.НоваяСтрока(); тз.а=11; // в принципе неважно, как заполнять, лишь бы заполнить. ТЗ.Сортировать("а"); ТЗ.ВыбратьСтроку(); Тз.КоличествоСтрок(3); ТЗ.ВыбратьСтроку(); |
|||
47
NS
18.11.04
✎
23:02
|
почему-то (46) отрабатывает правильно, что весьма странно...
на вот так, например, выдает полный бред: Процедура Сформировать() ТЗ=создатьобъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("а","Число",10,2); Для а=1 по 20 цикл ТЗ.Новаястрока(); ТЗ.а=(а%2)*100+а; Конеццикла; // в принципе неважно, как заполнять, лишь бы заполнить. ТЗ.Сортировать("а"); ТЗ.ВыбратьСтроку(); Тз.КоличествоСтрок(10); ТЗ.ВыбратьСтроку(); КонецПроцедуры |
|||
48
GrayT
18.11.04
✎
23:08
|
(47)Рупор как то раз показывал глюк с ТЗ (видимо давно известный). Я зарекся сортировать и удалять строки (изменять количество) в ТЗ одновременно
|
|||
49
NS
18.11.04
✎
23:31
|
(48) Глючит только один метод (количествострок()), и только в том случае, если им именно уменьшается (не увеличивается!!!) количество строк.
|
|||
50
Пудель
19.11.04
✎
00:33
|
(25) Таблица значений - чисто 1с-ский объект, удаление строки может работать по-разному.
NS, сам-то ты не ответишь? |
|||
51
VZ
19.11.04
✎
02:33
|
А еще ТЗ по-разному ведет себя как отдельный объект, и как положенный на форму. В частности, с методами ВыбратьСтроки() и ПолучитьСтроку()...
|
|||
52
Гурон
19.11.04
✎
05:10
|
Процедура глФильтроватьТаблицу(Табл,Реж="сортировать",Рек,ЗначРек) Экспорт
///если реж="удалить" тогда удаляет из таблицы все строки с указанным значением ///реквизита, ///если реж="отобрать" тогда возвращает только те строки, в которых есть указанное значение реквизита Табл.НоваяКолонка("__Фл","Число",1); Табл.ВыбратьСТроки(); Если (Реж="удалить") Тогда Состояние("Обработка-фильтрация таблицы: удаление строк..."); ИначеЕсли (Реж="отобрать") Тогда Состояние("Обработка-фильтрация таблицы: отбор строк..."); КонецЕсли; //[Реж="сортировать"] Выс=Табл.КоличествоСтрок(); Сч=1; //цикл Табл.ПолучитьСтроку()=1 Пока (Табл.ПолучитьСтроку()=1) Цикл Зн=Табл.ПолучитьЗначение(Сч,Рек); //условие Реж="удалить" Если (Реж="удалить") Тогда //условие Табл.ПолучитьЗначение(Сч,Рек)=ЗначРек Если (Табл.ПолучитьЗначение(Сч,Рек)=ЗначРек) Тогда Табл.__Фл=1; Иначе Табл.__Фл=0; КонецЕсли; //Табл.ПолучитьЗначение(Сч,Рек)=ЗначРек ИначеЕсли (Реж="отобрать") Тогда //условие Табл.ПолучитьЗначение(Сч,Рек)=ЗначРек Если (Табл.ПолучитьЗначение(Сч,Рек)=ЗначРек) Тогда Табл.__Фл=0; Иначе Табл.__Фл=1; КонецЕсли; //Табл.ПолучитьЗначение(Сч,Рек)=ЗначРек КонецЕсли; //Реж="удалить" Сч=Сч+1; КонецЦикла; //условие=Табл.ПолучитьСтроку()=1 Табл.Сортировать("__Фл+"); Сч=Выс; Пока (Сч>0) Цикл Табл.ПолучитьСТрокуПоНомеру(Сч); Если (Табл.__Фл=1) Тогда Табл.УдалитьСтроку(); Иначе КонецЕсли; //Табл._____Фл=1 Сч=Сч-1; КонецЦикла; //условие=Сч>0 Табл.УдалитьКОлонку("__Фл"); КонецПроцедуры //ФильтроватьТаблицу |
|||
53
NS
19.11.04
✎
09:36
|
(50) Не понял вопроса.
|
|||
54
Сияющий асинхраль
19.11.04
✎
10:33
|
Прикольно, а вот это работает правильно
. Процедура Сформировать() ТЗ=создатьобъект("ТаблицаЗначений"); ТЗ1=создатьобъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("а","Число",10,2); ТЗ.Выгрузить(ТЗ1,,,"а"); Для а=1 по 20 цикл ТЗ.Новаястрока(); ТЗ.а=(а%2)*100+а; Конеццикла; // в принципе неважно, как заполнять, лишь бы заполнить. ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Сообщить("0----- " + ТЗ.а); КонецЦикла; ТЗ.Сортировать("а"); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Сообщить("1----- " + ТЗ.а); КонецЦикла; ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл ТЗ1.НоваяСтрока(); ТЗ1.а = ТЗ.а; КонецЦикла; Тз1.КоличествоСтрок(10); ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку() = 1 Цикл Сообщить("2----- " + ТЗ1.а); КонецЦикла; КонецПроцедуры . Похоже на то, что глючит не КоличествоСтрок(), а совместное использование его с сортировкой. |
|||
55
NS
19.11.04
✎
10:38
|
(54) Можно еще проверить с методами свернуть(), удалитьстроку(),СдвинутьСтроку(), номерстроки=...
Но что это за метод, который нельзя использовать совместно с Сортировать()? Обычно количествострок() на уменьшение после него и используется... |
|||
56
Сияющий асинхраль
19.11.04
✎
10:45
|
Согласен. Печально... :-)
|
|||
57
mclarry
19.11.04
✎
11:49
|
Самый быстрый способ удаления из всех, что я видел: выгрузка ТЗ в SQL, Select, Возврат в ТЗ. Если речь идет о десятках-сотнях тысяч записей. Не универсально, но иногда здорово экономит время.
|
|||
58
NS
19.11.04
✎
12:35
|
(57) Ну-ну...
И быстро у тебя по-сети выгрузится ТЗ на миллион строк в SQL? А обратно? |
|||
59
Данила хМастер
19.11.04
✎
12:55
|
(51) Расскажите пожалуйста, а как это "1С ведет себя по-разному, когда она визуальный объект на форме и когда она объект по СоздатьОбъект()" в методах
ВыбратьСтроки() и ПолучитьСтроку()? В чем это конкретно проявляется? |
|||
60
mclarry
19.11.04
✎
13:34
|
(58)А делается все просто (относительно):
- в SQL создаем временную таблицу #r - в цикле по ТЗ формируем строку команды для SQL: "INSERT INTO #r... INSERT INTO #r..." - выполняем команду (выполняется быстрее, чем цикл по ТЗ!) - делаем Select, но не по всем колонкам #r, а только по одной (номер истроки исходной ТЗ) - выполняется мгновенно - закачиваем результаты в ТЗ2 (тоже не много времени) - работаем с ТЗ2 (через номер строки исходной ТЗ получаем доступ к нужным полям), сортировку, если надо, делаем в SQL |
|||
61
hlud
19.11.04
✎
13:51
|
(Ns) Олимпиец? А где выступал, если не секрет :)
|
|||
62
NS
19.11.04
✎
14:04
|
(61) Чистый Чемпион Питера по программированию среди школьников 89/90-го учебного года. На сборах на союз зарубили.
Чемпионом Мира в том году стал Д.Козлов, тоже Питерский, ес-но вместе со мной был на сборах. |
|||
63
hlud
19.11.04
✎
14:17
|
Прогер. :)
Я на межнаре по математике был в 96-ом от Украины. Чего-то мне показалось что ты математик, хотя не так уж далеко мы друг от друга ушли. :) |
|||
64
NS
19.11.04
✎
14:27
|
(63) По математике - вторые (последние) туры городской постоянно, на сборы на союз так ни разу и не прошел.
Хотя шансов и не было ;-) Я учился не в физ.мат. школе, а в мат. классе при ЛГУ, когда я прошел на сборы по программированию - оказалось, что за всю историю питерских олимпиад я первый, кому это удалось по математике/физике/программированию, не из физ.мат. школ... |
|||
65
VZ
19.11.04
✎
14:31
|
(59) Наткнулся на это дело, формируя обработку чиски Журнала в ЗиКе. Потому метод заполнения ТЗ в примере ниже оттуда. Но можно заливать ТЗ и по-другому. Важа обработка ТЗ. Итак, даю Модуль:
Перем ЖН; Перем Комментарий; //Текстовый контрол на форме Перем ТекстЗапроса; //******************************************* Процедура Сформировать1() //По кнопке "Сформировать1" ДатаАктуальности = Дата(Год,1,1); //Год - числовой контрод ("Ч4") на форме // Если ошибка в запросе, то выход из процедуры Запрос = СоздатьОбъект("Запрос"); Комментарий = "Выполняется запрос за "+ЖН.ОписательПериода(ДатаАктуальности); Форма.Обновить(); Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда Возврат; КонецЕсли; ТЗ = СоздатьОбъект("ТаблицаЗначений"); Запрос.Выгрузить(ТЗ,1,0); Если ТЗ.КоличествоСтрок()=0 Тогда Возврат; КонецЕсли; ТЗ.УдалитьКолонку("Результат"); ТЗ.УдалитьКолонку("Расчет"); ТЗ.УдалитьКолонку("ДатаОкончанияВЖурнале"); ТЗ.УдалитьКолонку("ДатаНачалаВЖурнале"); ТЗ.Выгрузить(ТЗф); //ТЗф - ТаблицаЗначений на форме Форма.Обновить(); //Пробегаем по месяцам: Для мес = 1 По 12 Цикл Комм1=Формат(Дата(Год,мес,1),"Д ММММГГГГ")+":"+РазделительСтрок; ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Комментарий = Комм1+строка(ТЗ.Сотрудник); Форма.Обновить(); КонецЦикла; КонецЦикла; КонецПроцедуры Процедура Сформировать2() //По кнопке "Сформировать2" ДатаАктуальности = Дата(Год,1,1); //Год - числовой контрод ("Ч4") на форме // Если ошибка в запросе, то выход из процедуры Запрос = СоздатьОбъект("Запрос"); Комментарий = "Выполняется запрос за "+ЖН.ОписательПериода(ДатаАктуальности); Форма.Обновить(); Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда Возврат; КонецЕсли; //ТЗ = СоздатьОбъект("ТаблицаЗначений"); Запрос.Выгрузить(ТЗф,1,0); Если ТЗф.КоличествоСтрок()=0 Тогда Возврат; КонецЕсли; ТЗф.УдалитьКолонку("Результат"); ТЗф.УдалитьКолонку("Расчет"); ТЗф.УдалитьКолонку("ДатаОкончанияВЖурнале"); ТЗф.УдалитьКолонку("ДатаНачалаВЖурнале"); //ТЗ.Выгрузить(ТЗф); //ТЗф - ТаблицаЗначений на форме Форма.Обновить(); //Пробегаем по месяцам: Для мес = 1 По 12 Цикл Комм1=Формат(Дата(Год,мес,1),"Д ММММГГГГ")+":"+РазделительСтрок; ТЗф.ВыбратьСтроки(); Пока ТЗф.ПолучитьСтроку()=1 Цикл Комментарий = Комм1+строка(ТЗф.Сотрудник); Форма.Обновить(); КонецЦикла; КонецЦикла; КонецПроцедуры ЖН = СоздатьОбъект("ЖурналРасчетов.НалогиСФОТ"); ТекущийГод = ДатаГод(ЖН.КонецТекущегоПериода()); Год = ТекущийГод; //Контрол формы Комментарий = ""; //Контрол формы ТекстЗапроса = "//{{ЗАПРОС(НалогиСФОТ) |Период с ДатаАктуальности по ДатаАктуальности; |Сотрудник = ЖурналРасчетов.НалогиСФОТ.Объект; |Расчет = ЖурналРасчетов.НалогиСФОТ.ВидРасч; |Результат = ЖурналРасчетов.НалогиСФОТ.Результат; |ДатаНачалаВЖурнале = ЖурналРасчетов.НалогиСФОТ.ДатаНачала; |ДатаОкончанияВЖурнале = ЖурналРасчетов.НалогиСФОТ.ДатаОкончания; |Функция Начало = Минимум (ДатаМесяц(ДатаНачалаВЖурнале)); |Функция Окончание = Максимум(ДатаМесяц(ДатаОкончанияВЖурнале)); |Группировка Сотрудник Без Групп; |Условие(Расчет=ВидРасчета.ПФР); |Условие(Результат=0);"; |
|||
66
VZ
19.11.04
✎
14:38
|
+65 Это "обрезанный" модуль, убрано все лишнее, вот только формирование ТЗ не стал трогать. Здесь (обратите внимание) процедуры Сформировать1 и Сформировать2 аналогичны, только одна работает с ТЗ из СоздатьОбъект, а другая - с ТЗ на форме (ТЗф). Методы получения ТЗ совершенно одинаковые: из Запроса.
Получено: 1сv7s.exe, релиз 23, тип базы ДБФ, ось XPsp1, 512 Мб |
|||
67
hlud
19.11.04
✎
15:32
|
(64)да физ-матшколы у вас мощные. 239 одна чего стоит. :)
|
|||
68
NS
19.11.04
✎
15:34
|
(67) Дело не только в этом - остальных жутко резали, и пропихивали своих, как и получилось с "союзом" по программированию.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |