Имя: Пароль:
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) как?