Публикацию можно считать художественным вымыслом, все совпадения случайны!
Люблю поэкспериментировать в нашей горячо обожаемой и «управляемой» среде разработки с интерфейсами форм. А если подворачивается подходящая задача — значит все звезды сошлись неспроста!
рождение сверхновой
- Дмитрий Вадимович, я тебе скину ТЗ, некоторые пункты описаны размыто и возможно потребуется пообщаться с заказчиком напрямую и даже проявить творческий подход.
Просто подарок, творческий подход…
- Ещё отмечу, что в одном пункте я подумал, что можно сделать через таблицу значений или табличный документ, решай сам…
- Готовые решения рассматриваем?
- Нет.
На нет и суда нет.
ТЗ
Дизайн интерфейса — одно из моих любимых хобби в разработке. Кто знает возможности платформы «1С:Предприятие 8.3» понимает, что мы сильно ограничены в дизайне интерфейса. Ты словно настоящий творец безумия в желтом мире пытаешь найти способ разработать нереализуемое на первый взгляд.
Подробности всего ТЗ опустим, оно было большое и в последствии переродилось из функционального блока 1С:ERP в отдельный проект по разработке самописной конфигурации, говорят, что её до сих пор пилят, а может и нет… Нас же интересует пункт про Таблицу значений или Табличный документ. Конечно, как ты уже заметил, мой дорогой читатель, из заголовка или своей личной компетентности, что речь идёт о Таблице формы, но многие грешат и называют её так как привыкли.
Если убрать контекст предприятия, то необходимо было предоставить пользователю возможность создавать свою сложную кросс-таблицу с разными группировками по колонкам. Уровень группировок доходил предварительно до четырех, но была вероятность и большей глубины. На пересечении строк и нижнего уровня группировки должны были вводиться производственные показатели с разным типом значений. Вся эта "портянка" должна была конечно же сохраняться и открываться в последствии.
Поехали!
Для простоты понимания, визуализирую в Excel необходимую Таблицу формы, она представлена ниже на скриншоте.
Как уже было озвучено в ТЗ, пользователь функционала может свободно создавать неограниченное количество группировок (разрезов) на каждом уровне, но каждый уровень группировки по умолчанию будет содержать как минимум один нижестоящий уровень.
Исходя из названия публикации выбор конечно пал на разработку интерфейса с помощью Таблицы формы. Точнее динамической таблицы формы, структура которой изменяется по желанию пользователя.
Движок
Причиной создания движка была необходимость в масштабировании функционала. Таблиц могло быть с десяток на одной форме и требовалось учитывать, что типы группировок будут разные, так же как количество уровней. Идея реализации как-то пришла сама собой.
Архитектура визуализации таблицы на форме осуществлялась с помощью элемента формы «Группа колонок» с выводом заголовка, в нижнем уровне группы колонок помещалась Колонка для хранения значения без вывода заголовка. Таким образом все заголовки, отображаемые на форме у Таблицы, не принадлежали колонке, хранящей значения.
Для сохранения архитектуры такого фантастического интерфейса использовалась не одна служебная таблица, которая в себе хранила имена элементов форм. Имена шифровались, что помогало легко и просто подключать новые таблицы и обращаться к любым показателям. Пример шифра, который использовался в движке представлен ниже на скриншоте.
Значения на пересечении строк и нижнего уровня группировки, хранятся в зашифрованных колонках на форме, при этом тип их может быть разный (число, дата, строка и т.д.). Ниже на скриншоте представлен пример шифрования колонок.
Единственное исключение имена группировок для всех таблиц должны быть уникальные в рамках всей формы, а не конкретной таблицы. Поэтому все имена элементов получили префикс в виде имени таблицы к которой они относились, например Таблица1Погрузчик_1, Таблица1Материал_1_1 и т.д.
На первый взгляд кажется всё сложным, но не забывайте, что за создание наименований и самого шифра отвечал движок. Также он отвечал за сборку и разборку этих сложных Таблиц формы для сохранения и загрузки данных. Получение информации для различных отчетов и алгоритмов уже происходило из плоских таблиц, записанных в базу данных.
Это был прототип, который по-хорошему после успешной опытно-промышленной эксплуатации потребовал бы рефакторинг кода и возможную оптимизацию.
Дедлайн
Демонстрация нового функционала заказчику состоялась через месяц. Визуализация заказчику понравилась, это конечно было попадание прямо в яблочко. Но не понравился сам интерфейс управления созданием новых колонок и установка значений им.
Движок динамической таблицы формы испытывал главную проблему, отсутствие метода вызова контекстного меню по элементу Группа колонок! Выкрутился я созданием уровня Группы колонок следующим образом (скриншот из инструкции ниже): пользователь вставал на значение (1) и осознавал в рамках какой группировки он находится, затем добавлял нужную колонку (2) по методам из командной панели. Да это было неудобно, и я это понимал, но решение принято и работа выполнена в поставленный срок. Функционал готовился к запуску в опытно-промышленную эксплуатацию.
А вот если бы да кабы
Было бы это лучше или хуже на табличном документе изначально? Всё возможно, но интерфейс, реализуемый на Табличном документе мне сразу показался, каким-то «плоским», не было явного акцента на элементах интерфейса, это было бы больше похоже на Excel с заливками ячеек колонок, их блокировкой от изменений и так далее. В реализованном функционале движка было именно привычное интерфейсное выделение уровней группировок как и во всех табличных частях типовых документах.
MES
Разработанный функционал у меня забрали и сказали прекратить работу по проекту, в опытно-промышленную мы его не запустили. Заказчик оказался удивлен не меньше меня... Тем временем пошли слухи, что над одной схожей задачей бизнеса работали две команды. На тот момент я подумал, что выбрали функционал другой команды, а мой похоронили.
Прошло примерно больше полугода и меня неожиданно и срочно подключают к проекту под кодовым названием «MES» и с требованием «бросить всё и заниматься только им». Первое моё удивление, в нем оказался мой функционал и другие функциональные блоки, перенесенные из 1С:ERP. К проекту так же вернулся и мой заказчик. Оба мы прибывали в недоумении, но это уже нюансы внутренней политики и кухни того предприятия.
Возвращение
Монстр вернулся к хозяину! В результате стечения обстоятельств мне перешла и вся самописка, тут я уже прокачивал опыт не на интерфейсе, а больше на работе с EDT & GIT… Но это уже другая история, вернемся к монстру!
Был удивлен, что перенесенный не мною функционал движка из 1С:ERP в самописную конфигурацию на БСП переехал без каких-то видимых повреждений и остался жив.
Новые потребности от заказчика начали тестировать движок на пригодность к масштабированию. Создавались другие табличные части у документа для хранения производственных показателей, если не ошибаюсь их количество уже стремилось к десяти и возможно перевалило этот рубеж.
Считаю, что движок справлялся на ура, он не потерял к сожалению своего главного минуса в плане интерфейса по добавлению колонок, но и приобрел неожиданно новый минус.
Некультурное поведение платформы
Первые жалобы после опытно-промышленной эксплуатации: «Когда мы вводим значение, таблица скачет». Оказалось, пересчеты вертикальных итогов отображаемые в подвале колонки, необходимо было писать не напрямую в элемент формы подвала, а выводить через вспомогательные текстовые реквизиты формы, закрепленные за заголовком подвала колонки. Хорошо, странное поведение Таблицы формы удалось победить.
Не прошло и пары дней после победы странного поведения платформы со скачками таблицы, как пользователи начали обращаться опять с той же проблемой: «Вводим значение колонки, таблица скачет».
И тут я решил применить тот же способ и для Группы колонок, выводить значения для заголовка колонок через вспомогательные текстовые реквизиты формы, но увы потерпел неудачу. При изменении заголовка выбранной Группы колонок, изменяемая колонка «скакала» принимая правое крайнее положение на отображаемой части таблицы формы.
Обращался за помощью к коллегам и в сообщества, но безрезультатно. Ниже отрывок из старого видео-вопроса. Если скажете, что есть решение... увы уже конечно не вернусь к этой задаче, так уже давно продолжил карьеру в другой компании.
Это фиаско, братан!
Если неудобство, связанное с созданием Группы колонок ещё можно было пережить, то представьте, как всё перевернули эти «скачки». Выявленное поведение платформы ставило крест на всем функционале движка по созданию динамической таблицы формы, решения проблемы не было.
ваша остановка, сэр!
Считаю, что изначальное решение по создания функционала динамической таблицы формы было верным, но подкачала сама платформа с её странным поведением и ограниченными возможностями. Использовать функционал в таком виде я бы не стал, но есть надежда, что платформа получит развитие в этом направлении. Возможно разработчики платформы добавят схожий функционал для Группы колонок как у Подвалов колонок, когда привязка к текстовому реквизиту решает проблему со «скачками». Возможно так же разработчики платформы добавят когда-нибудь метод контекстного меню для Группы колонок, что было бы точно не лишним.