Имя: Пароль:
1C
 
Запретить изменение строки в табличной части
0 kolts23381
 
06.05.25
13:48
Добрый день. Нужно в заказе клиента в УТ 11, для определенных строк(в зависимости от варианта обеспечения), запретить изменение. Не знаю как правильно сделать - через условное оформление или может добавить вторую таблицу и разделить отображение данных через отбор строк - не уверен что будет отрабатывать как надо. Там еще есть в командной панели кнопки. Кто-то делал подобное?
1 Мультук
 
гуру
06.05.25
14:01
(0)

>>Там еще есть в командной панели кнопки

И там их много.
А есть еще доп.обработки таб.частей, которым внезапно может быть абсолютно пофиг на ваши запреты.

Хотите запретить трогать строки с "Отгружено" ?. Благое дело (с)


Вариант 1 Софткор
С помощью УО и событий запрещаем удалять и менять строки с неким "Вариант обеспечения"

Проблема: Против волшебных кнопочек типовых и не очень -- не поможет.

Вариант 2 Хардкор
Перед записью пишем запрос и сравниваем тч. "Товары" из "Объект.Товары", с "ссылка.Товары"

Проблема: если в документе 500 строк, пользователь поменял 200, а "неправильных" из них всего 5
может вызвать негативную реакцию.


Нюансы
Кнопка "Закрыть заказ" должна всё же закрывать заказ
Пользователь (например с полными правами) должен всё же редактировать заказ игнорируя запреты
2 kolts23381
 
06.05.25
14:09
Насчет "отгружено" вы правы - то что нужно. Тоже думал перед записью проверять, но тоже есть нюансы. Наверное придется посчитать хэш строк по всем данным(чтоб не сломалось при изменении набора колонок в тч) у нужных строк у записанных данных. И у измененных данных тоже посчитать хеши у этих строк. В записываемых данных набор хешей должен быть не меньше чем у записанных. Как такой вариант?
3 Мультук
 
гуру
06.05.25
14:53
(2)

Ну какие хэши строк ?

{лень}
4 Волшебник
 
06.05.25
15:35
(3) Такие хэши, которые можно сравнивать на больше/меньше. Волшебные
5 kolts23381
 
06.05.25
16:24
Создаёшь массив, туда вставляешь данные каждой колонки ТЧ в качестве элемента. Далее сериализуешь массив, через значениевстрокувнутр. Далее получаешь хеш этой строки
6 kolts23381
 
06.05.25
17:25
Набросал такую функцию
Процедура ПолучитьХэши(КоллекцияСтрок,КоллекцияКолонок,массивХешей)
    
    Для Каждого ТекСтрока Из КоллекцияСтрок Цикл
        массивДанных = Новый массив;
        Для каждого ТекКолонка Из КоллекцияКолонок Цикл
            Если ТекКолонка.Имя = "Ссылка" Тогда
                Продолжить;
            КонецЕсли;
            массивДанных.Добавить(ТекСтрока[ТекКолонка.Имя]);
        КонецЦикла;  
        хеширование = новый ХешированиеДанных(ХешФункция.SHA1);
        хеширование.Добавить(ЗначениеВСтрокуВнутр(массивДанных));        
        массивХешей.Добавить(хеширование.ХешСумма);
    КонецЦикла;    
    
КонецПроцедуры

Перед записью объекта получаю массив хешей нужных строк для записанного объекта(если объект не новый) и текущего объекта. Затем проверяю что все элементы массива хешей для записанного объекта присутствуют в массиве для текущего объекта.
7 Волшебник
 
06.05.25
17:26
(6) чушь собачья
8 crasler
 
06.05.25
18:35
(0) проще сделать подписку перед записью и восстанавливать нужные строки
9 lucky_
 
06.05.25
18:45
(1) "Вариант 2 Хардкор"
хардкодить надо так:
Проц ТЧПриИзменении()
СтандартнаяОбработко = ложь;
Если ТекСтрока.ТекущиеДанные.Закрыт Тогда
Сообщить("Уходите, я вас не знаю.")
Возврат;
КонецЕсли;
КонецПроц;
10 olegves
 
06.05.25
19:49
при записи проверять на неудаление нужных строк (я так понял, это по какому-то условию).
Если условие не выполнено, ругаться на удаляемую строку и отказать записать
11 Волшебник
 
модератор
06.05.25
20:53
(9) Соблюдайте лесенку программного кода!
12 Maniac
 
08.05.25
05:00
(9) только это не при изменение а при начале редактирования
13 Maniac
 
08.05.25
05:00
или перед началом изменения
14 Сти
 
08.05.25
06:35
(12) а вот с "а есть еще доп.обработки таб.частей, которым внезапно может быть абсолютно пофиг на ваши запреты." из (1) как?
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан