Имя: Пароль:
1C
1C 7.7
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, спасибо! Сегодня я уже никакой. Завтра посмотрю твой код с включенными мозгами. Еще раз спасибо!