Имя: Пароль:
1C
 
Лучший вариант на удаление строк из ТЗ
Ø
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) Дело не только в этом - остальных жутко резали, и пропихивали своих, как и получилось с "союзом" по программированию.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.