Модуль обработки, модуль формы, реквизиты, задача на понимание

1. truba 17.10.19 14:27 Сейчас в теме
Коллеги, хочу предположить вашему вниманию следующую задачу:
Есть внешняя обработка. В модуле внешней обработки есть функция следующего вида:
Процедура Инкремент() Экспорт
      ЧтоНибудь = ЧтоНибудь + 1;
КонецПроцедуры

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

У обработки есть несколько форм, они могут быть открыты друг из друга. Из всех модулей форм вызывается функция Инкремент() модуля обработки.

Сама задача звучит так. Сделать так, что бы переменная "ЧтоНибудь" была равна количеству вызовов этой функции Инкремент() в сеансе работы пользователя с этой обработкой.

При этом нельзя изменять конфигурацию.
Понятно что решений может быть много, дополнительное условие - что бы решение было красивым.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. spacecraft 17.10.19 22:48 Сейчас в теме
(1) не указана конфигурация.
Если использоваться будет типовая, то в них (как правило) есть подходящий параметр сеанса.
Вот для УТ11:
Функция ЧтоНибудь() Экспорт
	Возврат ЧтениеЧтоНибудь();
КонецФункции

Процедура Инкремент() Экспорт
	ЧтоНибудь = ЧтениеЧтоНибудь();
	ЧтоНибудь = ЧтоНибудь + 1;
	ЗаписьЧтоНибудь(ЧтоНибудь);
КонецПроцедуры

Функция ЧтениеЧтоНибудь()
	ЧтоНибудь = ПараметрыСеанса.ПараметрыКлиентаНаСервере["Инкремент"];
	Возврат ?(ЧтоНибудь = Неопределено, 0, ЧтоНибудь);
КонецФункции

Процедура ЗаписьЧтоНибудь(ЧтоНибудь)
	ПараметрыКлиента = Новый Соответствие(ПараметрыСеанса.ПараметрыКлиентаНаСервере);
	ПараметрыКлиента["Инкремент"] = ЧтоНибудь;
	ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСоответствие(ПараметрыКлиента);
КонецПроцедуры
Показать
2. AlexandrSmith 69 17.10.19 21:31 Сейчас в теме
Сами выдумали задачу или кто помогал?
5. truba 18.10.19 10:46 Сейчас в теме
(2) Рассуждал на досуге о контекстах выполнения в управляемых формах (на другой задаче, посложнее) и в результате родилась такая задачка - с виду простая, но требует достаточного понимания как платформа работает с формами и какой контекст доступен разработчику на УФ, а какой нет.
//Согласитесь, прикольно?
4. SlavaKron 18.10.19 07:45 Сейчас в теме
Процедура Инкремент() Экспорт
	
	ПолноеИмяОбработки = Метаданные().ПолноеИмя();
	
	ЧтоНибудь = ХранилищеОбщихНастроек.Загрузить(ПолноеИмяОбработки, "ЧтоНибудь");
	Если ЧтоНибудь = Неопределено Тогда
		ЧтоНибудь = 0;
	КонецЕсли;
	ЧтоНибудь = ЧтоНибудь + 1;
	
	ХранилищеОбщихНастроек.Сохранить(ПолноеИмяОбработки, "ЧтоНибудь", ЧтоНибудь);
	
КонецПроцедуры

ХранилищеОбщихНастроек.Сохранить(ПолноеИмяОбработки, "ЧтоНибудь", 0);
Показать
6. truba 18.10.19 10:51 Сейчас в теме
Так что, Господа, пока приходим к выводу что в "экосистеме" самой обработки такое "ЧтоНибудь" невозможно? Обязательно ли нужен внешний объект для хранения с инициализацией и очисткой?
7. SlavaKron 19.10.19 09:24 Сейчас в теме
(6)
Обязательно ли нужен внешний объект для хранения с инициализацией и очисткой

Необязательно, решения, использующие внешние объекты обусловлены постановкой задачи. Понято, что переменные "живут" на сервере только на время вызова. Если нам нужна переменная, которая будет существовать на время сеанса работы с обработкой, а точнее с формой обработки, то она должна "жить" на клиенте, читай – в какой-нибудь из форм. Это очевидно исходя из самой природы сеанса пользователя. Так почему бы не хранить ЧтоНибудь на форме?
8. nomad_irk 72 19.10.19 10:42 Сейчас в теме
(7) Так обработку могут запустить разные пользователи и у всех этих обработок ЧтоНибудь должно меняться синхронно, насколько я понял условия возникновения этой задачи.
Если ЧтоНибудь должно отображать только по текущему пользователю, то вообще не понимаю, как могла возникнуть сама задача.
9. SlavaKron 19.10.19 11:23 Сейчас в теме
(8) В задаче четко сказано "Сделать так, что бы переменная "ЧтоНибудь" была равна количеству вызовов этой функции Инкремент() в сеансе работы пользователя с этой обработкой." Речи о сохранении значений между всеми сеансами пользователей вроде бы нет.
Сама задача возникла из-за того, что необходимо иметь некую переменную, которая доступна во всех формах обработки и хранит значение на протяжении всего времени работы с ней. В обычном приложении такой проблемы нет, для этого использовались реквизиты обработки. Но реквизиты обработки на УФ - архаизм и не отвечают задачам.

Если использовать "экосистему" самой обработки, то ЧтоНибудь придётся хранить в реквизите или экспортной переменной модуля формы. Другие формы, прежде чем обратиться к модулю обработки, должны будут получить значение ЧтоНибудь из Формы-хранителя.
10. nomad_irk 72 19.10.19 11:27 Сейчас в теме
(9)
реквизиты обработки на УФ - архаизм и не отвечают задачам

Это из чего следует, если они удовлетворяют требованиям решения поставленной задачи?
alex-l19041; +1 Ответить
11. SlavaKron 19.10.19 11:38 Сейчас в теме
(10) Вот вам обработка для тестирования.
Прикрепленные файлы:
ВнешняяОбработка1.epf
12. nomad_irk 72 19.10.19 12:00 Сейчас в теме
(11) Хорошо. Проблема понятна. Хранение значения в реквизите формы/экспортной переменной формы-хранителя так же не решит проблемы, имхо.
Т.е. единственный вариант решения - использовать внешнее по обработке хранилище для значения ЧтоНибудь.
13. truba 23.10.19 17:44 Сейчас в теме
Господа, прошу прощения за отсутствие, работа.
По поводу ничего не хранится на сервере - не совсем верно - хранится в форме обработки на сервере, а вот сам объект обработка на сервере (не форма) походу уничтожается, поэтому там да, в реквизитах обработки прихожу к заключению что никак.
Плюс все экспортные переменные доступны только на время вызова сервера и уничтожаются вместе с выходом с сервера.
Плюс все "реквизитФормыВЗначение" без "ЗначениеВРеквизитФормы()" тоже улетают в космос. А с ЗначениеВРеквизитФормы()- остаются реквизитами не объекта обработки, а реквизитами одной конкретной формы, которые при открытии других форм еще надо туда передать и получить обратно, т.к. сам объект в другую форму этой же обработки не передается, плюс если передавать его явно, то есть подозрение что только через клиента, т.е. сериализовать… А переданный объект еще надо синхронизировать или очень аккуратно блокировать все формы обработки и не допускать неявного вызова инкремента(), который уничтожит результат обращения к нему.

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

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

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

А так задача хоть и просто выглядит, заставляет на очень простых примерах в 3-4 строчки кода поэкспериментировать и узнать много нового про доступные, а главное недоступные возможности форм со сколь нибудь сложным интерфейсом.
14. truba 23.10.19 17:59 Сейчас в теме
Конечно есть еще ВладелецФормы, на котором можно повесить реквизит ЧтоНибудь, назначить эту форму мастер-формой и остальные открывать так, что бы мастер-форма оставалась корневым владельцем и на него рекурсивно можно было бы выйти и изменить там ЧтоНибдь.

Или одна из обработок имеет реквизит булево "ЭтоМастер" и реквизит "ЧтоНибудь", который только на ней имеет силу. Соответственно при закрытии мастер-формы одна любая из других открытых форм назначается мастером и на нее передается значение реквизита ЧтоНибудь.

Но все это тоже далеко от красоты и требует постоянной передачи параметров, что на большом объеме далеко от совершенства
15. karamazoff 96 09.04.20 11:30 Сейчас в теме
(14)так чем не устраивает обработка, приведенная в (11)? Реквизит обработки полностью решает вопрос с хранением дынных на время жизни обработки
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот