Имя: Пароль:
1C
1C 7.7
v7: ПриНачалеРедактированияСтроки - неправильно отрабатывает
,
0 tgu82
 
05.10.23
09:58
Обычный справочник формасписка, двухуровневый
Редактирование только "В списке".
Процедура ПриНачалеРедактированияСтроки()
УстановитьАтрибут("ТипКолонки","ку-ку-ку");

//Типколонки строка(50) ну проще ж некуда а не работает

КонецПроцедуры
1 Харлампий Дымба
 
05.10.23
10:09
ТипКолонки="куку" тоже не работает?
2 uno-group
 
05.10.23
10:16
ТекущийЭлемент().УстановитьАтрибут(...)
3 tgu82
 
05.10.23
10:21
(2) не хочет так
4 uno-group
 
05.10.23
10:33
искаль через спр=СоздатьОбъект() хотя скорее всего будет заблокирован. Редактирование в списке разрешено?
5 tgu82
 
05.10.23
10:34
(2) Я понимаю даже почему не хочет но как правильно сделать - не соображу. Но должно быть что-то простое - иначе на фига вообще эта предопределенная процедура
6 tgu82
 
05.10.23
10:35
(4) Да, разрешено
7 tgu82
 
05.10.23
10:39
Если В ПриЗаписи УстановитьАтрибут(...) то все без проблем. Но это же не то вообще
8 Bigbro
 
05.10.23
10:45
по-моему так нельзя
по крайней мере не помню чтобы так делал когда нибудь или чтобы видел такое.
9 tgu82
 
05.10.23
11:09
(8) НУ а зачем тогда это процедура нужна ???
Если я в ней немогу простейшие действия сделатаь
10 tgu82
 
05.10.23
12:20
Сделать можно если использовать можно если использовать кнопку выбора и приначалевыборазначения. Тогда срабатывает но это малость не то
11 tgu82
 
05.10.23
13:10
Процедура ПриНачалеРедактированияСтроки()
    Спр=СоздатьОбъект("Справочник.СвойстваПоляСправочника");
    Если Форма.ТекущаяКолонка()="ТипКолонки" Тогда  //тщи
        Если ТекущийЭлемент().Выбран()=0 Тогда
        ИначеЕсли ТекущийЭлемент().ЭтоГруппа()=1 Тогда
        ИначеЕсли Спр.НайтиЭлемент(ТекущийЭлемент())=1 Тогда
        Выбтип="";
          Если СписТип.ВыбратьЗначение(ВыбТип,"Выберите тип колонки",,,2)=1 Тогда  
            Спр.ТипКолонки=СокрЛП(ВыбТип);
            Попытка
                Спр.Записать();
            Исключение
                сообщить(ОписаниеОшибки(),"!!")
            КонецПопытки
        КонецЕсли;                        
        КонецЕсли;
    КонецЕсли;
    СтатусВозврата(0);
    Возврат;
КонецПроцедуры        


Вот так работает
12 Харлампий Дымба
 
05.10.23
17:03
Вставлю свои 5 копеек, для выпуклости картинки - может пригодится когда.

Форма списка справочника в режиме «редактировать – в списке» вещь специфичная. Сложное редактирование предполагалось делать в диалоговой форме, а форма списка – только для редактирования чего-нибудь простого «Код,  Наименование».  И набор инструментов беден и ограничен.

ПриВводеСтроки() вызывается самой первой при вводе нового элемента. Позволяет только запретить ввод новой строки через СтатусВозврата(0) и ничего больше. В этот момент новый элемент ещё не создан, поэтому  ТекущийЭлемент() и все обращения к реквизитам справочника  будут указывать на тот элемент, на котором стоял курсор непосредственно перед началом ввода элемента.

Следом при вводе нового элемента вызывается ПриНачалеРедактированияСтроки().В этот момент запретить ввод новой строки программно уже невозможно, СтатусВозврата(0) смысла не имеет. Тут уже работают все обращения к реквизитам текущего элемента: Код, Наименование, РеквизитыСправочника, Родитель, Владелец, ЭтоГруппа() и т.д,  но есть одна важная багофича – присвоить значение реквизиту, который не размещен в форме – невозможно. То есть если колонка с Реквизит1 выведена, а колонка с Реквизит2 – нет, то Реквизит1=1234 отработает, а присвоение Реквизит2=1234 будет проигнорировано. Обходится выводом Реквизит2 в колонке с Видимость(0).

Наконец третья функция ПриНачалеРедактированияСтроки( ) вызывается только при начале редактирования уже существующих элементов и сама не умеет ничего кроме запрета редактирования через СтатусВозврата(0). При этом само редактирование ещё не началось, объект не заблокирован, но спозиционирован, поэтому его можно найти через ТекущийЭлемент() создав объект справочника. В этот момент можно присвоить значения реквизиту, но получается корявенько: в Реквизит1 будет старое значение и на форме до момента записи элемент будет видно только старое значение, а вот в ТекущийЭлемент().Реквизит1 будет новое значение. Надо также учесть, что если редактирование строки не завершится записью (Enter), то присвоение нового значения элементу будет отменено. А в ПриЗаписи() надо помнить, что ТекущийЭлемент().Реквизит1 и Реквизит1 могут содержать разные значения, если вдруг алгоритм ими оперирует.

Касательно твоей задачи ещё 2 соображения:
1.Возможно стоило для колонки "ТипКолонки" сделать «запретить редактирование» и «имеет кнопку выбора», а выбор обрабатывать через:
Процедура ПриНачалеВыбораЗначения(ИЭД,ФСО)
  Если ИЭД="Поле1" Тогда
   ФСО=0;                        
   ВыбЗнач="";
   Если СписокДляВыбора.ВыбратьЗначение(ВыбЗнач,,,2)=1 Тогда
    ТипКолонки=ВыбЗнач;
   КонецЕсли;    
  КонецЕсли;    
КонецПроцедуры

2.Посмотри ещё режим Форма.ОбработкаВыбораСтроки(1) и Процедура ПриВыбореСтроки() - ими можно не пускать пользователя в режим редактирования, при этом в зависимости от Форма.ТекущаяКолонка() делать любые формы ввода хоть через .ВыбратьЗначение(), хоть через модальный вызов свое формы ввода Обработка.ФормаВводаВсех50ПараметровИлиНеВсех. А ещё текстовые колонки кнопки "Х" очистки значений и "О" - открытия форм..
13 tgu82
 
06.10.23
11:03
(12) Спасибо огромное. Но я поставил "запрет редактирования и недоступен" на колонке и необходимость СтатусВозврата(0) пропала
14 АгентБезопасной Нацио
 
06.10.23
12:12
(13) кстати, в табличномПоле, емнип, твою хотелку можно выполнить...
15 Arbuz
 
06.10.23
16:56
(12) У Вас в четвёртом абзаце опечатка: там должно быть ПриРедактированииНовойСтроки()

(0) Говорят тебе, говорят - возьми уже ТП.
Основная теорема систематики: Новые системы плодят новые проблемы.