|
v7: Как перенумеровать строки в табличной части документа | ☑ | ||
---|---|---|---|---|
0
Lsr
01.04.12
✎
21:29
|
Есть бухгалтер, которому не нравятся мои копируемые из месяца в месяц акты выполненных работ. Просит хотя бы изменить порядок следования пунктов. Мне показалось это легко.
Итак, 1)Отключаю в документе автоматическую нумерацию строк 2) Заполняю список значений, из которого будут выбираться случайным образом номера строк СписокЗнач=СоздатьОбъект("СписокЗначений"); Для ф=1 по 99 Цикл СписокЗнач.ДобавитьЗначение(ф); КонецЦикла; 2) При копировании устанавливаю флаг нового документа Процедура ВводНового(Копирование, ОбъектКопирования) Новый = 1; КонецПроцедуры 3)Использую квазислучайную функцию, которая выдает двузначное число Функция random(Длина=2) СлучайноеЧисло=((_getPerformanceCounter()*1103515245+12345)%2147483648)/2147483648; фф=Цел(СлучайноеЧисло*Лев("100000000000000000000",Длина+1)); Сообщить("88_фф="+фф); ф=СписокЗнач.ПолучитьЗначение(фф,); СписокЗнач.УстановитьЗначение(фф,0,,); Если ф=0 Тогда//это число уже использовалось random(); КонецЕсли; Сообщить("94_ф="+ф); Возврат ф; КонецФункции //random 4) Процедура ПриОткрытии() …. Если Новый = 1 Тогда //создан копированием документа Сообщить("160_КоличествоСтрок()="+КоличествоСтрок()); ВыбратьСтроки(); Пока получитьстроку()=1 цикл Сообщить("Строка="+НомерСтроки); СортироватьСтроки(-НомерСтроки);//думал поможет НомерСтроки=random(); КонецЦикла; КонецЕсли; КонецПроцедуры В результате Процедура ПриОткрытии() видит 9 строк в табличной части, но номер меняется только у первой строки. Как видно ниже 1-й на 76-й 160_КоличествоСтрок()=9 Строка=1 88_фф=76 94_ф=76 Вопрос: Как перенумеровать строки в табличной части документа? Спасибо. |
|||
1
НикДляЗапросов
01.04.12
✎
21:58
|
Жесть жестяная
|
|||
2
BlackSeaCat
01.04.12
✎
21:59
|
"Баловство это, барин. Жениться бы вам надо!"
P.S. Выгрузить в ТЗ, добавить колонку, заполнить ее номерами строк, отсортировать, удалить колонку, загрузить. |
|||
3
НикДляЗапросов
01.04.12
✎
22:01
|
Запрос.Текст =
"ВЫБРАТЬ | РеализацияТоваровУслугТовары.Номенклатура КАК Товар, | ВЫРАЗИТЬ(РеализацияТоваровУслугТовары.Номенклатура.НаименованиеПолное КАК СТРОКА(1000)) КАК ТоварНаименование, | РеализацияТоваровУслугТовары.СтранаПроисхождения КАК СтранаПроисхождения, | РеализацияТоваровУслугТовары.СтранаПроисхождения.НаименованиеПолное КАК ПредставлениеСтраны, | РеализацияТоваровУслугТовары.Номенклатура.БазоваяЕдиницаИзмерения.Представление КАК ЕдиницаИзмерения, | РеализацияТоваровУслугТовары.НомерГТД КАК НомерГТД, | РеализацияТоваровУслугТовары.НомерГТД.Представление КАК ПредставлениеГТД, | РеализацияТоваровУслугТовары.Количество КАК Количество, | РеализацияТоваровУслугТовары.Цена КАК Цена, | РеализацияТоваровУслугТовары.СтавкаНДС КАК СтавкаНДС, | РеализацияТоваровУслугТовары.СуммаНДС КАК СуммаНДС, | РеализацияТоваровУслугТовары.Сумма КАК Сумма, | РеализацияТоваровУслугТовары.НомерСтроки КАК НомерСтроки, | 1 КАК ID |ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары |ГДЕ | РеализацияТоваровУслугТовары.Ссылка = &ДокументОснование |"; |
|||
4
НикДляЗапросов
01.04.12
✎
22:01
|
Если Не (ТипЗнч(ТекущееОснование) = Тип("ДокументСсылка.РеализацияОтгруженныхТоваров") Или
ТекущееОснование.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.ОтгрузкаБезПереходаПраваСобственности) Тогда Запрос.Текст = Запрос.Текст + "ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | РеализацияТоваровУслугУслуги.Номенклатура, | ВЫРАЗИТЬ(РеализацияТоваровУслугУслуги.Содержание КАК СТРОКА(1000)), | NULL, | """", | РеализацияТоваровУслугУслуги.Номенклатура.БазоваяЕдиницаИзмерения, | NULL, | """", | РеализацияТоваровУслугУслуги.Количество, | РеализацияТоваровУслугУслуги.Цена, | РеализацияТоваровУслугУслуги.СтавкаНДС, | РеализацияТоваровУслугУслуги.СуммаНДС, | РеализацияТоваровУслугУслуги.Сумма, | РеализацияТоваровУслугУслуги.НомерСтроки, | 2 |ИЗ | Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги |ГДЕ | РеализацияТоваровУслугУслуги.Ссылка = &ДокументОснование | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | РеализацияТоваровУслугАгентскиеУслуги.Номенклатура, | ВЫРАЗИТЬ(РеализацияТоваровУслугАгентскиеУслуги.Содержание КАК СТРОКА(1000)), | NULL, | """", | РеализацияТоваровУслугАгентскиеУслуги.Номенклатура.БазоваяЕдиницаИзмерения, | NULL, | """", | РеализацияТоваровУслугАгентскиеУслуги.Количество, | РеализацияТоваровУслугАгентскиеУслуги.Цена, | РеализацияТоваровУслугАгентскиеУслуги.СтавкаНДС, | РеализацияТоваровУслугАгентскиеУслуги.СуммаНДС, | РеализацияТоваровУслугАгентскиеУслуги.Сумма, | РеализацияТоваровУслугАгентскиеУслуги.НомерСтроки, | 3 |ИЗ | Документ.РеализацияТоваровУслуг.АгентскиеУслуги КАК РеализацияТоваровУслугАгентскиеУслуги |ГДЕ | РеализацияТоваровУслугАгентскиеУслуги.Ссылка = &ДокументОснование | |УПОРЯДОЧИТЬ ПО | ID, | НомерСтроки"; |
|||
5
НикДляЗапросов
01.04.12
✎
22:01
|
Но тебе блин надо только последня строчка )))
|
|||
6
Guk
01.04.12
✎
22:02
|
тут ветка растаманов?...
|
|||
7
НикДляЗапросов
01.04.12
✎
22:03
|
(6) Тсс
|
|||
8
Lsr
01.04.12
✎
22:07
|
(2) BlackSeaCat, P.S. Выгрузить в ТЗ, добавить колонку, заполнить ее номерами строк, отсортировать, удалить колонку, загрузить.
Это я и сам знаю. Интересует почему не производится перенумерация, хоть я все делаю правильно. |
|||
9
НикДляЗапросов
01.04.12
✎
22:11
|
Использую квазислучайную функцию, которая выдает двузначное число - вот после этих слов меня сташнило
|
|||
10
НикДляЗапросов
01.04.12
✎
22:12
|
я такой ересь лет до 20ти страдал, потом жизнь все на места раставила
|
|||
11
viktor_vv
01.04.12
✎
23:15
|
Если это не первоапрельская шутка, то ты просто присваивая новый номер строки выборку сбиваешь, и цикл прерывается. Так что делай через ТЗ.
|
|||
12
viktor_vv
01.04.12
✎
23:18
|
Но очень смахивает на развод :).
|
|||
13
andrewks
01.04.12
✎
23:26
|
(12) да сегодня добрая половина веток смахивает на развод. самое страшное то, что некоторые из них - НЕ развод... О_о
|
|||
14
Lsr
01.04.12
✎
23:33
|
какой развод?!!! Написал через ТЗ. Не работает. Когда ремирую
строки с "НомерСтроки" в ТЗ идет перенумерация, но в документ заливается по порядку(1,2,3...) Если разремировать, то ситуация как с таблицей - перенумерует только одну строку. ТЗ=СоздатьОбъект("ТаблицаЗначений"); Если Новый = 1 Тогда //создан копированием документа Сообщить("160_КоличествоСтрок()="+КоличествоСтрок()); ВыгрузитьТабличнуюЧасть(ТЗ,); ТЗ.ВставитьКолонку("НомерСтр",,,2,,,,,); //ТЗ.ВставитьКолонку("НомерСтроки",,,2,,,,,); ТЗ.ВыбратьСтроки(); Пока ТЗ.получитьстроку()=1 цикл ТЗ.НомерСтр=random(); //ТЗ.НомерСтроки=ТЗ.НомерСтр; КонецЦикла; ТЗ.Сортировать("НомерСтр",); ТЗ.УдалитьКолонку("НомерСтр"); ЗагрузитьТабличнуюЧасть(ТЗ); КонецЕсли; Для данного кода сообщения выглядят так: 160_КоличествоСтрок()=9 94_ф=82 94_ф=85 94_ф=88 94_ф=91 94_ф=94 94_ф=96 94_ф=99 94_ф=2 94_ф=56 |
|||
15
viktor_vv
01.04.12
✎
23:41
|
Зачетно, то есть колонку удаляешь, в которой новый номер :).
Ты попробуй сначала в СписокЗначений загнать номераСтрок до перенумерации. Потом что-то типа. Для i = 1 по лспСписокНомеров.РазмерСписка() Цикл лчСтарыйНомерСтроки = лспСписокНомеров.ПолучитьЗначение(i) ; ПолучитьСтрокуПоНомеру(лчСтарыйНомерСтроки) ; НомерСтроки = лчНовыйНомерСтроки ; КонецЦикла ; Только с одинаковым номером не даст две строки. Как-то так. |
|||
16
viktor_vv
01.04.12
✎
23:42
|
(13) Ага. Иногда долго думаешь развод или не развод :).
|
|||
17
viktor_vv
01.04.12
✎
23:43
|
(15)+ Это без ТЗ.
|
|||
18
Lsr
02.04.12
✎
00:05
|
Спасибо всем кто откликнулся. Обходить проблемы я и сам умею. Надоело мне разбираться и вставил я модуль перенумерации в процедуру печати. Проблема "обманута". Только удовлетворения никакого.
ТЗ=СоздатьОбъект("ТаблицаЗначений"); ВыгрузитьТабличнуюЧасть(ТЗ,); ТЗ.ВставитьКолонку("НомерСтр",,,2,,,,,); ТЗ.ВыбратьСтроки(); Пока ТЗ.получитьстроку()=1 цикл ТЗ.НомерСтр=random(); КонецЦикла; ТЗ.Сортировать("НомерСтр",); Ном=0; ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Ном=Ном+1; Таб.ВывестиСекцию("Строка"); КонецЦикла; Таб.ВывестиСекцию("Подвал"); |
|||
19
НикДляЗапросов
02.04.12
✎
00:09
|
Опять рандом, пенсионеры...
|
|||
20
Lsr
02.04.12
✎
09:40
|
up
|
|||
21
viktor_vv
02.04.12
✎
09:41
|
(20) Ты (15) пробовал ? Специально проверил, все работает.
|
|||
22
Lsr
02.04.12
✎
09:47
|
(21)Не пробовал. Спасибо. Попробую.
|
|||
23
Lsr
02.04.12
✎
16:19
|
(21)попробовал. Этот код в принципе не рабочий так как не полный. Как это ты "Специально проверил, все работает"? Напиши тот, на котором проверял.
|
|||
24
BlackSeaCat
02.04.12
✎
16:27
|
Автор, сколько готов заплатить за свою хотелку?
|
|||
25
Lsr
02.04.12
✎
16:48
|
(24)Нисколько. Я свою проблему "решил" еще вчера. И выложил рабочий код.
|
|||
26
viktor_vv
02.04.12
✎
16:54
|
(23) Ну неужели так трудно написать код заполнения списка значений.
Я вообще-то в код оформил, тот кусок который являлся принципиальным. Процедура ПриОткрытии() лспСписокНомеров = СоздатьОбъект("СписокЗначений") ; ВыбратьСтроки(); Пока ПолучитьСтроку() = 1 Цикл лспСписокНомеров.ДобавитьЗначение(НомерСтроки); КонецЦикла ; Для i = 1 по лспСписокНомеров.РазмерСписка() Цикл лчСтарыйНомерСтроки = лспСписокНомеров.ПолучитьЗначение(i) ; ПолучитьСтрокуПоНомеру(лчСтарыйНомерСтроки) ; НомерСтроки = лчСтарыйНомерСтроки + 1000 ; // лчНовыйНомерСтроки ; Здесь можешь вставить свою random() // только в нее надо еще вставить исключение на выдачу номеров из списка сатрых. КонецЦикла ; КонецПроцедуры |
|||
27
viktor_vv
02.04.12
✎
17:05
|
А чтоб ты не убил еще пару дней на высшую математику, и учитывая твои же ограничения на количество строк, можешь так сделать.
Процедура ПриОткрытии() Если КоличествоСтрок() >= 5000 Тогда Сообщить("В документе больше 5000 строк. Перенумерация не выполнена"); Иначе лспСписокНомеров = СоздатьОбъект("СписокЗначений") ; лспСписокНомеровПромежуточных = СоздатьОбъект("СписокЗначений") ; ВыбратьСтроки(); Пока ПолучитьСтроку() = 1 Цикл лспСписокНомеров.ДобавитьЗначение(НомерСтроки); КонецЦикла ; Для i = 1 по лспСписокНомеров.РазмерСписка() Цикл лчСтарыйНомерСтроки = лспСписокНомеров.ПолучитьЗначение(i) ; ПолучитьСтрокуПоНомеру(лчСтарыйНомерСтроки) ; НомерСтроки = лчСтарыйНомерСтроки + 5000 ; // лспСписокНомеровПромежуточных.ДобавитьЗначение(НомерСтроки); КонецЦикла ; Для i = 1 по лспСписокНомеровПромежуточных.РазмерСписка() Цикл лчСтарыйНомерСтроки = лспСписокНомеровПромежуточных.ПолучитьЗначение(i) ; ПолучитьСтрокуПоНомеру(лчСтарыйНомерСтроки) ; НомерСтроки = Random() ; // КонецЦикла ; КонецЕсли ; КонецПроцедуры |
|||
28
viktor_vv
02.04.12
✎
17:18
|
Только вот отсортирровать по номеру строки не получится. Так что можешь с чистой совестью использовать вариант с сортировкой при печати.
|
|||
29
viktor_vv
02.04.12
✎
18:11
|
(28)+ Не сбрехал. В (27) рабочий код, и строки автоматом отсортируются по номеру строки, и номер строки останется.
|
|||
30
viktor_vv
02.04.12
✎
19:37
|
И в (14) ты неправильные выводы сделал. Порядок строк в документе после загрузки из отсортированной ТЗ соотвествует порядку строк в ТЗ. Просто нумерация заново начинается.
Это потому, что в колонке ТЗ с идентификатором "НомерСтрокиДокумента" (которая неявно добавляется при ВыгрузитьТабличнуюЧасть()) значения плучились неупорядоченные от меньшего к большему. Через ТЗ это надо так делать. ТЗ=СоздатьОбъект("ТаблицаЗначений"); ВыгрузитьТабличнуюЧасть(ТЗ,); ТЗ.ВыбратьСтроки(); Пока ТЗ.получитьстроку()=1 цикл ТЗ.НомерСтрокиДокумента=random(); КонецЦикла; ТЗ.Сортировать("+ НомерСтрокиДокумента",); ЗагрузитьТабличнуюЧасть(ТЗ) ; И все будет работать. Извини, не проверял, но .опой чувствую, что работать будет. |
|||
31
Lsr
02.04.12
✎
22:32
|
viktor_vv, спасибо! Сегодня я уже никакой. Завтра посмотрю твой код с включенными мозгами. Еще раз спасибо!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |