1. Модификации управляемых форм
Подсистема модификации управляемых форм позволяет изменять свойства формы с помощью макета, который создается для каждой формы объекта метаданных или общего макета для общих форм. Для использования подсистемы необходимо перенести в свою конфигурацию модуль: ОбщийМодуль.МодификацияУправляемыхФорм Для применения к форме макета изменений, необходимо сделать вызов МодификацияУправляемыхФорм.ПрименитьМакетИзменений(Форма) перед первым использованием добавленных объектов формы. Если в конфигурации предусмотрена процедура общего модуля, которая вызывается из всех форм (например ОбщийМодуль.МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере для конфигурации 1C:ERP) – следует добавить вызов в нее, чтобы не добавлять во все модифицируемые формы. Если для формы не предусмотрен вызов общей процедуры или вызов происходит слишком поздно - необходимо добавить следующий фрагмент в раздел инициализации модуля формы (после определения всех процедур и фунций):
#Если Сервер Тогда
МодификацияУправляемыхФорм.ПрименитьМакетИзменений(ЭтаФорма);
#КонецЕсли
Подсистема имеет защиту от повторного вызова, поэтому можно не беспокоиться о возможном вызове процедуры из общего обработчика
1.1. Формат описания изменений формы
Пример можно посмотреть в макете: Документ.Приход.Макет.МОД_Модификация_ФормаДокумента
Макет изменений состоит из 3-х областей, любая из которых не является обязательной, порядок расположения также не важен. Рекомендуется для каждой области использовать свой формат строк.
- Реквизиты – описывается добавление новых или корректировка существующих реквизитов формы. К добавленным реквизитам в модуле формы нужно обращаться с помощью ЭтаФорма.<имя реквизита>
- Колонки
- Имя – имя нового или существующего реквизита. Для имени может использоваться несколько подряд идущих колонок с таким именем, либо с объединенной шапкой. С помощью нескольких колонок имени можно добавлять колонки в коллекции данных формы.
- ОписаниеТипов(ТипЗначения) – тип значения нового реквизита
- <описание имени свойства> - свойство реквизита
- Описание каждого реквизита выполняется в отдельной строке. В ячейках указывается <описание значения свойства>
- Колонки
- Команды – описывается добавление новых или корректировка существующих команд формы
- Колонки
- Имя – имя новой или существующей команды
- <описание имени свойства> - свойство команды
- Описание каждой команды выполняется в отдельной строке. В ячейках указывается <описание значение свойства>
- Колонки
- Элементы – описывается добавление новых или корректировка существующих команд формы
- Колонки
- Имя – имя нового или существующего элемента. Если Имя = Форма, колонки описывают изменения свойств формы.
- Для новых элементов типа ПолеФормы вид поля формы зависит от типа реквизита, с которым связан элемент
- Для реквизита с единственным типом «Булево»: Вид = ВидПоляФормы.ПолеФлажка
- В остальных случаях Вид = ВидПоляФормы.ПолеВвода
- Для новых элементов типа ГруппаФормы, которые расположены в других группах или на страницах по-умолчанию устанавливаются следующие значения свойств: Вид = ВидГруппыФормы.ОбычнаяГруппа, Отображение = ОтображениеОбычнойГруппы.Нет, ОтображатьЗаголовок = Ложь
- Для новых элементов типа ПолеФормы вид поля формы зависит от типа реквизита, с которым связан элемент
- Тип – имя типа элемента формы
- ПутьКДанным – заполнение является обязательным для элементов типа «ПолеФормы». При необходимости вывода на форму полей ссылочного реквизита с вложенностью более 1 необходимо свойство «ПутьКДанным» указать в следующем формате <путь к реквизиту>/<путь к данным реквизита>
- <описание имени свойства> - свойство элемента
- Имя – имя нового или существующего элемента. Если Имя = Форма, колонки описывают изменения свойств формы.
- Описание каждого элемента выполняется в отдельной строке. В ячейках указывается <описание значения свойства>
- Колонки
Допускаются следующие варианты <описание имени свойства>:
- <имя свойства> - в качестве значения свойства используется строка из ячейки.
- Если в ячейке есть символ %, то он заменяется на значение ячейки родителя
- (<имя свойства>) – в качестве значения свойства устанавливается результат выражения из ячейки, выполняемого с помощью функции Вычислить()
- <имя конструктора>(<имя свойства>) – для вычисления значения свойства используется специальный конструктор. Поддерживаются следующие конструкторы
- ОписаниеТипов – в ячейке перечисляются типы через запятую, также как они передаются в конструктор объекта ОписаниеТипов. Для примитивных типов поддерживается указание квалификаторов
- Число(<длина>, <точность>, <имя значения перечисления ДопустимаяДлина>)
- Строка(<длина>, <имя значения перечисления ДопустимаяДлина >)
- Дата(<имя значения перечисления ЧастиДаты>)
- ОпределяемыйТип - в ячейке указывается имя определяемого типа
- ПараметрыВыбора – в ячейке определяется список параметров выбора, разделенный запятыми <имя параметра выбора>(<значение параметра выбора>), где <значение параметра выбора> это вычисляемое выражение на языке 1С
- Если <имя параметра выбора> = "*" добавляются параметры выбора, заданные в конфигураторе, и с помощью префиксов "+" и "-" можно добавить новые / удалить существующие
- СвязиПараметровВыбора – в ячейке определяется список параметров выбора, разделенный запятыми <имя параметра выбора>(<путь к данным формы>).
- Если <имя параметра выбора> = "*" добавляются связи параметров выбора, заданные в конфигураторе, и с помощью префиксов "+" и "-" можно добавить новые / удалить существующие
- ОбработатьТекст - в ячейке указывается имя шаблона преобразования текущего значения свойства. Шаблон находится в области макета изменений с именем ОТ_<имя шаблона>, при этом если в имени шаблона есть точка (.), она заменяется на подчеркивание (_). Если в ячейке указано %, то имя шаблона формируется как ИмяСвойства + ИмяШаблона. Если с ячейке есть %, то % заменяется на ИмяСвойства. Первая строка шаблона отводится под заголовок и состоит из следующих колонок:
- Маркер - строка поиска. Если в строке поиска указаны символы ## - строка шаблона используется для вставки, при этом ## определяет место вставки. В противном случае строка шаблона используется для замены
- Текст - строка замены. В режиме вставки заменит символы ##, в режиме замены заменит Маркер
- Счетчик - для режима замены определяет сколько значений необходимо искать. Если не заполнено выполняется поиск одного значения.
- ОписаниеТипов – в ячейке перечисляются типы через запятую, также как они передаются в конструктор объекта ОписаниеТипов. Для примитивных типов поддерживается указание квалификаторов
- <имя операции>() – необходимо выполнить операцию над объектом формы. Поддерживаются следующие операции:
- МестоРасположения – в ячейке задается имя элемента формы, перед которым необходимо разместить текущий элемент. Родитель указанного элемента должен находится в одной из подгрупп родителя текущего элемента
- Родитель – в ячейке задается имя элемента, которые необходимо установить в качестве родителя для текущего элемента. Новый родитель должен находится в одной из подгрупп родителя текущего элемента. Игнорируется если для текущего элемента указана операция МестоРасположения
- Вместо - в ячейке задается имя элемента формы, вместо которого необходимо добавить новый. Чаще всего это требуется из-за невозможности изменить некоторые свойства элемента формы после создания. Новый элемент будет добавлен перед заменяемым, его свойства буду заполнены свойствами заменяемого элемента, а подчиненные элементы перенесены
- <имя перечисления>(<имя свойства>) – строка из ячейки используется как имя значения системного перечисления <имя перечисления>
- [<имя действия>] – в ячейке указывается имя процедуры, которая устанавливается для действия <имя действия>.
- Если в ячейке установлено значение %, оно заменяется на <имя элемента><имядействия>.
- Если в ячейке есть значение % оно заменяется на <имя действия> Если <имя свойства> начинается с точки (.), то описывается изменение свойств значения реквизита формы. Например для динамического списка можно менять свойства объекта ДинамическийСписок
1.2. Существующие ограничения:
- невозможно изменить свойства реквизитов формы добавленных в конфигураторе. В том числе такое важное свойство как ТипЗначения
- невозможность назначить источник действий для командной панели. Из-за этого для форматированного документа необходимо добавлять в форму конфигуратора командную панель, реквизит форматированного документа и элемент формы, который связан с реквизитом
2. Ограничение изменения реквизитов управляемой формы
Подсистема предназначена для ограничения измененения реквизитов управляемой формы на основании других реквизитов. Разные ограничивать доступ к реквизитам в зависимости от статусов или функциональных ролей. Ограничение рекомендуется делать при первом открытии формы и после каждой записи, т.к. нет смысла ограничивать реквизиты внутри одного сеанса работы с формой.
Для работы с механизмом необходимо добавить следующий фрагмент в раздел инициализации формы (после всех процедур и функций)
#Если Сервер Тогда
МодификацияУправляемыхФорм.ИнициализироватьОграничениеИзмененияРеквизитов(ЭтаФорма);
#КонецЕсли
Ограничение выполняется с помощью вызова на клиенте:
МодификацияУправляемыхФорм.ОграничитьИзменениеРеквизитов(ЭтаФорма, <описание ограничений>)
По-умолчанию, если описание ограничений не указано, будут ограничен доступ ко всем элементам формы, связанных с данными объекта или реквизитами. В описании ограничений можно указать отклонение от этого правила с помощью настройки доступа к отдельным уровням дерева элементов. Например, для ограничения доступа ко всем элементам кроме поля "Утвержден" необходимо выполнить
МодификацияУправляемыхФорм.ОграничитьИзменениеРеквизитов(ЭтаФорма, "Утвержден")
По-умолчанию кнопки формы связанные с командами, у которых не установлен признак "ИзменяетСохраняемыеДанные" ограничиваться не будут, для их ограничения необходимо явно указать запрет, либо на кнопку, либо на все командную панель, например:
МодификацияУправляемыхФорм.ОграничитьИзменениеРеквизитов(ЭтаФорма, "-ФормаКоманднаяПанель.*")
Для предоставления доступа ко всем элементам таблицы "Товары", сроме колонки "Цена" цена необходимо выполнить
МодификацияУправляемыхФорм.ОграничитьИзменениеРеквизитов(ЭтаФорма, "Товары.*,-ТоварыЦена")
Для предоставления доступа только к таблице "Проверка" необходимо выполнить
МодификацияУправляемыхФорм.ОграничитьИзменениеРеквизитов(ЭтаФорма, "*,-Проверка")
В общем случае каждый элемент описания ограничений имеет следующий формат (<префикс>)<имя элемента>(.*) где <префикс> - если не указан или "+" - предоставить доступ, если "-" - ограничить доступ .* означает, что описание ограничения влияет в том числе на подчиненные элементы, при этом * означает все элементы Ограничение, установленное на более высоком уровне дерева элементов, имеет приоритет ниже, чем у ограничения, установленных на более низком уровне уровне.
При необходимости восстановить ограничение доступа, измененное, например, в обработчиках разрешенных для редактирования реквизитов необходимо выполнить на клиенте или на сервере
МодификацияУправляемыхФорм.ВосстановитьОграничениеИзмененияРеквизитов(ЭтаФорма)
Для отмены ограничения доступа необходимо выполнить на клиенте
МодификацияУправляемыхФорм.ОтменитьОграничениеИзмененияРеквизитов(ЭтаФорма)