Что не так с таблицами формы?

19.09.22

Разработка - Механизмы платформы 1С

Почему при редактирования строки таблицы нельзя отказаться от изменений? Почему на верхнем уровне дерева можно ввести только один узел? Ответ на эти и другие вопросы один - потому что 1С :) Однако не все так плохо! Возможностей кастомизации в платформе 1С вполне достаточно, чтобы улучшить работу с этим элементом и снять некоторые ограничения.

Скачать файлы

Наименование Файл Версия Размер
Демо-обработка
.epf 11,25Kb
2
.epf 11,25Kb 2 Скачать

Оглавление

Введение. 1

Просмотр значения поля. 1

Отмена изменений по строке из режима редактирования. 1

Различие режимов для новой строки и существующей. 2

Проверка уникальности и заполнения. 2

Работа с деревом.. 3

Реализация новой модели работы с таблицей формы.. 3

Вывод. 4


Введение

Обычно работа с элементами формы ограничивается оформительской частью. Конечно, если необходимо вставить диалог ввода в обработчик какого-либо события - это вполне распространенное решение по кастомизации поведения элементов формы. Однако изменение поведения элемента в моей практике встречалось крайне редко.

Наверное это неблагодарная работа изменять типовое поведение платформы. Во 1-х нужно очень хорошо представлять это поведение, во 2-х можно столкнуться с непониманием со стороны пользователей, которые привыкли к "стандартному" 1С. Однако я все же рискнул и провел некоторое исследование пользовательского опыта при работе с таблицами формы. Конечно в этом исследовании нет строго научного подхода и оно вполне может быть субъективным :) В любом случае, если интересно, представляю вам самим оценить полезность этих улучшений.

Так что же не так с таблицами формы? Первой строчкой моего хит-парада идет отсутствие тривиальной возможности открыть значение ячейки по двойному клику или просто вводу, аналогично как это делается для расшифровки в табличных документах. На второй строчке я бы поставил невозможность отказаться от изменений по строке при выходе из режима редактирования. И наконец, что за ужасная работа с деревом значений?!

Просмотр значения поля

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

Открытие значения ячейки поля таблицы формы не поддерживается платформой. Косвенно, если нужно открыть значение в ячейке таблицы, можно воспользоваться таким трюком: вызвать поиск по полю (Ctr+F) и нажать кнопку просмотр. Однако гораздо удобнее было бы это сделать, выбрав ячейку непосредственно.

Реализация такой функции проста. Для этого необходимо в обработчике события Выбор определить код по открытию значения в ячейке таблицы. Единственная здесь техническая сложность, как ни странно - получить путь к данным ячейки, чтобы определить значение в поле таблицы. Дело в том, что свойство элементов формы ПутьКДанным доступно только на сервере!

Работая с таблицами баз данных как то привыкаешь, что последнее слово за коммитом по строке. Отказался от изменений - изменения не попали в базу данных. И это удобно! Конечно было бы вообще хорошо, если бы по всем изменениям в форме была бы возможность откатываться назад или повторять действие вперед, как при работе с текстом :)

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

После добавлении новой строки платформа вызывает обработчик таблицы ПриИзменении. Этот обработчик вызывается также после каждого изменения в полях таблицы. Однако при отказе от подтверждения ввода новая строка удаляется, а обработчик ПриИзменении при этом не вызывается. Противоречие здесь в том, что при всех изменениях до этого обработчик таблицы вызывается, а при обратном изменении - нет. При вводе новой строки по сути строка была добавлена - это первое изменение, а при отказе - удалена и это уже второе изменение! Если отработать только первое изменение, то теряется обработка отказа. Впрочем событие отказа можно отловить в обработчике завершения редактирования строки, но тут есть два момента: теряется общий подход работы по изменениям, нельзя в обработчике использовать серверные вызовы.

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

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

А вы обратили внимание, что при вводе новой строки используется режим обхода полей ввода? Причем для обхода используется Enter, хотя в обычном режиме Enter служит подтверждением ввода и выходом из режима редактирования. Конечно закончить досрочно ввод можно комбинацией клавишь Ctrl+Enter или переключив фокус на другой элемент формы.

В тоже время в режиме редактирования существующей строки все как обычно: обход по Tab, ввод по Enter. Зачем такое различное поведение? Пусть будет одинаковым, тем более, что я так и не нашел иного способа ввести строку верхнего уровня, кроме как через режим редактирования существующей строки.

Кроме того в таком режиме удобно вводить информацию по колонкам, но тогда нужно отключить проверки заполнения и уникальности при работе с таблицей.

Еще неплохо бы добавить проверку перед вводом изменений: проверку на уникальность и заполнения обязательных полей. Это легко организовать в обработчике события ПередОкончаниемРедактирования. В случае исключения система должна выдать сообщение об ошибке и заблокировать выход из режима редактирования. У пользователя в таком случае будет два выхода: исправить ошибки или отказаться от изменений.

Непосредственная проверка в месте ввода - лучшее решение, чем большая проверка в конце. Проверки в интерфейсе делятся на два типа: ограничение выбора и контроль ввода. Ограничение выбора осуществляется в полях, а контроль ввода в таблице. В данном случае речь об ограничении ввода некорректных или неполных данных.

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

Результат добавления строк дерева: слева три узла на верхнем уровне, справа - только один узел верхнего уровня

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

Однако не все то, что хорошо для работы с таблицами также будет хорошо для дерева. Рассмотрим процесс удаления строки.

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

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

Результат удаления строки дерева: текущая строка осталась на том же уровне, справа - текущая строка оказалась на уровень выше

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

Изменение работы с элементом реализуется через обработчики событий. Для элемента таблицы формы есть следующие полезные события:

  • ПередНачаломДобавления - для новых строк
  • ПередНачаломИзменения - для существующих строк
  • ПриНачалеРедактирования - общий обработчик для новых или существующих строк, текущая строка спозиционирована
  • ПередОкончаниемРедактирования - проверки на возможность ввода
  • ПриОкончанииРедактирования - действия при выходе из режима редактирования

Последовательность событий редактирования строки

Для изменения поведения элемента также потребуются методы интерактивной работы с элементом: ДобавитьСтроку(), ИзменитьСтроку(). В демо примере использован подход, при котором вся работа с данными реализована в коде, а интерактивная работа со строкой вызывается методом ИзменитьСтроку(). Все манипуляции со строками: добавление, изменение и удаление - полностью реализованы в коде обработчиков.

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

Привожу код, реализующий требуемую функциональность.

 
 Код реализации модифицированного поведения таблицы формы

Реализованные возможности:

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

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

"На самом деле одинэсники вовсю используют самые лучшие паттерны, тщательно отобранные заботливыми методистами и разработчиками платформы 1С.
Когда ты пишешь свой тупой код для простенькой управляемой формы, на самом деле ты юзаешь model-view-controller с double-way data binding в three-layered-data-app-engine, сдобренный high level object-relation-mapping на базе declarative metadata description, имеющей свой platform-independent query language, c declarative data-driven user interface, complete transparent serialization и domain-oriented program language."

А. Орефков

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

Во вложении демо-обработка под управляемые формы, платформа 1С 8.3.21.1302.

Таблица форма Интерфейс Управляемая

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4625    dsdred    53    

73

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5312    YA_418728146    25    

64

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6440    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18508    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12113    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8850    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

20.08.2023    6290    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    16021    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. RustIG 1382 19.09.22 12:52 Сейчас в теме
(0) если это работает, то плюс вам за проделанную работу!
авансом тоже плюс! :)
2. German 413 20.09.22 05:41 Сейчас в теме
ПолучитьПутьКДаннымЭлементаФормы()


А как же
Элемент.ДанныеСтроки()
3. kalyaka 1053 20.09.22 09:37 Сейчас в теме
(2) Спасибо!
Исправил процедуру МодельПередНачаломИзменения, теперь достаточно элемента таблицы и свойств:
	ТекущиеДанные = Новый Структура(Свойства);
	ЗаполнитьЗначенияСвойств(ТекущиеДанные, ТаблицаФормы.ТекущиеДанные);
Еще бы придумать как ДанныеФормыЭлементКоллекции превратить в структуру на клиенте, тогда не нужно будет передавать свойства строки.

А вы, похоже про другое :) Но в процедуре Выбор мне нужно как раз узнать по имени поля имя колонки в структуре, которая возвращается методом ДанныеСтроки().

Обновил код в статье и демо-обработку.
Оставьте свое сообщение