Имя: Пароль:
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) Я нашла простое решение. Перед первым вызовом процедуры на сервере все реквизиты документа, которые заполняет пользователь, блокируются от изменений. Оно, кстати, так и должно быть. Это даже хорошо, пользователь после того, как начнет делать отгрузки по данному документу, уже не сможет ничего изменить.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн