Модификатор форм (Yet Another Form Modificator)

19.02.25

Разработка - Инструментарий разработчика

Еще один вариант по программной доработке управляемых форм. Основное отличие от аналогов - это описание модификации в виде текста (не код).

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Файл поставки подсистемы "МодификацияФорм" (Версия 1.1.0.3)
.cf 136,38Kb
0
0 Скачать (1 SM) Купить за 1 850 руб.

Оглавление

 

Назначение

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

 
Пример макета модификаций формы

Помимо желания создать еще один инструмент для программной доработки были еще причины:

  • Создать инструмент, который будет генерировать автотест для проверки формы;
  • А так же попробовать создать инструмент для корректировки исходных xml-файлов формы перед сборкой файла поставки.

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

 

К оглавлению

Дистрибутив

Дистрибутив подсистемы представляет собой файл поставки для внедрения в основную конфигурацию.

Вариант дистрибутива в виде расширений прорабатывается.

 

К оглавлению

Установка

При первом внедрении необходимо перенести объекты метаданных из файла поставки в
конфигурацию-потребитель. Для выполнения переноса объектов необходимо открыть конфигуратор конфигурации-потребителя и выбрать режим "Сравнить, объединить с конфигурацией из файла". В качестве файла необходимо указать файл поставки конфигурации "МодификацияФорм" (файл yafm-cf-main-AA_BB_CC_DD.cf, где AA_BB_CC_DD - номер релиза, например "1_1_0_1").

 
 Важно

На вопрос о постановке на поддержку требуется ответить утвердительно.

 

 

В открывшемся окне сравнения и объединения конфигураций снять все флажки и отметить
переносимые объекты с помощью команды "Действия – Отметить по подсистемам файла"
Далее выбрать подсистему МодификацияФормПодсистемы. После чего нажать "Установить". 
Далее выбрать режим объединения "Взять из файла"» (Действия – Установить режим для всех…)
и нажать кнопку "OK":

 

 

В окне сравнения и объединения нажать кнопку "Выполнить". При появлении окна "Настройка правил поддержки" рекомендуется установить следующие значения:

 

 

Если предполагается настройка стандартного генератора протокола (о генераторе см. раздел "Генератор протокола"), то в настройка поддержки необходимо модулю МФГенераторПротоколаПереопределяемый установить режим "Объект поставщика редактируется с сохранением поддержки":

 

 

К оглавлению

Использование

Для изменения формы необходимо:

  1. Подготовить макет изменения (см. раздел "Подготовка макета");
  2. В процедуре ПриСозданииНаСервере добавить строки: 
    МодификацияФорм.МодифицироватьФорму(
        ЭтаФорма,
        Отказ,
        "Обработки.ОписанияМодификацийФорм.Документ_Заказ_ФормаДокумента"
    );
    

    где строка "Обработки.ОписанияМодификацийФорм.Документ_Заказ_ФормаДокумента" - имя макета изменений. Имя макета описания модификаций задается в виде строки <Коллекция>.<Объект>.<Макет>, где:

  • <Коллекция> - Имя коллекции метаданных, указывается во множественном числе;

  • <Объект> - Имя объекта;

  • <Макет> - Имя макета;

Например, макет может выглядеть, как в примере выше: Обработки.ОписанияМодификацийФорм.Документ_Заказ_ФормаДокумента, а если макет хранится в самом объекте, то имя макета может выглядеть так: Документы.Заказ.ФормаДокумента.

 

К оглавлению

Подготовка макета

Заголовок макета

Макет должен начинаться с заголовка:

МОДИФИКАЦИЯФОРМ <Версия> <Код символа-разделителя>

Заголовок состоит из трех полей, разделенных знаком "пробел":

  • МОДИФИКАЦИЯФОРМ - Идентификатор, сейчас это только одно ключевое слово. Именно в верхнем регистре. Возможно будет несколько идентификаторов (есть идея сделать на нескольких языках);
  • <Версия> - Версия подсистемы, в которой был сделан макет. Сейчас версия при парсинге не анализируется, возможно в будущем понадобится;
  • <Код символа-разделителя> - Код символа-разделителя полей в последующих строках макета. Для символа табуляции это 9. Рекомендуется использовать его, на мой взгляд при использовании табуляции читаемость макета лучше.

 

К оглавлению

Реквизит формы

Для определения нового реквизита формы необходимо:

  1. Создать описание реквизита:
РЕКВИЗИТ  <Имя реквизита>
  • РЕКВИЗИТ - Зарезервированное слово;
  • <Имя реквизита> - Имя добавляемого реквизита. 

  1. Указать тип реквизита:
ТИПРЕКВИЗИТА  <Имя реквизита>  <Тип реквизита>
  • ТИПРЕКВИЗИТА - Зарезервированное слово;
  • <Имя реквизита> - Имя реквизита, как оно указано в конструкции РЕКВИЗИТ;

  • <Тип реквизита> - Тип реквизита. Правила написания

    • Булево и Дата пишутся как есть;

    • Ссылочные типы указываются в виде КоллекцияСсылка.ИмяОбъекта. Например, СправочникСсылка.Контрагенты;

    • Для строки дополнительно указывается длина строки, например: Строка150, Строка2, Строка34;

    • Для числа указывается общая длина и длина дробной части, разделенные точкой, например, Число10.2, Число15.3.

Обработка типов ТаблицаЗначений, ДинамическийСписок пока не реализована. Нужно учесть, что при указании нескольких типов для одного реквизита автоматически включается режим составного типа данных. Если указывать несколько типов с одинаковым базовым значением, например:

РЕКВИЗИТ  НовыйРеквизит1
ТИПРЕКВИЗИТА  НовыйРеквизит1  Строка100
ТИПРЕКВИЗИТА  НовыйРеквизит1  Строка200
ТИПРЕКВИЗИТА  НовыйРеквизит1  Строка20

в состав типов включится только последний Строка20

Если тип реквизита не будет указан в макете, то реквизит не будет добавлен, а в протоколе будет соответствующая запись.

 

К оглавлению

Команда формы

Для определения новой команды или изменения существующей команды необходимо:

  1. Создать описание команды:
КОМАНДА  <Имя команды>
  • КОМАНДА - Зарезервированное слово;
  • <Имя команды> - Имя добавляемой или изменяемой команды. 

  1. Указать заголовок команды и/или имя процедуры, которая должна выполниться в результате вызова команды:
ЗАГОЛОВОККОМАНДЫ  <Имя команды>  <Заголовок>
  • ЗАГОЛОВОККОМАНДЫ - Зарезервированное слово;
  • <Имя команды> - Имя команды, как оно указано в конструкции КОМАНДА;

  • <Заголовок> - Заголовок команды.

ДЕЙСТВИЕКОМАНДЫ  <Имя команды>  <Имя процедуры-обработчика>
  • ТИПРЕКВИЗИТА - Зарезервированное слово;
  • <Имя команды> - Имя команды, как оно указано в конструкции КОМАНДА;

  • <Имя процедуры-обработчика> - Имя процедуры обработчика без параметров, находится в модуле формы.

 

К оглавлению

Элемент формы

Для определения нового элемента формы или изменения существующей необходимо:

  1. Создать описание элемента:
ЭЛЕМЕНТ  <Имя элемента>  <Тип элемента>
  • ЭЛЕМЕНТ - Зарезервированное слово;
  • <Имя элемента> - Имя добавляемого или изменяемого элемента.

  • <Тип элемента> - Тип элемента. Может принимать значения:

    • ДЕКОРАЦИЯФОРМЫ

    • ГРУППАФОРМЫ

    • КНОПКАФОРМЫ

    • ТАБЛИЦАФОРМЫ

    • ПОЛЕФОРМЫ

  1. Указать (одну или несколько позиций) родителя элемента, элемент, перед которым должен стоять элемент, свойство элемента и событие элемента:
РОДИТЕЛЬЭЛЕМЕНТА  <Имя элемента>  <Родитель>
  • РОДИТЕЛЬЭЛЕМЕНТА - Зарезервированное слово;
  • <Имя элемента> - Имя элемента, как оно указано в конструкции ЭЛЕМЕНТ;

  • <Родитель> - Имя родительского элемента.

ПОСЛЕДУЮЩИЙЭЛЕМЕНТ  <Имя элемента>  <Элемент>
  • ПОСЛЕДУЮЩИЙЭЛЕМЕНТ - Зарезервированное слово;
  • <Имя элемента> - Имя элемента, как оно указано в конструкции ЭЛЕМЕНТ;

  • <Элемент> - Имя элемента, перед которым должен находится создаваемый (или существующий) элемент.

СВОЙСТВОЭЛЕМЕНТА  <Имя элемента>  <Имя свойства>  <Значение свойства>
  • СВОЙСТВОЭЛЕМЕНТА - Зарезервированное слово;
  • <Имя элемента> - Имя элемента, как оно указано в конструкции ЭЛЕМЕНТ;

  • <Имя свойства> - Имя свойства. См. дополнительно синтакс-помощник по свойствам элемента формы;

  • <Значение свойства> - Значение свойства. См. дополнительно синтакс-помощник по свойствам элемента формы. Для свойств с типами "Цвет", "СочетаниеКлавиш", "Рамка" указывается внутреннее имя, само определение значения свойства идет в соответствующем блоке: ЦВЕТ, СОЧЕТАНИЕКЛАВИШ, РАМКА.

СОБЫТИЕЭЛЕМЕНТА  <Имя элемента>  <Имя события>  <Имя процедуры-обработчика>
  • СОБЫТИЕЭЛЕМЕНТА - Зарезервированное слово;
  • <Имя элемента> - Имя элемента, как оно указано в конструкции ЭЛЕМЕНТ;

  • <Имя события> - Имя события. См. дополнительно синтакс-помощник по событиям элемента формы;

  • <Значение свойства> - Имя процедуры обработчика без параметров, находится в модуле формы.

 

К оглавлению

Дополнительные объекты

Цвет

Для определения цвета используется конструкция:

ЦВЕТ  <Имя цвета>  <Описание цвета>
  • ЦВЕТ - Зарезервированное слово;
  • <Имя цвета> - Внутреннее имя цвета. Используется для указания значения в свойствах элемента с типом "Цвет";
  • <Описание цвета> - Описание цвета. Используются несколько нотаций:
    • Авто, 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.

 

К оглавлению

Генератор протокола

Отдельно хочу разъяснить что такое Генератор протокола. Полный синтаксис главной процедуры выглядит так:

// Модификация формы согласно переданного макета
//
// Параметры:
//  Форма - ФормаКлиентскогоПриложения - Модифицируемая форма.
//  Отказ - Булево - Признак отказа от создания формы.
//  ИмяМакетаОписанияМодификаций - Строка - Путь к макету описания модификации. Формат пути:
//    "<Коллекция>.<Объект>.<Макет>", где:
//    * <Коллекция> - Имя коллекции метаданных, указывается во множественном числе;
//    * <Объект> - Имя объекта;
//    * <Макет> - Имя макета;
//    Например, "Обработки.ОписаниеМодификаций.ЗаказПоставщику".
//  ГенераторПротокола - ОбщийМодуль, Неопределено - См. дополнительно МФСлужебный.Протокол.
//
Процедура МодифицироватьФорму(Форма, Отказ, ИмяМакетаОписанияМодификаций, ГенераторПротокола = Неопределено) Экспорт
    <...>
КонецПроцедуры

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

Протокол.ДополнительныеПараметры.ВывестиНаЭкран = Истина;
Протокол.ДополнительныеПараметры.ВывестиВЖурналРегистрации = Ложь;

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

 

К оглавлению

Разработка

Подсистема разрабатывается на основе доработанной демо-конфигурации от фирмы . Доработка ведется в ветке develop репозитория: https://github.com/alexey-stepanenko/yafm/tree/develop

Сейчас все мои усилия направлены на разработку генератора сценарного теста по описанию модификации формы. Планирую релиз с этой функциональностью выпустить в конце марта 2025 г. 

Разработка и тестирование велось на платформе 8.3.25.1445

 

К оглавлению

P.S. Пока писал статью, выпустил 2 релиза с исправлением ошибок :-) Скорее всего есть еще ошибки, прошу отнестись с пониманием :-) 

Доработка форм подсистема

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    175343    974    403    

932

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    16902    115    55    

119

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    18147    49    19    

81

Инструментарий разработчика Программист Платформа 1С v8.3 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    28291    97    48    

141

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

15000 руб.

10.11.2023    12419    49    33    

70

Инструментарий разработчика Программист 8.3.14 Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

20000 руб.

07.10.2021    18403    7    32    

43

Инструментарий разработчика Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    1495    2    0    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dhurricane 19.02.25 18:57 Сейчас в теме
Какой-то сильно многословный синтаксис получился. :-) По ощущениям удобство разработчика принесено в жертву удобству парсера.

Все же код:
Группа1.ОтображатьЗаголовок = Истина;
более нагляден, нежели:
СВОЙСТВОЭЛЕМЕНТА Группа1 ОтображатьЗаголовок Истина
ixijixi; alex_sayan; +2 Ответить
4. stepan96 80 19.02.25 21:52 Сейчас в теме
15. dhurricane 20.02.25 20:46 Сейчас в теме
(4) Не понял ответ ниже. Почему на основании первой строки кода, которую я привел, нельзя создать feature-файл для VA?
16. stepan96 80 20.02.25 20:48 Сейчас в теме
(15) А как? Что мне нужно сделать, чтобы в VA появился тест, который будет анализировать, что на форме есть группа с именем "Группа1" и ее свойство "ОтображатьЗаголовок" установлено в истину?
17. dhurricane 20.02.25 20:50 Сейчас в теме
(16) Ровно то же, что и сейчас. Меняется же только синтаксис макета, логика остается прежней.
2. alex_sayan 56 19.02.25 19:53 Сейчас в теме
А в чём профит-то? Тот же код, только другими словами
Трактор; +1 Ответить
3. stepan96 80 19.02.25 21:52 Сейчас в теме
(2) Да, другими словами. Но я хочу так же генерировать на основании макета feature-файл для VA. При использовании просто кода, тест придется писать.
6. alex_sayan 56 20.02.25 09:00 Сейчас в теме
(3) так может лучше использовать JSON или YAML? Их парсить намного легче, а читабельность ещё лучше. В текущем виде напоминает многословный COBOL
Пример кода на COBOL
7. stepan96 80 20.02.25 12:17 Сейчас в теме
(6) Я пробовал в начале json, но оказалось, что его сложно вручную писать, нужен тогда сразу инструмент для упрощения, а второе - это проблема десериализации. Если ошибка в самом синтаксисе json, то весь файл не соберется в структуру. Ямл наверное лучше подойдет, но я не проверял. Решили остановиться на своем формате.
18. alex_sayan 56 21.02.25 10:09 Сейчас в теме
(7) тогда попробуй использовать фигурные скобки
ЭЛЕМЕНТ    Реквизит1    ПОЛЕФОРМЫ {
	РОДИТЕЛЬЭЛЕМЕНТА  {  	
		Группа1 }
	СВОЙСТВОЭЛЕМЕНТА  {
		ПутьКДанным    Реквизит11
	 	Вид    ПолеВвода }
	СОБЫТИЕЭЛЕМЕНТА  {
		ПриИзменении    ОбработчикПриИзменении
		НачалоВыбора ОбработчикНачалоВыбора }
}
Показать

Становится меньше слов, одно и то же не надо повторять постоянно. Ну и парсится это дело легко
5. Жолтокнижниг 259 20.02.25 00:22 Сейчас в теме
Идея интересная, но вот формат макета... Очень многословно, рекомендую глянул в сторону yaml.
8. stepan96 80 20.02.25 12:18 Сейчас в теме
(5) Подумаю о ямле если вот прям совсем неудобно будет. Сейчас вопрос более актуальный - это сделать генератор теста измененной формы
9. Жолтокнижниг 259 20.02.25 12:42 Сейчас в теме
Как по мне простые тесты, которые просто проверят параметры созданных элементов, это не сложно. Сложность будет когда новые элемента включены в бизнес логику. Те какие то элементы могут быть скрыты по условиям, для каких то наложены ограничения типов и тд. Как быть в этих случаях. Получается инструмент закрывает только простые случаи.

Надо хорошо подумать сценарии использования.
10. stepan96 80 20.02.25 16:35 Сейчас в теме
(9) "это не сложно" - согласен )))) А вы их делаете? А потом обновляете? )))))) Мой опыт говорит, что нет. Поэтому я и делаю инструмент, который пусть простые случаи, но покрывает. Много раз был в ситуации, когда клиент говорит "Ну вы что? Просто проверить форму после обновления не могли?" Проверяя глазами очень легко это упустить. Если есть другой способ ускорения написания таких вот "простых" тестов - я буду только рад! С радостью удалю этот проект и буду пользоваться вашим методом!
11. Жолтокнижниг 259 20.02.25 16:52 Сейчас в теме
(10) я не говорю что инструмент бесполезный и ненужный. Причины возникновения понятны. Но для полноты понимания не плохо бы описать сценарии использования.
Причем сценарии полезны не только для читателей, чтобы лучше понять задумку. Но и для писателя.
12. Жолтокнижниг 259 20.02.25 16:54 Сейчас в теме
(10) тесты пишем и актуализируем, причем разные виды тестов и разными людьми. И конечно же запускаем.
13. stepan96 80 20.02.25 17:30 Сейчас в теме
(12) Я столкнулся с тем, что разработчики не пишут тесты на доработанную форму. Потому что. Или очень тяжело пишут. Проблема даже не в том, что пишут или нет, а в том, как проконтролировать, что после изменения формы тест тоже актуализировали. Проверять глазами - ну такое себе. И я подумал про инструмент, который с одной стороны будет делать изменение формы, а с другой стороны давать готовый тест для VA. В этой концепции разработчику гораздо проще эти тесты актуализировать.
14. Жолтокнижниг 259 20.02.25 18:38 Сейчас в теме
(13) идея интересная, надо развивать
Оставьте свое сообщение