1с только просмотр для формы кроме реквизита

У любой формы в 1С есть свойство ТолькоПросмотр, которое управляет доступностью для редактирования всех ее элементов. Но оно не подходит, когда стоит задача на выборочный запрет редактирования элементов. Например, есть форма со множеством элементов на ней, и необходимо убрать доступность для всех этих элементов формы, но в тоже время оставить доступ для редактирования одного или нескольких элементов. Для этой цели я написал процедуру, которую можно разместить в каком-либо серверном общем модуле и вызывать ее, например в событии формы ПриСозданииНаСервере:

// ПАРАМЕТРЫ:
// ГруппаРодитель - вся форма, или группа формы, или таблица формы
    
    // например: ЭтаФорма (вся Форма объекта)
    
    // или Элементы.Товары (таблица Товары)
    
    // или Элементы.Товары.КоманднаяПанель (командная панель таблицы Товары)
    
    // или Элементы.Товары.КонтекстноеМеню (контекстное меню таблицы Товары)
    
    // или Элементы.ТоварыКонтекстноеМенюСкопировать (кнопка Скопировать в контекстном меню таблицы Товары)
    
    // или Элементы.ТоварыКоличество (колонка Количество в таблице Товары)
    
    // или Элементы.ГруппаШапка (группа элементов на форме с названием ГруппаШапка)

//МассивДоступныхЭлементовФормы - массив, содержащий в себе доступные элементы формы, например:

    //Элементы.Номер (поле Номер в шапке документа)
    
    // или Элементы.Товары (таблица Товары)
    
    // или Элементы.ТоварыДобавить (команда добавить на командной панели таблицы Товары)
    
    // или Элементы.Товары.КоманднаяПанель (командная панель таблицы Товары)
    
    // или Элементы.Товары.КонтекстноеМеню (контекстное меню таблицы Товары)
    
    // или Элементы.ТоварыКонтекстноеМенюСкопировать (кнопка Скопировать в контекстном меню таблицы Товары)
    
    // или Элементы.ТоварыКоличество (колонка Количество в таблице Товары)
    
    // или Элементы.ГруппаШапка (группа элементов на форме с названием ГруппаШапка)
&НаСервере
Процедура УбратьДоступностьЭлементовФормыКромеУказанных(ГруппаРодитель,МассивДоступныхЭлементовФормы = Неопределено)Экспорт
    Если ТипЗнч(ГруппаРодитель) = Тип("УправляемаяФорма") Тогда 
        ЭлементКоманднаяПанель = ГруппаРодитель.КоманднаяПанель;
        Если МассивДоступныхЭлементовФормы <> Неопределено И МассивДоступныхЭлементовФормы.Найти(ЭлементКоманднаяПанель) <> Неопределено Тогда 
            ЭлементКоманднаяПанель = Неопределено   
        КонецЕсли;
    ИначеЕсли ТипЗнч(ГруппаРодитель) = Тип("ТаблицаФормы") Тогда 
        ЭлементКоманднаяПанельТаблицы = ГруппаРодитель.КоманднаяПанель;
        Если МассивДоступныхЭлементовФормы <> Неопределено И МассивДоступныхЭлементовФормы.Найти(ЭлементКоманднаяПанельТаблицы) <> Неопределено Тогда
            ЭлементКоманднаяПанельТаблицы = Неопределено;   
        КонецЕсли;
        ЭлементКонтекстноеМенюТаблицы = ГруппаРодитель.КонтекстноеМеню;
        Если МассивДоступныхЭлементовФормы <> Неопределено И МассивДоступныхЭлементовФормы.Найти(ЭлементКонтекстноеМенюТаблицы) <> Неопределено Тогда
            ЭлементКонтекстноеМенюТаблицы = Неопределено;   
        КонецЕсли;
    Иначе
        ЭлементКоманднаяПанель = Неопределено;
        ЭлементКоманднаяПанельТаблицы = Неопределено;
        ЭлементКонтекстноеМенюТаблицы = Неопределено;
    КонецЕсли;
    Для Каждого ТекЭлемент Из ГруппаРодитель.ПодчиненныеЭлементы Цикл 
        Если МассивДоступныхЭлементовФормы <> Неопределено И МассивДоступныхЭлементовФормы.Найти(ТекЭлемент) <> Неопределено Тогда 
            Продолжить;
        КонецЕсли;
        Если ТипЗнч(ТекЭлемент) = Тип("ГруппаФормы") Или ТипЗнч(ТекЭлемент) = Тип("ТаблицаФормы") Тогда
            УбратьДоступностьЭлементовФормыКромеУказанных(ТекЭлемент,МассивДоступныхЭлементовФормы);       
        Иначе   
            Попытка
                ТекЭлемент.ТолькоПросмотр = Истина;                     
            Исключение   
                ТекЭлемент.Доступность = Ложь;
            КонецПопытки;      
        КонецЕсли;       
    КонецЦикла;
    Если ЭлементКоманднаяПанель <> Неопределено Тогда 
        УбратьДоступностьЭлементовФормыКромеУказанных(ЭлементКоманднаяПанель,МассивДоступныхЭлементовФормы);   
    КонецЕсли;   
    Если ЭлементКоманднаяПанельТаблицы <> Неопределено Тогда 
        УбратьДоступностьЭлементовФормыКромеУказанных(ЭлементКоманднаяПанельТаблицы,МассивДоступныхЭлементовФормы);   
    КонецЕсли;
    Если ЭлементКонтекстноеМенюТаблицы <> Неопределено Тогда 
        УбратьДоступностьЭлементовФормыКромеУказанных(ЭлементКонтекстноеМенюТаблицы,МассивДоступныхЭлементовФормы);   
    КонецЕсли;
КонецПроцедуры 

Рассмотрим параметры этой процедуры:
ГруппаРодитель — группа формы, таблица формы, командная панель формы, командная панель таблицы, контекстное меню таблицы формы, или сама форма. В этот параметр мы передаем одно из вышеперечисленных значений, на подчиненные элементы которого будем ставить запрет на редактирование.
МассивДоступныхЭлементовФормы — массив содержащий в себе элементы формы, группы формы, таблицы формы, командную панель формы, командную панель таблицы, контекстное меню таблицы, кнопки командной панели, кнопки контекстного меню и тд. В этот параметр мы передаем массив, на элементы которого не должен накладываться запрет на редактирование.

Ø

Я
   Silenzio

14.09.05 — 10:31

Каким образом можно решить следующую задачу?
Необходимо установить режим недоступности для изменения всех реквизитов формы, искючая при этом некоторые поля в табличной части, для возможного их просмотра.

  

Партнерская программа EFSOL Oblako

   Naumov

1 — 14.09.05 — 10:45

1)Форма (Form)
ТолькоПросмотр (ReadOnly)
Использование:
Чтение и запись.
Описание:
Тип: Булево. Содержит признак использования формы в режиме просмотра. Если свойство установлено в Истина, то становятся не доступны для изменения элементы управления, связанные с реквизитами любого реквизита формы, элементы управления, для которых установлено свойство ИзменяетДанные, а также становятся не доступны все кнопки командной панели с установленным свойством ИзменяетДанные.
2) Как в 77 был метод так и остался :Доступность (Enabled)
Использование:
Чтение и запись.

   Silenzio

2 — 14.09.05 — 10:59

Это понятно. Свойство ТолькоПросмотр устанавливает режим для всех подобных реквизитов, а необходимо чтобы для некоторых это не работало.

   Naumov

3 — 14.09.05 — 11:01

ТОгда у нужных Метод Доступность. Больше никак

   Silenzio

4 — 14.09.05 — 11:15

ОК!Спасибо! Понимаешь, только когда используешь метод Доступность, становится недоступным также кнопка просмотра.

   MaxS

5 — 14.09.05 — 11:35

(4) У отдельно взятого элемента тоже есть Доступность.
Что-то типа так:
Для Каждого Элемент Из ЭлементыФормы Цикл
Элемент.Доступность = Ложь;
КонецЦикла;
ЭлементыФормы.МояЛюбимаяКнопка.Доступность = Истина;

  

Filin

6 — 14.09.05 — 11:37

(4)Ну тогда это немного другое, чем просто «ТолькоПросмотр» или «Доступность».
Если кнопка «Просмотра» нужна доступной, то надо либо делать такую кнопку самому (а не пользоваться стандартной)и писать код обработки, либо накладывать ограничения на форму открываемого объекта и переписывать стандартный обработчик «ОбработкаВыбора»

TurboConf — расширение возможностей Конфигуратора 1С

Используя обычные формы не всегда возможно через Роли ограничить редактирование форм документа, поэтому, можно обойтись ниже вариантом

Процедура ДоступностьЭлементовФормы()

Если Не РольДоступна(«вх_МенеджерРядовый») Тогда
Возврат;
КонецЕсли;

Для Каждого Элемент Из ЭлементыФормы Цикл

Если Элемент.Имя = «ОсновныеДействияФормы»
Или Элемент.Имя = «ДействияФормы» Тогда
Продолжить;
КонецЕсли;

Если Элемент.Имя = «ОплатаПлатежнымиКартами» Тогда
Для Каждого Колонка Из Элемент.Колонки Цикл
Если Колонка.Имя = «ВидОплаты» Тогда
Продолжить;
КонецЕсли;

Колонка.ТолькоПросмотр = Истина;
КонецЦикла;

Продолжить;
КонецЕсли;

Если ТипЗнч(Элемент) = Тип(«ПолеВвода») Тогда
Элемент
.ТолькоПросмотр = Истина;
ИначеЕсли ТипЗнч(Элемент) = Тип(«КоманднаяПанель») Тогда
Элемент
.Доступность = Ложь;
ИначеЕсли ТипЗнч(Элемент) = Тип(«Надпись») Тогда
Элемент
.Доступность = Ложь;
ИначеЕсли ТипЗнч(Элемент) = Тип(«ТабличноеПоле») Тогда
Элемент
.ТолькоПросмотр = Истина;
ИначеЕсли ТипЗнч(Элемент) = Тип(«Флажок») Тогда
Элемент
.Доступность = Ложь;
КонецЕсли;

КонецЦикла;

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

proGAll
23.09.2014 14:03 Прочитано: 5030

Всем привет,

8.3.5, УФ. На форме программно создаются реквизиты формы и элементы, связанные с ними. После программного создания на форме этих динамически формируемых элементов для формы в модуле формы делаю

Код 1C v 8.3

 ЭтотОбъект.ТолькоПросмотр = Истина;   

после чего признак невозможности редактирования устанавливается на все реквизиты, кроме программно созданных. В чем может быть причина? Спасибо.

Yandex
Возможно, вас также заинтересует

Реклама на портале

proGAll
23.09.2014 14:07 Ответ № 1

Я извиняюсь, вопрос никак не по Бухгалтерии), пренести в «Управляемое приложение» не смог

E_Migachev
23.09.2014 14:58 Ответ № 2

потому что ты блокируешь объект, а надо форму

proGAll
23.09.2014 15:49 Ответ № 3

Да, забыл написать, режим совместимости с 8.2 отключен, т.е. работаю с чистой 8.3, поэтому используя ЭтотОбъект в модуле формы я блокирую данную управляемую форму.

E_Migachev
23.09.2014 16:22 Ответ № 4

в управляемой ты можешь блокировать элементы

Код 1C v 8.2 УП

  Элементы.СтраницаОписание.ТолькоПросмотр = истина;   

не помню точно, но вроде как возможно

Код 1C v 8.2 УП

 Элементы.ТолькоПросмотр = истина;   
proGAll
23.09.2014 16:46 Ответ № 5

Нашелся ответ, если элемент не связан с основным реквизитом формы или у реквизита, с которым он связан не установлена СохраняемыеДанные, то он не блокируется. Спасибо.

Подсказка: Для выделения Кода используйте (в редакторе).

В стандартных конфигурациях, написанных на обычных формах, нет возможности, по умолчанию, открывать документы на просмотр. И при закрытие документа, пользователь частенько  нажимает кнопку «ОК» а не «Закрыть» . При этом происходит запись и перепроведение документа. Что не всегда есть правильно.

С помощью минимального изменения конфигурации можно данный недостаток устранить.
Формы документа будут открываться по умолчанию «Только просмотр», а для редактирования документа, пользователю требуется нажать доп. кнопку в командной панели документа. (см. скрин)

В стандартных конфигурациях, написанных на обычных формах, нет возможности, по умолчанию, открывать документы на просмотр. И при закрытие документа, пользователь частенько  нажимает кнопку «ОК» а не «Закрыть» . При этом происходит запись и перепроведение документа. Что не всегда есть правильно.

С помощью минимального изменения конфигурации можно данный недостаток устранить.

Формы документа будут открываться по умолчанию «Только просмотр», а для редактирования документа, пользователю требуется нажать доп. кнопку в командной панели документа. (см. скрин)

Как реализовать этот функционал?

В конфигурациях от 1С (БП, УТ, ЗУП, УПП и т.д.), при открытие формы документа всегда вызывается какая либо процедура которая проверяет дату запрета редактирования данных.

Например:

в конфигурации Бухгалтерия предприятия, редакция 2.0 во всех формах документа ПриОткрытии вызывается:

// Установить доступность формы с учетом даты запрета редактирования

РаботаСДиалогами.УстановитьДоступностьФормыДляРедактирования(ЭтотОбъект, ЭтаФорма);

в конфигурации «Управление торговлей», редакция 10.3

НастройкаПравДоступа.ОпределитьДоступностьВозможностьИзмененияДокументаПоДатеЗапрета(ДокументОбъект, ЭтаФорма);

и т.д.

Также в конфигурациях от 1С, во всех  формах документов присутствует процедура ДействияФормыРедактироватьНомер(Кнопка)

Эту процедуру мы будем использовать для обработки действия по нажатию кнопки «Изменить».

Эти процедуры нам и нужны. Дальше, для примера, разберем, как это реализовать в конфигурации Бухгалтерия предприятия, редакция 2.0.

1. Создать новый общий модуль «лМодульДоработок» содержащий всего 1 процедуру:

Процедура ДобавитьКнопкуВКоманднуюПанельФормы(_Метаданные,_Форма) Экспорт

      КП =_Форма.ЭлементыФормы.ДействияФормы; ТипКнопки = ТипКнопкиКоманднойПанели.Действие;

      Если КП.Кнопки.Найти("РедактированиеДокумента") = Неопределено Тогда

            НоваяКнопка = КП.Кнопки.Добавить("РедактированиеДокумента", ТипКнопки, "Изменить" , Новый Действие("ДействияФормыРедактироватьНомер"));

      конецесли;

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

2. Изменить стандартную процедуру УстановитьДоступностьФормыДляРедактирования  общего модуля РаботаСДиалогами. Добавить в конец процедуры (после всех проверок даты редактирования) текст:

 //Если после проверки даты запрета, форма доступна для редактирования, откроем ее на просмотр,

//но добавим кнопочку в панель для возможности редактирования

если НЕ ФормаДокумента.ТолькоПросмотр и ДокументОбъект.Проведен тогда

      ФормаДокумента.ТолькоПросмотр = Истина;

      лМодульДоработок.ДобавитьКнопкуВКоманднуюПанельФормы(ДокументОбъект.Метаданные(),ФормаДокумента);

конецесли;

//конец изменений

3.  Процедура форм документов «ДействияФормыРедактироватьНомер» состоит из 1 строчки и вызывает процедуру «ИзменениеВозможностиРедактированияНомера» общего модуля «МеханизмНумерацииОбъектов»

МеханизмНумерацииОбъектов.ИзменениеВозможностиРедактированияНомера(ЭтотОбъект.Метаданные(), ЭтаФорма, ЭлементыФормы.ДействияФормы.Кнопки.Подменю, ЭлементыФормы.Номер);  

Изменить процедуру следующим образом:

Процедура ИзменениеВозможностиРедактированияНомера(МетаданныеОбъекта, ФормаОбъекта, ПодменюДействия, ПолеВводаНомера, ПолеВводаНомераДубль = Неопределено, ТекстВопроса = "") Экспорт

    //Если при вызове процедуры форма документа не доступна для редактирования, то вызов процедуры произошел по нажатию кнопки «Изменить»

    Если ФормаОбъекта.ТолькоПросмотр тогда

        ФормаОбъекта.ТолькоПросмотр = ложь;            

        ФормаОбъекта.ЭлементыФормы.ДействияФормы.Кнопки.РедактированиеДокумента.Доступность = ложь;

        ФормаОбъекта.Обновить();

    иначе //иначе на самом деле хотят редактировать номер документа

        Кнопка = ПодменюДействия.Кнопки.РедактироватьКодНомер;
        Если НЕ Кнопка.Пометка Тогда

                    Если ПустаяСтрока(ТекстВопроса) Тогда            
                Если ВРЕГ(ПолеВводаНомера.Данные) = ВРЕГ("Код") Тогда
                    ТекстВопроса = "Код присваивается автоматически при записи элемента, самостоятельное его редактирование может привести к нарушению в нумерации в системе. Вы действительно хотите установить код вручную?"
                Иначе
                    ТекстВопроса = "Номер документу присваивается автоматически при записи, самостоятельное его редактирование может привести к нарушению в нумерации в системе. Вы действительно хотите установить номер вручную?"
                КонецЕсли;
            КонецЕсли;        

                    Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
            Если Ответ <> КодВозвратаДиалога.Да Тогда
                Возврат;
            КонецЕсли;                
        КонецЕсли;
        Кнопка.Пометка = Не Кнопка.Пометка;
        ПолеВводаНомера.ТолькоПросмотр = НЕ Кнопка.Пометка;
        ПолеВводаНомера.ПропускатьПриВводе = ПолеВводаНомера.ТолькоПросмотр;    
        ОбновитьПодсказкуКодНомерОбъекта(МетаданныеОбъекта, ПодменюДействия, ПолеВводаНомера);

            Если ПолеВводаНомераДубль <> Неопределено Тогда
            ПолеВводаНомераДубль.ТолькоПросмотр = ПолеВводаНомера.ТолькоПросмотр;
            ПолеВводаНомераДубль.ПропускатьПриВводе = ПолеВводаНомераДубль.ТолькоПросмотр;
            ОбновитьПодсказкуКодНомерОбъекта(МетаданныеОбъекта, ПодменюДействия, ПолеВводаНомераДубль);
        КонецЕсли;

    //конец проверки Если ФормаОбъекта.ТолькоПросмотр тогда

    конецесли;

    //конец изменений

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

Это все изменения.

Стандартный функционал сохраняется. Изменений минимум. Легко поддерживать (переносить) при обновление.

Время на прочтение
7 мин

Количество просмотров 35K

Наверное, одной из самых непростых и скучных задач при проектировании обычной формы в «1С: Предприятии» является управление доступностью элементов в зависимости от того или иного набора данных. Мне встречалось очень много решений: от процедуры вроде УстановитьВидимостьДоступность() с включением в нее всех правил для элементов управления, до совершенно хаотично разбросанных по всему коду обращений к указанным свойствам.

Признаюсь честно, я тоже перепробовал различные способы, но в один прекрасный момент дошел до очень удобного и логичного (как мне кажется), который и будет описан в этом посте.

Все началось с того, что поиск решения для этой задачи натолкнул меня на статью из «Методик разработки» под названием «Организация управления доступом в форме». Ключевым моментом в статье является то, что управление доступом сосредотачивается в одной лишь процедуре УстановитьДоступ(). И если необходимо изменить состояния элементов управления, вызывается только эта процедура. Сама процедура не занимается определением доступа, а работает с данными из списков, которые формируются следующими функциями:

ПолучитьСписокУправлениеВидимостью();
ПолучитьСписокУправлениеДоступностью();
ПолучитьСписокУправлениеТолькоПросмотр();
ПолучитьСписокДоступаКУправлениюВидимостью();

То есть сами условия доступности устанавливаются в этих функциях, а уже процедура УстановитьДоступ() присваивает соответствующим свойствам элементов управления эти заранее установленные значения.

Я разделил код на три составляющих. Первая — это методы, которые как раз выполняют изменения значений свойств доступности элементов формы. Вынес их в общий модуль. Назовем его условно УправлениеДоступом. Ниже расположен код, который размещается в нем. Я постарался максимально прокомментировать малопонятные участки кода.

Исходный код общего модуля УправлениеДоступом

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ УПРАВЛЕНИЯ ДОСТУПОМ К ЭЛЕМЕНТАМ ФОРМЫ

Функция ПолучитьСвойствоЭлементаФормы(Знач ЭлементУправления, Знач ИмяСвойства)

    Результат = Неопределено;

    Попытка
        Результат = ЭлементУправления[ИмяСвойства];
    Исключение

    КонецПопытки;

    Возврат Результат;

КонецФункции

Функция ПолучитьЭлементУправленияПоИмени(Форма, Знач ИмяЭлемента)

    // Переменная хранит результат работы функции
    ЭлементУправления = Неопределено;

    ПозицияТочки = Найти(ИмяЭлемента, ".");

    // Если имя элемента состоит из пути, например "Товары.Колонки.Номенклатура",
    // разбиваем на составляющие и проходим путь до конечного элемента.
    Если ПозицияТочки > 0 Тогда
        // Получаем имя основного элемента управления
        ЧастьИмени  = Лев(ИмяЭлемента, ПозицияТочки - 1);

        // Исключаем полученную часть из основного имени
        ИмяЭлемента = Сред(ИмяЭлемента, ПозицияТочки + 1);

        Элемент = ПолучитьСвойствоЭлементаФормы(Форма.ЭлементыФормы, ЧастьИмени);

        Если Элемент <> Неопределено Тогда
            ПозицияТочки = Найти(ИмяЭлемента, ".");

            Пока ПозицияТочки > 0 Цикл
                ЧастьИмени  = Лев(ИмяЭлемента, ПозицияТочки - 1);
                ИмяЭлемента = Сред(ИмяЭлемента, ПозицияТочки + 1);

                Элемент = ПолучитьСвойствоЭлементаФормы(Элемент, ЧастьИмени);
                Если Элемент = Неопределено Тогда
                    Возврат Неопределено;
                КонецЕсли;
  
                ПозицияТочки = Найти(ИмяЭлемента, ".");
            КонецЦикла;

            Элемент = ПолучитьСвойствоЭлементаФормы(Элемент, ИмяЭлемента);
            ЭлементУправления = Элемент;
        КонецЕсли;

    Иначе
        ЭлементУправления = Форма.ЭлементыФормы[ИмяЭлемента];
    КонецЕсли;

    Возврат ЭлементУправления;

КонецФункции

Процедура УстановитьДоступ(Форма) Экспорт

    СписокУправлениеВидимостью = Форма.ПолучитьСписокУправлениеВидимостью();
    Для Каждого ЭлементСписка Из СписокУправлениеВидимостью Цикл
        ЭлементУправления = ПолучитьЭлементУправленияПоИмени(Форма, ЭлементСписка.Представление);

        Если ТипЗнч(ЭлементУправления) = Тип("КолонкаТабличногоПоля") Тогда
            Если ЭлементУправления.ИзменятьВидимость Тогда
                ЭлементУправления.Видимость = ЭлементСписка.Значение;
            Иначе
                ЭлементУправления.ИзменятьВидимость = Истина;
                ЭлементУправления.Видимость         = ЭлементСписка.Значение;
                ЭлементУправления.ИзменятьВидимость = Ложь;
            КонецЕсли;
        Иначе
            ЭлементУправления.Видимость = ЭлементСписка.Значение;
        КонецЕсли;
    КонецЦикла;

    СписокУправлениеДоступностью = Форма.ПолучитьСписокУправлениеДоступностью();
    Для Каждого ЭлементСписка Из СписокУправлениеДоступностью Цикл
        ЭлементУправления = ПолучитьЭлементУправленияПоИмени(Форма, ЭлементСписка.Представление);
        ЭлементУправления.Доступность = ЭлементСписка.Значение;
    КонецЦикла;

    СписокУправлениеТолькоПросмотр = Форма.ПолучитьСписокУправлениеТолькоПросмотр();
    Для Каждого ЭлементСписка Из СписокУправлениеТолькоПросмотр Цикл
        ЭлементУправления = ПолучитьЭлементУправленияПоИмени(Форма, ЭлементСписка.Представление);
        ЭлементУправления.ТолькоПросмотр = ЭлементСписка.Значение;
    КонецЦикла;

    СписокУправлениеРедактированиемТекста = Форма.ПолучитьСписокУправлениеРедактированиемТекста();
    Для Каждого ЭлементСписка Из СписокУправлениеРедактированиемТекста Цикл
        ЭлементУправления = ПолучитьЭлементУправленияПоИмени(Форма, ЭлементСписка.Представление);
        ЭлементУправления.РедактированиеТекста = ЭлементСписка.Значение;
    КонецЦикла;

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

Например, у нас есть табличное поле Товары, в котором присутствует колонка СкидкаПоДисконтнойКарте. Колонка видна только тогда, когда дисконтная карта проставлена в документ, т.е. реквизит ДисконтнаяКарта является заполненным. Соответственно, условие списока управления видимостью для колонки СкидкаПоДисконтнойКарте будет следующим:

Вторая часть когда — это функции, которые отвечают за формирование списков доступности. Они располагаются непосредственно в форме и являются экспортируемыми. Я немного отошел от стандарта 1С и заменил метод ПолучитьСписокДоступаКУправлениюВидимостью() на ПолучитьСписокУправлениеРедактированиемТекста(). Просто мне кажется, что так удобнее и логичнее. Ниже приведен шаблон кода с этими функциями:

Исходный код функций формирования списков управления доступом

////////////////////////////////////////////////////////////////////////////////
// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

Функция ПолучитьСписокУправлениеВидимостью() Экспорт
  
    СписокУправлениеВидимостью = Новый СписокЗначений;
  
    Возврат СписокУправлениеВидимостью;
  
КонецФункции

Функция ПолучитьСписокУправлениеДоступностью() Экспорт
  
    СписокУправлениеДоступностью = Новый СписокЗначений;
  
    Возврат СписокУправлениеДоступностью;
  
КонецФункции

Функция ПолучитьСписокУправлениеРедактированиемТекста() Экспорт
  
    СписокУправлениеРедактированиемТекста = Новый СписокЗначений;
  
    Возврат СписокУправлениеРедактированиемТекста;
  
КонецФункции  

Функция ПолучитьСписокУправлениеТолькоПросмотр() Экспорт
  
    СписокУправлениеТолькоПросмотр = Новый СписокЗначений;
  
    Возврат СписокУправлениеТолькоПросмотр;
  
КонецФункции

И, наконец, третья часть — это процедура УстановитьДоступ(), которая тоже расположена в модуле формы. Именно эту процедуру мы вызываем в любом месте кода нашей формы, чтобы переопределить доступность элементов формы.

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ

Процедура УстановитьДоступ()

    УправлениеДоступом.УстановитьДоступ(ЭтаФорма);

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

Чтобы было все нагляднее и понятнее, давайте рассмотрим следующий пример. Допустим, что у нас есть форма. На ней расположен флажок НаличнаяПродажа (булево), флажок ПробиватьФискальныйЧек (булево), поле ввода ДисконтнаяКарта (ссылка на справочник ДисконтныеКарты), поле ввода Комментарий (строка) и табличное поле Товары. Все связаны с одноименными реквизитами. У табличного поля есть колонка с именем СкидкаПоДисконтнойКарте (число). Кроме этого, есть командная панель ОсновныеДействияФормы, на которой размещена кнопка ПробитьЧек. Определим некоторые условия:

  1. Если установлен флажок НаличнаяПродажа, флажок ПробиватьФискальныйЧек видим и поле ДисконтнаяКарта доступно для ввода.
  2. Если стоит флажок ПробиватьФискальныйЧек, кнопка ПробитьЧек доступна.
  3. Если поле ДисконтнаяКарта заполнено, то видна колонка СкидкаПоДисконтнойКарте табличной части Товары и поле ввода Комментарий доступно для редактирования.

Тогда для нашего примера функции определения списков примут следующий вид:

Исходный код функций для примера

Функция ПолучитьСписокУправлениеВидимостью() Экспорт

    СписокУправлениеВидимостью = Новый СписокЗначений;

    ЗначениеВидимость = НаличнаяПродажа;
    СписокУправлениеВидимостью.Добавить(ЗначениеВидимость, "ПробиватьФискальныйЧек");

    ЗначениеВидимость = НЕ ДисконтнаяКарта.Пустая();
    СписокУправлениеВидимостью.Добавить(ЗначениеВидимость, "Товары.Колонки.СкидкаПоДисконтнойКарте");

    Возврат СписокУправлениеВидимостью;

КонецФункции

Функция ПолучитьСписокУправлениеДоступностью() Экспорт

    СписокУправлениеДоступностью = Новый СписокЗначений;

    ЗначениеДоступность = ПробиватьФискальныйЧек;
    СписокУправлениеДоступностью.Добавить(ЗначениеДоступность, "ОсновныеДействияФормы.Кнопки.ПробитьЧек");

    Возврат СписокУправлениеДоступностью;

КонецФункции

Функция ПолучитьСписокУправлениеРедактированиемТекста() Экспорт

    СписокУправлениеРедактированиемТекста = Новый СписокЗначений;

    ЗначениеРедактированиеТекста = НаличнаяПродажа И НЕ ДисконтнаяКарта.Пустая();
    СписокУправлениеРедактированиемТекста.Добавить(ЗначениеРедактированиеТекста, "Комментарий");

    Возврат СписокУправлениеРедактированиемТекста;

КонецФункции

Функция ПолучитьСписокУправлениеТолькоПросмотр() Экспорт

    СписокУправлениеТолькоПросмотр = Новый СписокЗначений;

    ЗначениеТолькоПросмотр = НаличнаяПродажа;
    СписокУправлениеТолькоПросмотр.Добавить(ЗначениеТолькоПросмотр, "ДисконтнаяКарта");

    Возврат СписокУправлениеТолькоПросмотр;

КонецФункции

Теперь достаточно вызвать процедуру формы УстановитьДоступ(), и мы получим то состояние элементов, которые задали.

Хочется выделить следующий момент. В списки можно можно добавлять пути к элементам формы. Например, для вышеприведенного примера с таблицей Товары имя элемента определяем как «Товары.Колонки.СкидкаПоДисконтнойКарте». Или путь к кнопке ПробитьЧек. Можно использовать множественные вложения, вроде «ИмяКоманднойПанели.Кнопки.ИмяПодменю.Кнопки.ИмяКнопки».

Предлагаемый вариант не конечный. Можно внести множество мелких дополнений, вроде указаний, какие списки обрабатывать, а какие нет. Но это уже зависит от точечных потребностей разработчика.

Спасибо за внимание.

Понравилась статья? Поделить с друзьями:
  • Boxberry измайловский бульвар 43 часы работы
  • 1с удаление периодических реквизитов на дату
  • Яндекс тариф бизнес требования к автомобилю
  • Boxberry проспект вернадского 39 часы работы
  • 1с узнать значение дополнительного реквизита