v8: Маркировка измененных ячеек табличной части Ключевые слова: редактирование,бизнес-процесс
Решение простое - в табличную часть добавляется реквизит ИзмененоПользователем с типом неограниченная строка.
В нем записываются в виде строки, заключенной в фигурные скобки, идентификаторы реквизитов, которые были изменены, например: {Товар}{Количество}{Цена}.
Некоторые реквизиты можно править, не отмечая, например, вычисляемые поля и поля примечаний, в нашем примере это поля: Примечание и Сумма.
Если в реквизите ИзмененоПользователем содержится символ "*" то считается, что все поля изменены.
Код нормально работает с добавлением строк, все реквизиты добавленной строки, кроме исключений, считаются измененными.
Используется глобальная переменная для хранения предыдущего состояния строки.
Пример кода, реализующего этот функционал на примере табличной части с названием Состав:
Перем глфПредСостояниеСтроки;
Процедура СоставПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
Если Элемент.ТекущаяСтрока<>Неопределено И НЕ НоваяСтрока Тогда
глфПредСостояниеСтроки=Новый Структура();
Для Каждого Колонка ИЗ Метаданные.НайтиПоТипу(ТипЗнч(Элемент.Значение)).Реквизиты Цикл
глфПредСостояниеСтроки.Вставить(Колонка.Имя, Элемент.ТекущаяСтрока[Колонка.Имя]);
КонецЦикла;
Иначе
глфПредСостояниеСтроки=Неопределено;
КонецЕсли;
КонецПроцедуры
Процедура СоставПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Для Каждого Колонка ИЗ Метаданные.НайтиПоТипу(ТипЗнч(Элемент.Значение)).Реквизиты Цикл
ИмяКолонки=Колонка.Имя;
Если Найти(ДанныеСтроки.ИзмененоПользователем,"{"+ИмяКолонки+"}")<>0 ИЛИ Найти(ДанныеСтроки.ИзмененоПользователем,"*")<>0 Тогда
Если ОформлениеСтроки.Ячейки.Найти(ИмяКолонки)<>Неопределено Тогда
ОформлениеСтроки.Ячейки[ИмяКолонки].ЦветФона=WebЦвета.Древесный;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура СоставПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
Стр=Элемент.ТекущаяСтрока;
Если Стр<>Неопределено Тогда
Для Каждого Колонка ИЗ Метаданные.НайтиПоТипу(ТипЗнч(Элемент.Значение)).Реквизиты Цикл
ИмяКолонки=Колонка.Имя;
Если Найти("{Примечание}{Сумма}", "{"+ИмяКолонки+"}")<>0 Тогда Продолжить; КонецЕсли;
Если глфПредСостояниеСтроки=Неопределено ИЛИ глфПредСостояниеСтроки[ИмяКолонки]<>Элемент.ТекущаяСтрока[ИмяКолонки] И Найти(Стр.ИзмененоПользователем,"{"+ИмяКолонки+"}")=0 Тогда
Стр.ИзмененоПользователем=СокрЛП(Стр.ИзмененоПользователем)+"{"+ИмяКолонки+"}";
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
|