|
вывод номера строки табличной части, фиксация всех изменений | ☑ | ||
---|---|---|---|---|
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) следить за изменением номеров строк ТЧ маразм.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |