Оглавление
Назначение
Как видно из названия, это еще один инструмент для программной доработки управляемых форм. В отличии от альтернатив, описание изменений оформляется в виде текстового макета. Пример макета ниже:
Помимо желания создать еще один инструмент для программной доработки были еще причины:
- Создать инструмент, который будет генерировать автотест для проверки формы;
- А так же попробовать создать инструмент для корректировки исходных xml-файлов формы перед сборкой файла поставки.
Эти требования очень сложно (и наверное просто невозможно) реализовать без объектной модели изменений формы. Поэтому было принято решение разработать свой формат описания изменений и парсер.
Дистрибутив
Дистрибутив подсистемы представляет собой файл поставки для внедрения в основную конфигурацию.
Вариант дистрибутива в виде расширений прорабатывается.
Установка
При первом внедрении необходимо перенести объекты метаданных из файла поставки в
конфигурацию-потребитель. Для выполнения переноса объектов необходимо открыть конфигуратор конфигурации-потребителя и выбрать режим "Сравнить, объединить с конфигурацией из файла". В качестве файла необходимо указать файл поставки конфигурации "МодификацияФорм" (файл yafm-cf-main-AA_BB_CC_DD.cf, где AA_BB_CC_DD - номер релиза, например "1_1_0_1").
На вопрос о постановке на поддержку требуется ответить утвердительно.
В открывшемся окне сравнения и объединения конфигураций снять все флажки и отметить
переносимые объекты с помощью команды "Действия – Отметить по подсистемам файла"
Далее выбрать подсистему МодификацияФормПодсистемы. После чего нажать "Установить".
Далее выбрать режим объединения "Взять из файла"» (Действия – Установить режим для всех…)
и нажать кнопку "OK":
В окне сравнения и объединения нажать кнопку "Выполнить". При появлении окна "Настройка правил поддержки" рекомендуется установить следующие значения:
Если предполагается настройка стандартного генератора протокола (о генераторе см. раздел "Генератор протокола"), то в настройка поддержки необходимо модулю МФГенераторПротоколаПереопределяемый установить режим "Объект поставщика редактируется с сохранением поддержки":
Использование
Для изменения формы необходимо:
- Подготовить макет изменения (см. раздел "Подготовка макета");
- В процедуре ПриСозданииНаСервере добавить строки:
МодификацияФорм.МодифицироватьФорму( ЭтаФорма, Отказ, "Обработки.ОписанияМодификацийФорм.Документ_Заказ_ФормаДокумента" );
где строка "Обработки.ОписанияМодификацийФорм.Документ_Заказ_ФормаДокумента" - имя макета изменений. Имя макета описания модификаций задается в виде строки <Коллекция>.<Объект>.<Макет>, где:
-
<Коллекция> - Имя коллекции метаданных, указывается во множественном числе;
-
<Объект> - Имя объекта;
-
<Макет> - Имя макета;
Например, макет может выглядеть, как в примере выше: Обработки.ОписанияМодификацийФорм.Документ_Заказ_ФормаДокумента, а если макет хранится в самом объекте, то имя макета может выглядеть так: Документы.Заказ.ФормаДокумента.
Подготовка макета
Заголовок макета
Макет должен начинаться с заголовка:
МОДИФИКАЦИЯФОРМ <Версия> <Код символа-разделителя>
Заголовок состоит из трех полей, разделенных знаком "пробел":
- МОДИФИКАЦИЯФОРМ - Идентификатор, сейчас это только одно ключевое слово. Именно в верхнем регистре. Возможно будет несколько идентификаторов (есть идея сделать на нескольких языках);
- <Версия> - Версия подсистемы, в которой был сделан макет. Сейчас версия при парсинге не анализируется, возможно в будущем понадобится;
- <Код символа-разделителя> - Код символа-разделителя полей в последующих строках макета. Для символа табуляции это 9. Рекомендуется использовать его, на мой взгляд при использовании табуляции читаемость макета лучше.
Реквизит формы
Для определения нового реквизита формы необходимо:
- Создать описание реквизита:
РЕКВИЗИТ <Имя реквизита>
- РЕКВИЗИТ - Зарезервированное слово;
-
<Имя реквизита> - Имя добавляемого реквизита.
- Указать тип реквизита:
ТИПРЕКВИЗИТА <Имя реквизита> <Тип реквизита>
- ТИПРЕКВИЗИТА - Зарезервированное слово;
-
<Имя реквизита> - Имя реквизита, как оно указано в конструкции РЕКВИЗИТ;
-
<Тип реквизита> - Тип реквизита. Правила написания
-
Булево и Дата пишутся как есть;
-
Ссылочные типы указываются в виде КоллекцияСсылка.ИмяОбъекта. Например, СправочникСсылка.Контрагенты;
-
Для строки дополнительно указывается длина строки, например: Строка150, Строка2, Строка34;
-
Для числа указывается общая длина и длина дробной части, разделенные точкой, например, Число10.2, Число15.3.
-
Обработка типов ТаблицаЗначений, ДинамическийСписок пока не реализована. Нужно учесть, что при указании нескольких типов для одного реквизита автоматически включается режим составного типа данных. Если указывать несколько типов с одинаковым базовым значением, например:
РЕКВИЗИТ НовыйРеквизит1
ТИПРЕКВИЗИТА НовыйРеквизит1 Строка100
ТИПРЕКВИЗИТА НовыйРеквизит1 Строка200
ТИПРЕКВИЗИТА НовыйРеквизит1 Строка20
в состав типов включится только последний Строка20.
Если тип реквизита не будет указан в макете, то реквизит не будет добавлен, а в протоколе будет соответствующая запись.
Команда формы
Для определения новой команды или изменения существующей команды необходимо:
- Создать описание команды:
КОМАНДА <Имя команды>
- КОМАНДА - Зарезервированное слово;
-
<Имя команды> - Имя добавляемой или изменяемой команды.
- Указать заголовок команды и/или имя процедуры, которая должна выполниться в результате вызова команды:
ЗАГОЛОВОККОМАНДЫ <Имя команды> <Заголовок>
- ЗАГОЛОВОККОМАНДЫ - Зарезервированное слово;
-
<Имя команды> - Имя команды, как оно указано в конструкции КОМАНДА;
-
<Заголовок> - Заголовок команды.
ДЕЙСТВИЕКОМАНДЫ <Имя команды> <Имя процедуры-обработчика>
- ТИПРЕКВИЗИТА - Зарезервированное слово;
-
<Имя команды> - Имя команды, как оно указано в конструкции КОМАНДА;
-
<Имя процедуры-обработчика> - Имя процедуры обработчика без параметров, находится в модуле формы.
Элемент формы
Для определения нового элемента формы или изменения существующей необходимо:
- Создать описание элемента:
ЭЛЕМЕНТ <Имя элемента> <Тип элемента>
- ЭЛЕМЕНТ - Зарезервированное слово;
-
<Имя элемента> - Имя добавляемого или изменяемого элемента.
-
<Тип элемента> - Тип элемента. Может принимать значения:
-
ДЕКОРАЦИЯФОРМЫ
-
ГРУППАФОРМЫ
-
КНОПКАФОРМЫ
-
ТАБЛИЦАФОРМЫ
-
ПОЛЕФОРМЫ
-
- Указать (одну или несколько позиций) родителя элемента, элемент, перед которым должен стоять элемент, свойство элемента и событие элемента:
РОДИТЕЛЬЭЛЕМЕНТА <Имя элемента> <Родитель>
- РОДИТЕЛЬЭЛЕМЕНТА - Зарезервированное слово;
-
<Имя элемента> - Имя элемента, как оно указано в конструкции ЭЛЕМЕНТ;
-
<Родитель> - Имя родительского элемента.
ПОСЛЕДУЮЩИЙЭЛЕМЕНТ <Имя элемента> <Элемент>
- ПОСЛЕДУЮЩИЙЭЛЕМЕНТ - Зарезервированное слово;
-
<Имя элемента> - Имя элемента, как оно указано в конструкции ЭЛЕМЕНТ;
-
<Элемент> - Имя элемента, перед которым должен находится создаваемый (или существующий) элемент.
СВОЙСТВОЭЛЕМЕНТА <Имя элемента> <Имя свойства> <Значение свойства>
- СВОЙСТВОЭЛЕМЕНТА - Зарезервированное слово;
-
<Имя элемента> - Имя элемента, как оно указано в конструкции ЭЛЕМЕНТ;
-
<Имя свойства> - Имя свойства. См. дополнительно синтакс-помощник по свойствам элемента формы;
-
<Значение свойства> - Значение свойства. См. дополнительно синтакс-помощник по свойствам элемента формы. Для свойств с типами "Цвет", "СочетаниеКлавиш", "Рамка" указывается внутреннее имя, само определение значения свойства идет в соответствующем блоке: ЦВЕТ, СОЧЕТАНИЕКЛАВИШ, РАМКА.
СОБЫТИЕЭЛЕМЕНТА <Имя элемента> <Имя события> <Имя процедуры-обработчика>
- СОБЫТИЕЭЛЕМЕНТА - Зарезервированное слово;
-
<Имя элемента> - Имя элемента, как оно указано в конструкции ЭЛЕМЕНТ;
-
<Имя события> - Имя события. См. дополнительно синтакс-помощник по событиям элемента формы;
-
<Значение свойства> - Имя процедуры обработчика без параметров, находится в модуле формы.
Дополнительные объекты
Цвет
Для определения цвета используется конструкция:
ЦВЕТ <Имя цвета> <Описание цвета>
- ЦВЕТ - Зарезервированное слово;
- <Имя цвета> - Внутреннее имя цвета. Используется для указания значения в свойствах элемента с типом "Цвет";
- <Описание цвета> - Описание цвета. Используются несколько нотаций:
- Авто, Auto - Установка авто цвета. Дополнительно см. синтакс-помощник ВидЦвета.АвтоЦвет;
- R,G,B - Указание значений компонентов цвета в десятичной системе. Например, 190,136,18;
- #RRGGBB - Указание значений компонентов цвета в шестнадцатеричной системе. Например, #BE8812.
Сочетание клавиш
Для определения сочетания клавиш используется конструкция:
СОЧЕТАНИЕКЛАВИШ <Имя сочетания> <Основная клавиша> <Alt> <Ctrl> <Shift>
- СОЧЕТАНИЕКЛАВИШ - Зарезервированное слово;
- <Имя сочетания> - Внутреннее имя сочетания клавиш. Используется для указания значения в свойствах элемента с типом "СочетаниеКлавиш";
- <Основная клавиша> - Значение основной клавиши сочетания. См. дополнительно синтакс-помощник "СочетаниеКлавиш.Клавиша";
- <Alt> - Признак использования в сочетании клавиши Alt;
- <Ctrl> - Признак использования в сочетании клавиши Control (Ctrl);
- <Shift> - Признак использования в сочетании клавиши Shift.
Рамка
Для определения рамки используется конструкция:
РАМКА <Имя рамки> <Тип рамки> <Толщина рамки>
- РАМКА - Зарезервированное слово;
- <Имя рамки> - Внутреннее имя рамки. Используется для указания значения в свойствах элемента с типом "Рамка";
- <Тип рамки> - Тип рамки:
- БезРамки, WithoutBorder;
- Вдавленная, Indented;
- Выпуклая, Embossed;
- Двойная, Double;
- ДвойноеПодчеркивание, DoubleUnderline;
- Одинарная, Single;
- Подчеркивание, Underline;
- Скругленная, Rounded;
- ЧертаСверху, Overline;
- <Толщина рамки> - Толщина рамки. Максимальное значение: 5.
Генератор протокола
Отдельно хочу разъяснить что такое Генератор протокола. Полный синтаксис главной процедуры выглядит так:
// Модификация формы согласно переданного макета
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Модифицируемая форма.
// Отказ - Булево - Признак отказа от создания формы.
// ИмяМакетаОписанияМодификаций - Строка - Путь к макету описания модификации. Формат пути:
// "<Коллекция>.<Объект>.<Макет>", где:
// * <Коллекция> - Имя коллекции метаданных, указывается во множественном числе;
// * <Объект> - Имя объекта;
// * <Макет> - Имя макета;
// Например, "Обработки.ОписаниеМодификаций.ЗаказПоставщику".
// ГенераторПротокола - ОбщийМодуль, Неопределено - См. дополнительно МФСлужебный.Протокол.
//
Процедура МодифицироватьФорму(Форма, Отказ, ИмяМакетаОписанияМодификаций, ГенераторПротокола = Неопределено) Экспорт
<...>
КонецПроцедуры
Генератор протокола - это необязательный четвертый параметр. Передается или ОбщийМодуль, или Неопределено. Во втором случае будет использован стандартный генератор протокола МФГенераторПротокола. Его предназначение, как понятно из названия - это сформировать протокол модификации, т.е. все ошибки, замечания и т.д. А потом вывести их в журнал регистрации или в консоль. Поведение стандартного генератора можно изменить с помощью модуля МФГенераторПротоколаПереопределяемый. Например, стандартное поведение - все ошибки модификации не показываются на экране, они логируются в ЖР. Если хочется показывать их на экране, а в ЖР не писать, то достаточно в процедуре ИнициализироватьДополнительныеПараметры модуля МФГенераторПротоколаПереопределяемый прописать строки:
Протокол.ДополнительныеПараметры.ВывестиНаЭкран = Истина;
Протокол.ДополнительныеПараметры.ВывестиВЖурналРегистрации = Ложь;
Если возможности стандартного генератора не устраивают (например, хочется логировать этот протокол во внешнем хранилище) - можно создать свой модуль, главное, чтобы он реализовывал соответствующий интерфейс.
Разработка
Подсистема разрабатывается на основе доработанной демо-конфигурации от фирмы 1С. Доработка ведется в ветке develop репозитория: https://github.com/alexey-stepanenko/yafm/tree/develop
Сейчас все мои усилия направлены на разработку генератора сценарного теста по описанию модификации формы. Планирую релиз с этой функциональностью выпустить в конце марта 2025 г.
Разработка и тестирование велось на платформе 8.3.25.1445
P.S. Пока писал статью, выпустил 2 релиза с исправлением ошибок :-) Скорее всего есть еще ошибки, прошу отнестись с пониманием :-)