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

14.01.13

Разработка - Математика и алгоритмы

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
MVC_web.dt
.dt 36,56Kb
115
115 Скачать (1 SM) Купить за 1 850 руб.
TestKurs22_03.dt
.dt 33,98Kb
103
103 Скачать (1 SM) Купить за 1 850 руб.

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

См. также

Математика и алгоритмы Программист Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    3208    stopa85    12    

38

Математика и алгоритмы Бесплатно (free)

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

19.10.2023    7618    user1959478    52    

36

Математика и алгоритмы Разное Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3147    maksa2005    8    

26

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    10932    7    SpaceOfMyHead    18    

61

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

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4401    RustIG    9    

25

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

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

23.11.2022    3567    gzharkoj    14    

25

Математика и алгоритмы Программист Платформа 1С v8.3 Россия Абонемент ($m)

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

1 стартмани

21.03.2022    9051    7    kalyaka    11    

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

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

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

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

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

5. tsd 105 31.08.10 15:24 Сейчас в теме
(4) а при чем здесь Гагарин? :)
nonamek27; LelikOFF; +2 Ответить
6. kote 537 01.09.10 00:02 Сейчас в теме
(5) Тык, это я шлем примеряю.. Видимо, придется в космосе искать 1Сников, интересующихся шаблонами проектирования ;)
18. zfilin 2352 08.06.11 22:37 Сейчас в теме
10. Збянтэжаны Саўка 245 02.09.10 17:25 Сейчас в теме
(5) Присмотритесь. Это не Гагарин, возможно это фото автора или еще кого-то, но никак не Гагарина.
11. tsd 105 02.09.10 17:40 Сейчас в теме
(10) уже присмотрелись. Как признался автор, энто он примеряет старые шмотки.
Видать взлететь собрался :D
12. kote 537 03.09.10 10:25 Сейчас в теме
(10)(11) .. Для желающих отправиться со мной - скафандры выдают на http://www.tinza.ru/flash.photofx.php 8-)
7. tango 545 01.09.10 09:51 Сейчас в теме
так это - (0) - шаблон проектирования?
всегда казалось, что ШП - это типовые конфигурации
8. kote 537 01.09.10 12:40 Сейчас в теме
(7) типовые конфигурации - все таки готовые решения.. а вообще 1С страдает тем, что заимствует термины, но понятия в них вкладывает свои, что порой приводит к путанице.. я не слышал, но может и типовые конфигурации они обозвали шаблоном проектирования.
9. tango 545 01.09.10 16:04 Сейчас в теме
(8) "1С страдает" - ...жЖоООжЬ... :)
13. Rabajaba 354 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 537 08.09.10 12:29 Сейчас в теме
(13) Спасибо за интерес..
"Зачем редактировать в списке, если есть форма объекта?"
.. ну а зачем пользователю показывать ненужные ему поля, которые в форме объекта представлены все? Или под каждую роль делать отдельную форму с отдельным набором полей? У меня набор полей определяется запросом, являющимся источником данных для конкретного списка - проще манипулировать полями запроса, чем делать формы под каждую роль или использовать штатные средства управления доступом на уровне полей в платформе, ИМХО.

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

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

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

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

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

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

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

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


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


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

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