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