Имя: Пароль:
1C
1С v8
вывод номера строки табличной части, фиксация всех изменений
0 pnamik
 
27.04.15
18:30
Есть некий код в процедуре ПередЗаписью, который проверяет табличные части документа


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

1) При удалении строки выводится сообщение "изменено кол.строк"
Как сделать так, чтобы выводилось более подробная информация, например
Удалена строка №...

Варианты

НовСтр.НовоеЗначение=НомерСтроки.Накладная; или
НовСтр.НовоеЗначение=НомСтр.Накладная; не подходят по причине ошибки
Переменная не определена (НомСтр)

2) Если в документе сделать одно изменение (например менять количество в одной строке), потом без записи документа документа сделать второе изменение (например менять количество в другой строке), и записывать документ, фиксируется только одно (первое) изменение. Как устранить?

Спасибо за возможные помощь и подсказку
1 pnamik
 
27.04.15
19:45
Первую проблему удалось решить так
НовСтр.НовоеЗначение="Удалена строка №"+ТекСтрока.НомерСтроки;

Теперь при удалении самой последней строки накладной выдает ошибку


{Документ.ПриходнаяНакладная.Форма.ФормаДокумента(475)}: Индекс находится за границами массива
                Если Ссылка[ИмяТЧ][НомСтр][ИмяРек]<>ЭтотОбъект[ИмяТЧ][НомСтр][ИмяРек] Тогда

При удалении других строк нормально фиксирует
2 FIXXXL
 
27.04.15
19:47
А если порядок строк поменять? Раза три...
3 pnamik
 
27.04.15
19:51
(2) Если один раз менять, фиксирует нормально, если несколько раз, только последнюю фиксирует
4 pnamik
 
28.04.15
07:03
Вариант
НовСтр.НовоеЗначение="Удалена строка №"+ТекСтрока.НомерСтроки;

в модуле объекта не подходит.  Как получить номер строки табличной части "Накладная" документа "Приходная Накладная"?
Перепробовал всякие варианты
Накладная.ТекСтрока.НомерСтроки
НомСтр
Строка (ТекСтрока.НомерСтроки)

Ошибка Поле объекта не обнаружено
5 pnamik
 
28.04.15
07:29
или же другая ошибка

{Документ.ПриходнаяНакладная(378)}: Значение не является значением объектного типа (НомерСтроки)
            НовСтр.Реквизит= "ТЧ.Строка №"+Строка(ТекСтрока.НомерСтроки); //"ТЧ."+ИмяТЧ;
6 pnamik
 
28.04.15
07:55
Попробовал вариант

НомСтр=ЭтотОбъект.Накладная.НомерСтроки;
        Если Ссылка[ИмяТЧ].Количество()<>ЭтотОбъект[ИмяТЧ].Количество() Тогда
            НовСтр=тПроверка.Добавить();
            //НовСтр.Автор=Строка(глТекущийПользователь);
            НовСтр.Автор=Строка(ИмяПользователя());
            НовСтр.Реквизит= "ТЧ.Строка №"+НомСтр; //"ТЧ."+ИмяТЧ;


Ошибка
{Документ.ПриходнаяНакладная(374)}: Поле объекта не обнаружено (НомерСтроки)
        НомСтр=ЭтотОбъект.Накладная.НомерСтроки;
7 pnamik
 
28.04.15
08:33
неужели ни у кого нет идей?
8 fishb1
 
28.04.15
09:47
(7) У ЭтотОбъект.Накладная (если это ТЧ) не может быть свойства НомерСтроки.

Лучше оставь как было, ты сейчас все сломаешь. :(
9 pnamik
 
28.04.15
09:57
(8) Накладная это Табличная часть. Как с нее "выдрать" номер той строки, которая была удалена?
10 pnamik
 
28.04.15
09:57
(8) сломать точно ничего не буду. Проверяю варианты, не подходит, возвращаюсь к исходной точке
11 pnamik
 
28.04.15
10:08
(8) Накладная это табличная часть документа ПриходнойНакладной. Код в модуле документа в процедуре ПередЗаписью
12 fishb1
 
28.04.15
10:10
(9) Объект ТЧ это по сути коллекция строк. Нужно циклом пройти по всем строкам в исходной ТЧ и если такой строки нет в измененной ТЧ, то значит она была удалена. Но по номеру строки связывать две тч не верно. Как уже говорили выше, пользователь может изменить порядок строк в измененной ТЧ. Нужно связывать по всем реквизитам, кроме номера строки, при условии, что значения будут уникальными.
13 Dmitriy_76
 
28.04.15
10:12
+(9) я бы гуид добавил в таб часть.. по нему бы и искал..
14 pnamik
 
28.04.15
10:19
(12) в выше указанном коде (0) если заменить

Если Ссылка[ИмяТЧ][НомСтр][ИмяРек]<>ЭтотОбъект[ИмяТЧ][НомСтр][ИмяРек] Тогда
....
...
...
НовСтр.Реквизит="ТЧ."+ИмяТЧ;

с

НовСтр.Реквизит="ТЧ.Строка №"+НомСтр;

в истории объекта номер строки, где были изменения, показывает с минусом -1, т.е. если изменения произвел на строке 6, в истории документа эта строка будет показана как 5-я. Нумерация строк с нуля начинается. Но это неважно. Хоть так. Но, если меняю

Если Ссылка[ИмяТЧ].Количество()<>ЭтотОбъект[ИмяТЧ].Количество() Тогда
            ...
...
НовСтр.Реквизит="ТЧ."+ИмяТЧ;

на

НовСтр.Реквизит="ТЧ.Строка №"+НомСтр;


Ругается Переменная не определена (НомСтр)
15 fishb1
 
28.04.15
11:14
(14) Правильно ругается, у тебя НомСтр используется в цикле ниже по коду.

Если я правильно понял суть задачи, нужно делать примерно так:
...
    ИмяТЧ = ТЧ.Имя;
    НомераСтрок = Новый Массив;
    
    Для Каждого СтрокаТЧ1 ИЗ Ссылка[ИмяТЧ] Цикл
        НетСовпадений = Истина;
        Для Каждого СтрокаТЧ2 Из ЭтотОбъект[ИмяТЧ] Цикл
            Если СтрокиРавны(СтрокаТЧ1, СтрокаТЧ2, ИмяТЧ) Тогда
                НетСовпадений = Ложь;
                Продолжить;                
            КонецЕсли;    
        КонецЦикла;
        
        Если НетСовпадений Тогда
            НомераСтрок.Добавить(СтрокаТЧ1.НомерСтроки);
        КонецЕсли;
    КонецЦикла;
    
    Если НомераСтрок.Количество() > 0 Тогда
        Сообщить("Удалены строки: "); // TODO: склеить массив в одну строку
        Для Каждого НомерСтроки Из НомераСтрок Цикл
            Сообщить(НомерСтроки);
        КонецЦикла;
    КонецЕсли;
...

Функция СтрокиРавны(Строка1, Строка2, ИмяТЧ)
   Результат = Истина;
   Реквизиты = ЭтотОбъект.Метаданные().ТабличныеЧасти[ИмяТЧ].Реквизиты;
   Для каждого Реквизит из Реквизиты Цикл
      Имя = Реквизит.Имя;
      Если Строка1[Имя] <> Строка2[Имя] Тогда
         Результат = Ложь;
         Прервать;
      КонецЕсли;
   КонецЦикла;
   Возврат Результат;
КонецФункции
16 Drac0
 
28.04.15
11:20
(0) Какова цель всего этого?
17 pnamik
 
28.04.15
11:21
Эта система (код) хранит историю изменения объектов. История потом выводится в виде таблички, что и где и когда менял. То, что Вы (15) предлагаете, это явно не то. Если есть время могу по тиму дать доступ, чтобы смотреть
18 pnamik
 
28.04.15
11:26
Здесь нужно что-то такое

НомСтр=ЭтотОбъект.ФормаДокумента.ТекСтрока.НомерСтроки;

чтобы определить, что такое НомСтр
19 Drac0
 
28.04.15
11:30
(17) Не майся фигней. Положи рядом новый документ ТвойДокумент_Версия ,добавь ему реквизиты Родитель ,Автор, времяВерсии и создавай при его при записи.
20 pnamik
 
28.04.15
11:33
(19) тут все заново получится. а так работающий код, только одну строку нужно менять/добавить.
кто смелее
312 263 519
8311
две минуты активен
21 pnamik
 
28.04.15
11:54
жаль никто пока не может помочь
22 pnamik
 
28.04.15
23:14
друзья, как все таки получить номер строки, чтобы номер выводился в истории?
23 pnamik
 
30.04.15
08:58
какой то замкнутый круг. в первой части кода получается вывести в макет номер строки. а на первой части никак. ошибки то поле не обнаружено, то значение не то, то индекс не тот.
24 Мимохожий Однако
 
30.04.15
09:00
Добавь реквизит ИсторияНомеровСтрок и кидай туда что хочешь перед началом редактирования
25 asady
 
30.04.15
09:09
(0) следить за изменением номеров строк ТЧ маразм.