Имя: Пароль:
1C
 
Как бороться с "Серверные вызовы при завершении работы запрещены"?
0 DTX 4th
 
01.09.17
15:41
При закрытии обработки сохраняю настройки в хранилище. Всё ок, но если попытаться закрыть 1С при открытой обработке, появляется ошибка
"Серверные вызовы при завершении работы запрещены"
Можно как-нибудь обойти? Не сохранять же настройки при каждом изменении
1 Господин ПЖ
 
01.09.17
15:41
в ОФ все реализовано
2 Мыш
 
01.09.17
15:43
Если в ПриЗакрытии выполняется сохранение настроек формы, то следует отказаться от обработчика ПриЗакрытии и перенести этот код в обработчики событий, вызываемые при действиях пользователя.

Было:

&НаКлиенте
Процедура ПриЗакрытии()
  
    СохранитьНастройки();
  
КонецПроцедуры

&НаСервере
Процедура СохранитьНастройки()
  
    // Сохраняем дату последнего отображения.
    ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("Настройка", " ДатаПоследнегоОтображенияПредложения", ТекущаяДатаСеанса());
КонецПроцедуры
Стало:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
  
    ...
    // Сохраняем дату последнего отображения.
    ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("Настройка", "ДатаПоследнегоОтображенияПредложения", ТекущаяДатаСеанса());
    ...
КонецПроцедуры
Если событие, которое возникает при действиях пользователя, вызывается на стороне клиента, рекомендуется выполнять сохранение настроек в безконтекстном серверном вызове, чтобы избежать перерисовки формы:

&НаКлиенте
Процедура НапомнитьПозже(Команда)
    СохранитьНастройки();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура СохранитьНастройки()
  
    // Сохраняем дату последнего отображения.
    ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("Настройка", "ДатаПоследнегоОтображенияПредложения", ТекущаяДатаСеанса());
КонецПроцедуры
3 Мыш
 
01.09.17
15:43
Копипаста отсюда: https://its.1c.ru/db/metod8dev#content:5293:hdoc
4 Вафель
 
01.09.17
15:44
Теперь принято сохранять настройки не при закрытии, а при изменении настроек
5 DTX 4th
 
01.09.17
15:50
http://i0.kym-cdn.com/entries/icons/mobile/000/005/848/Aliens.jpg

Т.е. если у меня есть большая ТЧ с настройками, то мне её при каждом чихе (по окончанию редактирования строки) сохранять надо?? Ужс.

За инфу спасибо.
6 Вафель
 
01.09.17
15:56
не сохраняй всю тз, разбей ее на блоки.
настройки лучше поштучно хранить
7 DTX 4th
 
01.09.17
16:00
(6) В тз у меня, например, суммы тарифов в зависимости от количества документов. Т.е. будут строки вида:
до 1 дока - 100 р
до 2 доков - 150 р
до 5 доков - 300 р

и т.д. Тут нечего разбивать на блоки.

Ну или например у меня на форме поле Контрагент, которое нужно сохранить для всех пользователей. Это получается, что при каждом изменении нужно на сервер бегать. Не понимаю.
8 Вафель
 
01.09.17
16:02
(7) Пишите письма (в спортлото)
9 ildary
 
01.09.17
16:02
(7) Добро пожаловать в мир управляемых форм. Пилотам Апача еще тяжелей - у них глаза привыкают смотреть в разные стороны - один смотрит куда летит, второй - куда стреляет.
10 DTX 4th
 
01.09.17
16:13
Я сделаль!

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    Попытка
        СохранитьВсеНастройки();
    Исключение
        Если ЗавершениеРаботы Тогда
            Отказ = Истина;    
        КонецЕсли;
    КонецПопытки;
КонецПроцедуры
11 Вафель
 
01.09.17
16:18
но ничего не сохранится ведь
12 Мыш
 
01.09.17
16:23
(11) Прекратите. Это совершенно не важно. Пользователь не заметит, свинья не съест )
13 Фрэнки
 
01.09.17
16:26
Типовая КА 2.2 время от времени отображает такое сообщение, хотя ни строчки кода не изменено
14 DTX 4th
 
01.09.17
16:30
(11) При завершении работы вылезет окно "Работа в данном окне не завершена". Далее пользователь жмёт "Продолжить работу", закрывает форму обработку, закрывает 1С.
Если нажмёт "Завершить работу", то да, ничего не сохранится, но его предупреждали)
Писать в каждый элемент процедуру "ПриИзменении", по-моему, та ещё дичь.
15 DTX 4th
 
01.09.17
16:37
Добавил немного UX)

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

16 Torquader
 
02.09.17
01:37
А если сделать отказ от закрытия, сохранить настройки - поднять флаг возможности сохранения и снова выполнить "завершить работу" ?
17 craxx
 
02.09.17
06:47
(16) Вот именно так я и делал! По другому не выходит
18 craxx
 
02.09.17
06:48
(17) + обработку ожидания секундную разовую, в которой все закрывалось с флагом без сохранения
19 jsmith82
 
02.09.17
09:33
(15) Силён.
20 mistеr
 
02.09.17
11:38
(7) >В тз у меня, например, суммы тарифов в зависимости от количества документов

К слову, это уже не настройки пользователя, эти данные должны жить в базе.

А вообще, это конечно проблема. Точнее недоработка платформы. Со времени появления веб клиента прогресс не стоял на месте. В браузерах появились веб воркеры и прочие ништяки. Можно уже реализовать и сохранение настроек в фоне после закрытия формы, и асинхронную загрузку гигабайтных файлов из соседней темы.
21 DTX 4th
 
05.09.17
10:32
(16) Так программно отказ от закрытия не сделать. Но вроде неплохой вариант.

(20) >К слову, это уже не настройки пользователя, эти данные должны жить в базе.
В типовой? В хранилище общих настроек?

Прост один и тот же файл может быть использован в разных базах.
2 + 2 = 3.9999999999999999999999999999999...