Каждый опытный разработчик пишет для себя инструменты. И чем больше опыт, тем больше задач приходится автоматизировать, в том числе и поддержка legacy-проектов, переход на новые версии платформы/базовой конфигурации и тд.
Одним из самых сложных таких переходов для многих был/остается переход на управляемые формы. Хорошо, когда код почти типовой - базовую конфигурации переделала сама 1С. Но даже тогда остается задача переписать весь багаж своих привычных обработок на УФ.
Для примера, поиск по infostart'у фразы " для управляемых форм " - "Найдено 4696". Невероятная работа проделана сообществом...
Управляемые формы - это не новый дизайн интерфейса, это концепция разделения работы между клиентом и сервером.
В обычных формах:
- практически всю работу делал клиент (тащил сырые данные с сервера, обрабатывал и отображал результат)
- в любой момент в клиенте можно было делать синхронные, модальные и интерактивные вызовы/операции
- чтобы выполнить код на сервере, нужно было постараться (вынести логику в специальный общий модуль). программисты мало задумывались о том, где код выполняется
В управляемых формах (толстый клиент не рассматриваем как атавизм):
- клиент обеспечивает только отображение данных, пользовательский ввод и простейшие вычисления.
- синхронные и модальные вызовы запрещены даже на клиенте
- работа с данными из СУБД возможна только на сервере
- код должен быть разделен на методы по контексту выполнения (клиент, сервер), а также в местах обратных вызовов (callbacks), т.к. код должен быть асинхронным
А ТаблицуЗначений за что???
В начале работы с УФ это все казалось очень и очень сложным, инертность мышления долго мешала писать правильно (спасибо, что хотя бы многопоточности нет). Но ближе к теме:
Переписывание кода для УФ - нетривиальная задача. Ее может сделать только программист...
Т.е. о генерации валидного кода можно сразу забыть. А как быть с самой формой? В УФ форма - это XML-файл в недрах конфигурации, который можно как выгрузить из конфигурации, так и загрузить обратно... А XML-файл можно сгенерировать программно.
Создание управляемой формы - это всего лишь генерация XML-файла...
Для этого нам понадобится
1) Декомпозиция обычной толстой формы на элементы и анализ их свойств
С этим сообщество разработчиков 1С разобралось достаточно давно, например здесь
Дерево элементов формы "ФормаКонсоли" обработки "ирКонсольЗаданий".
2) Генерация XML-файлов по дереву элементов и свойств обычной формы
Здесь-то и были сосредоточены основные усилия.
- нужно было исследовательским путем определить названия всех свойств всех возможных элементов управляемой формы и их соответствие свойствам элементов обычной формы
Список элементов управления
КоманднаяПанель
Кнопка
Панель
СтраницаПанели
Надпись
ПолеВвода
ПолеВыбора
ТабличноеПоле
КолонкаТабличногоПоля
ПолеСписка
РамкаГруппы
Флажок
Переключатель
ПолеКартинки
ПолеТабличногоДокумента
ПолеТекстовогоДокумента
ПолеГрафическойСхемы
ПолеГеографическойСхемы
ПолеHTMLДокумента
Диаграмма
ДиаграммаГанта
Дендрограмма
Индикатор
ПолосаРегулирования
ПолеКалендаря
- нужно было также определить названия всех возможных значений всех свойств этих элементов
АвтоВводНовойСтроки (AutoInsertNewRow)
АвтоВыборНезаполненного (AutoChoiceIncomplete)
АвтоЗаполнение (AutoFill)
АвтоКонтекстноеМеню (AutoContextMenu)
АвтоОтметкаНезаполненного (AutoMarkIncomplete)
АвтоПереносСтрок (Wrap)
АвтоПорядокОбхода (AutoTabOrder)
АктивизироватьПоУмолчанию (DefaultControl)
БегущаяСтрока (ScrollingText)
ВертикальнаяПолосаПрокрутки (VerticalScrollBar)
ВертикальноеПоложение (VerticalAlign)
ВертикальныеЛинии (VerticalLines)
Верх (Top)
Видимость (Visible)
Вспомогательная (Secondary)
ВыбираемоеЗначение (SelectionValue)
ВыбиратьТип (ChooseType)
ВыборНезаполненного (ChoiceIncomplete)
Вывод (Output)
ВыделенныеСтроки (SelectedRows)
ВыделенныйТекст (SelectedText)
ВыделятьОтрицательные (MarkNegatives)
ВыравниваниеКнопок (ButtonsAlignment)
Высота (Height)
ВысотаПодвала (FooterHeight)
ВысотаСпискаВыбора (ChoiceListHeight)
ВысотаШапки (HeaderHeight)
ГиперСсылка (HyperLink)
ГоризонтальнаяПолосаПрокрутки (HorizontalScrollBar)
ГоризонтальноеПоложение (HorizontalAlign)
ГоризонтальныеЛинии (HorizontalLines)
Данные (Data)
Доступность (Enabled)
Заголовок (Caption)
Значение (Value)
ИзменяетДанные (ModifiesData)
ИзменятьНастройкуКолонок (ChangeSettingOfColumns)
ИзменятьПозициюКолонок (ChangePositionOfColumns)
ИзменятьПорядокСтрок (ChangeRowOrder)
ИзменятьСоставСтрок (ChangeRowSet)
Имя (Name)
ИспользоватьКонтекстноеМеню (UseContextMenu)
ИсточникДействий (ActionSource)
Картинка (Picture)
КартинкаКнопкиВыбора (ChoiceButtonPicture)
КартинкаКнопкиВыбора (SelButtonPicture)
КнопкаВыбора (ChoiceButton)
КнопкаОткрытия (OpenButton)
КнопкаОчистки (ClearButton)
КнопкаПоУмолчанию (DefaultButton)
КнопкаРегулирования (SpinButton)
КнопкаСпискаВыбора (ChoiceListButton)
КонтекстноеМеню (ContextMenu)
Лево (Left)
МаксимальноеЗначение (MaxValue)
Маска (Mask)
Масштабировать (Zoomable)
МинимальноеЗначение (MinValue)
МногострочныйРежим (MultiLine)
НачальноеОтображениеДерева (InitialTreeView)
НачальноеОтображениеСписка (InitialListView)
ОбновлятьПриИзмененииОтбора (UpdateOnFilterChange)
ОграничениеТипа (TypeRestriction)
Ориентация (Orientation)
ОтборСтрок (RowFilter)
ОтметкаНезаполненного (MarkIncomplete)
ОтображатьВыделение (ShowSelection)
ОтображатьКартинку (ShowPicture)
ОтображатьПометку (ShowCheckBox)
ОтображатьПроценты (ShowPercent)
ОтображениеЗакладок (ShowTabs)
ПервыйВГруппе (FirstInGroup)
Подвал (Footer)
Подсказка (ToolTip)
ПоложениеЗаголовка (TitleLocation)
ПоложениеКартинкиНадписи (LabelPictureLocation)
ПоложениеКартинкиПанели (PanelPictureLocation)
ПорядокОбхода (TabOrder)
ПорядокОтображения (ZOrder)
ПроверкаОтображенияНовойСтроки (NewRowShowCheck)
ПрозрачныйФон (Transparent)
ПропускатьПриВводе (SkipOnInput)
РазмерКартинки (PictureSize)
РазрешитьНачалоПеретаскивания (EnableStartDrag)
РазрешитьПеретаскивание (EnableDrag)
Рамка (Border)
РаспределятьПоСтраницам (SeparateByPage)
РасширенноеРедактирование (ExtendedEdit)
РедактированиеТекста (TextEdit)
РежимВводаСтрок (RowInputMode)
РежимВыбора (ChoiceMode)
РежимВыбораИзСписка (ListChoiceMode)
РежимВыбораНезаполненного (IncompleteChoiceMode)
РежимВыделения (SelectionMode)
РежимВыделенияСтроки (RowSelectionMode)
РежимПароля (PasswordMode)
РежимПрокручиваемыхСтраниц (ScrollPageMode)
Свертка (Collapse)
СочетаниеКлавиш (ShortCut)
СписокВыбора (ChoiceList)
СтильОтображения (ShowStyle)
ТекстНевыбраннойКартинки (NonselectedPictureText)
ТекущаяКолонка (CurrentColumn)
ТекущаяСтраница (CurrentPage)
ТекущаяСтрока (CurrentRow)
ТекущиеДанные (CurrentData)
ТекущийРодитель (CurrentParent)
ТипЗначения (ValueType)
ТолькоПросмотр (ReadOnly)
ТриСостояния (ThreeState)
ФиксацияСверху (FixedTop)
ФиксацияСлева (FixedLeft)
ФиксацияСнизу (FixedBottom)
ФиксацияСправа (FixedRight)
Формат (Format)
ЦветРамки (BorderColor)
ЦветТекста (TextColor)
ЦветТекстаВыделения (SelectionTextColor)
ЦветТекстаКнопки (ButtonTextColor)
ЦветТекстаПодвала (FooterTextColor)
ЦветТекстаПоля (FieldTextColor)
ЦветТекстаШапки (HeaderTextColor)
ЦветФона (BackColor)
ЦветФонаВыделения (SelectionBackColor)
ЦветФонаКнопки (ButtonBackColor)
ЦветФонаПодвала (FooterBackColor)
ЦветФонаПоля (FieldBackColor)
ЦветФонаЧередованияСтрок (AlternationRowBackColor)
ЦветФонаШапки (HeaderBackColor)
ЧередованиеЦветовСтрок (UseAlternationRowColor)
Шаг (Step)
Шапка (Header)
Ширина (Width)
ШиринаСпискаВыбора (ListSelWidth)
Шрифт (Font)
ШрифтПодвала (FooterFont)
ШрифтШапки (HeaderFont)
ЭлементСвязиПоТипу (TypeLinkItem)
Да, впадать в исследовательский азарт - это такая себе черта характера.
- и всего лишь сгенерировать XML-файл управляемой формы и упаковать ее в конфигурацию. Самым сложным при этом оказалась группировка элементов, чтобы при масшабировании элементы адекватно растягивались/сдвигались на форме
Дерево элементов в упр. форме. Сгенерированные имена не отличаются красотой
В прикрепленных изображениях и в прикрепленном файле можно посмотреть исходную форму и результат работы на примере обработки ирКонсольЗаданий.epf из шикарной библиотеки "Инструменты разработчика". К сожалению, выложить файл бесплатно (за 0 SM) нельзя.
Генерация форм была выполнена на платформе 8.3.9.2309.
***
Это концептуальная статья, а сам инструмент в стадии глубокой альфа-версии, поэтому код генератора не выложен. Буду благодарен за конструктивные комментарии.
upd 14.11.19
Не все объекты из толстых форм могут быть отображены на управляемой форме (к примеру, объект ПостроительОтчета), но в целом можно генерировать довольно похожие на оригинал формы.
Консоль запросов из ИР
Становится примерно такой. Похоже?
P.s. если задаться целью, можно даже так:
Результат автоматической генерации
но из за сильных отличий построения UI в 7.7 и УФ результат слишком кривой (в основном мешает управление слоями в форме 7.7)