|   |   | 
| 
 | 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) Вернее по ООП :)     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |