Вход | Регистрация

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

Метки: 

v7: 1С++ Табличное поле. Доступность колонки

Я
   akocur
 
21.01.18 - 23:03
Всем доброго времени суток! Подскажите, есть ли в 1С++ возможность делать колонку табличного поля не доступной для редактирования?

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

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

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

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

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

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

//******************************************************************************

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

        ТП.РедактироватьЗначение(СтрокаТП, Колонка, ТипРегиона, текЗнач,Длина,Точность, РеквДляФормы, Флаг);
    //КонецЕсли;

КонецПроцедуры                                                                  

 

//******************************************************************************

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

        РекДляФормы = КолонкаТП.Имя;
    Иначе            
        РекДляФормы = "";
    КонецЕсли;
    
    Если ТипЗначения(ЗначениеТЗ)<>2 Тогда//Строка

        Флаг = "0x00000020";// имеет кнопку выбора

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

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

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

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

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

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

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


Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует