Книга знаний

1С:Предприятие / v8

v8: Маркировка измененных ячеек табличной части

Если табличная часть заполняется автоматически, но пользователю разрешается затем ее править, полезно отмечать, какие ячейки были изменены пользователем.Автор статьи: Гений 1С | Редакторы: BlackTiger
Последняя редакция №3 от 25.06.07 | История
URL: http://kb.mista.ru/article.php?id=517

Ключевые слова: редактирование,бизнес-процесс


Решение простое - в табличную часть добавляется реквизит ИзмененоПользователем с типом неограниченная строка.
В нем записываются в виде строки, заключенной в фигурные скобки, идентификаторы реквизитов, которые были изменены, например: {Товар}{Количество}{Цена}.
Некоторые реквизиты можно править, не отмечая, например, вычисляемые поля и поля примечаний, в нашем примере это поля: Примечание и Сумма.
Если в реквизите ИзмененоПользователем содержится символ "*" то считается, что все поля изменены.
Код нормально работает с добавлением строк, все реквизиты добавленной строки, кроме исключений, считаются измененными.
Используется глобальная переменная для хранения предыдущего состояния строки.


Пример кода, реализующего этот функционал на примере табличной части с названием Состав:

Перем глфПредСостояниеСтроки;

Процедура СоставПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
    Если Элемент.ТекущаяСтрока<>Неопределено И НЕ НоваяСтрока Тогда
        глфПредСостояниеСтроки=Новый Структура();
        Для Каждого Колонка ИЗ Метаданные.НайтиПоТипу(ТипЗнч(Элемент.Значение)).Реквизиты Цикл
            глфПредСостояниеСтроки.Вставить(Колонка.Имя, Элемент.ТекущаяСтрока[Колонка.Имя]);
        КонецЦикла;
    Иначе
        глфПредСостояниеСтроки=Неопределено;
    КонецЕсли;
КонецПроцедуры

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

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


Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика