Версия для печати темы (https://pro1c.org.ua/index.php?s=afcfd0b54e439e1d0c2ea071c8f202e9&showtopic=62973)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Ошибка при вызове метода контекста (Заблокировать)

Автор: gololol 18.11.20, 11:23

1С:Предприятие 8.3 (8.3.10.2667)
Толстый Клиент
Обычное приложение


Доброго времени суток.

Есть таблица: ДокументСостояние

В этой таблице одна запись (один документ)

В этом документе есть поля:

Состояние = "1"
ВерсияДанных = "AAAAAABc4OoM"

Есть РегламентноеЗадание: РЗ_ИзменитьСостояние (запускается один раз в период времени)
Это реглмантное задание изменяет значение поля "Состояние"

Ситуация следующая.

РЗ_ИзменитьСостояние - запустилось и изменило значение полей

Состояние = "2"
ВерсияДанных = "AAAAAABc4OoP"

Далее пользователь делает двойной клик на записи
и происходит переход из ФормыСписка в ФормуДокумента

В ФормеДокумента выполняется

Процедура ПриОткрытии()

        ...

    Если Не Ссылка.Пустая() Тогда
         ЭтотОбъект.Заблокировать();
    КонецЕсли;
    

КонецПроцедуры


Проблема в том, что блокируется запись у которой

ВерсияДанных = "AAAAAABc4OoM"

а на самом деле

ВерсияДанных = "AAAAAABc4OoP"

т.е. программа пытается заблокировать запись с несуществующей ВерсиейДанных

ош: Ошибка при вызове метода контекста (Заблокировать)
ЭтотОбъект.Заблокировать();
по причине:
Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных
(возможно, запись была изменена или удалена)!

Всё правильно.

Вопрс: "Как можно решить эту проблему?"

Автор: volodya1122 18.11.20, 14:38

gololol @ Сегодня, 11:23 * ,

такого не должно быть. тут скорее всего что-то "держит" этот документ.
Что проверить:
1. Маловероятно но все же в ПриОткрытии() или в ПередОткрытием() не меняются никакие реквизиты документа?
2. Ваше регламентное задание выполняется не единожды, а крутится по кругу. И поэтому постоянно блокирует документ.
3. В регламентном задании в конце очистить объект документа где вы его меняете ((тот что ПолучитьОбъект()).
4. Возможно где-то в другом месте этот документ блкируете и держите постоянно его в каком то реквизите.

Цитата(gololol @ 18.11.20, 11:23) *
Проблема в том, что блокируется запись у которой

ВерсияДанных = "AAAAAABc4OoM"

а на самом деле

ВерсияДанных = "AAAAAABc4OoP"

т.е. программа пытается заблокировать запись с несуществующей ВерсиейДанных


Тут неверно понимаете поведение платформы 1С. 1С пытается заблокировать не реквизиты в вашем документе а сам документ (и неважно что внутри документа поменялись данные)
Поясню на примере. Например у Вас есть обычная паперовая папка с документами. Лежит у Вас на столе. Вы на ней написали (внутри лежит 10 документов. Другой человек взял эту папку и открыл (заблокировал, в терминологии 1С). Положил туда еще какие-то дукументы, закрыл и положил на место (папка опять доступна). Хотя содержимое внутри уже не соответствует описанию , вы всеравно можете взять эту папку и открыть (заблокировать уже от себя) и при открытии папки можете видеть новое содержимое..
А теперь представте. Другой человек взял эту папку, открыл (ПолучитьОбъект() - в терминологии 1С) положил в нее свои документы (или ничего не положил) и держит в руках. В таком случае Вы не можете взять и заблокировать свою папку. Это вам и сообщает 1С

Автор: gololol 18.11.20, 15:03

gololol @ Сегодня, 11:23 * ,

Проблема решена.

Я запускал (вручную) Регламентное Задание находясь в ФормеСписка документа.
А надо было вызвать не Регламентное Задание, а метод этого Регламентного Задания.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua