Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как определить что объект заблокирован
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
nysysimara
Задача: нужно переставить несколько документов по времени
Проблема: документ может быть открыт для редактирования/просмотра другим пользователем, тогда метод Записать() дает ошибку "...Объект заблокирован:..."
Конечно, выход из этой ситуации - запускать обработку по переносу документов монопольно, но хотелось бы найти решение для разделенного режима работы
sava1
попытка
окрытьФорму(...
alex040269
Блокировка(<?>);
Синтаксис:
Блокировка(<ВклВыкл>)
Назначение:
Установить/прочитать режим блокировки. Если при вызове метода параметр <ВклВыкл> не задан, то возвращается режим блокировки до выполнения метода. Число: 1 - заблокирован; 0 - свободен. Если при вызове метода параметр <ВклВыкл> задан, то возвращается результат выполнения метода блокировки. Число: 1 - успешно; 0 - не получилось.
Параметры:
<ВклВыкл> - необязательный параметр. Число: 1 - включить; 0 - выключить.
nysysimara
Цитата(alex040269 @ 13.09.12, 8:16) необходимо зарегистрироваться для просмотра ссылки
Блокировка(<?>);

этот метод я отбросила изначально - он не срабатывает
хотя возможно я что-то не то делаю. вот кусок кода:
                Док.НайтиДокумент(ТдДок);
                Если Док.Блокировка()=1 Тогда // не работает
                    Сообщ = "Заблокирован";
                Иначе
                    Сообщ = "";
                    Если Док.Проведен()=1 Тогда  
                        Док.СделатьНеПроведенным();
                        Док.УстановитьВремя(Ч,М,С);
                        Док.Записать();
                        Если Док.Провести(0)=0 Тогда
                            Сообщ = "не провелся";
                        КонецЕсли;
                    Иначе
                        Док.УстановитьВремя(Ч,М,С);
                        Док.Записать();
                    КонецЕсли;
                    глЗаписьЖурналаРегистрации("изм время обр Сжать23часа",2,2,Док.ТекущийДокумент(),2);
                КонецЕсли;


Цитата(sava1 @ 13.09.12, 8:13) необходимо зарегистрироваться для просмотра ссылки
окрытьФорму(.

не соображу,а как потом программно закрыть форму документа?
alex040269
Нужно
Если Док.Блокировка(1)=1 Тогда
....делаем сложное дело
    Док.Блокировка(0);
Иначе
     Сообщить ("Заблокирован")
КонецЕсли


где то так
nysysimara
alex040269, спасибо все получилось
до меня наконецто дошло, что Блокировка проверяет заблокирован ли мною объект
alex040269
nysysimara , в принципе не обязательно. Просто если делать Вашим способом, то никто не мешает заблокировать документ кому-то еще после того как вы проверили и до того момента, когда вы делаете запись в базу.

Хотя может вы и правы. Я не проверял.

nysysimara
Цитата(alex040269 @ 13.09.12, 12:05) необходимо зарегистрироваться для просмотра ссылки
то никто не мешает заблокировать документ кому-то еще после того как вы проверили и до того момента, когда вы делаете запись в базу.
согласна

первый вариант кода я проверяла так:
документ реально открыт другим пользователем, я запускаю обработку и в условии
Если Док.Блокировка()=1 Тогда 
        ...
Иначе
алгоритм идет по ветке "Иначе", т.е Док.Блокировка()=0
sava1
Цитата(nysysimara @ 13.09.12, 9:24) необходимо зарегистрироваться для просмотра ссылки
не соображу,а как потом программно закрыть форму документа?

через контекст
nysysimara
sava1, мне такой вариант не подходит
для того чтобы только изменить время документа, открывать форму документа - на мой взгляд, лишнее

объясню, что я пытаюсь сделать:
У нас в базе ряд документов создаются в ночную смену, записываются текущим временем, т.е.последний может быть позже 23:00 (например 11.09.2012 23:56:00
другие документы,созданные на следующий день(12.09), но с датой вчера(11.09) записываются автоматически в конец дня
в результате имеем ситуацию: куча документов расположены в 23:59:59 и проблемы с проведением

Хочу сделать обработку, которая в начале текущего дня все доки вчерашние во временном отрезке с23:00:00 до 23:59:59
расположит более "компактно" с малым интервалом, тем самым освободит хотя бы последние полчаса

sava1
иначе не определить - открыт ли документ
или анализировать журнал регистрации на предмет открытия
nysysimara
Цитата(sava1 @ 13.09.12, 12:22) необходимо зарегистрироваться для просмотра ссылки
через контекст

это потом во всех документах прописывать при открытии "закрытие"?
нее...
вроде с методом Блокировка работает, завтра еще на реальной база потестирую
sava1
Цитата(nysysimara @ 13.09.12, 14:28) необходимо зарегистрироваться для просмотра ссылки
вроде с методом Блокировка работает

так должно - глюков не замечалось
vadim007
Цитата(nysysimara @ 13.09.12, 12:49) необходимо зарегистрироваться для просмотра ссылки
sava1, мне такой вариант не подходит
У нас в базе ряд документов создаются в ночную смену, записываются текущим временем, т.е.последний может быть позже 23:00 (например 11.09.2012 23:56:00

Документы создаются последовательно, или параллельно?
nysysimara
Цитата(vadim007 @ 14.09.12, 9:38) необходимо зарегистрироваться для просмотра ссылки
Документы создаются последовательно, или параллельно?

Я наверное неточно выразилась
Цитата
ряд документов создаются в ночную смену
означает:
в ночную смену работают несколько пользователей, ими создаются документы текущем временем
+- полчаса принципиального значения для этих документов не имеет, главное сохранить последовательность

пока писала этот пост, решила запускать обработку только монопольно,
объясню: если документ заблокирован, его невозможно переставить по времени, а значит нельзя двигать и следующие за ним,
Cthulhu
Навскидку.

1. Ввести реквизит (возможно общий) для флага необходимости пере-позиционирования документов.

2. В ПриЗаписи() документов.
2.1. Для новых документов - сверять ДатаДок на равенствоТекущаяДата(), а ТекущееВремя() на попадание в "интервалом перепозиционирования"(23:00:00-23:59:59): если совпадает+попадает - взводить флаг необходимости пере-позиционирования(см.п.1) в единицу.
2.2. Для ранее созданных документов - сверять ДатаДок на равенствоТекущаяДата(), а ТекущийДокумент().ПолучитьВремя() на попадание в "интервалом перепозиционирования"(23:00:00-23:59:59): если совпадает+попадает - взводить флаг необходимости пере-позиционирования(см.п.1) в единицу.

3. В ПриОткрытии() ранее созданных документов. Если ( необходимости пере-позиционирования(см.п.1) взведен в единицу ) И ( ДатаДок < ТекущаяДата() ): СтатусВозврата(0) с выдачей сообщения о тотм, что документ необходимо перепозиционировать в рамках регламента (можно с координатами для связи с работниками/службами, ответственными за выполнение этого пункта регламента).

4. В описываемой обработке - после "расстановки" документов по хронологии - сбрасывать(обнулять) в них флаг необходимости пере-позиционирования(см.п.1).

Результат - гарантированное отсутствие блокиоровок при выполнении упомянутой обработки документов ("расстановки" документов по хронологии).

прим.: форс-мажорные корректировки до "расстановки" документов по хронологии - также вопрос в принципе решаемій. если надо.

add: вместо реквизита можно использовать справочник (можно динамичесский).
nysysimara
Cthulhu спасибо за идею, было бы время для реализации
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.