Оглавление
Отмена изменений по строке из режима редактирования
Различие режимов для новой строки и существующей
Проверка уникальности и заполнения
Реализация новой модели работы с таблицей формы
Введение
Обычно работа с элементами формы ограничивается оформительской частью. Конечно, если необходимо вставить диалог ввода в обработчик какого-либо события - это вполне распространенное решение по кастомизации поведения элементов формы. Однако изменение поведения элемента в моей практике встречалось крайне редко.
Наверное это неблагодарная работа изменять типовое поведение платформы. Во 1-х нужно очень хорошо представлять это поведение, во 2-х можно столкнуться с непониманием со стороны пользователей, которые привыкли к "стандартному" 1С. Однако я все же рискнул и провел некоторое исследование пользовательского опыта при работе с таблицами формы. Конечно в этом исследовании нет строго научного подхода и оно вполне может быть субъективным :) В любом случае, если интересно, представляю вам самим оценить полезность этих улучшений.
Так что же не так с таблицами формы? Первой строчкой моего хит-парада идет отсутствие тривиальной возможности открыть значение ячейки по двойному клику или просто вводу, аналогично как это делается для расшифровки в табличных документах. На второй строчке я бы поставил невозможность отказаться от изменений по строке при выходе из режима редактирования. И наконец, что за ужасная работа с деревом значений?!
Просмотр значения поля
Стандартно платформа открывает значение ячейки табличного документа, если для нее заполнена расшифровка. Это работает, если табличный документ находится в режиме недоступном для редактирования. Такой же пользовательский опыт логично перенести на таблицы формы.
Открытие значения ячейки поля таблицы формы не поддерживается платформой. Косвенно, если нужно открыть значение в ячейке таблицы, можно воспользоваться таким трюком: вызвать поиск по полю (Ctr+F) и нажать кнопку просмотр. Однако гораздо удобнее было бы это сделать, выбрав ячейку непосредственно.
Реализация такой функции проста. Для этого необходимо в обработчике события Выбор определить код по открытию значения в ячейке таблицы. Единственная здесь техническая сложность, как ни странно - получить путь к данным ячейки, чтобы определить значение в поле таблицы. Дело в том, что свойство элементов формы ПутьКДанным доступно только на сервере!
Работая с таблицами баз данных как то привыкаешь, что последнее слово за коммитом по строке. Отказался от изменений - изменения не попали в базу данных. И это удобно! Конечно было бы вообще хорошо, если бы по всем изменениям в форме была бы возможность откатываться назад или повторять действие вперед, как при работе с текстом :)
Однако у строки таблицы есть режим редактирования и это как бы намекает на некоторую целостность данных и возможность отмены изменений при выходе из режима. Однако платформа не поддерживает отмену изменений, хотя и позволяет обработать это событие.
После добавлении новой строки платформа вызывает обработчик таблицы ПриИзменении. Этот обработчик вызывается также после каждого изменения в полях таблицы. Однако при отказе от подтверждения ввода новая строка удаляется, а обработчик ПриИзменении при этом не вызывается. Противоречие здесь в том, что при всех изменениях до этого обработчик таблицы вызывается, а при обратном изменении - нет. При вводе новой строки по сути строка была добавлена - это первое изменение, а при отказе - удалена и это уже второе изменение! Если отработать только первое изменение, то теряется обработка отказа. Впрочем событие отказа можно отловить в обработчике завершения редактирования строки, но тут есть два момента: теряется общий подход работы по изменениям, нельзя в обработчике использовать серверные вызовы.
При редактировании существующей строки таблицы нельзя отменить изменения. Если отказаться от подтверждения ввода изменений по строке и выйти из режима редактирования, то сами изменения сохранятся. При этом платформа также не генерирует событие об изменении и здесь это не является противоречием, однако сохранение изменений - таковым является.
На мой взгляд отмена редактирования должна приводить к откату изменений: для новой строки - удаление, для существующей - восстановление данных до начала редактирования. Обработка изменений по таблице должна быть только после выхода из режима редактирования с подтверждением.
А вы обратили внимание, что при вводе новой строки используется режим обхода полей ввода? Причем для обхода используется Enter, хотя в обычном режиме Enter служит подтверждением ввода и выходом из режима редактирования. Конечно закончить досрочно ввод можно комбинацией клавишь Ctrl+Enter или переключив фокус на другой элемент формы.
В тоже время в режиме редактирования существующей строки все как обычно: обход по Tab, ввод по Enter. Зачем такое различное поведение? Пусть будет одинаковым, тем более, что я так и не нашел иного способа ввести строку верхнего уровня, кроме как через режим редактирования существующей строки.
Кроме того в таком режиме удобно вводить информацию по колонкам, но тогда нужно отключить проверки заполнения и уникальности при работе с таблицей.
Еще неплохо бы добавить проверку перед вводом изменений: проверку на уникальность и заполнения обязательных полей. Это легко организовать в обработчике события ПередОкончаниемРедактирования. В случае исключения система должна выдать сообщение об ошибке и заблокировать выход из режима редактирования. У пользователя в таком случае будет два выхода: исправить ошибки или отказаться от изменений.
Непосредственная проверка в месте ввода - лучшее решение, чем большая проверка в конце. Проверки в интерфейсе делятся на два типа: ограничение выбора и контроль ввода. Ограничение выбора осуществляется в полях, а контроль ввода в таблице. В данном случае речь об ограничении ввода некорректных или неполных данных.
В работе с деревом в таблице формы есть особенности: нельзя добавить строку верхнего уровня, добавить можно только подчиненные строки. Из-за этой особенности дерево всегда представляется в виде одного главного узла и подчиненных. Также для добавления новой строки на текущем уровне необходимо вначале выбрать строку верхнего уровня, чтобы затем добавить подчиненную строку на текущем уровне.
Результат добавления строк дерева: слева три узла на верхнем уровне, справа - только один узел верхнего уровня
Для работы с деревом используется тот же элемент формы, что и для таблиц. При работе с деревом также используются строки, режим редактирования и те же события, что и для таблиц. Поведение платформы аналогично таблицам.
Однако не все то, что хорошо для работы с таблицами также будет хорошо для дерева. Рассмотрим процесс удаления строки.
Общий принцип удаления строки в таблице формы следующий: после удаления строки текущей строкой становится следующая. Если это последняя строка, то последняя после удаления. При работе с деревом получается, что если удалить последнюю строку в подчиненном узле, то текущим становится следующий узел верхнего уровня. Т.е. получается, что находясь на нижнем уровне после удаления последней строки текущим становится следующий узел верхнего уровня.
Рассмотрим на примере. Пусть мы удаляем файл с конца в папке. Представим себе, что после удаления файла текущим становится следующий каталог! Обычно файловые менеджеры действуют не так: вначале удаляются все файлы внутри папки, а уже затем сама текущая папка (не следующая!).
Результат удаления строки дерева: текущая строка осталась на том же уровне, справа - текущая строка оказалась на уровень выше
Итак, что здесь хотелось бы исправить. В первую очередь исправить добавление новой строки. Пусть всегда добавление новой строки будет на текущем уровне. Для добавления подчиненной строки необходимо предусмотреть команду. Следующим улучшением можно изменить сценарий удаления строк: всегда удалять вначале строки текущего уровня и затем текущий узел верхнего уровня.
Изменение работы с элементом реализуется через обработчики событий. Для элемента таблицы формы есть следующие полезные события:
- ПередНачаломДобавления - для новых строк
- ПередНачаломИзменения - для существующих строк
- ПриНачалеРедактирования - общий обработчик для новых или существующих строк, текущая строка спозиционирована
- ПередОкончаниемРедактирования - проверки на возможность ввода
- ПриОкончанииРедактирования - действия при выходе из режима редактирования
Последовательность событий редактирования строки
Для изменения поведения элемента также потребуются методы интерактивной работы с элементом: ДобавитьСтроку(), ИзменитьСтроку(). В демо примере использован подход, при котором вся работа с данными реализована в коде, а интерактивная работа со строкой вызывается методом ИзменитьСтроку(). Все манипуляции со строками: добавление, изменение и удаление - полностью реализованы в коде обработчиков.
Такой подход позволяет изменить работу элемента таблицы формы требуемым образом. В демо обработке можно посмотреть такую реализацию для таблицы значений и для дерева. В обработке можно попробовать поработать с таблицей с модифицированным поведением и со стандартным.
Привожу код, реализующий требуемую функциональность.
Реализованные возможности:
- просмотр значения
- отмена изменений по строке
- удаление строк вначале на текущем уровне, затем текущий узел верхнего уровня
- одинаковое поведение в режиме редактирования как для новой строки, так и для существующей
- проверка уникальности в рамках родительского узла и заполнения данных
Платформа 1С является средой быстрой разработки. Разработка интерфейса - это одна из самых сложных задач в бизнес-ориентированных продуктах, где доля взаимодействия пользователя с системой очень высока. Именно эту задачу платформа 1С берет на себя, предоставляя разработчику готовые решения под разнообразные сценарии взаимодействия с пользователями.
И конечно отвечая на вопрос в теме, нужно иметь в виду, что здесь нет никакой претензии. Наоборот, решения представленные здесь показывают гибкость платформы, способную изменить стандартные поведения элементов в нужную нам сторону. А вот воспользоваться этими возможностями по кастомизации или нет - решать вам. В большинстве задач автоматизации бизнеса скорее такие усовершенствования не будут иметь решающего значения. Но если речь идет о продукте, то такие усовершенствования вполне могут быть оправданы.
Во вложении демо-обработка под управляемые формы, платформа 1С 8.3.21.1302.