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

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

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

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

На виндовс можно добиться так

```1c
    Shell = Новый COMОбъект("WScript.Shell");
    Shell.SendKeys("%+®"); // вызов Alt+Shift+R
```

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

Обидно, что подобное не реализовано. Всем спасибо за участие.
---
Проще пользователей этой кнопке обучить.
---
да. Почистить нужно https://infostart.ru/public/635729/ кеш.
---
viki_glebova, дополните, пожалуйста, найденное решение информацией из (59)
---
Какова конечная цель? Зачем сбрасывать настройки, которые сделал пользователь в форме?
Может проще изначально запретить пользователям изменять форму, тогда она всегда будет иметь вид, который задал разработчик.
---
Попробуйте так:

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

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

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

    // пример полного имени формы
    ИмяФормы = "Обработка.ВыгрузкаДанных.Форма.Форма1";
```
---
```1c
    ХранилищеСистемныхНастроек.Удалить("ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма/НастройкиФормы",, ИмяПользователя());
```
---
(5)
Пробовала. Даже удалила полностью все найтроки из этого хранилища. Все равно не работает. Это общая форма.

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

и так

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

На инфостарте скачала обработку, которая может просматривать и удалять настройки из этого хранилища. Так вот если это сделать, то в моей форме все равно ничего не меняется.
---
Почему "ПараметрыСеанса.ТекущийПользователь"? Я же писал ИмяПользователя().
Еще раз:

```1c
    ХранилищеСистемныхНастроек.Удалить("ОбщаяФорма.sendy_ФормаОплаты/НастройкиФормы",, ИмяПользователя());
```
---
ХранилищеСистемныхНастроек.Удалить("ОбщаяФорма.sendy_ФормаОплаты/НастройкиФормы",, ИмяПользователя());
Нет, все тоже самое.
---
Запустите эту обработку. Есть настройки с ключом объекта "ОбщаяФорма.sendy_ФормаОплаты/НастройкиФормы"?
---
Нет там такой настройки.

(14)Эта процедура вызывается как раз ПриСозданииНаСервере.
---
В какой момент вы вызываете этот код?
---
У меня есть процедура установки видимости элементов формы. Серверная. Там и пишу его.
---
То есть для открытой уже формы?
Не работает такое.
Программно нельзя установить стандартные настройки формы.
Единственный вариант - при создании на сервере или когда форма закрыта удалить настройки, чтобы при открытии уже были стандартные.
---
Вполне возможно сбросить настройки у открытой формы. После удаления настроек достаточно сделать любой серверный контекстный вызов формы.
---
А можно пруф? =)
---
Ну вот возьмите эту же обработку. Только что на коленке написал.
Удалите отображение, например, последних 2-х колонок таблицы через "Изменить форму...".
Обновите. Удалите настройку с ключом "ВнешняяОбработка.ПолучитьНастройкиПользователя.Форма.Форма/НастройкиФормы". Колонки появятся.
---
Браузер пишет, в файле вирус.
---
Воспроизвел.
Прикольно, спасибо.
---
У меня сработало на платформе 8.3.23. Но для добавленных программно колонок не работает.
---
Точнее у программно добавленных колонок восстановилась только видимость, а ширина не восстановилась.
---
Чуть поподробнее?
---
У меня работает так для внешней обработки:

```1c
    &НаСервере
    Процедура Команда1НаСервере()
    ХранилищеСистемныхНастроек.Удалить("ВнешняяОбработка.ВнешняяОбработка2.Форма.Форма/НастройкиФормы",, ИмяПользователя());
    КонецПроцедуры

    &НаКлиенте
    Процедура Команда1(Команда)
    Команда1НаСервере();
    КонецПроцедуры
```
---
У меня в списке настроек вообще нет сохраненной настройки для этой формы.
---
У себя не проверял, есть ли настройки, только привел код, как у меня работает.
Этот код выполняется не при создании на сервере, а при нажатии на отдельную кнопку.
---
Все равно не работает как надо. Ни один из вариантов.
---
Я так понял, у Вас проблемы именно с размерами окна? Попробуйте поэкспериментировать и с другими ключами объектов настроек. Например:

```1c
    "ОбщаяФорма.sendy_ФормаОплаты/НастройкиОкна"
    "ОбщаяФорма.sendy_ФормаОплаты/Такси/НастройкиОкна"
```
---
Совершенно верно. См.Скриншоты. Первый как открывается. Второй как должно открываться и оно таким ставновится когда устанавливаю стандартные настройки.

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

Не получится ли у Вас зайти с другой стороны и сделать форму всегда одного размера? Не использовать изменение видимости групп элементов, а менять их доступность, или же расположить элементы на страницах и программно переключать эти страницы?
---
Одного размера в моем случае, к сожалению, сделать невозможно. Разные страницы можно попробовать, но все равно, размеры у каждой страницы будут свои. Попробую сделать разные страницы. Хотя по сути это тоже самое, что группы.
---
Почему же, нет. Страницы все должны быть одинаковыми. Если я, конечное, опять ничего не перепутал.
---
В таком случае у меня всегда будет пустое пространство, там где его быть не должно))
---
Ну да. Я почему и спросил, вдруг у Вас получится его чем-нибудь заполнить бесполезным. Например, какой-нибудь декорацией с текстом подсказки. Или же не скрывать вовсе ненужные элементы, а блокировать их.
---
Увы, не получится.
---
Очень любопытно где 1с хранит это. Ведь когда ручками то делаешь, то все норм))
---
Думаю, что нигде не хранит. А рассчитывает заново.
---
Ок, тогда как это перерасчитать заново?
---
Насколько я понял, настройки окна создаются при завершении сеанса. Во время сеанса их бесполезно удалять — будут устанавливаться последние примененные.
---
(34) Методом "тыка" случайно я нашел, как обновить настройки окна. Нужно лишь подключить обработчик ожидания при открытии формы, который в свою очередь будет делать контекстный серверный вызов, бросающий исключение. :-)

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

Вам помогло решение в (44)?
---
нет. Возможно я что-то не так делаю. Я не знаю состояние при открытии. Это состояние определяет сам пользователь нажимаю на определенную кнопку.
---
Нашел на форуме. https://partners.v8.1c.ru/forum/t/1452456/m/1774859
---
Выше я уже предлагал поэкспериментировать с ключом ".../НастройкиОкна". Автор ответил, что не помогло. Полагаю дело в том, что тут размеры окна еще не известны, пока не будет создана форма. Видимость подчиненных элементов ведь настраивается при создании.
---
Теоретически, можно. Форма formCustomization.lf же это как-то делает. Только там используется какой-то странный объект "Customizer", который непонятно как инициализируется.
Ну и в (38) вроде бы решение.
---
Попробую, отпишусь.
---
Еще один способ, который у меня сработал. В обработчике создания формы попробуйте определять свойство формы "КлючСохраненияПоложенияОкна" уникальным строковым значением для каждого из возможных состояний формы. Что-то вроде такого:

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    ...

    // Считаем, что скрываемые группы передаются в форму с параметрами:
    СкрыватьГруппу1 = ЭтотОбъект.Параметры.СкрытьПервуюГруппу;
    СкрыватьГруппу2 = ЭтотОбъект.Параметры.СкрытьВторуюГруппу;

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

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

    // Можно дать менее осмысленные названия, но более коротким выражением:
    ЭтотОбъект.КлючСохраненияПоложенияОкна =
    "Группа1" + Формат(СкрыватьГруппу1, "БЛ=Вкл; БИ=Выкл") + "/" +
    "Группа2" + Формат(СкрыватьГруппу2, "БЛ=Вкл; БИ=Выкл");

    КонецПроцедуры
```
---
Не работает. Как у вас это отработало? Можете свою обработку скинуть? Может свойства формы какие то надо установить?
---
Так здесь и настраиваются свойства формы, а именно "КлючСохраненияПоложенияОкна". Но оно будет работать, видимо, при фиксированных настройках видимости элементов. Т.е. их видимость определяется в момент открытия формы и не меняется до ее закрытия.

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

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

```1c
    ИмяПользователя = ИмяПользователя();
    Отбор = Новый Структура;
    Отбор.Вставить("Пользователь", ИмяПользователя);

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

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

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

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

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

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

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

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

2) я же уже говороила, что я обработкой (с таким же кодом) смотрела все настройки, что у меня там хранятся. Удаляла полностью все по текущему пользователю, да и вообще все. Не приходит форма в исходное положение.
---
Удаление настроек формы помогает, если форма не открыта.
То есть можно попробовать в месте, откуда вызывается форма, например, перед ОткрытьФорму() прописать удаление настроек окна.
---
Не работает. Пробовала.
---
Вам похоже нужно руководство разработчика почитать. Чтобы правильно форму настроить.
---
Перерыв весь инет. Почитав мнения людей и даже ответы разработчиков, сформировалось мнение... Подобное в платформе просто не реализовано.

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

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

На виндовс можно добиться так

```1c
    Shell = Новый COMОбъект("WScript.Shell");
    Shell.SendKeys("%+®"); // вызов Alt+Shift+R
```

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

Обидно, что подобное не реализовано. Всем спасибо за участие.
---
У меня сработало вот так

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

    Пока Выборка.Следующий() Цикл

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

    ХранилищеСистемныхНастроек.Удалить(Выборка.КлючОбъекта, Выборка.КлючНастроек, Выборка.Пользователь);

    КонецЕсли;

    КонецЦикла;
```

Правда это не решает мою задачу, но может вам поможет. Пусть и поздно.
---
Или вот так можно:

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

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

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

*вытирает слезы*
---
Добрый день! Получается, на управляемых формах все отрабатывает.
А не подскажите случаем как реализовать под обычным приложением?
---
супер, спасибо! Намучался с тем, что через расширение что-то на форме меняешь меняешь, а у некоторых пользователей отображается как попало, либо вообще не отображается. После этих 3 строчек у всех отображается одинаково и как задумано!
---
Огромное спасибище!

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

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

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

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

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

Устанавливать КлючСохраненияПоложенияОкна, как в (59) не стоит, если не хотите потом тонны элементов в хранилище настроек, которые надо все обходить и вычищать.
---
КлючСохраненияПоложенияОкна

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

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

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

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

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

```1c
    Процедура ЗапускОчисткиВФонеФормы_НаСервере(эф) Экспорт
    ТекстФоновойПроцедуры = "Общ.СброситьРазмерыИПоложениеОкна2(ИмяФормы);";
    ИмяКл = "СброситьРазмерыИПоложениеОкна2";
    _ИмяФормы = эф.ИмяФормы;
    Попытка
    ИмяФормы2 = эф.ИмяФормы;
    Исключение
    ИмяФормы2 = эф;
    КонецПопытки;

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

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

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

```1c
    Процедура СброситьРазмерыИПоложениеОкна2(Форма) Экспорт

    Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда
    Возврат;
    КонецЕсли;

    Попытка
    ИмяФормы = Форма.ИмяФормы;
    Исключение
    ИмяФормы = Форма;
    КонецПопытки;
    НовыйКлючСохраненияПоложенияОкна = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "_");
    //Сообщить("НовыйКлючСохраненияПоложенияОкна:"+НовыйКлючСохраненияПоложенияОкна);
    КлючОбъектаХранения = ИмяФормы + "/ВременныеКлючиСохраненияПоложенияОкна";
    ИмяПользователя = ИмяПользователя();
    НачалоДня = НачалоДня(ТекущаяУниверсальнаяДата());
    ГраницаУстаревания = НачалоДня - 2*24*60*60;
    //ГраницаУстаревания = НачалоДня - 1*24*60*60; //Юра

    //Сообщить("ТекущаяУниверсальнаяДата:"+СокрЛП(ТекущаяУниверсальнаяДата()));
    //Сообщить("ГраницаУстаревания:"+СокрЛП(ГраницаУстаревания));
    Ключи = ХранилищеСистемныхНастроек.Загрузить(КлючОбъектаХранения);

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

    ОчиститьСтарыеКлючи = ТипЗнч(Ключи) <> Тип("Соответствие");

    //ОчиститьСтарыеКлючи = Истина; //Юра Удаляет лишние Все Лишние Ключи

    Если ОчиститьСтарыеКлючи Тогда
    Ключи = Новый Соответствие;
    КонецЕсли;

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

    Попытка
    Форма.КлючСохраненияПоложенияОкна = НовыйКлючСохраненияПоложенияОкна;
    Исключение
    КонецПопытки;

    Если Не ОчиститьСтарыеКлючи Тогда
    Возврат;
    КонецЕсли;

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

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

```1c
    //Модуль ФоновоеВыполнение
    Процедура ЗапускОчисткиВФонеФормы_НаСервере(эф) Экспорт
    ТекстФоновойПроцедуры = "Общ.СброситьРазмерыИПоложениеОкна2(ИмяФормы);";
    ИмяКл = "СброситьРазмерыИПоложениеОкна2";
    _ИмяФормы = эф.ИмяФормы;
    Попытка
    ИмяФормы2 = эф.ИмяФормы;
    Исключение
    ИмяФормы2 = эф;
    КонецПопытки;

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

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

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

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

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

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

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

    Ключ = КлючПотока(СтруктураПараметров.ИмяКлючаЗадания);

    ПараметрыВыполнения = Новый Массив;
    ПараметрыВыполнения.Добавить(ТекстПроцедуры);

    ПараметрыВыполнения.Добавить(СтруктураПараметров);

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

    Процедура ФоноваяПроцедура(ТекстМодуля, ПараметрыВыполнения) Экспорт
    ПолныйТекстМодуля = ";
    Для Каждого ТекПараметр Из ПараметрыВыполнения Цикл
    ПолныйТекстМодуля = ПолныйТекстМодуля+ТекПараметр.Ключ+"=ПараметрыВыполнения."+ТекПараметр.Ключ+";"+Символы.ПС;
    КонецЦикла;

    //ПолныйТекстМодуля = ПолныйТекстМодуля+"ТабПП"+"=ПараметрыВыполнения."+"ТабПП"+";"+Символы.ПС;
    ПолныйТекстМодуля = ПолныйТекстМодуля + ТекстМодуля;
    //Сообщить("ПолныйТекстМодуля ="+ПолныйТекстМодуля);
    #Если МобильноеПриложениеКлиент или МобильноеПриложениеСервер Тогда

    #Иначе

    ТекСтр = Новый ТекстовыйДокумент;
    ТекСтр.ДобавитьСтроку("********************");
    ТекСтр.ДобавитьСтроку(ПолныйТекстМодуля);
    ТекСтр.ДобавитьСтроку("********************");
    ТекСтр.Записать("C:\1\1111111.txt");
    #КонецЕсли

    Выполнить(ПолныйТекстМодуля);
    КонецПроцедуры

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

    Результат = Новый Структура("Выполняется, Успех, Ошибка", Ложь, Ложь, Неопределено);
    Если Идентификатор = Неопределено Тогда
    Возврат Результат;
    КонецЕсли;

    Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор);
    Если Задание = Неопределено Тогда
    Возврат Результат;
    КонецЕсли;

    Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
    Результат.Выполняется = Истина;
    Иначе
    Результат.Выполняется = Ложь;
    Если Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
    Результат.Успех = Истина;
    Иначе
    Результат.Успех = Ложь;
    Результат.Ошибка = Задание.ИнформацияОбОшибке;
    КонецЕсли;
    КонецЕсли;

    Возврат Результат;
    КонецФункции
```