Генерация управляемой формы на основе обычной (proof of concept)











В статье рассматривается техническая возможность автоматизированной генерации управляемой формы на основе обычной.

Каждый опытный разработчик пишет для себя инструменты. И чем больше опыт, тем больше задач приходится автоматизировать, в том числе и поддержка legacy-проектов, переход на новые версии платформы/базовой конфигурации и тд.

Одним из самых сложных таких переходов для многих был/остается переход на управляемые формы. Хорошо, когда код почти типовой — базовую конфигурации переделала сама 1С.  Но даже тогда остается задача переписать весь багаж своих привычных обработок на УФ.

Для примера, поиск по infostart’у фразы " для управляемых форм " — "Найдено 4696". Невероятная работа проделана сообществом…

Управляемые формы — это не новый дизайн интерфейса, это концепция разделения работы между клиентом и сервером.

В обычных формах:

  • практически всю работу делал клиент (тащил сырые данные с сервера, обрабатывал и отображал результат)
  • в любой момент в клиенте можно было делать синхронные, модальные и интерактивные вызовы/операции
  • чтобы выполнить код на сервере, нужно было постараться (вынести логику в специальный общий модуль). программисты мало задумывались о том, где код выполняется

В управляемых формах (толстый клиент не рассматриваем как атавизм):

  • клиент обеспечивает только отображение данных, пользовательский ввод и простейшие вычисления.
  • синхронные и модальные вызовы запрещены даже на клиенте
  • работа с данными из СУБД возможна только на сервере
  • код должен быть разделен на методы по контексту выполнения (клиент, сервер), а также в местах обратных вызовов (callbacks), т.к. код должен быть асинхронным

 

А ТаблицуЗначений за что???

 

В начале работы с УФ это все казалось очень и очень сложным, инертность мышления долго мешала писать правильно (спасибо, что хотя бы многопоточности нет). Но ближе к теме:

 

Переписывание кода для УФ — нетривиальная задача. Ее может сделать только программист…

 

Т.е. о генерации валидного кода можно сразу забыть. А как быть с самой формой? В УФ форма — это XML-файл в недрах конфигурации, который можно как выгрузить из конфигурации, так и загрузить обратно… А XML-файл можно сгенерировать программно.

 

Создание управляемой формы — это всего лишь генерация XML-файла…

 

Для этого нам понадобится

1) Декомпозиция обычной толстой формы на элементы и анализ их свойств

С этим сообщество разработчиков 1С разобралось достаточно давно, например здесь

 

Дерево элементов формы "ФормаКонсоли" обработки "ирКонсольЗаданий".

 

2) Генерация XML-файлов по дереву элементов и свойств обычной формы

Здесь-то и были сосредоточены основные усилия.

 

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

 

 Список элементов управления

 

— нужно было также определить названия всех возможных значений всех свойств этих элементов

 

 Список свойств

Да, впадать в исследовательский азарт — это такая себе черта характера.

 

— и всего лишь сгенерировать XML-файл управляемой формы и упаковать ее в конфигурацию. Самым сложным при этом оказалась группировка элементов, чтобы при масшабировании элементы адекватно растягивались/сдвигались на форме

 

Дерево элементов в упр. форме. Сгенерированные имена не отличаются красотой

 

В прикрепленных изображениях и в прикрепленном файле можно посмотреть исходную форму и результат работы на примере обработки ирКонсольЗаданий.epf из шикарной библиотеки "Инструменты разработчика". К сожалению, выложить файл бесплатно (за 0 SM) нельзя.

Генерация форм была выполнена на платформе 8.3.9.2309.

***

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

 

upd 14.11.19

Не все объекты из толстых форм могут быть отображены на управляемой форме (к примеру, объект ПостроительОтчета), но в целом можно генерировать довольно похожие на оригинал формы.

Консоль запросов из ИР

Становится примерно такой. Похоже?

 

 

P.s. если задаться целью, можно даже так:

Результат автоматической генерации

но из за сильных отличий построения UI в 7.7 и УФ результат слишком кривой (в основном мешает управление слоями в форме 7.7)

16 Comments

  1. dandykry

    Отдаленно похожее делал. Нужна была форма для отображения свойств элементов формы. Форма родилась, но успеть за развитием платформы не удалось (переименованием, дополнением, расширением свойств). В какой то новой платформе строка

    Выполнить (ИмяРеквизитаФормы  + » = НекоеЗначение; «)

    Перестала работать. Теперь необходимо писать

    Выполнить («ЭтотОбъект.» + ИмяРеквизитаФормы  + » = НекоеЗначение; «)

    Переписывать не стал и просто бросил. Жду когда расширения до ума доведут.

    По поводу обработки-генератора. Думаю она все равно не сделает 100% работы. И даже 50% думаю не сумеет. Дело в том, что в обычных формах многое работало на привязках. В управляемых формах этого нет — все решается группами формы. Из-за этого все равно придется форму перерисовывать, чтобы она отображалась нормально. И лично я сделал бы это заново, а не перетаскивал лишнее из старой обработки. Из старой нужна только специфичная логика — запросы, заполнение документов, печать и пр. Все то, что к отображению данных на форме не относится по большей части

    Reply
  2. user700211_a.straltsou

    (1)

    По поводу обработки-генератора. Думаю она все равно не сделает 100% работы. И даже 50% думаю не сумеет. Дело в том, что в обычных формах многое работало на привязках. В управляемых формах этого нет — все решается группами формы. Из-за этого все равно придется форму перерисовывать, чтобы она отображалась нормально

    Я с вами согласен в том плане, что если форма простая — ее легче нарисовать вручную. Но если сложная… Под спойлером «Список свойств» 38 свойств элементов управления, которые можно взять из старой формы

    Reply
  3. Perfolenta

    и когда, хоть приблизительно, можно ожидать инструмент?

    Reply
  4. user700211_a.straltsou

    (3) Зависит от загруженности. Пока могу ваши формы сконвертить, если в личку пришлете

    Reply
  5. Perfolenta

    (4) а в каком виде их можно прислать?

    Reply
  6. user700211_a.straltsou

    (5) epf или cf со списком нужных форм

    Reply
  7. dandykry

    (2) Я писал и о простых, и о сложных формах. Особенно о формах, которые делал не сам лично.

    На сколько я помню, элементы формы различаются и в свойствах, и в событиях. После генерации все равно придется это протыкивать и смотреть все ли работает как нужно, или теперь нужно даже то, что перенеслось переделывать, потому что теперь «это не работает так же» или теперь это не работает на клиенте и логику нужно тащить на сервер. Ко всему прочему конфигурация без БСП — это велосипеды, либо очень простая конфигурация. А внедрять БСП так или иначе придется, а это еще работа с формами.

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

    Мысль очень напоминает «Конвертация информационных баз системы «1С:Предприятие 7.7»» — когда конфигурация 7.7 превращалась в 8.2. На мою память эту вещь я использовал всего 1 раз только для «попробовать». Реальные переводы делались руками, потому что дешевле по времени.

    В целом, если Ваш конвертор появится в свет, то я скачаю его за стартмани, чтобы посмотреть реализацию и возможно заимствовать в будущем.

    Reply
  8. SerVer1C

    Идея интересная, не бросайте развивать её.

    Reply
  9. Eret1k

    «В начале работы с УФ это все казалось очень и очень сложным, инертность мышления долго мешала писать правильно (спасибо, что хотя бы многопоточности нет).»

    Не только инертность.

    Не было подхода MVC.

    Когда во всем остальном мире девелопмента все активно начали использовать подход MVC, тут в виду закрытости мира 1С, не могли и представить альтернативы.

    Reply
  10. Cyberhawk

    Ну что, когда ждем ИР для тонкого клиента?

    Reply
  11. user700211_a.straltsou

    (10) Я не являюсь автором ИР и могу только помочь ее автору с конвертацией

    Reply
  12. tormozit

    Посмотрел на картинки и на сгенерированную форму редактор объекта БД. Сразу бросилось в глаза

    — контекстные меню встраиваются как командные панели

    — некоторые таблицы со своими командными панелями не отображаются (например таблица результата в окне консоли запросов)

    Согласен, что даже в текущем виде конвертор облегчает работу по переводу формы на управляемый вариант. Однако основные затраты в большинстве случаев все таки будут в переработке модуля и там даже частичный конвертор сделать будет намного сложнее.

    Reply
  13. user700211_a.straltsou

    (12)

    контекстные меню встраиваются как к

    — контекстные меню встраиваются как командные панели

    исправлю, инструмент все еще в разработке

    — некоторые таблицы со своими командными панелями не отображаются

    не отображаются табличные поля без колонок. это стандартное поведение УФ

    Спасибо за оценку работы и буду рад помочь в переводе ИР на УФ

    Reply
  14. tormozit

    (13)

    Получается у тебя некоторые таблицы с колонками конвертируются в таблицы без колонок?

    ИР на управляемые формы переводить я не собираюсь. Но конвертор твой действительно будет полезен сообществу.

    Reply
  15. user700211_a.straltsou

    (14)

    Получается у тебя некоторые таблицы с колонками конвертируются в таблицы без колонок?

    Нет. В обработке «ирКонсольЗапросов» табличное поле «РезультатКоллекция» не имеет колонок Реквизиты Данные — пустой, реквизит ТипЗначения — ТаблицаЗначений (колонки создаются при отображении результатов РезультатКоллекция.Значение = мРезультатЗапроса.Выгрузить)

    В управляемой версии получаем на форме элемент Таблица «РезультатКоллекция» без колонок, который в режиме просмотра формы не отображается.

    Reply
  16. tormozit

    (15) Наверное тогда стоит в конверторе добавить настройку «создавать пустые колонки при отсутствии колонок в оригинале» — будет добавляться дочерний реквизит реквизита-коллекции и связанное с ним поле таблицы формы. Ведь для оценки корректности конвертации предпросмотр формы — самый эффективный способ.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *