Имя: Пароль:
1C
 
Управляемая форма, клиент и сервер
0 LenaAt
 
12.12.17
16:15
Подскажите, пожалуйста, как на клиенте узнать, что отображаемый документ был изменен на сервере?
1 3achem
 
12.12.17
16:17
(0) это что подразумивается под такой формулировкой?
2 LenaAt
 
12.12.17
16:21
(1) Пользователь открыл на клиенте форму документа, а в это время обработчик события на сервере документ изменил. Например, заполнил табличную часть.
3 3achem
 
12.12.17
16:22
(2) будет конфликт блокировок
4 perester
 
12.12.17
16:23
Модифицированность? Сравнение значений незаписанных данных по сравнению с записанными?
5 LenaAt
 
12.12.17
16:25
(3) Конфликт блокировок - это когда два процесса пытаются одновременно изменить одну и туже запись в таблице РСУБД. А у меня форма на клиенте открыта.

(4) Нет, на клиенте форму не модифицируют. Ее меняет другой процесс на сервере.
6 DmitrO
 
12.12.17
16:27
То что происходит в Лас-Вегасе, остается в Лас-Вегасе.

Правильный ответ на вопрос в (0): в данных формы поле Версия будет иметь значение отличное от того, которое сейчас записано в базе данных.
7 LenaAt
 
12.12.17
16:30
(6) Как мне на клиенте сравнить версии данных. На клиенте это свойство Объект.ВерсияДанных?
8 LenaAt
 
12.12.17
16:31
7+ Надо сходить на сервер за версией данных и сравнить их?
9 3achem
 
12.12.17
16:32
(7) Перед записью Если Объект = Объект.Ссылка Тогда
10 DmitrO
 
12.12.17
16:33
(7)Да, поле называется ВерсияДанных.
(8)Да.
11 3achem
 
12.12.17
16:35
(7) А вообще, если данные изменены, то должна вылезти ошибка при записи "Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных"
12 LenaAt
 
12.12.17
16:35
(10) Спасибо, попробовала, все работает

    ВерсияСервера = ПолучитьВерсиюОбъекта();
    ВерсияКлиента = Объект.ВерсияДанных;
    Если ВерсияСервера <> ВерсияКлиента Тогда
        
    КонецЕсли;
13 LenaAt
 
12.12.17
16:36
(11) Вот я и хочу это сообщение предотвратить, чтобы пользователь нажал на кнопку Перечитать
14 3achem
 
12.12.17
16:38
(13) Побоюсь спросить, а зачем изменять документы, в то время пока в них работает пользователь? Либо это архитектурная ошибка, либо это костыль для хотелок.
15 ildary
 
12.12.17
16:40
(14) возможно регламентное задание изменило документ, в то время, когда в нём сидел пользователь.
16 3achem
 
12.12.17
16:41
(15) бэд практис никто не отменял
17 1Садовник
 
12.12.17
16:45
(13) а в чем смысл? Ну открыл пользователь док, поправил там что-то. Жмет сохранить, а ему сообщение, мол перечитай данные. Он перечитывает, и все что менял до этого теряется.
18 Мандалай
 
12.12.17
16:48
"(4) Нет, на клиенте форму не модифицируют. Ее меняет другой процесс на сервере."
Форму модифицируют только на клиенте, скорее всего Вы подразумеваете модифицирование объекта БД.
RTFM
19 LenaAt
 
12.12.17
16:48
(17) У меня все реквизиты недоступны для редактирования. Его задача только открыть документ и запустить обработчик события на сервере, а затем сохранить документ.
20 3achem
 
12.12.17
16:50
(19) Вариант без участия пользователя исключен? Потому что он при такой поставноке вопроса не нужен вообще. Регламентное само пошурашло ночью, утром пользователь проверил, и то его проверка ничего не значит, потому что доступа к реквизитам нет.
21 LenaAt
 
12.12.17
16:52
(20) Без пользователя совсем обойтись нельзя, к сожалению. Он должен отреагировать на поступление груза.
22 3achem
 
12.12.17
16:53
(21) То есть это реализация бизнес-процесса?
23 Новиков
 
12.12.17
16:53
(20) так может подумать в сторону АРМ. Если груз пришел, что-то сделалось, у него в АРМ по обработчику ожидания что-то булькнуло, он кнопку какую-то нажал - пошла магия. Без открытия документа.
24 DmitrO
 
12.12.17
16:54
(19)Сейчас они  вас спросят: зачем пользователю записывать документ еще раз, если документ уже был записан на сервере. :)
25 3achem
 
12.12.17
16:55
(24) А действительно, зачем? Так много вопросов и так мало ответов
26 1Садовник
 
12.12.17
16:57
(24) что там сохранять, если версия на сервере уже сохранена. А пользователь видит старую картинку
27 Mort
 
12.12.17
16:59
Имхо, пользователь должен иметь приоритет перед роботом (пока мы им в войне ещё не проиграли) и регзадание должно пытаться блокировать доки и не трогать уже заблокированные объекты.
28 LenaAt
 
12.12.17
17:00
(25) А затем, что что - то он всё - таки меняет. А защита от потери изменений при перечитывании делается элементарно
//*****************************************************************************
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    Если Модифицированность Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Документ нельзя перечитать пока не будет нажата кнопка Записать";
        Сообщение.Сообщить();
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры
29 dezss
 
12.12.17
17:00
(21) ОФФ:
Да ну эти проблемы...тут конкурс интересный на мисте, айда участвовать!!!)))
30 Mort
 
12.12.17
17:03
(28) Отказ не взлетит, нет такого параметра. Лупи ВызватьИсключение. На общем фоне будет норм смотреться.
31 DmitrO
 
12.12.17
17:04
(27)А вот это уже нарушение прав роботов и дискриминация. Я буду жаловаться Путину! :)
32 LenaAt
 
12.12.17
17:05
(30) Точно, поторопилась... Как быть?
33 Mort
 
12.12.17
17:06
(32) -> (27)
34 Mort
 
12.12.17
17:08
(32) Где-то в модуле регзадания:

Попытка
    ДокОбъект.Заблокировать();

    ....
    ДокОбъект.Записать();

Исключение
//Ничего не делаем, может получится в след. раз

КонецПопытки;
35 Mort
 
12.12.17
17:13
+(34) Кусок заполнения и записи документа лучше, конечно,  вынести за пределы попытки, чтобы не прошляпить какое-нибудь другое годное исключение, но в целом думаю идея понятна.
36 LenaAt
 
12.12.17
17:17
(35) Я нашла простое решение. Перед первым вызовом процедуры на сервере все реквизиты документа, которые заполняет пользователь, блокируются от изменений. Оно, кстати, так и должно быть. Это даже хорошо, пользователь после того, как начнет делать отгрузки по данному документу, уже не сможет ничего изменить.