Имя: Пароль:
1C
1C 7.7
v7: 1С++ Табличное поле. Доступность колонки
,
0 akocur
 
21.01.18
23:03
Всем доброго времени суток! Подскажите, есть ли в 1С++ возможность делать колонку табличного поля не доступной для редактирования?

В документации увидел только свойство Видимость.

Использую 1С++ версии 3.2.4.1. Использую событие Выбор для табличного поля. Нужно не все колонки редактировать. Как это сделать?
1 Sserj
 
22.01.18
06:20
Не совсем понятно что значит "не доступной для редактирования".
ТабличныеПоле и так ничего не редактирует только отражает.
Все что якобы редактируется сам описываешь в событиях.
Если это в Выбор то и делай просто первой строкой:

Если Колонка.Имя = "НужноеИмяКолонки" Тогда
  Возврат;
КонецЕсли;

Если нужно много каких то колонок заблокировать в зависимости от польователей то можно завести список в него добавлять нужные имена колонок и в событии выбор к примеру делать так:

Если СписокНедоступныхКолонок.Принадлежит(Колонка.Имя) = 1 Тогда
  Возврат;
КонецЕсли;
2 Dump
 
22.01.18
07:33
А Доступность() чеи не устраивает?
Доступность(<?>)
Синтаксис:
Доступность(<Режим>)
Назначение:
Установка режима редактирования элемента диалога. Возвращает: текущее числовое значение режима редактирования элемента диалога (на момент до исполнения метода).
Параметры:
<Режим> - число: 1 - разрешено редактирование элемента диалога, 0 - запрещено (необязателен).
Замечание:
Доступ к методу возможен только в контексте Модуля формы через атрибут Форма.
3 akocur
 
23.01.18
12:28
(1) Так и сделал, перед тем как задать вопрос. Но если в поле есть значение отличающееся от нуля, то курсор заходит в это поле и значение в этом поле можно редактировать. Посмотрел в отладчике условие

Если КолонкиТПТолькоПросмотр.НайтиЗначение(КолонкаТП.Имя) <> 0 Тогда
    Возврат;
КонецЕсли;

Это условие срабатывает. Но редактировать можно только не нулевые значения.
4 akocur
 
23.01.18
12:30
(1) Вот полный код


//******************************************************************************
Процедура ТПВыбор(ТП, СтрокаТП, Колонка, ТипРегиона, РеквДляФормы="", Флаг="")
    Если ТипРегиона<>3 Тогда
        Возврат;
    КонецЕсли;      
    ТЗ = ТП.ПоставщикДанных.ТаблицаЗначений;
    ИмяКолонки=Колонка.Имя;
    текЗнач=ТЗ.ПолучитьЗначение(СтрокаТП, ИмяКолонки);
    Длина="";
    Точность="";                                      
    ТЗ.ПолучитьПараметрыКолонки(ИмяКолонки,,Длина,Точность);
    //Если ПустоеЗначение(текЗнач)=0 Тогда
        ТП.РедактироватьЗначение(СтрокаТП, Колонка, ТипРегиона, текЗнач,Длина,Точность, РеквДляФормы, Флаг);
    //КонецЕсли;
КонецПроцедуры                                                                  



//******************************************************************************
//1С++
Процедура ак_ТабПолеВыбор(ТПИсточник, НомерСтрокиТП, КолонкаТП, Регион)
    
    Если КолонкиТПТолькоПросмотр.НайтиЗначение(КолонкаТП.Имя) <> 0 Тогда
        Возврат;
    КонецЕсли;  
    
    ЗначениеТЗ=ТПИсточник.ПоставщикДанных.ТаблицаЗначений.ПолучитьЗначение(НомерСтрокиТП, КолонкаТП.Имя);
    Если ТипЗначения(ЗначениеТЗ) = 11 Тогда//Справочник
        РекДляФормы = КолонкаТП.Имя;
    Иначе            
        РекДляФормы = "";
    КонецЕсли;
    
    Если ТипЗначения(ЗначениеТЗ)<>2 Тогда //Строка
        Флаг = "0x00000020"; // имеет кнопку выбора
    КонецЕсли;
    
    ТПВыбор(ТПИсточник, НомерСтрокиТП, КолонкаТП, Регион, РекДляФормы, Флаг);  
    
    ТекущийАвтомобиль = ТПИсточник.ТекущиеДанные.Автомобиль;
    
КонецПроцедуры
5 akocur
 
23.01.18
12:36
(2) Вы привели метод для стандартного реквизита формы. Я использую расширение формы, которое доступно благодаря 1С++. Я не знаю как метод стандартного реквизита применить для табличного поля из 1С++.
6 ADirks
 
23.01.18
12:46
(4) ну так не вызывай ТП.РедактироватьЗначение(), и не будет редактирования
7 akocur
 
23.01.18
12:58
(6) Так оно и не вызывается. Событие табличного поля описывается процедурой
Процедура ак_ТабПолеВыбор(ТПИсточник, НомерСтрокиТП, КолонкаТП, Регион)

А процедура ТПВыбор - это не событие. Процедура ТПВыбор вызывается из событий табличного поля. Сама по себе она не вызывается.

Процедура ак_ТабПолеВыбор не вызывает ТПВыбор, если верно условие
Если КолонкиТПТолькоПросмотр.НайтиЗначение(КолонкаТП.Имя) <> 0 Тогда
        Возврат;
    КонецЕсли;
8 akocur
 
23.01.18
13:33
Записал видео. https://youtu.be/4sM_dPXygPs
9 ADirks
 
23.01.18
14:02
Вообще-то событие - это именно ТПВыбор().  А ак_ТабПолеВыбор() - это какая-то твоя процедура. не событие.

документация живёт тут: http://www.1cpp.ru/forum/YaBB.pl?num=1303385763
10 akocur
 
23.01.18
14:12
(9) Ты смотрел видео? Там видно, какая процедура вызывается. В документации написано "Табличное поле может генерировать события в виде вызова процедур модуля формы, на которой оно расположено, имена которых должны быть составлены <b>из имени реквизита формы и имени события</b>." На форме у меня размещена кнопка с идентификатором "ак_ТабПоле". Так что согласно документации, чтобы табличное поле генерировало событие, это событие нужно назвать "ак_ТабПолеВыбор". Не веришь, что это так, посмотри видео из (8)
11 ADirks
 
23.01.18
14:28
> ... кнопка с идентификатором "ак_ТабПоле"

Ну тогда да. Но судя по описанию (и видео тоже) срабатывает что-то ещё.  В ТП само ничего не редактируется, РедактироватьЗначение() надо вызывать самостоятельно.

Возможно, объект ТП - это объект какого-то производного от ТП класса, и там это событие отрабатывается.
12 akocur
 
23.01.18
14:37
(9) Вот еще записал https://youtu.be/Q2xzud710Eo. Показано что за чем вызывается.

Еще интересно, что если поле не нулевое, то при входе в режим редактирования бывает попадает какой то мусор и еще нельзя написать число больше 9. Хотя колонка может содержать число с разрядность 15.
13 akocur
 
23.01.18
14:42
(11) Огромное тебе спасибо!!! Действительно, в классе этого объекта была определена процедура Выбор. Я и не думал, что эта процедура будет автоматом тоже вызываться. Видимо еще мало знаний по ОПП.
14 akocur
 
23.01.18
14:44
(13) Вернее по ООП :)