gifts2017

Эргономика рулит, или как добиться от 1С возможности редактирования объекта в списке / Попытка применения MVC паттерна в среде 1С Предприятия 8.2

Опубликовал Котэ Пруидзе (kote) в раздел Программирование - Теория программирования

Все началось с того, что в ходе разработки одного интерфейса меня стали посещать мысли, как легко все, что мне требовалось, достигалось в среде MS Access XP/2003.. ну в самом деле, отчего такая несправедливость?! В общем..

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

.. в итоге этого получилось достичь достаточно просто - но гибкости явно недоставало, что при внесении изменений (а они обязательно появляются в самый неудобный момент, не так ли?) привело бы к необходимости муторного переписывания кода - а я этого не очень люблю.. ну максимум - согласен на не_муторное!

В результате молитв, возносимых к богам ООП, снизошло озарение в виде луча ГАММА спектра, который проник ко мне через черепную коробку и породил брожение мыслей :)) И приснились мне паттерны и шаблоны.. и один из них - MVC (Model-View-Controller) - возвышался среди всех, что был мне знак..

В общем, долго ли, коротко ли - но на свет родилось следующее решение, которое врят ли является абсолютным "универсуумом" в плане потребительском, но вполне может сгодится (я надеюсь) аналогом паттерна MVC, широко применяемого при проектировании ООП приложений.

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

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

Итак, осмелюсь представить на суд аудитории сие "чудо в перьях".. Встречаем, как сказал бы Карлсон, Первую и Единственную (пока?) реализацию.. т.е. попытку применения паттерна Model View Controller в среде 1С Предприятие 8.2 на уровне конфигуратора, т.к. думаю.. (или надеюсь?), что внутри самой платформы он используется не единожды.

Пример работает для справочников, а для документов.. ну пока что не реализовано (надобности не было)..

Был бы очень рад конструктивной критике, интересным идеям, да и вообще - поддержке в виде положительных отзывов - со стороны сообщества 1С программистов.. как говорится - пишите, деньги будут.. ну это лучше обсудить в личке ;)


Большая просьба, при использовании данного подхода в своих разработках, давать ссылку на эту публикацию.. ну типа, авторское право, что ли.. Я же даю ссылку на книгу "Паттерны проектирования". Авторы: Эрих Гамма. Ричард Хелм. Ральф Джонсон. Джон Влиссидес..

PS.
- Этот подход будет работать для платформы 8.х в целом.. Во всех версиях есть использованные в работе средства и инструменты (т.е. типы данных и методы)
- То что есть, писалось для тонкого клиента.. в web клиенте не проверял работает.. Если кто проверит - отпишитесь, как оно себя ведет.. в общем, я думаю, что работать должно. Если нет - буду допиливать.

ОБНОВЛЕНО 17/09/2010

+ теперь работает в web клиенте (протестировано в IE и Chrome)

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

Наименование Файл Версия Размер
MVC_web.dt 112
.dt 36,56Kb
14.01.13
112
.dt 36,56Kb Скачать
TestKurs22_03.dt 101
.dt 33,98Kb
14.01.13
101
.dt 33,98Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Coolain (zaebidze) 31.08.10 01:47
Молодчик!Только MVC с 1С-ной как-то не айс вяжется))))Программер который будет читать код не зная данного паттерна, быстрее застрелица! Да и для ООП он более актуален!А идея супер!
2. Котэ Пруидзе (kote) 31.08.10 03:13
(1) .. думал я один бессоницей маюсь :) А на счет не айс, в общем согласен.. но давно было желание попробывать реализовать в 1С эти идеи.. как начал знакомиться с Java для самообразования.

Обидно как то за то, что лучшие мировые наработки использовать 1С не дает.
3. VVV (V_V_V) 31.08.10 12:29
Я конечно далек от ООП, но в чем конкретно была проблема с связями списков в 1С 8.2? О каком перепрограммировании (муторном) связи с Владельцем идет речь, если эта связь настраивается парой щелчков мышки? При этом становятся видны (и доступны на редактирование) только подчиненные элементы. Что сложного в редактировании элемента в списке без вызова форм?
4. Котэ Пруидзе (kote) 31.08.10 13:31
(3) Ну и.. в общем я такого же мнения был, пока не начал делать такую форму.. Бъюсь об заклад, штатными средствами - без написания кода - у Вас ничего не выйдет.. особенно при создании нового объекта.
А если я не прав - пожалуйста, расскажите как сделать то же простыми настройками, буду очень благодарен Вам.

Ну и попробую ответить, как смогу..

"Что сложного в редактировании элемента в списке без вызова форм?"- ну хотя бы то, что на месте можно редактировать _только данные табличных частей_, но никак не поля списка, данные в котором, - элементы справочника.. ну и при этом - в списке же - нужно не только изменять поля, но и добавлять новые элементы - тоже без вызова формы объекта..

"О каком перепрограммировании (муторном) связи с Владельцем идет речь, если эта связь настраивается парой щелчков мышки?" - .. по опыту поддержки значительно"меняных" конфигураций - особенно в части форм - при обновлении настройки, "нащелканные" мышкой как правило слетают и/или забываются.. код поддерживать проще, быстрее и дешевле.. а если изменения (или построение) форм прописать в код, в событие ПриСоздании, например, - то перенос изменений форм при обновлении ГОРАЗДО быстрее.. Единственное неудобство поначалу - в конфигураторе сразу не видишь форму в доработанном виде.. но это поначалу - когда по привычке лезешь смотреть макет формы :)

5. Сергей Троицкий (tsd) 31.08.10 15:24
(4) а при чем здесь Гагарин? :)
nonamek27; LelikOFF; +2 Ответить 2
6. Котэ Пруидзе (kote) 01.09.10 00:02
(5) Тык, это я шлем примеряю.. Видимо, придется в космосе искать 1Сников, интересующихся шаблонами проектирования ;)
7. Михаил Ражиков (tango) 01.09.10 09:51
так это - (0) - шаблон проектирования?
всегда казалось, что ШП - это типовые конфигурации
8. Котэ Пруидзе (kote) 01.09.10 12:40
(7) типовые конфигурации - все таки готовые решения.. а вообще 1С страдает тем, что заимствует термины, но понятия в них вкладывает свои, что порой приводит к путанице.. я не слышал, но может и типовые конфигурации они обозвали шаблоном проектирования.
9. Михаил Ражиков (tango) 01.09.10 16:04
(8) "1С страдает" - ...жЖоООжЬ... :)
10. aga_aga (Збянтэжаны Саўка) 02.09.10 17:25
(5) Присмотритесь. Это не Гагарин, возможно это фото автора или еще кого-то, но никак не Гагарина.
11. Сергей Троицкий (tsd) 02.09.10 17:40
(10) уже присмотрелись. Как признался автор, энто он примеряет старые шмотки.
Видать взлететь собрался :D
12. Котэ Пруидзе (kote) 03.09.10 10:25
(10)(11) .. Для желающих отправиться со мной - скафандры выдают на http://www.tinza.ru/flash.photofx.php 8-)
13. Rabajaba Caspersky (Rabajaba) 07.09.10 17:37
Плюс за попытку реализации.
Немного размышлений вслух:
1. Зачем редактировать в списке, если есть форма объекта? Я переход к SDI интерфейсу вижу как попытку сделать ввод и чтение данных процессом последовательным, т.е. если что-то начал делать, то делай до конца, а не переключайся между окнами нонстопом. Эта идея 1С мне очень нравится, у пользователей теперь не по 20-25 окон а 3-4, спустя месяц работы говорят удобнее;
2. По трафику реализация - жесть. Фильтровать список отбором динамического списка 50к элементов в 15-30 позиций это 100-500Б у меня, у вас на 2-3 элемента 5-6кБ;
3. В реалиях 1С идея мало необходима, т.к. в конечном итоге все равно описываются реквизиты, штатными же средствами необходимо установить точные вызовы событий, ИМХО вид в профиль. 1С штука прикладная, поэтому, на мой взгляд, делать сверхуправляемыми списки, при наличии типа "Динамический список" с произвольным запросом, мало необходимо;
4. Пример простой работы с отборами в списках (2 метода в глобальном модуле):
Функция ПолучитьЭлементОтбораКомпоновки(Отбор, ИмяПоля) Экспорт
	// разберем по типам отбора
	Результат = "";
	флПоиска = ЛОЖЬ;
	// сначала попробуем найти
	Для каждого Элемент из Отбор.Элементы Цикл
		Если Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля) Тогда
			Результат = Элемент;
			флПоиска = ИСТИНА;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	// не нашли - создадим
	Если НЕ флПоиска Тогда
		Результат = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		Результат.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
	КонецЕсли;
	
	Возврат Результат;
КонецФункции
Функция УстановитьЗначениеЭлементаОтбораКомпоновки(Отбор, ИмяПоля, Значение, ВидСравнения = "") Экспорт
	ЭлементОтбора = ПолучитьЭлементОтбораКомпоновки(Отбор, ИмяПоля);
	ЭлементОтбора.Использование = ИСТИНА;
	ЭлементОтбора.ПравоеЗначение = Значение;
	Если ВидСравнения = "" Тогда
		ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	КонецЕсли;
	ЭлементОтбора.ВидСравнения = ВидСравнения;
	
	Возврат ЭлементОтбора;
КонецФункции
...Показать Скрыть

Итого как у меня выглядит связь двух списков:
&НаКлиенте
Процедура ТаблицаСпискаПриАктивизацииСтроки(Элемент)
		УстановитьЗначениеЭлементаОтбораКомпоновки(РеквизитФормыТаблица.Отбор, "Объект", Ссылка);
КонецПроцедуры
14. Котэ Пруидзе (kote) 08.09.10 12:29
(13) Спасибо за интерес..
"Зачем редактировать в списке, если есть форма объекта?"
.. ну а зачем пользователю показывать ненужные ему поля, которые в форме объекта представлены все? Или под каждую роль делать отдельную форму с отдельным набором полей? У меня набор полей определяется запросом, являющимся источником данных для конкретного списка - проще манипулировать полями запроса, чем делать формы под каждую роль или использовать штатные средства управления доступом на уровне полей в платформе, ИМХО.

"..SDI.. а не переключайся между окнами нонстопом. Эта идея 1С мне очень нравится.."
.. как правило, подробно разработанная модель данных, при использовании 1С, вызывает то, что появляются множество объектов, и, соответственно, множество форм - для редактирования каждого из них.. именно от этого и хотелось уйти, т.е. получить удобный SDI интерфейс + сохранить свободу в реализации модели данных..

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

"В реалиях 1С идея мало необходима, .. делать сверхуправляемыми списки, при наличии типа "Динамический список" с произвольным запросом, мало необходимо.."
Мне, прежде всего, было необходимо иметь возможность редактировать поля объекта непосредственно в списке - вот этого в 1С нет. Остальное - последствия.
15. Котэ Пруидзе (kote) 09.09.10 10:22
(13) А вообще, думается, что можно на основе динамических списков сделать все это.. Как нибудь попробую попробовать сотворить это с использованием модели MVC.. Спасибо, еще раз, за общение.
16. Rabajaba Caspersky (Rabajaba) 09.09.10 11:46
(14)
.. как правило, подробно разработанная модель данных, при использовании 1С, вызывает то, что появляются множество объектов, и, соответственно, множество форм

попробую более подробно описать как я вижу работу с интерфейсами 8.2:
1. Пользователю нужно что-то выбрать из списка - форма списка должна быть легкой, интуитивно понятной и не нагруженной кнопками и формами. Если в списке чего-то не хватает, то пользователь жмет добавить и открывается полная форма объекта. Как результат: окна модальны относительно родителя, т.е. он не сможет вернуться в документ, в котором выбирал номенклатуру, пока не закончит ввод номенклатуры. Из-за этого у меня было много проблем с семеркой (там при открытии модально списков нельзя было добавлять элементы). Т.е. никогда не остается открытых не понятно откуда окон.
2. Управление видимостью элементов ИМХО проще, чем динамически генерить тексты запросов. Да и не забываем, что это управляемый интерфейс. Я уже своих научил - сначала на форму я размещаю все реквизиты все, потом пользователи снимают видимость того, что их не интересует. Т.е. проще управлять видимостью реквизитов от ролей, нежели генерить разные запросы от ролей. Можно даже унифицировать (пробовал уже) и хранить настройки видимости реквизитов в каком-нибудь справочнике, для централизованного управления;
3. Небольшое удобство для программиста - не нужно определять все проверки и события модификации объекта как в форме списка, так и в форме объекта. Я уже сам привык (даже как-то удобнее), что справочник на два реквизита редактируется в отдельной форме.
4. Динамический список удобнее таблицы значений, т.к. его можно настроить как угодно (отборы, сортировки и условное оформление).
ИМХО:
Не вижу смысла редактировать объекты в списке.
Применение вашей реализации вижу удобным только для различных универсальных журналов, списков и т.п.
17. Котэ Пруидзе (kote) 10.09.10 11:11
(16) спасибо за подробное изложение опыта.. буду изучать.

PS // чую, что скоро ценность комментариев станет больше, чем самого сабжа статьи ;)
18. Александр Лапшин (zfilin) 08.06.11 22:37
19. Александр Лапшин (zfilin) 08.06.11 22:48
20. Алекс Ю (AlexO) 08.12.11 01:24
Я так понимаю, что это интерактивная связь двух динамических списков?
21. Котэ Пруидзе (kote) 22.12.11 04:03
(20) Если смотреть чисто функционально - то можно и так сказать.. но сам подход - везде доказал свою жизнеспособность и эффективность. Только до прикладных программистов 1С не дошел - в силу специфичности платформы и продвигаемых фирмой 1С наилучших практик использования своей платформы..
.. на практике - могу сказать, что этот, ээээ.. "скилл" :) помог мне ускорить работу пользователей на большой базе местного лидера рынка по продажам 1С - в среднем в 8 раз.. а на самом "напряжном" моменте - в 22 раза, примерное. Просто переписал интерфейс CRM системы (подсистема от фирмы Рарус). А там многие "спецы" сломались - используя стандартный подход и рекомендации от 1С.
22. г. Казань Рустем Гумеров (Rustig) 15.01.12 19:47
(0) покажите в публикации алгоритмы, чтобы не скачивать ваши файлы. сначала заинтересуйте алгоритмами, прежде чем вынуждать людей скачивать что-то. за это минус.
в описании много лишнего (по-моему): космос, пространные мысли об ООП, каких-то Модель-Вью-Контрол...
Только из комментарий стало ясно, по какому поводу разговор. Сталкивался с этой проблемой. Скажу так, что в 1С (дополнительно к типовым спискам документов и элементов справочника) редактирование в списке реализуется через ТаблицуЗначений, в которую вы сами заливаете нужные вам поля нужных вам объектов (справочников, документов, характеристик), далее для этой таблицы значений через командную панель сами программируете "Добавить", "Удалить", "Добавить копированием" и так далее. Объем писанного кода безусловно увеличивается в разы, если сравнить с типовыми средствами редактирования в списках элементов справочника.
Но если вы это сделаете, вы будете в плюсе, потому что это понравится вашим клиентам. :)
Потому что это реально удобно пользователям, но уже не так гибко разработчикам.
zainaz; KAPACEB.AA; +2 Ответить
23. г. Казань Рустем Гумеров (Rustig) 15.01.12 22:48
Пример, представленный в файлах, выбран неудачно, потому что все равно остаются непонятными преимущества перед стандартными динамическими списками. Также, особых комментариев в коде нет, что усложняет расшифровку заложенных алгоритмов и самой идеи. В коде есть отбор списка при активизации элемента в другом списке, собственное перепрограммирование создания и удаления элементов списка, то есть в целом ничего нового... Может я что не увидел? ;)
24. Котэ Пруидзе (kote) 19.01.12 18:39
(23) Вы, видимо, сути так и не поняли - суть не в организации связанных списков. Суть - в возможности редактирования элементов справочников в списке, _без открытия формы элементов_.

Если Вы сможете с помощью _любых штатных 1С-ских механизмов_ организовать редактирование на одной форме _в списке_ элементов документов/справочников - то я бы признал Вашу правоту.
25. Дмитрий Елисеев (w-divin) 18.05.12 10:07
.. ну а зачем пользователю показывать ненужные ему поля, которые в форме объекта представлены все? Или под каждую роль делать отдельную форму с отдельным набором полей? У меня набор полей определяется запросом, являющимся источником данных для конкретного списка - проще манипулировать полями запроса, чем делать формы под каждую роль или использовать штатные средства управления доступом на уровне полей в платформе, ИМХО.

Специально для этого придумали ФункциональныеОпции, ВидимостьПоРолям ну и как уже говорилось произвольный запрос у динамического списка

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


Интересно было бы посмотреть на работу такого механизма в веб-клиенте при 500-800 тыщь строк...
26. Котэ Пруидзе (kote) 09.06.12 02:57
(25)
Интересно было бы посмотреть на работу такого механизма в веб-клиенте при 500-800 тыщь строк...


Не, спасибо :) Тут вот на примере тестов все сделано - вот для таких вот случаев оно в самый раз..

А где это на стандартных то механизмах можно посмотреть? Мне кажется - такого на практике не бывает, чтоб пользователю нужно было показать все это разом.