Оптимальное изменение видимости элементов на управляемой форме
Флаг «Видимость»
В предыдущей статье была описана причина, по которой изменение видимости элементов на управляемой форме не является хорошим способом перестроения интерфейса, управлением доступности элементов формы для пользователей.
Сегодня мы рассмотрим альтернативный способ изменения видимости элементов управляемой формы, который не инициирует обращение к серверу. Тем самым мы сможем сэкономить трафик и увличить быстродействие программы.
Все на клиенте
Вся суть описанного ниже способа заключается в изменении видимости / доступности элемента формы только на клиентской стороне, без обращений к серверу. Флаг «Видимость» нам не подойдет. Обратимся к другим возможностям.
Недоступны элемент принимает следующий вид:
При изменении доступности элемента обращений к серверу для перерисовки формы, как это было с флагом «Видимость», не происходит.
Но что, если нам нужно полностью скрыть элемент формы из вида? Продемонстрируем как это сделать на элементе динамического списка представленой выше формы. Добавим на форму группу элементов с видом «Страницы» и две подчиненных группы с видом «Страница». Элемент динамического списка перенесем в одну из них.
На пустую страницу, где нет динамического списка, добавим декорацию вида «Надпись», чтобы страница была не пустой и на нее можно было переключаться. У группы страниц свойство «Отображение страниц» установим в ЛОЖЬ, чтобы закладки были не видны.
Теперь в команде «Скрыть динамический список» напишем следующий обработчик:
Команда переключает страницы. При переключении страниц обращений к серверу не происходит, все выполняется на стороне клиента. При этом если мы переключимся на страницу «Страница2», где был добавлена лишь декорация надписи, то форма будет выглядеть как на скриншоте ниже:
Таким образом, мы скрыли элемент управляемой формы оптимальным образом без обращений к серверу, контекстных вызовов сервера. Следовательно, сэкономили объем передаваемого трафика и ускорили работу программы.
Используйте возможности управляемых форм правильно!
Видимость, доступность элементов форм (управляемые формы)
В разделе «Администрирование» добавляется пункт «ВДЭФ настройки».
В список форм добавлены формы Справочников, Документов, Регистров сведений, Обработок и бизнеспроцессов с задачами.
В список ролей все возможные роли из основной конфигурации и расширений(если такие есть).
1. Выбираем форму, далее подгружаются все элементы формы.
2. Выбираем необходимый элемент.
3. Из списка ролей выбираем роль, по доступности которой правило не работает (допустим, ПолныеПрава, чтобы у всех кроме администраторов.
4. Устанавливаем флажок, Видимость, Доступность, ТолькоПросмотр.
Также, если будет заполнено поле Произвольный код, то он выполнится после всех выбранных действий.
На каждый элемент формы создаётся отдельная строка регистра.
Есть небольшие баги(допустим, правило которое создаётся, применяется так же и на форму записи ВДЭФ_Настройки, т.к. форма на которую «вешаются» ограничения получается через «ПолучитьФорму()». Следовательно, может получиться так, что правило, которое вы создали не откроется на редактирование, его достаточно будет удалить и создать заново), которые, возможно, исправлю, но они мало влияют на суть.
UPD: Если какая-то форма не работает, значит в модуле этой формы, в обработчике ПриСозданииНаСервере не добавлено:
Соответственно, чтобы форма работала, можно добавить её в это же расширение через конфигуратор, и создать ПриСозданииНаСервере, выбрать «После» и дописывать код который написан выше.
Хоть механизм и типовой, но не на всех формах добавлен.
Проверено на конфигурации Комплексная Автоматизация 2 (2.4.9.70), Технологическая Платформа 8.3.14.1854 и 8.3.15.1565. Должно работать на любой конфигурации где применяется типовой функционал модификации конфигурации(УТ 11, КА 2 и ERP 2).
Отбор на формах и отключение видимости ненужных групп на управляемой форме в 1С
В данной статье я хочу рассказать о отборе на формах в режимах Предприятия и Конфигуратора и отключение видимости ненужных групп на управляемой форме в 1С.
Видимостью элементов можно управлять программно через свойство Видимость при открытии формы:
В случае если нужно скрыть некоторые строки списка с определенным значением нужно работать через отбор.
Открыть форму с отбором можно для любых объектов и несколькими способами в режиме 1С:Конфигуратор, рассмотрим на примере регистра накопления “Оплата счетов”:
Первый способ работает при открытии формы.
У формы есть параметр Отбор, который является структурой, где:
Ключ структуры – имя параметра,
Значение – значение параметра формы или как в данном случае предопределенное значение, как в данном случае. Если отбор берется со значением элемента формы, то имя элемента должно совпадать с именем параметра структуры.
Если нужно открыть форму без отбора, но скрыть несколько элементов можно это реализовать следующим образом:
Второй способ заключается в добавлении кода в обработчике события формы списка оплата счетов ПриСозданииНаСервере
Для этого в нужной процедуре открываем форму
и уже в модуле открываемой формы
Данный метод имеет больше возможностей для отбора по сравнению с предыдущим, потому, что ВидСравнения у отбора можно задавать не только Равно, но и Больше, Меньше и т.п.
ВидСравненияКомпоновкиДанных определяет набор видов сравнения, которые могут быть использованы в условиях отбора. Но стоит учитывать, что на мобильной платформе игнорируются следующие виды сравнения: НачинаетсяС, НеНачинаетсяС, СоответствуетШаблону, НеСоответствуетШаблону.
РежимОтображенияЭлементаНастройкиКомпоновкиДанных определяет режим отображения.
Используется при отображении списка в зависимости от режима отображения табличного поля.
Кроме того, если элемент принадлежит пользовательскому отбору, свойство используется при формировании начального состава пользовательского отбора и при применении пользовательского отбора к базовому.
Если использовать такой способ – то форма будет открываться всегда с таким отбором – независимо от места вызова формы.
РежимОтображенияЭлементаНастройкиКомпоновкиДанных содержит режимы отображения элемента настройки компоновки данных:
Авто – значение режима нужно получать из основных настроек,
БыстрыйДоступ – этот элемент настройки предназначен для режима быстрого доступа. Он будет доступен в табличном поле, если у расширения табличного поля отбора свойство РежимОтображения будет установлено в значение Все или БыстрыйДоступ,
Недоступный – этот элемент настройки не предназначен для изменения в составе пользовательской настройки,
Обычный – указывает на обычный режим отображения. Он будет доступен в табличном поле, если у расширения табличного поля отбора, свойство РежимОтображения будет установлено в значение Все.
Третий способ – возможность поместить условие отбора в произвольный запрос, выбирающий данные для динамического списка.
Для этого в форме списка создадим команду и соответствующую ей кнопку Оплата счетов.
В обработчике команды пишем следующее:
ТекущаяСтрока – это строка динамического списка, на которую будет установлен курсор после открытия формы. В качестве значения для параметра используются значения ссылок на объекты, которые содержит главная таблица динамического списка.
В результате мы получаем форму списка оплаченных счетов и с отбором по параметру ФильтрПоНДС, который передаем на форму, где значение параметра – это ссылка на текущий элемент в списке счетов и открываем форму с этим параметром.
Затем создадим форму списка оплаченных счетов и создадим реквизит формы ФильтрПоНДС, который мы будем использовать в качестве параметра формы при ее открытии. Теперь откроем палитру свойств основного реквизита формы Счета. Установим флаг ПроизвольныйЗапрос и в строке Настройка списка нажмем Открыть.
Создаем запрос со следующим текстом запроса, где указываем передаваемый параметр, по которому делаем отбор:
Имя параметра в запросе может отличаться, так как сама передача данных будет в процедуре ПриОткрытии().
В этом обработчике событий формы списка внесем код установки значения параметра запроса ФильтрПоНДС,
“ФильтрПоТовару” – параметр из запроса динамического списка,
ФильтрПоТовару – ссылка на текущую строку в списке оплата счетов,
Список.Параметры – это список параметров запроса динамического списка для реквизита Счета,
УстановитьЗначениеПараметра – устанавливает значение параметра и включает свойство Использование. Если параметр с указанным именем не найден, будет вызвано исключение.
Таким образом по нажатию на кнопку Оплата счетов в форме списка,результатом на форме будет список счетов с отбором по Ставке НДС с тем же значением, что и в выделенной в строке в списке счетов.
Настройка отбора в режиме 1С:Предприятие
В режиме Предприятия также можно настроить отбор. Пользователь может самостоятельно настроить состав и расположение колонок в списке, отборы документов и цвет фона строк и шрифта по определенным условиям.
Рассмотрим настройку списка документов на примере регистра накопления “Книга продаж”.
Для настройки состава и расположения колонок: в правой верхней части списка документов по кнопке “Еще” выберите “Настроить список”, а также есть кнопка “Изменить форму”
В окне “Настройка формы” по кнопке “Еще”можно изменить расположение колонок по кнопкам с синими стрелочками “вверх-вниз” (“вверх” – колонка сдвинется вверх, “вниз” – колонка сдвинется вправо), удалить колонку (по кнопке с красным крестиком), скрыть или установить видимость колонки.
Для настройки отборов нужных документов: на панели настроек списка документов доступны отборы по: активности, дате оплаты, организации, ставка НДС, сумма НДС, счет фактура и т. д.
Если нет нужного фильтра, можно настроить свой: по кнопке “Еще” на форме списка выберите “Настроить список”, на закладке “Отбор” настройте отбор по нужному полю
Гибкое управление свойствами доступности элементов управления в обычных формах 1С: Предприятия 8.х
Наверное, одной из самых непростых и скучных задач при проектировании обычной формы в «1С: Предприятии» является управление доступностью элементов в зависимости от того или иного набора данных. Мне встречалось очень много решений: от процедуры вроде УстановитьВидимостьДоступность() с включением в нее всех правил для элементов управления, до совершенно хаотично разбросанных по всему коду обращений к указанным свойствам.
Признаюсь честно, я тоже перепробовал различные способы, но в один прекрасный момент дошел до очень удобного и логичного (как мне кажется), который и будет описан в этом посте.
Все началось с того, что поиск решения для этой задачи натолкнул меня на статью из «Методик разработки» под названием «Организация управления доступом в форме». Ключевым моментом в статье является то, что управление доступом сосредотачивается в одной лишь процедуре УстановитьДоступ(). И если необходимо изменить состояния элементов управления, вызывается только эта процедура. Сама процедура не занимается определением доступа, а работает с данными из списков, которые формируются следующими функциями:
То есть сами условия доступности устанавливаются в этих функциях, а уже процедура УстановитьДоступ() присваивает соответствующим свойствам элементов управления эти заранее установленные значения.
Я разделил код на три составляющих. Первая — это методы, которые как раз выполняют изменения значений свойств доступности элементов формы. Вынес их в общий модуль. Назовем его условно УправлениеДоступом. Ниже расположен код, который размещается в нем. Я постарался максимально прокомментировать малопонятные участки кода.
Например, у нас есть табличное поле Товары, в котором присутствует колонка СкидкаПоДисконтнойКарте. Колонка видна только тогда, когда дисконтная карта проставлена в документ, т.е. реквизит ДисконтнаяКарта является заполненным. Соответственно, условие списока управления видимостью для колонки СкидкаПоДисконтнойКарте будет следующим:
Вторая часть когда — это функции, которые отвечают за формирование списков доступности. Они располагаются непосредственно в форме и являются экспортируемыми. Я немного отошел от стандарта 1С и заменил метод ПолучитьСписокДоступаКУправлениюВидимостью() на ПолучитьСписокУправлениеРедактированиемТекста(). Просто мне кажется, что так удобнее и логичнее. Ниже приведен шаблон кода с этими функциями:
И, наконец, третья часть — это процедура УстановитьДоступ(), которая тоже расположена в модуле формы. Именно эту процедуру мы вызываем в любом месте кода нашей формы, чтобы переопределить доступность элементов формы.
Чтобы было все нагляднее и понятнее, давайте рассмотрим следующий пример. Допустим, что у нас есть форма. На ней расположен флажок НаличнаяПродажа (булево), флажок ПробиватьФискальныйЧек (булево), поле ввода ДисконтнаяКарта (ссылка на справочник ДисконтныеКарты), поле ввода Комментарий (строка) и табличное поле Товары. Все связаны с одноименными реквизитами. У табличного поля есть колонка с именем СкидкаПоДисконтнойКарте (число). Кроме этого, есть командная панель ОсновныеДействияФормы, на которой размещена кнопка ПробитьЧек. Определим некоторые условия:
Теперь достаточно вызвать процедуру формы УстановитьДоступ(), и мы получим то состояние элементов, которые задали.
Хочется выделить следующий момент. В списки можно можно добавлять пути к элементам формы. Например, для вышеприведенного примера с таблицей Товары имя элемента определяем как «Товары.Колонки.СкидкаПоДисконтнойКарте». Или путь к кнопке ПробитьЧек. Можно использовать множественные вложения, вроде «ИмяКоманднойПанели.Кнопки.ИмяПодменю.Кнопки.ИмяКнопки».
Предлагаемый вариант не конечный. Можно внести множество мелких дополнений, вроде указаний, какие списки обрабатывать, а какие нет. Но это уже зависит от точечных потребностей разработчика.
Условное оформление управляемой формы в 1С
Условное оформление формы в 1с 8 служит для управления видимостью, доступностью, цветом элементов таблиц управляемой формы (а также оно используется в СКД и динамических списках). Удобство его использования заключается в том, что вы один раз задаете условие по которому должно меняться оформление вашей формы. После этого при работе пользователя с формой, при срабатывании условия оформление будет меняться автоматически. Не нужно использовать события формы и писать лишний код.
Следует заменить, что условное оформление форм работает только в конфигурациях использующих управляемое приложение (Бухгалтерия 3.0, ЗУП 3.0/3.1, Управление торговлей 11 и т.п.)
Условное оформление 1с. Интерактивная настройка
Еще один плюс условного оформления — его можно настроить не написав ни строчки кода. Для этого в форме необходимо:
Обратите внимание, что условное оформление действует только на колонки таблиц формы. Другие элементы формы вы тоже можете выбрать в колонке Оформляемые поля, но это не даст никакого результата.
Условное оформление формы. Пример интерактивной настройки
Для примера мной была написана простейшая обработка, на формы которой добавлен реквизит с типом ТаблицаЗначений, с тремя колонками. А также три реквизита с типом булево. Скачать обработку можно Здесь.
Форма обработки выглядит так:
Настроим следующее условное оформление данной формы: при установке реквизита СкрытьКолонку1 в значение Истина, в таблице форме скрывать реквизит Колонка1.
Условное оформление 8.3. Пример программной настройки
Используя ту же внешнюю обработку, что и в предыдущем пункте, приведем пример программной настройки условного оформления. Необходимо сделать следующее: при установке реквизита ПоменятьЦветКолонки2 в значение Истина, в таблице формы раскрашивать фон Колонки 2, при установке реквизита СделатьНедоступнойКолонку3 в значение Истина, в таблице формы делать недоступным реквизит Колонка3.
В модуле формы создадим серверную процедуру, назовем ее УстановитьУсловноеОформление и сразу же допишем ее вызов в процедуре ПриСозданииНаСервере.
Весь следующий код будем писать в процедуре УстановитьУсловноеОформление. Нам необходимо добавить новый элемент условного оформления формы, для этого используем стандартную коллекцию формы УсловноеОформление.
Также как и в интерактивном варианте, нам необходимо в созданном элементе заполнить оформления, условия и поля. Для того чтобы указать поле мы должны создать поле компоновки данных с именем колонки на которую будет распространяться оформление. Если полей несколько, добавляем нужное количество полей компоновки данных. Для отборов создаем элементы отбора компоновки данных и заполняем для них левое значение, правое значение и вид сравнения. Для того, чтобы задать нужные оформления заполним значения параметров доступных оформлений. В нашем примере получается следующий код:
Таким образом мы создали оформление для второй колонки таблицы. Для третьей колонки оно делается аналогичным образом, поэтому не будем на нем подробно останавливаться. Итоговый код процедуры УстановитьУсловноеОформление будет выглядеть следующим образом:
Напомню, что скачать обработку написанную на основе разобранных примеров можно Здесь.