Установить стандартные настройки управляемой формы

1. viki_glebova 04.07.19 22:14 Сейчас в теме
Всем привет. Если зайти на форме в меню Еще-->Изменить форму. Затем Еще-->Установить стандартные настройки. То форма приобретает изначальный внешний вид. Мне нужно это сделать программно. Это возможно?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
59. Lerka2611 26.05.20 13:09 Сейчас в теме
У меня работает так: в процедуре ПриСозданииНаСервере

КлючОбъекта = "ВнешняяОбработка.ИмяОбработки.Форма.Форма/НастройкиОкна";
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта,"", ИмяПользователя());
КлючСохраненияПоложенияОкна = Строка(Новый УникальныйИдентификатор);
G13ma; AnPet; user717534; vakham; HalWin; kabantus; nikolasx; Apolonov-Erik; HystriX; natlens; ZDmitry83; Serg2000mr; blandinko; dav1984; user635795_aleksej.alex2011; s512; insurgut; AnddnA; stupidgamer; tancha_cha; Merkalov; rpgshnik; kalyaka; BigB; COMPER; +25 Ответить
56. viki_glebova 13.07.19 12:24 Сейчас в теме
Перерыв весь инет. Почитав мнения людей и даже ответы разработчиков, сформировалось мнение... Подобное в платформе просто не реализовано.

Костыль как это все же сделать:
1) Как было предложены выше, все же стараться сделать форму одного размера. Заполнить чем-то пустое пространство, ну или что-то в этом роде.

2) Оказывается программно это можно сделать обычной горячей клавишей восстановления положения окна Alt+Shift+R

На виндовс можно добиться так
		
Shell = Новый COMОбъект("WScript.Shell");
Shell.SendKeys("%+®"); // вызов Alt+Shift+R


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

Обидно, что подобное не реализовано. Всем спасибо за участие.
Teut_Vlad; Henistaromin; AnddnA; KolBbl4; Merkalov; BigB; DennyPhilord; pyrkin_vanya; +8 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. danjer74 3 05.07.19 07:24 Сейчас в теме
(1)Проще пользователей этой кнопке обучить.
47. Xershi 1484 05.07.19 22:18 Сейчас в теме
65. Serg2000mr 319 27.09.22 20:11 Сейчас в теме
(1) viki_glebova, дополните, пожалуйста, найденное решение информацией из (59)
2. Stref75 05.07.19 05:51 Сейчас в теме
Какова конечная цель? Зачем сбрасывать настройки, которые сделал пользователь в форме?
Может проще изначально запретить пользователям изменять форму, тогда она всегда будет иметь вид, который задал разработчик.
baracuda; danjer74; +2 1 Ответить
4. dhurricane 05.07.19 07:44 Сейчас в теме
Попробуйте так:
// удаление для текущего пользователя
ХранилищеНастроекДанныхФорм.Удалить("<Полное имя формы>/НастройкиФормы");

// удаление для другого пользователя
ХранилищеНастроекДанныхФорм.Удалить("<Полное имя формы>/НастройкиФормы", , "ИвановИИ");

// если у формы установлено свойство "КлючНазначенияИспользования"
ХранилищеНастроекДанныхФорм.Удалить("<Полное имя формы>/<КлючНазначенияИспользования>/НастройкиФормы");

// пример полного имени формы
ИмяФормы = "Обработка.ВыгрузкаДанных.Форма.Форма1";
Показать
5. SlavaKron 05.07.19 08:37 Сейчас в теме
ХранилищеСистемныхНастроек.Удалить("ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма/НастройкиФормы",, ИмяПользователя());
6. viki_glebova 05.07.19 11:33 Сейчас в теме
(4)
(5)
Пробовала. Даже удалила полностью все найтроки из этого хранилища. Все равно не работает. Это общая форма.

(2)
Нет, не проще. Используется общая форма. В ней есть много групп, которые необходимо в зависимости от отпределенных условий скрывать и показывать вновь. Так вот, когда, например, показываешь какую то группу, которая имеет большой размер, то сама форма расширяется. 1С это виидмо как то запоминанает. Но потом когда открываешь опять эту форму, то размер у нее меньше и пол формы просто с пустым пространством. Через эту ручную операцию все приходит в норму. Теперь это нужно сделать программно.
7. SlavaKron 05.07.19 11:44 Сейчас в теме
8. viki_glebova 05.07.19 11:47 Сейчас в теме
(7) ХранилищеСистемныхНастроек.Удалить("ОбщаяФорма.sendy_ФормаОплаты/Такси/НастройкиОкна", "", ПараметрыСеанса.ТекущийПользователь);

и так

ХранилищеНастроекДанныхФорм.Удалить("ОбщаяФорма.sendy_ФормаОплаты", "НастройкиФормы", ПараметрыСеанса.ТекущийПользователь);

На инфостарте скачала обработку, которая может просматривать и удалять настройки из этого хранилища. Так вот если это сделать, то в моей форме все равно ничего не меняется.
9. SlavaKron 05.07.19 11:50 Сейчас в теме
(8) Почему "ПараметрыСеанса.ТекущийПользователь"? Я же писал ИмяПользователя().
Еще раз:
ХранилищеСистемныхНастроек.Удалить("ОбщаяФорма.sendy_ФормаОплаты/НастройкиФормы",, ИмяПользователя());
11. viki_glebova 05.07.19 11:52 Сейчас в теме
(9)
ХранилищеСистемныхНастроек.Удалить("ОбщаяФорма.sendy_ФормаОплаты/НастройкиФормы",, ИмяПользователя());

Нет, все тоже самое.
13. SlavaKron 05.07.19 11:57 Сейчас в теме
(11) Запустите эту обработку. Есть настройки с ключом объекта "ОбщаяФорма.sendy_ФормаОплаты/НастройкиФормы"?
Прикрепленные файлы:
ПолучитьНастройкиПользователя.epf
20. viki_glebova 05.07.19 12:41 Сейчас в теме
(13)Нет там такой настройки.

(14)Эта процедура вызывается как раз ПриСозданииНаСервере.
10. Sashares 34 05.07.19 11:52 Сейчас в теме
(8) В какой момент вы вызываете этот код?
12. viki_glebova 05.07.19 11:52 Сейчас в теме
(10)У меня есть процедура установки видимости элементов формы. Серверная. Там и пишу его.
14. Sashares 34 05.07.19 12:03 Сейчас в теме
(12)То есть для открытой уже формы?
Не работает такое.
Программно нельзя установить стандартные настройки формы.
Единственный вариант - при создании на сервере или когда форма закрыта удалить настройки, чтобы при открытии уже были стандартные.
15. SlavaKron 05.07.19 12:10 Сейчас в теме
(14) Вполне возможно сбросить настройки у открытой формы. После удаления настроек достаточно сделать любой серверный контекстный вызов формы.
Sashares; +1 Ответить
16. Sashares 34 05.07.19 12:13 Сейчас в теме
17. SlavaKron 05.07.19 12:18 Сейчас в теме
(16) Ну вот возьмите эту же обработку. Только что на коленке написал.
Удалите отображение, например, последних 2-х колонок таблицы через "Изменить форму...".
Обновите. Удалите настройку с ключом "ВнешняяОбработка.ПолучитьНастройкиПользователя.Форма.Форма/НастройкиФормы". Колонки появятся.
Прикрепленные файлы:
ПолучитьНастройкиПользователя.epf
user717534; tormozit; Nihonjin; d_sdr; viki_glebova; Sashares; +6 Ответить
18. Sashares 34 05.07.19 12:23 Сейчас в теме
(17)Браузер пишет, в файле вирус.
Прикрепленные файлы:
19. Sashares 34 05.07.19 12:37 Сейчас в теме
(17) Воспроизвел.
Прикольно, спасибо.
67. tormozit 7143 28.12.22 18:24 Сейчас в теме
(17) У меня сработало на платформе 8.3.23. Но для добавленных программно колонок не работает.
68. tormozit 7143 28.12.22 19:14 Сейчас в теме
(67) Точнее у программно добавленных колонок восстановилась только видимость, а ширина не восстановилась.
21. viki_glebova 05.07.19 12:42 Сейчас в теме
22. Sashares 34 05.07.19 12:50 Сейчас в теме
(21) У меня работает так для внешней обработки:
&НаСервере
Процедура Команда1НаСервере()
 ХранилищеСистемныхНастроек.Удалить("ВнешняяОбработка.ВнешняяОбработка2.Форма.Форма/НастройкиФормы",, ИмяПользователя());
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
 Команда1НаСервере();
КонецПроцедуры
Показать
23. viki_glebova 05.07.19 12:54 Сейчас в теме
(22)У меня в списке настроек вообще нет сохраненной настройки для этой формы.
24. Sashares 34 05.07.19 12:57 Сейчас в теме
(23)У себя не проверял, есть ли настройки, только привел код, как у меня работает.
Этот код выполняется не при создании на сервере, а при нажатии на отдельную кнопку.
25. viki_glebova 05.07.19 13:23 Сейчас в теме
Все равно не работает как надо. Ни один из вариантов.
26. dhurricane 05.07.19 13:28 Сейчас в теме
(25) Я так понял, у Вас проблемы именно с размерами окна? Попробуйте поэкспериментировать и с другими ключами объектов настроек. Например:
"ОбщаяФорма.sendy_ФормаОплаты/НастройкиОкна"
"ОбщаяФорма.sendy_ФормаОплаты/Такси/НастройкиОкна"
27. viki_glebova 05.07.19 13:33 Сейчас в теме
(26)Совершенно верно. См.Скриншоты. Первый как открывается. Второй как должно открываться и оно таким ставновится когда устанавливаю стандартные настройки.

Дело в том, что таких настроек там даже нету вообще.
Прикрепленные файлы:
28. dhurricane 05.07.19 13:39 Сейчас в теме
(27) Осмелюсь предположить, что дело здесь совсем не в сохраняемых настройках. Видимо, нужно указать форме, чтобы она пересчитала свои размеры в зависимости от видимых на ней элементов. Но как это сделать, я не знаю.

Не получится ли у Вас зайти с другой стороны и сделать форму всегда одного размера? Не использовать изменение видимости групп элементов, а менять их доступность, или же расположить элементы на страницах и программно переключать эти страницы?
29. viki_glebova 05.07.19 13:44 Сейчас в теме
(28)Одного размера в моем случае, к сожалению, сделать невозможно. Разные страницы можно попробовать, но все равно, размеры у каждой страницы будут свои. Попробую сделать разные страницы. Хотя по сути это тоже самое, что группы.
31. dhurricane 05.07.19 13:46 Сейчас в теме
(29) Почему же, нет. Страницы все должны быть одинаковыми. Если я, конечное, опять ничего не перепутал.
33. viki_glebova 05.07.19 13:47 Сейчас в теме
(31)В таком случае у меня всегда будет пустое пространство, там где его быть не должно))
35. dhurricane 05.07.19 13:49 Сейчас в теме
(33) Ну да. Я почему и спросил, вдруг у Вас получится его чем-нибудь заполнить бесполезным. Например, какой-нибудь декорацией с текстом подсказки. Или же не скрывать вовсе ненужные элементы, а блокировать их.
36. viki_glebova 05.07.19 13:56 Сейчас в теме
30. viki_glebova 05.07.19 13:45 Сейчас в теме
(28)Очень любопытно где 1с хранит это. Ведь когда ручками то делаешь, то все норм))
32. dhurricane 05.07.19 13:47 Сейчас в теме
(30) Думаю, что нигде не хранит. А рассчитывает заново.
34. viki_glebova 05.07.19 13:47 Сейчас в теме
(32)Ок, тогда как это перерасчитать заново?
37. SlavaKron 05.07.19 14:49 Сейчас в теме
(26) Насколько я понял, настройки окна создаются при завершении сеанса. Во время сеанса их бесполезно удалять — будут устанавливаться последние примененные.
38. dhurricane 05.07.19 15:00 Сейчас в теме
(37) (34) Методом "тыка" случайно я нашел, как обновить настройки окна. Нужно лишь подключить обработчик ожидания при открытии формы, который в свою очередь будет делать контекстный серверный вызов, бросающий исключение. :-)

Прошу прощения за офф-топ.
45. viki_glebova 05.07.19 16:32 Сейчас в теме
(38)Это вы о чем? Поподробнее?
46. dhurricane 05.07.19 21:06 Сейчас в теме
(45) Это шутка была. Просто случайно ошибся в коде. И заметил, что открытая форма, как обычно с пустым пространством вместо скрытых реквизитов, вдруг изменила свой размер на корректный, когда выскочила ошибка в одной из серверных процедур.

Вам помогло решение в (44)?
49. viki_glebova 06.07.19 10:26 Сейчас в теме
(46)нет. Возможно я что-то не так делаю. Я не знаю состояние при открытии. Это состояние определяет сам пользователь нажимаю на определенную кнопку.
39. Sashares 34 05.07.19 15:04 Сейчас в теме
(37)Нашел на форуме. https://partners.v8.1c.ru/forum/t/1452456/m/1774859

Лехан Александр (1С, Москва) 27.11.2018 13:26

Командой "Установить стандартные настройки формы" сбрасываются два вида настроек:

"Настройки внешнего вида формы" - состав, свойство и взаимное расположение элементов формы (но не размеры)
"Размеры формы и элементов управления" - в т.ч. ширина колонок.

Чтобы сбросить программно первые, надо удалить из системного хранилища настройки с ключом объекта <Полное имя формы> + "/НастройкиФормы".

Вторые - ".../НастройкиОкна" (".../НастройкиОкнаВебКлиента").

Это поможет, только если форма еще не открыта.

Способа программно установить стандартную ширину колонок таблицы у открытой формы сейчас нет.

Показать
VKislitsin; COMPER; +2 Ответить
40. dhurricane 05.07.19 15:08 Сейчас в теме
(39) Выше я уже предлагал поэкспериментировать с ключом ".../НастройкиОкна". Автор ответил, что не помогло. Полагаю дело в том, что тут размеры окна еще не известны, пока не будет создана форма. Видимость подчиненных элементов ведь настраивается при создании.
41. SlavaKron 05.07.19 15:11 Сейчас в теме
(39) Теоретически, можно. Форма formCustomization.lf же это как-то делает. Только там используется какой-то странный объект "Customizer", который непонятно как инициализируется.
Ну и в (38) вроде бы решение.
Прикрепленные файлы:
formCustomization.lf.epf
42. viki_glebova 05.07.19 15:13 Сейчас в теме
44. dhurricane 05.07.19 15:54 Сейчас в теме
(42) Еще один способ, который у меня сработал. В обработчике создания формы попробуйте определять свойство формы "КлючСохраненияПоложенияОкна" уникальным строковым значением для каждого из возможных состояний формы. Что-то вроде такого:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	...
	
	// Считаем, что скрываемые группы передаются в форму с параметрами:
	СкрыватьГруппу1 = ЭтотОбъект.Параметры.СкрытьПервуюГруппу;
	СкрыватьГруппу2 = ЭтотОбъект.Параметры.СкрытьВторуюГруппу;

	// В зависимости от параметров настраиваем элементы формы.
	Элементы.Группа1.Видимость = Не СкрыватьГруппу1;
	Элементы.Группа2.Видимость = Не СкрыватьГруппу2;

	// И самое главное: для каждой пары значений параметров нужен свой уникальный ключ:
	Если СкрыватьГруппу1 И СкрыватьГруппу2 Тогда
	   ЭтотОбъект.КлючСохраненияПоложенияОкна = "Первый";
	ИначеЕсли Не СкрыватьГруппу1 И СкрыватьГруппу2 Тогда
	   ЭтотОбъект.КлючСохраненияПоложенияОкна = "Второй";
	ИначеЕсли СкрыватьГруппу1 И Не СкрыватьГруппу2 Тогда
	   ЭтотОбъект.КлючСохраненияПоложенияОкна = "Третий";
	ИначеЕсли Не СкрыватьГруппу1 И Не СкрыватьГруппу2 Тогда
	   ЭтотОбъект.КлючСохраненияПоложенияОкна = "Четвертый";
	КонецЕсли;

	// Можно дать менее осмысленные названия, но более коротким выражением:
	ЭтотОбъект.КлючСохраненияПоложенияОкна = 
	   "Группа1" + Формат(СкрыватьГруппу1, "БЛ=Вкл; БИ=Выкл") + "/" +
	   "Группа2" + Формат(СкрыватьГруппу2, "БЛ=Вкл; БИ=Выкл");
	
КонецПроцедуры
Показать
Akela_Crimea; pavz; BigB; viki_glebova; SlavaKron; +5 Ответить
51. viki_glebova 06.07.19 12:00 Сейчас в теме
(44)Не работает. Как у вас это отработало? Можете свою обработку скинуть? Может свойства формы какие то надо установить?
52. dhurricane 08.07.19 13:06 Сейчас в теме
(51) Так здесь и настраиваются свойства формы, а именно "КлючСохраненияПоложенияОкна". Но оно будет работать, видимо, при фиксированных настройках видимости элементов. Т.е. их видимость определяется в момент открытия формы и не меняется до ее закрытия.

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

Попробуйте таки предусмотреть интерфейс с оглядкой на то, что размеры формы меняться не будут. Заполните чем-нибудь свободное пространство.
viki_glebova; +1 Ответить
55. viki_glebova 09.07.19 12:59 Сейчас в теме
(52)Ох, попробую. Спасибо большое.
53. SlavaKron 08.07.19 18:02 Сейчас в теме
(51) Попробуйте такой код вставить в процедуру ПриСозданииНаСервере:
ИмяПользователя = ИмяПользователя();
Отбор = Новый Структура;
Отбор.Вставить("Пользователь", ИмяПользователя);

МассивУдалить = Новый Массив;

Выборка = ХранилищеСистемныхНастроек.Выбрать(Отбор);
Пока Выборка.Следующий() Цикл
	Если СтрНайти(Выборка.КлючОбъекта, ИмяФормы) > 0 Тогда
		МассивУдалить.Добавить(Выборка.КлючОбъекта)
	КонецЕсли;
КонецЦикла;

Для Каждого КлючОбъекта Из МассивУдалить Цикл
	ХранилищеСистемныхНастроек.Удалить(КлючОбъекта,,ИмяПользователя); 
КонецЦикла;

КлючСохраненияПоложенияОкна = Новый УникальныйИдентификатор;
Показать

Это должно решить проблему. При каждом открытии формы, будет устанавливаться случайный адрес настроек положения окна. Соответственно, предыдущие настройки никогда не будут найдены и применены. В рамках сеанса они будут накапливаться в оперативной памяти при каждом открытии формы и записаны в ХранилищеСистемныхНастроек при закрытии программы. В следующем сеансе, когда форма будет открыта первый раз, они удалятся.
Минус в том, что строчка "Выборка = ХранилищеСистемныхНастроек.Выбрать(Отбор)" может отрабатывать довольно долго, так как будут получены все настройки пользователя, ведь мы не знаем точное имя ключа.
ASDF2; viki_glebova; +2 Ответить
54. viki_glebova 09.07.19 12:57 Сейчас в теме
(53)
ИмяПользователя = ИмяПользователя();
Отбор = Новый Структура;
Отбор.Вставить("Пользователь", ИмяПользователя);

МассивУдалить = Новый Массив;

Выборка = ХранилищеСистемныхНастроек.Выбрать(Отбор);
Пока Выборка.Следующий() Цикл
Если СтрНайти(Выборка.КлючОбъекта, ИмяФормы) > 0 Тогда
МассивУдалить.Добавить(Выборка.КлючОбъекта)
КонецЕсли;
КонецЦикла;


1) У меня ошибка вылезла.
Ошибка преобразования данных XDTO: Значение: {http://v8.1c.ru/8.1/data/ui/style}НедоступныеДанныеЦвет

2) я же уже говороила, что я обработкой (с таким же кодом) смотрела все настройки, что у меня там хранятся. Удаляла полностью все по текущему пользователю, да и вообще все. Не приходит форма в исходное положение.
43. Sashares 34 05.07.19 15:25 Сейчас в теме
(41)Удаление настроек формы помогает, если форма не открыта.
То есть можно попробовать в месте, откуда вызывается форма, например, перед ОткрытьФорму() прописать удаление настроек окна.
50. viki_glebova 06.07.19 11:59 Сейчас в теме
(43)Не работает. Пробовала.
48. Xershi 1484 05.07.19 22:27 Сейчас в теме
Вам похоже нужно руководство разработчика почитать. Чтобы правильно форму настроить.
56. viki_glebova 13.07.19 12:24 Сейчас в теме
Перерыв весь инет. Почитав мнения людей и даже ответы разработчиков, сформировалось мнение... Подобное в платформе просто не реализовано.

Костыль как это все же сделать:
1) Как было предложены выше, все же стараться сделать форму одного размера. Заполнить чем-то пустое пространство, ну или что-то в этом роде.

2) Оказывается программно это можно сделать обычной горячей клавишей восстановления положения окна Alt+Shift+R

На виндовс можно добиться так
		
Shell = Новый COMОбъект("WScript.Shell");
Shell.SendKeys("%+®"); // вызов Alt+Shift+R


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

Обидно, что подобное не реализовано. Всем спасибо за участие.
Teut_Vlad; Henistaromin; AnddnA; KolBbl4; Merkalov; BigB; DennyPhilord; pyrkin_vanya; +8 Ответить
57. MikhailDr 30.04.20 14:56 Сейчас в теме
(56) У меня сработало вот так

Выборка = ХранилищеСистемныхНастроек.Выбрать();

		Пока Выборка.Следующий() Цикл
		    
		    Если Найти(Выборка.КлючОбъекта, "Документ.БюджетированиеВРегламентнойОперации.Форма.ФормаДокумента") <> 0 Тогда
		        
		        ХранилищеСистемныхНастроек.Удалить(Выборка.КлючОбъекта, Выборка.КлючНастроек, Выборка.Пользователь);
		        
		    КонецЕсли;
		    
		КонецЦикла;
Показать


Правда это не решает мою задачу, но может вам поможет. Пусть и поздно.
58. le0nard 20.05.20 12:14 Сейчас в теме
Или вот так можно:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	КлючОбъекта="Отчет.<ИмяОтчета>/<ИмяВариантаОтчета>/ТекущиеПользовательскиеНастр­ойки";
	СброситьПоложениеОкна(КлючОбъекта,ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
	
КонецПроцедуры


&НаСервере
Процедура СброситьПоложениеОкна(КлючОбъекта,ИмяПользователя)
    ХранилищеСистемныхНастроек.Удалить(КлючОбъекта,"", ИмяПользователя);
    КлючСохраненияПоложенияОкна = Строка(Новый УникальныйИдентификатор);
КонецПроцедуры
Показать
59. Lerka2611 26.05.20 13:09 Сейчас в теме
У меня работает так: в процедуре ПриСозданииНаСервере

КлючОбъекта = "ВнешняяОбработка.ИмяОбработки.Форма.Форма/НастройкиОкна";
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта,"", ИмяПользователя());
КлючСохраненияПоложенияОкна = Строка(Новый УникальныйИдентификатор);
G13ma; AnPet; user717534; vakham; HalWin; kabantus; nikolasx; Apolonov-Erik; HystriX; natlens; ZDmitry83; Serg2000mr; blandinko; dav1984; user635795_aleksej.alex2011; s512; insurgut; AnddnA; stupidgamer; tancha_cha; Merkalov; rpgshnik; kalyaka; BigB; COMPER; +25 Ответить
60. Merkalov 8 28.09.20 08:19 Сейчас в теме
Алилуя, попробовал каждый из способов представленных в теме и только ваш сработал!

*вытирает слезы*
61. tancha_cha 05.03.21 09:49 Сейчас в теме
(59) Добрый день! Получается, на управляемых формах все отрабатывает.
А не подскажите случаем как реализовать под обычным приложением?
62. insurgut 207 28.11.21 18:20 Сейчас в теме
(59) супер, спасибо! Намучался с тем, что через расширение что-то на форме меняешь меняешь, а у некоторых пользователей отображается как попало, либо вообще не отображается. После этих 3 строчек у всех отображается одинаково и как задумано!
blandinko; +1 Ответить
64. blandinko 26.08.22 14:19 Сейчас в теме
(59) Огромное спасибище!

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

Возможно, нужно чистить кэш сеансовых данных на сервере... Это еще не пробовала.

Пока буду спасаться Вашим решением. Еще раз спасибо!
69. HystriX 29.12.22 04:59 Сейчас в теме
(59) А зачем каждый раз новый ключ положения окна? Так хранилище настроек замусоривается бесконечно.
63. dav1984 04.08.22 09:54 Сейчас в теме
66. natlens 5 16.11.22 10:57 Сейчас в теме
(59) Спасибо большое! Работает.
70. HystriX 30.12.22 14:52 Сейчас в теме
Для обоих вариантов управляемого интерфейса работает вот такое. Удаление срабатывает первом открытии формы при старте сеанса. В рамках сеанса настройки положения окна сохраняются.

КлючиОбъектов = Новый Массив;
КлючиОбъектов.Добавить(СтрШаблон("%1/НастройкиОкнаТонкогоКлиента", ИмяФормы));
КлючиОбъектов.Добавить(СтрШаблон("%1/Такси/НастройкиОкнаТонкогоКлиента", ИмяФормы));

Для Каждого КлючОбъекта Из КлючиОбъектов Цикл
	ХранилищеСистемныхНастроекУдалить(КлючОбъекта, "", ИмяПользователя);
КонецЦикла;


Устанавливать КлючСохраненияПоложенияОкна, как в (59) не стоит, если не хотите потом тонны элементов в хранилище настроек, которые надо все обходить и вычищать.
71. user1475907 07.11.23 08:41 Сейчас в теме
(70)
КлючСохраненияПоложенияОкна


Бывают Случаи Когда Очень Надо сбросить настройки при открытии чего либо каждый раз
Если Рассуждать логически то делается Так.

КлючСохраненияПоложенияОкна1 = "КЛЮЧИК1";
КлючСохраненияПоложенияОкна2 = "КЛЮЧИК2";

Отбор.Вставить("КлючОбъекта", "ЖурналДокументов.ЖурналДокументы.Форма.ФормаСписка/КЛЮЧИК1/Такси/НастройкиОкнаТонкогоКлиента");		
	Выборка = ХранилищеСистемныхНастроек.Выбрать(Отбор);
ХранилищеСистемныхНастроек.Удалить КЛЮЧИК1
Получили = КЛЮЧИК1

Отбор.Вставить("КлючОбъекта", "ЖурналДокументов.ЖурналДокументы.Форма.ФормаСписка/КЛЮЧИК2/Такси/НастройкиОкнаТонкогоКлиента");		
	Выборка = ХранилищеСистемныхНастроек.Выбрать(Отбор);
ХранилищеСистемныхНастроек.Удалить КЛЮЧИК2
Получили = КЛЮЧИК2
*************
Если Получили = КЛЮЧИК1 Тогда
  КлючСохраненияПоложенияОкна = КлючСохраненияПоложенияОкна2;
Иначе
  КлючСохраненияПоложенияОкна = КлючСохраненияПоложенияОкна1;
Показать
72. user1475907 07.11.23 14:33 Сейчас в теме
(71)
Предыдущий Вариант не прокатил.
Пришлось делать из стандартной обработки и запуск в фоне, чтобы избежать зависаний.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)   
		
	Общ.ЗапускОчисткиВФонеФормы_НаСервере(ЭтаФорма);
	КлючСохраненияПоложенияОкна = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "_");	

КонецПроцедуры

Показать


Процедура ЗапускОчисткиВФонеФормы_НаСервере(эф) Экспорт
	ТекстФоновойПроцедуры = "Общ.СброситьРазмерыИПоложениеОкна2(ИмяФормы);";					
	ИмяКл = "СброситьРазмерыИПоложениеОкна2";
	_ИмяФормы = эф.ИмяФормы;
	Попытка
		ИмяФормы2 = эф.ИмяФормы;
	Исключение   
		ИмяФормы2 = эф;
	КонецПопытки;
	
	//Сообщить("ИмяФормы2="+СокрЛП(ИмяФормы2));
	ТекущаяяСреда = ВРЕГ(СокрЛП(_ПолучитьТекущуюСредуВыполнения())); 	
	//Сообщить("ТекущаяяСреда="+СокрЛП(ТекущаяяСреда));	
	Пользователь = Пользователи.АвторизованныйПользователь();    
	Если ВРЕГ(Пользователь) = "ТОВАРОВЕД" Тогда  	
 		ЗаписьЖурналаРегистрации("СброситьРазмерыИПоложениеОкна2", УровеньЖурналаРегистрации.Информация,,,"Запуск Фонового Задания
		|"+_ИмяФормы);		
		Идентификатор = ФоновоеВыполнение.ЗапуститьФоновоеВыполнение(ТекстФоновойПроцедуры,Новый Структура("ИмяФормы,ИмяКлючаЗадания",_ИмяФормы,ИмяКл));	
		//ЗаписьЖурналаРегистрации(
		//		НСтр("ru = 'Запуск Фона'", ОбщегоНазначения.КодОсновногоЯзыка()),
		//		УровеньЖурналаРегистрации.Ошибка,,,
		//		ОбработкаОшибок.ПодробноеПредставлениеОшибки(Идентификатор));
		
		//Сообщить("Идентификатор = "+СокрЛП(Идентификатор));		
	ИначеЕсли ИмяФормы2 = "Обработка.РабочееМестоКассира.Форма.ФормаРМК" Тогда
		Если ВРЕГ(Пользователь) = "АДМИНИСТРАТОР" и ТекущаяяСреда = "ТОЛСТЫЙ КЛИЕНТ" Тогда  			
			//Сообщить("Тут");
 			ЗаписьЖурналаРегистрации("СброситьРазмерыИПоложениеОкна2", УровеньЖурналаРегистрации.Информация,,,"Запуск Фонового Задания
			|"+_ИмяФормы);			
			Идентификатор = ФоновоеВыполнение.ЗапуститьФоновоеВыполнение(ТекстФоновойПроцедуры,Новый Структура("ИмяФормы,ИмяКлючаЗадания",_ИмяФормы,ИмяКл));	
			//ЗаписьЖурналаРегистрации(
			//	НСтр("ru = 'Запуск Фона'", ОбщегоНазначения.КодОсновногоЯзыка()),
			//	УровеньЖурналаРегистрации.Ошибка,,,
			//	ОбработкаОшибок.ПодробноеПредставлениеОшибки(Идентификатор));
			
			//Сообщить("Идентификатор = "+СокрЛП(Идентификатор));					
		КонецЕсли;
	КонецЕсли;
	//Идентификатор = ФоновоеВыполнение.ЗапуститьФоновоеВыполнение(ТекстФоновойПроцедуры, ЭтаФорма, Новый Структура("ИмяКлючаЗадания", ИмяКл), ЭтаФорма);	
КонецПроцедуры

Показать



Процедура СброситьРазмерыИПоложениеОкна2(Форма) Экспорт
	
	Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда
		Возврат;
	КонецЕсли;
	
	Попытка
		ИмяФормы = Форма.ИмяФормы;
	Исключение   
		ИмяФормы = Форма;
	КонецПопытки;
	НовыйКлючСохраненияПоложенияОкна = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "_");
	//Сообщить("НовыйКлючСохраненияПоложенияОкна:"+НовыйКлючСохраненияПоложенияОкна);
	КлючОбъектаХранения = ИмяФормы + "/ВременныеКлючиСохраненияПоложенияОкна";
	ИмяПользователя = ИмяПользователя();
	НачалоДня = НачалоДня(ТекущаяУниверсальнаяДата());
	ГраницаУстаревания = НачалоДня - 2*24*60*60;
	//ГраницаУстаревания = НачалоДня - 1*24*60*60;  //Юра
	
	
	//Сообщить("ТекущаяУниверсальнаяДата:"+СокрЛП(ТекущаяУниверсальнаяДата()));	
	//Сообщить("ГраницаУстаревания:"+СокрЛП(ГраницаУстаревания));
	Ключи = ХранилищеСистемныхНастроек.Загрузить(КлючОбъектаХранения);
	
	Если ТипЗнч(Ключи) = Тип("Соответствие") Тогда
		ИменаНастроек = Новый Массив;
		ИменаНастроек.Добавить("/НастройкиОкнаТонкогоКлиента");
		ИменаНастроек.Добавить("/Такси/НастройкиОкнаТонкогоКлиента");
		ИменаНастроек.Добавить("/НастройкиОкнаВебКлиента");
		ИменаНастроек.Добавить("/НастройкиОкнаМобильногоКлиента");
		ИменаНастроек.Добавить("/Такси/НастройкиОкнаВебКлиента");
		ИменаНастроек.Добавить("/Такси/НастройкиОкнаМобильногоКлиента");
		ТекущиеКлючи = Новый Соответствие(Новый ФиксированноеСоответствие(Ключи));
		Для Каждого КлючИЗначение Из ТекущиеКлючи Цикл
			ТекущийДень = КлючИЗначение.Ключ;
			Если ТипЗнч(ТекущийДень) <> Тип("Дата") Тогда
				Ключи = Неопределено;
				Прервать;
			КонецЕсли;
			Если ТекущийДень > ГраницаУстаревания Тогда
				Продолжить;
			КонецЕсли;
			КлючиТекущегоДня = КлючИЗначение.Значение;
			Если ТипЗнч(КлючиТекущегоДня) <> Тип("Массив") Тогда
				Ключи = Неопределено;
				Прервать;
			КонецЕсли;
			Для Каждого ТекущийКлюч Из КлючиТекущегоДня Цикл
				НачалоКлючаОбъекта = ИмяФормы + "/" + ТекущийКлюч;
				Для Каждого ИмяНастройки Из ИменаНастроек Цикл
					Сообщить("*Уд " + НачалоКлючаОбъекта + ИмяНастройки);
					ХранилищеСистемныхНастроек.Удалить(НачалоКлючаОбъекта + ИмяНастройки, "", ИмяПользователя);
				КонецЦикла;
			КонецЦикла;
			Ключи.Удалить(ТекущийДень);
		КонецЦикла;
	КонецЕсли;
	
	ОчиститьСтарыеКлючи = ТипЗнч(Ключи) <> Тип("Соответствие");
	
	//ОчиститьСтарыеКлючи = Истина; //Юра Удаляет лишние Все Лишние Ключи                  
	
	Если ОчиститьСтарыеКлючи Тогда
		Ключи = Новый Соответствие;
	КонецЕсли;
	
	КлючиДня = Ключи.Получить(НачалоДня);
	Если ТипЗнч(КлючиДня) <> Тип("Массив") Тогда
		КлючиДня = Новый Массив;
		Ключи.Вставить(НачалоДня, КлючиДня);
	КонецЕсли;
	КлючиДня.Добавить(НовыйКлючСохраненияПоложенияОкна);
	ХранилищеСистемныхНастроек.Сохранить(КлючОбъектаХранения,, Ключи);
	
	Попытка
		Форма.КлючСохраненияПоложенияОкна = НовыйКлючСохраненияПоложенияОкна;
	Исключение
	КонецПопытки;
	
	Если Не ОчиститьСтарыеКлючи Тогда
		Возврат;
	КонецЕсли;
	
	Отбор = Новый Структура("Пользователь", ИмяПользователя);
	Выборка = ХранилищеСистемныхНастроек.Выбрать(Отбор);
	//Выборка = ХранилищеСистемныхНастроек.Выбрать();	
	КлючПоискаРусский = "НастройкиОкнаТонкогоКлиента"; // @Non-NLS
	КлючПоискаАнглийский = "ThinClientWindowSettings";
	Пока Истина Цикл
		Попытка
			ЕстьСледующей = Выборка.Следующий();
		Исключение
			ИнформацияОбОшибке = ИнформацияОбОшибке();
			ЗаписьЖурналаРегистрации(
				НСтр("ru = 'Ошибка выполнения'", ОбщегоНазначения.КодОсновногоЯзыка()),
				УровеньЖурналаРегистрации.Ошибка,,,
				ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
			Прервать;
		КонецПопытки;
		Если Не ЕстьСледующей Тогда
			Прервать;
		КонецЕсли;
		Если Не СтрНачинаетсяС(Выборка.КлючОбъекта, ИмяФормы)
		 Или Выборка.КлючНастроек <> ""
		 Или Выборка.КлючОбъекта = КлючОбъектаХранения Тогда
			Продолжить;
		КонецЕсли;
		ЧастиКлючаОбъекта = СтрРазделить(Выборка.КлючОбъекта, "/");
		Если ЧастиКлючаОбъекта.Количество() < 2 Тогда
			Продолжить;
		КонецЕсли;
		ПоследняяЧастьКлюча = ЧастиКлючаОбъекта[ЧастиКлючаОбъекта.ВГраница()];
		Если СтрНайти(ПоследняяЧастьКлюча, КлючПоискаРусский) > 0
		 Или СтрНайти(ПоследняяЧастьКлюча, КлючПоискаАнглийский) > 0 Тогда
			//ХранилищеСистемныхНастроек.Удалить(Выборка.КлючОбъекта, "", ИмяПользователя);
			Сообщить("*Уд 2 " + НачалоКлючаОбъекта + ИмяНастройки+"  Выборка.КлючОбъекта="+СокрЛП(Выборка.КлючОбъекта));
			ХранилищеСистемныхНастроек.Удалить(Выборка.КлючОбъекта, "", );
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Показать



//Модуль ФоновоеВыполнение
Процедура ЗапускОчисткиВФонеФормы_НаСервере(эф) Экспорт
	ТекстФоновойПроцедуры = "Общ.СброситьРазмерыИПоложениеОкна2(ИмяФормы);";					
	ИмяКл = "СброситьРазмерыИПоложениеОкна2";
	_ИмяФормы = эф.ИмяФормы;
	Попытка
		ИмяФормы2 = эф.ИмяФормы;
	Исключение   
		ИмяФормы2 = эф;
	КонецПопытки;
	
	//Сообщить("ИмяФормы2="+СокрЛП(ИмяФормы2));
	ТекущаяяСреда = ВРЕГ(СокрЛП(_ПолучитьТекущуюСредуВыполнения())); 	
	//Сообщить("ТекущаяяСреда="+СокрЛП(ТекущаяяСреда));	
	Пользователь = Пользователи.АвторизованныйПользователь();    
	Если ВРЕГ(Пользователь) = "ТОВАРОВЕД" Тогда  	
 		ЗаписьЖурналаРегистрации("СброситьРазмерыИПоложениеОкна2", УровеньЖурналаРегистрации.Информация,,,"Запуск Фонового Задания
		|"+_ИмяФормы);		
		Идентификатор = ФоновоеВыполнение.ЗапуститьФоновоеВыполнение(ТекстФоновойПроцедуры,Новый Структура("ИмяФормы,ИмяКлючаЗадания",_ИмяФормы,ИмяКл));	
		//ЗаписьЖурналаРегистрации(
		//		НСтр("ru = 'Запуск Фона'", ОбщегоНазначения.КодОсновногоЯзыка()),
		//		УровеньЖурналаРегистрации.Ошибка,,,
		//		ОбработкаОшибок.ПодробноеПредставлениеОшибки(Идентификатор));
		
		//Сообщить("Идентификатор = "+СокрЛП(Идентификатор));		
	ИначеЕсли ИмяФормы2 = "Обработка.РабочееМестоКассира.Форма.ФормаРМК" Тогда
		Если ВРЕГ(Пользователь) = "АДМИНИСТРАТОР" и ТекущаяяСреда = "ТОЛСТЫЙ КЛИЕНТ" Тогда  			
			//Сообщить("Тут");
 			ЗаписьЖурналаРегистрации("СброситьРазмерыИПоложениеОкна2", УровеньЖурналаРегистрации.Информация,,,"Запуск Фонового Задания
			|"+_ИмяФормы);			
			Идентификатор = ФоновоеВыполнение.ЗапуститьФоновоеВыполнение(ТекстФоновойПроцедуры,Новый Структура("ИмяФормы,ИмяКлючаЗадания",_ИмяФормы,ИмяКл));	
			//ЗаписьЖурналаРегистрации(
			//	НСтр("ru = 'Запуск Фона'", ОбщегоНазначения.КодОсновногоЯзыка()),
			//	УровеньЖурналаРегистрации.Ошибка,,,
			//	ОбработкаОшибок.ПодробноеПредставлениеОшибки(Идентификатор));
			
			//Сообщить("Идентификатор = "+СокрЛП(Идентификатор));					
		КонецЕсли;
	КонецЕсли;
	//Идентификатор = ФоновоеВыполнение.ЗапуститьФоновоеВыполнение(ТекстФоновойПроцедуры, ЭтаФорма, Новый Структура("ИмяКлючаЗадания", ИмяКл), ЭтаФорма);	
КонецПроцедуры

Показать
73. user1475907 08.11.23 05:34 Сейчас в теме
(72)
Дополнение.

//Модуль ФоновоеВыполнение

Функция КлючПотока(Имя) Экспорт
	Возврат Имя;
КонецФункции

Функция ЗапуститьФоновоеВыполнение(ТекстПроцедуры, СтруктураПараметров=Неопределено) Экспорт 

	//
	//Сообщить("ТекстПроцедуры ="+ТекстПроцедуры);
	//Сообщить(СтруктураПараметров.Параметр1);
	//Сообщить(СтруктураПараметров.Параметр2);	
	//Сообщить("СтруктураПараметров.ИмяКлючаЗадания=" + СокрЛП(СтруктураПараметров.ИмяКлючаЗадания));		
	
	Ключ = КлючПотока(СтруктураПараметров.ИмяКлючаЗадания);	  
	
    ПараметрыВыполнения = Новый Массив;  
    ПараметрыВыполнения.Добавить(ТекстПроцедуры);

    ПараметрыВыполнения.Добавить(СтруктураПараметров);
	
	Попытка
    	ТекЗадание = ФоновыеЗадания.Выполнить("ФоновоеВыполнение.ФоноваяПроцедура", ПараметрыВыполнения, Ключ);
    	Возврат ТекЗадание;
	Исключение  
		Сообщить(ОписаниеОшибки());
		Возврат Неопределено;
	КонецПопытки;
КонецФункции

Процедура ФоноваяПроцедура(ТекстМодуля, ПараметрыВыполнения) Экспорт
    ПолныйТекстМодуля = "";
    Для Каждого ТекПараметр Из ПараметрыВыполнения Цикл
        ПолныйТекстМодуля = ПолныйТекстМодуля+ТекПараметр.Ключ+"=ПараметрыВыполнения."+ТекПараметр.Ключ+";"+Символы.ПС;
	КонецЦикла;
	
	//ПолныйТекстМодуля = ПолныйТекстМодуля+"ТабПП"+"=ПараметрыВыполнения."+"ТабПП"+";"+Символы.ПС;	
    ПолныйТекстМодуля = ПолныйТекстМодуля + ТекстМодуля;   
	//Сообщить("ПолныйТекстМодуля ="+ПолныйТекстМодуля);
	 #Если МобильноеПриложениеКлиент или МобильноеПриложениеСервер Тогда
		 
	 #Иначе  
	
		ТекСтр = Новый ТекстовыйДокумент;        
		ТекСтр.ДобавитьСтроку("********************");		
		ТекСтр.ДобавитьСтроку(ПолныйТекстМодуля);           
		ТекСтр.ДобавитьСтроку("********************");				
		ТекСтр.Записать("C:\1\1111111.txt");
	#КонецЕсли
	
    Выполнить(ПолныйТекстМодуля);
КонецПроцедуры


Функция НайтиЗадание(Идентификатор) Экспорт
    // Считывает состояние фонового задания по переданному идентификатору.
    //
    // Параметры:
    //   Идентификатор - УникальныйИдентификатор - Идентификатор фонового задания.
    //
    // Возвращаемое значение:
    //   Неопределено - Задание не найдено.
    //   Структура - Сведения о задании.
    //       * Выполняется - Булево - Истина когда фоновое задание еще выполняется.
    //       * Успешно     - Булево - Истина когда сеанс фонового задания завершился без ошибок.
    //       * Ошибка      - Строка, ИнформацияОбОшибке, Неопределено - Описание ошибки.
    //
    УстановитьПривилегированныйРежим(Истина);
    
    Результат = Новый Структура("Выполняется, Успех, Ошибка", Ложь, Ложь, Неопределено);
    Если Идентификатор = Неопределено Тогда
        Возврат Результат;
    КонецЕсли;
        
    Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор);
    Если Задание = Неопределено Тогда
        Возврат Результат;
    КонецЕсли;
    
    Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
        Результат.Выполняется = Истина;
    Иначе
        Результат.Выполняется = Ложь;
        Если Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
            Результат.Успех = Истина;
        Иначе
            Результат.Успех = Ложь;
            Результат.Ошибка = Задание.ИнформацияОбОшибке;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Результат;
КонецФункции
Показать
Оставьте свое сообщение

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