Проверка на открытие документа другим пользователем
Помогите настроить проверку на открытие документа. На форме рабочего стола создается предварительная запись, по которой можно создавать документ прием. Но почему-то появляется возможность создавать 2 документа приема, а этого не должно быть. В модуле документа прописала процедуру ПроверкаНаОткрытиеДокументаДругимПользователем(Отказ);
Но она срабатывает не всегда. Форма управляемая 8.3.9
Но она срабатывает не всегда. Форма управляемая 8.3.9
По теме из базы знаний
- Универсальный передаточный документ для Управление торговлей релиза 10.3.21.1 (бета для УТ 10.3.30.2) - печатная форма 2 в 1 альтернатива счету фактуре и расходной накладной.
- Перенос данных и обмен из УТ 10.3 в УТ 11 / КА 2 / ERP 2. Переносятся документы, справочники и остатки
- Статусы проверки документов
- Поддержка пользователей [Alt+S] (подключаемое расширение)
- РеСольДо - редактор строк документов
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Я не могу понять как работает Ваша процедура, кода нет.
В несколько похожей ситуации я делал регистр "БлокируемыеДокументы" и при начале работы с документом по указанному условию добавлял его туда. При открытии формы проверял есть-ли этот документ в данном регистре и если есть, то запрещал работу с ним.
В несколько похожей ситуации я делал регистр "БлокируемыеДокументы" и при начале работы с документом по указанному условию добавлял его туда. При открытии формы проверял есть-ли этот документ в данном регистре и если есть, то запрещал работу с ним.
я так понимаю вы должны проверять не открыт ли не записанный документ у текущего пользователя? или у вас в базе только 1 человек может открыть для создания новый документ (надеюсь что нет)
если 1 предположение верно, тогда просто при нажатии кнопки проверяйте открыта ли форма или нет
если 1 предположение верно, тогда просто при нажатии кнопки проверяйте открыта ли форма или нет
(4)да, должны проверять не открыт ли этот документ. Я сделала, чтобы при открытии документ записывался и выполняется процедура ПроверкаНаОткрытиеДокументаДругимПользователем(Отказ). Но почему-то разные пользователи могут зайти сразу и открыть этот документ. в итоге по предварительной записи создается 2 документа.
(8) есть поле с таблицей по предварительной записи ( это документ основания документа Прием). Если один пользователь захотел создать по этой записи прием, нажимает правой кнопкой мыши "Создать прием" и ему открывается форма приема, потом второй решил по этой записи создать прием и делает тоже самое и ему тоже открывается форма приема...но в итоге они оба могут сохранить эти приемы, но под разными номерами. А это неправильно
(9) я бы сделал так.
при щелкают по "Создать прием" идет проверка есть ли по этой записи документ Прием (можно анализировать документы приема по реквизиту основание или в предварительную запись писать куда-то)
если документ прием уже есть (я так понял он записывается в базу при 1 открытии), пользователю пишут что документ уже создан.
Если он открыт у кого-то - об этом можно сообщить. Если нет, то открыть существующий
при щелкают по "Создать прием" идет проверка есть ли по этой записи документ Прием (можно анализировать документы приема по реквизиту основание или в предварительную запись писать куда-то)
если документ прием уже есть (я так понял он записывается в базу при 1 открытии), пользователю пишут что документ уже создан.
Если он открыт у кого-то - об этом можно сообщить. Если нет, то открыть существующий
(10) вот моя процедура
&НаКлиенте
Процедура ПроверкаНаОткрытиеДокументаДругимПользователем(Отказ) Экспорт
Если ЭтаФорма.ТолькоПросмотр = Ложь Тогда
Попытка
ЭтаФорма.ЗаблокироватьДанныеФормыДляРедактирования();
Исключение
Ошибка = ОписаниеОшибки();
Ошибка = Сред(Ошибка, Найти(Ошибка, "сеанс:") + 7, СтрДлина(Ошибка));
Ошибка = Сред(Ошибка, 1, Найти(Ошибка, ",") - 1);
ТекстВопроса = "Документ уже открыт пользователем "+ Ошибка + ". Открыть для просмотра?";
Если Вопрос(ТекстВопроса , РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
Иначе
ЭтаФорма.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Но почему-то обходит попытку(
&НаКлиенте
Процедура ПроверкаНаОткрытиеДокументаДругимПользователем(Отказ) Экспорт
Если ЭтаФорма.ТолькоПросмотр = Ложь Тогда
Попытка
ЭтаФорма.ЗаблокироватьДанныеФормыДляРедактирования();
Исключение
Ошибка = ОписаниеОшибки();
Ошибка = Сред(Ошибка, Найти(Ошибка, "сеанс:") + 7, СтрДлина(Ошибка));
Ошибка = Сред(Ошибка, 1, Найти(Ошибка, ",") - 1);
ТекстВопроса = "Документ уже открыт пользователем "+ Ошибка + ". Открыть для просмотра?";
Если Вопрос(ТекстВопроса , РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
Иначе
ЭтаФорма.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Но почему-то обходит попытку(
(10) при нажатии на "Создать прием" в процедуре
Если НЕ ПЗРасшифровкаТекущейОбласти = Неопределено И ЗначениеЗаполнено(ПЗРасшифровкаТекущейОбласти.Событие) Тогда
//Проверка статуса записи
СтатусСобытия = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ПЗРасшифровкаТекущейОбласти.Событие, "Статус");
Прием = ВвестиПосещениеНаСервере(ПЗРасшифровкаТекущейОбласти.Событие, "Прием");
Если ЗначениеЗаполнено(Прием) Тогда
СтруктураПараметры = Новый Структура("Ключ", Прием);
Иначе
СтруктураПараметры = Новый Структура("Основание", ПЗРасшифровкаТекущейОбласти.Событие);
КонецЕсли;
ОткрытьФорму("Документ.Прием.ФормаОбъекта", СтруктураПараметры);
КонецЕсли;
по второму если открывает форму для создания(без номера документа), по первому если документ был записан, т.е уже записанный прием. может тут что не так.
Если НЕ ПЗРасшифровкаТекущейОбласти = Неопределено И ЗначениеЗаполнено(ПЗРасшифровкаТекущейОбласти.Событие) Тогда
//Проверка статуса записи
СтатусСобытия = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ПЗРасшифровкаТекущейОбласти.Событие, "Статус");
Прием = ВвестиПосещениеНаСервере(ПЗРасшифровкаТекущейОбласти.Событие, "Прием");
Если ЗначениеЗаполнено(Прием) Тогда
СтруктураПараметры = Новый Структура("Ключ", Прием);
Иначе
СтруктураПараметры = Новый Структура("Основание", ПЗРасшифровкаТекущейОбласти.Событие);
КонецЕсли;
ОткрытьФорму("Документ.Прием.ФормаОбъекта", СтруктураПараметры);
КонецЕсли;
по второму если открывает форму для создания(без номера документа), по первому если документ был записан, т.е уже записанный прием. может тут что не так.
(7) уже и так писала
работает криво
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ЭтаФорма.ТолькоПросмотр = Ложь Тогда
Попытка
ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка,, ЭтаФорма.УникальныйИдентификатор);
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Документ уже открыт пользователем ");
ЭтаФорма.ТолькоПросмотр = Истина;
КонецПопытки;
КонецЕсли;
Показатьработает криво
(17) не делала. Я сделала проверку по запросу, есть ли созданный документ по предварительной записи или нет. Если есть тогда только просмотр. Но в итоге получилось что документ не смогла провести...Но мне нужно выдавать сообщение, что этот документ открыт пользователем таким-то.
(18) Чем больше читаю, тем больше путаюсь. Я попробую сформулировать, а Вы скажите, где я не прав.
У Вас есть документ Предварительная запись, на основании него сотрудники создают документ прием. Проблема в том, что два сотрудника одновременно могут начать создавать документ прием и в результате будет задвоение. Вам нужно, чтобы, если один сотрудник уже начал создавать документ прием по конкретной заявке, второй пользователь не смог начать создание документа по этой заявке?
У Вас есть документ Предварительная запись, на основании него сотрудники создают документ прием. Проблема в том, что два сотрудника одновременно могут начать создавать документ прием и в результате будет задвоение. Вам нужно, чтобы, если один сотрудник уже начал создавать документ прием по конкретной заявке, второй пользователь не смог начать создание документа по этой заявке?
(20) Тогда я бы сделал все таки через регистр сведений. Вкратце смысл:
Создаем регистр сведений, в который добавляем заносим, Заявка(прием), пользователя который открыл, время открытия.
Когда пользователь начинает создавать прием проверяем по регистру начата ли работа по данному приему, если да, отказ, если нет, то добавляем запись в регистр. Когда мы создаем документ - т.е. прием создан, то удаляем запись по нему из регистра.
Создаем регистр сведений, в который добавляем заносим, Заявка(прием), пользователя который открыл, время открытия.
Когда пользователь начинает создавать прием проверяем по регистру начата ли работа по данному приему, если да, отказ, если нет, то добавляем запись в регистр. Когда мы создаем документ - т.е. прием создан, то удаляем запись по нему из регистра.
(22) Способ рабочий, но другое дело, что я сомневался, что в Вашем случае нет ничего проще. Надо еще учитывать, что при неожиданном завершении работы записи в регистре могут зависать. Поэтому я добавлял еще параметры сеанса, и периодически пробегался по регистру заданием - вычищал неактуальные записи если они были(в моем случае не было). Надо предусмотреть все варианты.
вопрос еще открыт. Сейчас при открытии документа прием вторым пользователем показывается сообщение и форма открыта для Только просмотр, за исключением одной таблицы, и если добавляю данные из этой таблицы, то при закрытии система предлагает сохранить и сохраняет(( и опять появляется дубликат по записи.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот