Автоматическое сохранение редактируемого документа

0. Yauhen Makei (mrDSide) 96 04.08.17 15:24 Сейчас в теме
Если пользователь работает сразу в n-документах или набивает большую накладную, и обрывается связь с сервером или происходит обновление базы, то велика вероятность, что он (пользователь) будет не очень счастлив, когда поймёт, что теперь придётся делать всё заново.

Перейти к публикации

Комментарии
1. Александр Хомяк (logarifm) 994 07.08.17 16:54 Сейчас в теме
Молчу о том насколько это неоптимально постоянно опрашивать Состояния документа Проведен количество строк его ТЧ.
2. Yauhen Makei (mrDSide) 96 07.08.17 17:01 Сейчас в теме
(1) т.к. 1С использует "ленивое" сравнение, можно поставить
ТекущаяДата() - ПоследнееСохранение >= 30
на первое место, это должно избавить от лишних проверок. Можно добавить индикацию необходимости только на клиенте в обработчик "ПриОкончанииРедактирования" и "ПослеУдаления". Просто в моём случае это пока работает достаточно быстро, проблем нет.
3. Yauhen Makei (mrDSide) 96 07.08.17 17:10 Сейчас в теме
(1) http://prntscr.com/g5ftg8 - весь код на клиенте, без вызова сервера. Вызов происходит только на строке
Записать(Новый Структура("Автосохранение", Истина));
4. Александр Хомяк (logarifm) 994 07.08.17 17:23 Сейчас в теме
(3) Во-первых это ничего не изменит обработчик ожидания подключен например на 30 сек.

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

Также хочется подчеркнуть тот момент, что автосохранение и не всегда пользователю необходимо. Зашол в документ и изменил товар, чтобы посмотреть какая цена получится или общая сумма, но клиент отказался от такой суммы и просит оставить так как было и т.д. и тому подобное.
5. Yauhen Makei (mrDSide) 96 07.08.17 17:31 Сейчас в теме
(4) Во-первых, чем не нравится обработчик ожидания? Тут он срабатывает каждый раз при простое. Если ставить больше, то очень часто просто не срабатывает, т.к. система генерирует события и вполне вероятно, что он вообще не будет срабатывать.
Во-вторых, базу они не опрашивают, и так же по тексту читайте - "Если нужно не всем пользователям...", "Реализовывать этот механизм для всех документов конфигурации определённо не стоит...", "Также этот метод без модификации кода не подойдёт...".
В-третьих см. "Во-вторых" :)
6. Александр Хомяк (logarifm) 994 07.08.17 17:41 Сейчас в теме
Объект.Проведен = Опрос базы
Объект.Товары.Количество() = Опрос базы
Объект.ВозвратнаяТара.Количество() = Опрос базы

Из мат.части в Вашем случае вообще произойдет полная отчитка объекта в кэш.

Минус поставил!
7. Yauhen Makei (mrDSide) 96 07.08.17 17:48 Сейчас в теме
(6) показал же, что не происходит. Или замеру от 1С не доверяете?
Из мат.части в Вашем случае вообще произойдет полная отчитка объекта в кэш.

Вот это интересно, что бы это могло значить. Ничего в объект не пишу.
Минус поставил!

Критикуешь, предлагай.
8. kiruha Д (kiruha) 363 10.08.17 15:17 Сейчас в теме
(7)
сохраняйте в табличный документ или xml локально во временой папке на компьютере пользователя
Заодно будет история версий.

Никаких нагрузок на сервер
Ну и загрузку придется реализовать
Я бы такую штуку скачал
9. Yauhen Makei (mrDSide) 96 11.08.17 10:51 Сейчас в теме
(8) нагрузок нет на сервер. А вот предложенный вариант будет, как раз, очень медленный. Да и для нормальной реализации потребуется писать ПВД, чтобы контролировать что там пользователь вводил, а что теперь в базе (значения ссылочных типов изменяются). Вообще этот вариант лучше делать (я так думаю) с помощью встроенной подсистемы версионирования, но это точно ещё "хуже".
10. kiruha Д (kiruha) 363 11.08.17 13:47 Сейчас в теме
(9)
Что там медленного ?
Затраты времени - формирование печ формы (только без запросов) + сохранение файла.

А работы да - побольше , чем просто Записать()
11. Yauhen Makei (mrDSide) 96 11.08.17 14:30 Сейчас в теме
(10) В самом простом случае - это три цикла (реквизиты, строки т/ч, колонки т/ч), даже если хранить только примитивные типы и ссылки (без реквизитов по ссылкам), это гораздо медленнее (даже если не использовать метаданные, а кэшировать в форме на клиенте имена реквизитов). А запись файла на диск - это ещё куча операций. Если бы это работало, как в Excel на уровне платформы, тогда да, это можно было бы рассматривать как вариант на случай потери соединения.
12. kiruha Д (kiruha) 363 11.08.17 17:35 Сейчас в теме
Нда .... Почитайте временные файлы и для чего они нужны.
13. Yauhen Makei (mrDSide) 96 12.08.17 21:11 Сейчас в теме
(12) Хорошая шутка. Всегда думал, что временные файлы на то и временные, что после того как приложение закрывает дескриптор файла, нет никаких гарантий что файл не будет удалён или изменён.
14. Сергей Капустин (kauksi) 197 16.08.17 13:33 Сейчас в теме
Что будет если данные объекта будут изменены извне? в ходе обмена при включенной авторегистрации например? Интерактивно при попытки записи будет выдаваться сообщение что данные изменены другим пользователем. А как будет вести себя обработчик ожидания? Может вызов Записать лучше поместить в попытку?
15. Yauhen Makei (mrDSide) 96 16.08.17 17:00 Сейчас в теме
(14) могу сказать по собственному опыту, что это хорошо, если пользователь узнает, что объект, который он сейчас редактирует, изменился. т.к. часто приходилось слышать такое: "я тут набираю документ, нажимаю 'Провести', а мне ошибка. что делать?". и пытался я сделать автоматическое сохранение, но получил однозначное "фе" от руководителя. это была платформа 8.2. а как это могло бы облегчить жизнь тем бух-ам?
П.С. в попытку думал, разница будет в том, что тогда для пользователя это будет просто сообщение, нужно будет меры принимать какие-то, а так - это исключение, нажми "Ок" и что-нибудь предпринимай. Хотя предложение правильное, но можно и просто исключительную блокировку накладывать при открытии документа. Так, кажется, приходилось делать для каких-то документов.
16. Сергей Капустин (kauksi) 197 17.08.17 13:50 Сейчас в теме
Блокировка накладывается на форму:

Если ЭтаФорма.ТолькоПросмотр = Ложь Тогда
        Попытка
            ЭтаФорма.ЗаблокироватьДанныеФормыДляРедактирования();
        Исключение
            Ошибка = ОписаниеОшибки();
            Ошибка = Сред(Ошибка, Найти(Ошибка, "сеанс:") + 7, СтрДлина(Ошибка));
            Ошибка = Сред(Ошибка, 1, Найти(Ошибка, ",") - 1);
            ПользовательСеанса = ПолучитьПользователяСеансаИнформационнойБазы(Число(Ошибка));
            ТекстВопроса = "Документ уже открыт " + ?(ПользовательСеанса = "", "другим", "") + " пользователем " + ПользовательСеанса + ". Открыть для просмотра?";
            Если Вопрос(ТекстВопроса , РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
                Отказ = Истина;
            Иначе
                ЭтаФорма.ТолькоПросмотр = Истина;
            КонецЕсли;
        КонецПопытки;
    КонецЕсли;
Показать



а вот обмен или регламентированное задание может перезаписать документ Не Интерактивно. Поэтому через Попытку и будет корректней пытаться записать документ, и в случае ошибки сразу отключить обработчик ожидания
17. Yauhen Makei (mrDSide) 96 17.08.17 14:41 Сейчас в теме
(16) добавил попытку, а вот при попытке начать редактирование уже открытого в другом сеансе документа и так появляется сообщение об ошибке в автоматическом режиме управления блокировками.
Оставьте свое сообщение