Ошибка блокировки объекта объект уже заблокирован собой

Ошибка блокировки объекта. Объект уже заблокирован

Автор demon3, 23 янв 2018, 07:33

0 Пользователей и 1 гость просматривают эту тему.

База бп 3.0. файловый вариант работы. Пользователь заходит в базу. создает документ. потом повторно может в него зайти но изменить ничего не может. Пишет, что объект уже заблокирован. По факту кроме нее никто не сидит в данном документе. Что может быть? КЭШ чистил, базу на ошибки проверял. Была одна ошибка. Но после ее исправления ситуация не изменилась. В чем может быть проблема?

Помог ответом, скажи спасибо


Открыла один нтот же документ более, чем в одной закладке (окне)

пусть позакрывает другие


у нас такое бывает, даже если окно одно открыто, помогает перезапуск базы или в крайнем случае создание нового идентичного документа.А глючный на удаление


Ну закрыть базу и открыть ,это не выход. Не понимаю, в чем может быть проблема.

Помог ответом, скажи спасибо


Если сможете решить проблему, сообщайте, нам программисты просто говорят, что глюк


Показывать по
10
20
40
сообщений

Новая тема

Ответить

ООО Горизонт

Дата регистрации: 06.06.2017
Сообщений: 7

Платформа 1С предприятия 8.3.10.2561, конфигурация 3.0.52.39 Режим веб-сервер, кол-во оперативы сервера 16 Гб.
При повторном открытии и корректировки проведенного документа появляется сообщение:»Ошибка блокировки объекта.Объект уже заблокирован»

Как бороться?

Prikum

активный пользователь

офлайн

Дата регистрации: 18.02.2002
Сообщений: 20833

ООО Горизонт, попросить пользователя закрыть документ

ООО Горизонт

Дата регистрации: 06.06.2017
Сообщений: 7

Другие пользователи с этим документом не работали, ругается именно на пользователя создавшего документ (он же и пытается его корректировать). Документ закрывали, и все равно та же ошибка.

Prikum

активный пользователь

офлайн

Дата регистрации: 18.02.2002
Сообщений: 20833

ООО Горизонт, перезапустите WEB сервер, объект должен освободиться.

ООО Горизонт

Дата регистрации: 06.06.2017
Сообщений: 7

Prikum, спасибо, но это немного не то, вылетят все пользователи из базы, а это никому не нужно, кроме того такая ситуация возникает уже не в первый раз…

Prikum

активный пользователь

офлайн

Дата регистрации: 18.02.2002
Сообщений: 20833

ООО Горизонт, Так у Вас зависла сессия на вэб-сервере, может быть пользователь отключился не выйдя из программы, может быть что то еще, теперь только перезагружать.

Показывать по
10
20
40
сообщений

Объект уже заблокирован

Я

  

jamesgold

08.11.18 — 12:06

Добрый день, прошу помочь!

При добавлении ведомости и проведении выдает ошибку.

https://ibb.co/ksF30A

Групповой обработкой тоже не дает добавить ведомость. Ошибку выдает под любыми правами, документ больше нигде не открыт.

  

zak555

1 — 08.11.18 — 12:08

закрой 1с и попробуй снова

  

Mankubus

2 — 08.11.18 — 12:09

(0) перезагрузи службу сервера

  

jamesgold

3 — 08.11.18 — 12:15

перегружал, эта ошибка не первый день, хотя сервер 1с каждую ночь перегружается

  

jamesgold

4 — 08.11.18 — 12:19

Ошибка при выполнении обработчика — ‘ОбработкаПроведения’

по причине:

{ОбщийМодуль.УправлениеСвойствами.Модуль(1125)}: Ошибка при вызове метода контекста (ЗаблокироватьДанныеДляРедактирования)

            ЗаблокироватьДанныеДляРедактирования(ВладелецСвойствОбъект.Ссылка);

по причине:

Ошибка блокировки объекта. Объект уже заблокирован:

  

Cyberhawk

5 — 08.11.18 — 12:20

Меняй платформу

  

jamesgold

6 — 08.11.18 — 12:22

Обновляю на последний релиз БП, но думаю тож не поможет. Платформа одна из последних 8.3.12.1595

  

jamesgold

7 — 08.11.18 — 12:30

не хочется типовой код менять, чтобы ошибку убрать

  

Sasha_H

8 — 08.11.18 — 12:32

(7) повесь исправление на расширение и все дела.!

  

youalex

9 — 08.11.18 — 12:34

(0) сеанс 4 — текущий?

  

jamesgold

10 — 08.11.18 — 12:35

Да с расширением хорошая идея, согласен! Меня смущает что похоже только у меня такой баг.

  

jamesgold

11 — 08.11.18 — 12:35

(9) Текущий

  

youalex

12 — 08.11.18 — 12:42

(11) может все-таки он реально заблокирован. Открыта форма или нет, здесь не играет.

Можно замером посмотреть, было ли еще ЗаблокироватьДанныеДляРедактирования.

  

jamesgold

13 — 08.11.18 — 12:52

Не дает добавить ведомость не в один из документов выдача наличных — заблокированы все. Переоткрытие 1с, перегрузка сервера 1с не помогаеют.

  

Cyberhawk

14 — 08.11.18 — 12:53

Под другим пользователем ИБ проверь

  

Cyberhawk

15 — 08.11.18 — 12:53

И пользователем ОС

  

1Сергей

16 — 08.11.18 — 12:53

(13) повисших сеансов тоже нет?

  

jamesgold

17 — 08.11.18 — 12:55

(14) Под несколькими пробовал проводить

(16) Рестарт сервера 1с каждую ночь, все скидываются

  

Cyberhawk

18 — 08.11.18 — 12:57

Перенеси базу в другой кластер (центральный сервер которого на другом порту и с другим каталогом который будет работать). А то может в базу лазят с двух серверов приложений.

  

jamesgold

19 — 08.11.18 — 13:13

(18) Можно было бы на файловой тогда, но не выгрузится там размер таблиц большой

  

jamesgold

20 — 08.11.18 — 13:48

(18) Перенес на другой сервер, восстановил из бекапа, — таже ошибка

  

Cyberhawk

21 — 08.11.18 — 13:50

Ну тогда мой первый совет в помощь

  

jamesgold

22 — 08.11.18 — 13:54

(21) Хорошо сейчас на другой платформе проведу документ.

  

jamesgold

23 — 08.11.18 — 15:03

на 8.3.10.2252 таже ошибка

  

jamesgold

24 — 08.11.18 — 15:37

Тема актуальна, есть еще идеи?

  

youalex

25 — 08.11.18 — 15:39

ну, типа на пустой файловой попробовать (минимально вколотить данные для воспроизведения)

  

МимохожийОднако

26 — 08.11.18 — 15:41

(24) 8.3.12 ))

  

youalex

27 — 08.11.18 — 15:42

+ поиграться с РазблокироватьДанныеДляРедактирования() — повтыкать его в разные места через расширение — сначала непосредственно перед Заблокировать…

  

jamesgold

28 — 08.11.18 — 15:53

В итоге доработал код — заработало, странно что проблема только у меня

Транзакция — это неделимая, с точки зрения воздействия на базу данных, последовательность операций манипулирования данными, выполняющаяся по принципу «все или ничего», и переводящая базу данных из одного целостного состояния в другое целостное состояние.

Если по каким-либо причинам одно из действий транзакции невыполнимо или произошло какое-либо нарушение работы системы, база данных возвращается в то состояние, которое было до начала транзакции (происходит откат транзакции).

Блокировка (в общем случае) — это информация о том, что данный ресурс «захвачен» кем-то для выполнения какого-то действия.

Суть блокировки:

  • запрет некоторых действий над общим ресурсом на некоторое ограниченное время.

В силу различных причин блокировки могут быть:

  1. необходимыми («хорошими») — благодаря им обеспечивается предсказуемость действий пользователей, целостность и непротиворечивость данных;
  2. избыточными («плохими»).

В системе 1С:Предприятие 8 различают:

  • объектные блокировки (позволяют осуществлять конкурентный доступ пользователей к данным 1С:Предприятия в терминах объектов информационной базы, например, при интерактивной работе пользователей в формах: редактировании существующих объектов, удалении, создании новых и др.);
  • транзакционные блокировки (обеспечивают конкурентный доступ к данным в целях целостности и непротиворечивости хранимых данных).

Виды блокировок объектов базы данных 1С:

  1. объектная пессимистическая;
  2. объектная оптимистическая;

Объектная пессимистическая блокировка

Пессимистическая блокировка объектов базы данных предназначена для запрета изменения данных определенного объекта другими сеансами или данным сеансом до тех пор, пока блокировка не будет снята этим объектом встроенного языка.

При этом блокировка данных для редактирования не запрещает запись заблокированных данных в других пользовательских сеансах (или в других экземплярах объекта в этом же сеансе), а лишь не позволяет нескольким объектам одновременно установить блокировку одних и тех же данных.

Пессимистическая блокировка объектов базы данных:

  • используется системой 1С:Предприятие для блокировки объектов, редактируемых в форме;
  • устанавливается:
    1. автоматически — в момент начала модификации объекта в форме, указанного в качестве основного реквизита формы (при этом если другой пользователь попытается выполнить редактирование того же объекта, ему будет выдано сообщение о том, что не удалось заблокировать объект);
    2. программно — метод объектов Заблокировать() или метод глобального контекста ЗаблокироватьДанныеДляРедактирования().
  • снимается, когда пользователь, редактировавший объект, закроет форму объекта.

Пример

Отсюда

Войдем в информационную базу под пользователем Иванов, откроем форму элемента 1С:Предприятие 8.0. Управление торговлей справочника Номенклатура (код 12) и изменим цену продажи с 420,00 на 450,00Не сохраняя сделанные изменения, войдем в информационную базу еще раз, но теперь под именем пользователя Петров. Откроем форму того же элемента справочника и попробуем изменить значение какого-либо реквизита. Любая попытка изменения приведет к появлению специального окна с сообщением об ошибке:

Пессимистическая блокировка 1С

[свернуть]

Таким образом пессимистическая блокировка гарантирует, что пользователь, начав изменять данные объекта, сможет записать эти изменения в информационную базу.

Использование объектной пессимистической блокировки

Прежде чем изменять существующий объект информационной базы из кода на встроенном языке, следует предварительно его заблокировать (установить «блокировку данных для редактирования» или «объектную блокировку»), тем самым:

  1. убедиться, не заблокирован ли он другими объектами;
  2. попытаться предотвратить его изменение другими пользовательскими сеансами (или другими экземплярами объекта в этом же сеансе).

В противном случае, если при изменении и записи из встроенного языка не устанавливать блокировку объекта на время редактирования, то может возникнуть, например, ситуация, когда пользователь не сможет сохранить свои изменения, если эти же самые данные были конкурентно изменены в другом сеансе.

Примеры

Отсюда

Пример № 1.

Требуется заблокировать объект и, если это удалось, модифицировать данные. В противном случае – проинформировать пользователя об отказе в выполнении операции с помощью сообщения вида:

«Не удалось заблокировать запись. Действие (изменение, удаление или блокировка записи) не выполнено. Ошибка блокировки объекта. Объект уже заблокирован: компьютер: <имя компьютера>, пользователь: <имя пользователя>, сеанс: <номер сеанса>, начат: <дата и время>, приложение: <тип клиентского приложения>».

ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект();

// Выполнить блокировку объекта от изменения другими режимами

// или пользователями; в случае блокировки — 

// вывести пользователю сообщение об исключении.

ФайлОбъект.Заблокировать(); 

// Затем изменить и записать объект

ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка();

ФайлОбъект.Записать();

Аналогичным образом, можно воспользоваться методом глобального контекста ЗаблокироватьДанныеДляРедактирования:

ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект();

// Выполнить блокировку объекта от изменения другими режимами

// или пользователями; в случае блокировки — 

// вывести пользователю сообщение об исключении.

ЗаблокироватьДанныеДляРедактирования(ДанныеФайла.Ссылка); 

// Затем изменить и записать объект

ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка();

ФайлОбъект.Записать();

Пример № 2.

Требуется пропустить обработку объекта, если он заблокирован для редактирования. При очередном вызове процедуры (например, из фонового или регламентного задания) будет предпринята повторная попытка изменения объекта.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

Объект = ТекущаяВерсия.ПолучитьОбъект();

// Выполнить блокировку объекта от изменения другими режимами

// или пользователями

УстановитьПолноеНаименование = Истина;

Попытка 

ФайлОбъект.Заблокировать();

Исключение

// в случае блокировки — не выполнять изменение объекта

УстановитьПолноеНаименование = Ложь;

// записать предупреждение в журнал регистрации

ЗаписьЖурналаРегистрации(НСтр(«ru = ‘Фоновое обновление имен файлов’», Метаданные.ОсновнойЯзык.КодЯзыка),

УровеньЖурналаРегистрации.Предупреждение,, ФайлОбъект, ОписаниеОшибки());

КонецПопытки;

// Пропустить обработку объекта, если он заблокирован.

Если УстановитьПолноеНаименование Тогда

  Объект.ПолноеНаименование = ПолноеНаименование;

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

КонецЕсли;

[свернуть]

Не следует проверять блокировку объектов для редактирования в следующих случаях:

  1. при выполнении отдельных операций, имеющих по логике работы больший приоритет по сравнению с интерактивными действиями пользователя (например, загрузка данных при обмене);
  2. при действиях, которые гарантированно выполняются в монопольном режиме (например, в процедурах обновления и первоначального заполнения данных информационной базы).

Для снятия пессимистической блокировки разработчик может использовать метод объекта Разблокировать(), причем использовать его для того же самого экземпляра объекта, для которого ранее была установлена блокировка.

ВАЖНО! Объектные блокировки не влияют на операции над данными и на процесс течения транзакций (они расположены на другом уровне работы с данными):

  1. если блокировка объекта вызвала исключение, то оно может быть обработано разработчиком конфигурации и не приведет к обязательному откату транзакции;
  2. блокировки объектов, установленные в течение транзакции, сохраняются при фиксации транзакции и снимаются при откате транзакции.

Объектная оптимистическая блокировка

Оптимистическая блокировка запрещает запись объекта в базу данных, если после считывания объекта он был изменен в базе данных другими сеансами или другими программными объектами этого же сеанса.

Таким образом оптимистическая блокировка гарантирует, что пользователь изменяет актуальные данные объекта, которые хранятся в информационной базе, а не какой-то их предыдущий вариант.

Фактически, оптимистическая блокировка представляет собой проверку, которая выполняется перед записью объекта в базу данных. Эта проверка построена на анализе номера версии объекта, хранящейся в базе данных и номера версии, помещенной в память компьютера в момент считывания данных из информационной базы. Если при записи объекта номера его версий отличаются, то будет выдано предупреждение о том, что версия объекта изменилась или он был удален, то есть сработает оптимистическая блокировка.

Примеры

Отсюда

Рассмотрим пример. Откроем два сеанса работы с прилагаемой к работе информационной базой: один под пользователем Иванов, а другой — под пользователем Петров. В обоих сеансах откроем откроем форму элемента Управление торговлей справочника Номенклатура (код 12). Теперь в сеансе, открытом от имени пользователя Иванов, изменим цену продажи с 420,00 на 450,00 и запишем сделанные изменения. После этого, в сеансе, открытом от имени пользователя Петров попробуем изменить значение какого-либо реквизита. Любая попытка изменения приведет к появлению другого окна с сообщением об ошибке:

[свернуть]

Механизм транзакционных блокировок

Возможные проблемы при многопользовательском доступе к одним и тем же данным

Подробнее…

Работа в многопользовательской среде требует соблюдения определенного компромисса между требованиями предсказуемости, целостности и непротиворечивости данных информационной базы и требованиями параллельности работы.

Как известно, при одновременном чтении и изменении одних и тех же данных конкурирующими транзакциями могут возникнуть следующие проблемы одновременного доступа:

  1. Проблема потерянного изменения (англ. The Lost Update Problem) — если две транзакции изменяют одни и те же данные, взяв в качестве первоисточника начальное значение этих данных, то в системе останутся изменения внесенные той транзакцией, которая записала свои изменения последней, поскольку эти изменения заменят собой все изменения, внесенные до этого. Вывод:
    • нельзя одновременно изменять одни и те же данные.
  2. Проблема «грязного» чтения (англ. The Uncommitted Dependency Problem) — если одна транзакция начнет считывать некоторые данные не дождавшись окончания внесения изменений, вносимых в эти данные другой транзакцией, то достаточно вероятен случай, когда прочитанные данные будут содержать неверную информацию. Вывод:
    • нельзя читать уже измененные, но еще не записанные данные.
  3. Проблема неповторяемого чтения (англ. The Inconsistent Analysis Problem) — если одна транзакция несколько раз считывает одни и те же данные, а вторая — вносит изменения в эти данные между циклами чтения данных первой транзакции, то при повторном считывании первая транзакция может получить другой набор данных. Вывод:
    • нельзя повторно читать измененные и записанные данные, если эти же самые данные уже были прочитаны до внесения в них изменений.
  4. Проблема чтения фантомов (англ. The Phantom Read Problem) — если первая транзакция считывает данные и потом на их основе осуществляет определенные действия, а вторая транзакция в этот момент добавляет в эти данные новую информацию, то как и в предыдущем случае это может привести к некорректному результату. Вывод:
    • нельзя вводить новые данные (удалить имеющиеся), если они могут попасть в уже один раз прочитанные данные при повторном чтении.

Строго говоря, список вышеперечисленных проблем не является окончательным.

[свернуть]

Уровни изоляции транзакций

Уровни изоляции транзакций в современных СУБД являются механизмом гибкой настройки ограничений, позволяющих:

  1. допустить параллельное выполнение транзакций ради увеличения производительности системы;
  2. обеспечить необходимую степень целостности данных (ограничить параллельность транзакций при работе с одними ресурсами).

Например, MS SQL Server 2000 позволяет использовать следующие уровни изоляции транзакции:

  • READ UNCOMMITED — незавершенное чтение. Низший уровень изоляции, обеспечивает максимальную параллельность выполнения транзакций. Данный уровень защищает изменяемые текущей (актуальной) транзакцией данные от изменений, которые могут внести конкурирующие транзакции. Если другой транзакции необходимо изменить те же самые данные, то она должна ожидать завершения изменения данных текущей (актуальной) транзакцией. Однако чтение данных разрешено. Таким образом этот уровень изоляции допускает чтение незавершенных изменений данных.
  • READ COMMITED —  обеспечивает запрет «грязного» чтения. Если текущая (актуальная) транзакция начала изменять данные, то конкурирующая транзакция не может не только изменить, но даже прочитать их до завершения изменений, вносимых текущей (актуальной) транзакцией. После того, как изменения, вносимые текущей (актуальной) транзакцией закончены, конкурирующие транзакции могут читать данные, не дожидаясь окончания текущей (актуальной) транзакции в целом. Таким образом решается проблема неповторяемого чтения.
  • REPEATABLE READ — обеспечивает повторяемость чтения данных. Если текущая (актуальная) транзакция начинает читать данные, то другая транзакция не может их изменить до окончания текущей (актуальной) транзакции.
  • SERIALIZABLE — последовательное выполнение. Этот уровень изоляции является максимальным и обеспечивает полную изоляцию транзакций друг от друга. Решаются все рассмотренные проблемы, включая проблему «фантомов».

В зависимости от используемого уровня изоляции, СУБД накладывает различные типы блокировок на различные объекты базы данных на различное время.

Режим автоматических блокировок

В режиме автоматических блокировок 1С:Предприятие целиком «полагается» на возможности, предоставляемые СУБД.

Такой подход позволяет разработчику не задумываться о достаточно сложных вопросах блокирования нужных данных в транзакции. Однако СУБД не имеет информации о логической структуре данных 1С:Предприятия, и платформе приходится использовать достаточно высокие уровни изоляции транзакций СУБД для того, чтобы обеспечить целостность и непротиворечивость данных:

  СУБД
   Файловая база данных  MS SQL Server  IBM DB2  PostgreSQL
 Вид блокировок  Таблиц  Записей  Записей  Таблиц
 Уровень изоляции транзакций  Serializable  Repeatable Read или Serializable  Serializable  Read Committed

Режим автоматических блокировок:

  1. может привести к возникновению избыточных блокировок;

  2. не позволяет достичь желаемой параллельности работы пользователей.

В клиент-серверном варианте блокировка данных происходит на уровне записей, однако может быть заблокирована и вся таблица целиком (например, в результате выбора СУБД неоптимального плана выполнения запроса).

Тип блокировок, устанавливаемых в том или ином случае, зависит от вида операции, используемого 1С:Предприятием уровня изоляции транзакций и определяется внутренними механизмами самой СУБД (например, MS SQL Server).

Режим управляемых блокировок

В 1С:Предприятии реализован дополнительный режим работы, позволяющий использовать собственный менеджер транзакционных блокировок 1С:Предприятия, независимый от используемой СУБД.

Управляемые блокировки 1С:Предприятия учитывают логическую структуру прикладного решения и поэтому позволяют максимально точно блокировать необходимые области данных (в отличие от использовавшихся ранее блокировок СУБД, которым не известна логическая структура системы). Таким образом менеджер управляемых блокировок позволяет избежать возникновения избыточных блокировок, блокируя только действительно необходимые области данных.

При работе в этом режиме система использует гораздо более низкий уровень изоляции транзакций для MS SQL Server и IBM DB2, и блокировку на уровне записей для PostgreSQL, что позволяет достичь более высокой параллельности работы пользователей:

  СУБД
   Файловая база данных  MS SQL Server  IBM DB2  PostgreSQL
 Вид блокировок  Таблиц  Записей  Записей  Записей
 Уровень изоляции транзакций  Serializable  Read Committed  Read Committed  Read Committed

Однако этот уровень изоляции транзакций СУБД уже не может сам по себе обеспечить целостность и непротиворечивость данных во всех случаях. Поэтому 1С:Предприятие 8 при модификации данных методами встроенного языка (например, метод Записать() у объектных данных) устанавливает собственные управляемые блокировки в транзакции, которые обрабатываются собственным менеджером транзакционных блокировок. Эти блокировки также могут быть установлены и разработчиком самостоятельно в тех местах кода, где требуется:

  • обеспечить неизменность считываемых в транзакции данных (разделяемая блокировка);
  • запретить чтение данных другими транзакциями (исключительная блокировка).

Порядок действия механизма управляемых блокировок:

  1. любой запрос к данным прежде всего обрабатывается собственным менеджером транзакционных блокировок 1С:Предприятия; если на уровне 1С:Предприятия конфликт управляемых блокировок не обнаруживается, то запрос передается далее, на исполнение СУБД;
  2. СУБД использует собственный механизм блокировок для определения конфликтующих транзакций, но уже с более низким уровнем изоляции транзакций, чем в режиме автоматических блокировок.

Установка режима управления блокировками для объектов конфигурации

В структуре объектов конфигурации существует несколько возможностей для задания режима управления блокировками:

  1. через свойство «Режим управления блокировкой данных» в палитре свойств конфигурации и(или) объекта;
  2. установка управляемых блокировок средствами встроенного языка.

Установка режима управления блокировками через свойство «Режим управления блокировкой данных» в палитре свойств конфигурации или объекта

Управление блокировками 1С

  • режим Автоматический используются автоматические блокировки, устанавливаемые СУБД. Собственный менеджер блокировок 1C:Предприятия не задействован.
  • режим Управляемый — система всегда самостоятельно устанавливает необходимые управляемые блокировки, обрабатываемые собственным менеджером транзакционных блокировок (независимо от того, какие режимы управления блокировками установлены для конкретных объектов конфигурации). Этот режим предназначен для работы всей конфигурации только с управляемыми блокировками в транзакции.
  • режим Автоматический и управляемый — для конкретного объекта конфигурации режим блокировки будет определяться значением свойства Режим управления блокировкой данных самого объекта конфигурации. Этот режим предназначен для постепенного или частичного перевода конфигурации в режим управляемых блокировок. Он позволяет отдельным объектам метаданных работать с управляемыми блокировками (например, наиболее «проблемным» документам и регистрам), в то время как остальные объекты работают в режиме автоматических блокировок.

Сочетания режимов управления блокировками в транзакции в режиме Автоматический и управляемый:

Режим существующей транзакции Режим начинаемой транзакции Результат
 Автоматический  Автоматический  Начинаемая транзакция будет выполнена в автоматическом режиме
 Управляемый  Управляемый  Начинаемая транзакция будет выполнена в управляемом режиме
 Автоматический  Управляемый  Начинаемая транзакция будет выполнена в автоматическом режиме
 Управляемый  Автоматический  Будет вызвана исключительная ситуация

Особенности режимов управления блокировками для документов

Транзакция, единая для пользователя может представлять собой несколько транзакций с точки зрения платформы.

Интерактивное проведение документа по регистру делает две транзакции:

  1. запись самого документа;
  2. внутри этой записи (транзакции) запись набора строк по регистру.

В зависимости от режима управления блокировками для самого документа и двигаемого им регистра, возможны четыре ситуации:

  1. Режим документа Автоматический, режим регистра Автоматический -> запись по регистру в автоматическом режиме
  2. Режим документа Управляемый, режим регистра Управляемый-> запись по регистру в управляемом режиме
  3. Режим документа Автоматический, режим регистра Управляемый -> запись по регистру в автоматическом режиме
  4. Режим документа Управляемый, режим регистра Автоматический -> исключительная ситуация (ошибка)

[свернуть]

Если, например, стоит задача повысить параллельность работы при проведении отдельного документа, не переводя при этом всю конфигурацию в управляемый режим, то последовательность действий должна быть следующей:

  1. свойство конфигурации Режим управления блокировкой данных необходимо установить в значение Автоматический и управляемый;
  2. свойство Режим управления блокировкой данных объекта метаданных документ необходимо установить в значение Управляемый;
  3. у всех регистров, по которым данный документ выполняет движения, следует установить свойство Режим управления блокировкой данных в значение Управляемый;
  4. проанализировать процедуру проведения документа на предмет наличия:
    • явных вызовов транзакций
    • неявных вызовов транзакций, которые выполняются системой при модификации данных каких-либо объектов конфигурации
  5. для найденных явных и неявных вызовов транзакций обеспечить их выполнение в управляемом режиме
    • для явных вызовов — параметр метода НачатьТранзакцию();
    • для неявных вызовов — свойство Режим управления блокировкой данных модифицируемого объекта конфигурации;
  6. в теле процедуры проведения документа установить необходимые управляемые блокировки.

Установка управляемых блокировок средствами встроенного языка

Средствами встроенного языка установка управляемых блокировок внутри явной или скрытой (неявной) транзакции происходит с помощью специального объекта БлокировкаДанных,  который предназначен для явной блокировки данных от чтения или изменения другими сессиями.

Управление блокировкой данных средствами встроенного языкаОписание доступных свойств и методов которого можно посмотреть в синтакс-помощнике в ветви «Общие объекты» — «Управление блокировкой данных».

Новый экземпляр данного объекта может быть создан с помощью одноименного конструктора и представляет собой коллекцию элементов блокировки данных. Изначально эта коллекция пуста и задача разработчика состоит в добавлении в эту коллекцию некоторого количества элементов блокировки.

При добавлении нового элемента блокировки для него необходимо указать пространство блокировок, которое будет блокировать данный элемент. Пространства блокировок определены в платформе 1С:Предприятия 8.1 и соответствуют структуре прикладных объектов конфигурации.

Допустимы следующие имена пространств блокировок и имена полей пространств блокировок:

  • для объектных данных (справочник, документ и др.) определено единственное пространство блокировки — сам объект данных;
  • для необъектных данных (например, регистры) определено по два пространства блокировок, которые имеют разный логический смысл.

Перечень допустимых имен

  Имя пространства блокировок Поля пространства блокировок
 Справочник.<имя>  Ссылка
 Документ.<имя>   Ссылка
 ПланОбмена.<имя>   Ссылка
 ПланСчетов.<имя>   Ссылка
 БизнеcПроцесс.<имя>   Ссылка
 Задача.<имя>   Ссылка
 ПланВидовРасчета.<имя>   Ссылка
 ПланВидовХарактеристик.<имя>   Ссылка
 РегистрСведений.<имя>.НаборЗаписей — только для регистра сведений, подчиненного регистратору  Регистратор
 РегистрСведений.<имя>  Период — если есть;
<имя измерения>
 РегистрНакопления.<имя>.НаборЗаписей  Регистратор
 РегистрНакопления.<имя> Период;
<имя измерения>
 РегистрБухгалтерии.<имя>.НаборЗаписей  Регистратор
 РегистрБухгалтерии.<имя>  Период;
<вид движения> — значение системного перечисления ВидДвиженияБухгалтерии;
Счет — обязательное поле;
Субконто;
<вид субконто>;
<имя измерения>
 РегистрРасчета.<имя>.НаборЗаписей  Регистратор
 РегистрРасчета.<имя>  ПериодРегистрации;
ПериодДействия;
<имя измерения>
 Перерасчет.<имя>.НаборЗаписей  ОбъектПерерасчета
 Перерасчет.<имя>  ВидРасчета
 Последовательность.<имя>.НаборЗаписей  Регистратор
 Последовательность.<имя>  <имя измерения>
 Константа.<имя>  

Пространство блокировок с суффиксом НаборЗаписей используется в тех случаях, когда необходимо заблокировать сами записи данного объекта (например, при добавлении новых записей).

Пространство блокировок без суффикса используется тогда, анализируются некоторые данные этого объекта (например, остатки регистра), или когда выполняются какие-либо операции, приводящие к изменению существующих данных объекта (например, восстановление границы последовательности).

[свернуть]

Порядок действий при установке управляемых блокировок средствами встроенного языка:

  1. добавить элемент блокировки, соответствующий некоторому пространству блокировок;
  2. установить для этого элемента режим блокировки (разделяемая или исключительная);
  3. определить значения полей блокировки (указать, какие же именно записи будут заблокированы — для каждого пространства блокировок в платформе определены имена полей, значения которых могут задаваться при установке тех или иных блокировок).

ВНИМАНИЕ!

Следует понимать, что, в данном случае речь не идет о реальных записях базы данных. Несмотря на то, что управляемые блокировки описываются в терминах объектов метаданных и их полей, эти блокировки никак не связаны с реальной структурой хранения данных 1С:Предприятия в СУБД. Это всего лишь записи о том, что заблокировано «нечто».

Иногда можно провести аналогию между управляемыми блокировками и реальными записями СУБД. Например, для объектных данных блокировка объекта с указанной ссылкой будет «соответствовать» блокировке всех записей, содержащих указанную ссылку, во всех таблицах этого объекта метаданных (в основной таблице и в таблицах его табличных частей).

Однако в других случаях провести такую аналогию достаточно затруднительно, да и не нужно. Например, при блокировке регистра бухгалтерии с указанием значения вида субконто, мы запрещаем другим транзакциям каким-либо образом изменять «записи» регистра бухгалтерии, у которых значение вида субконто равно указанному нами. Как при этом данное условие «проецируется» на реальную структуру данных регистра бухгалтерии — для нас совершенно не важно.

При установке новых блокировок менеджер анализирует имеющиеся блокировки. Если оказывается, что «нечто», что мы пытаемся заблокировать, уже заблокировано ранее, сравниваются режимы существующей и новой блокировок. Если режимы совместимы — новая блокировка устанавливается. Если режимы не совместимы — новая блокировка ожидает снятия существующей блокировки.

[свернуть]

Условия необходимо ставить именно на те поля, имена которых приведены в списке имен пространств блокировок. Условия могут быть заданы или на равенство значения поля какому-либо значению, или на вхождение значения поля в указанный диапазон.

Для каждого пространства блокировок количество устанавливаемых условий не ограничено.

Способы задания условий на поля пространств блокировки

Существует два способа задания условий на поля пространств блокировки:

  1. с помощью явного задания имени поля и его значения;
  2. с помощью указания источника данных, содержащего необходимые значения.

Задание условий на поля пространств блокировки с помощью явного задания имени поля и его значения

При явном задании имени поля и его значения необходимо использовать метод УстановитьЗначение() объекта ЭлементБлокировкиДанных. В этом случае имя и значение указывают в качестве параметров метода, например так, как показано в листинге 1.

Листинг 1

Листинг 1. Пример установки условия блокировки записей с помощью явного указания имени поля и его значения

// Создать объект блокировка данных

БлокировкаДанных = Новый БлокировкаДанных;

// Добавить новый элемент блокировки, блокирующий «нечто» в данных регистра накопления Остатки номенклатуры

ЭлементБлокировки = БлокировкаДанных.Добавить(«РегистрНакопления.ОстаткиНоменклатуры»);

// Установить режим блокировки — исключительный. Другие транзакции, устанавливающие управляемые блокировки, не смогут даже начать чтение этих данных

ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;

// Указать, что именно мы блокируем в данных регистра Остатки номенклатуры — все «записи», у которых значение измерения Склад равно значению, содержащемуся в переменной Склад

ЭлементБлокировки.УстановитьЗначение(«Склад», Склад);

[свернуть]

Для значений типа Дата или Число в качестве значения может быть задан некоторый диапазон значений. Диапазон значений передается методу с помощью объекта встроенного языка — Диапазон. Данный объект позволяет задать верхнюю и нижнюю границы диапазона, причем в диапазон включаются и границы диапазона (листинг 2).

Листинг 2

Листинг 2. Пример установки условия блокировки записей с помощью задания диапазона

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

// Создать объект блокировка данных

БлокировкаДанных = Новый БлокировкаДанных;

// Добавить новый элемент блокировки, блокирующий «нечто» в данных регистра накопления Продажи

ЭлементБлокировки = БлокировкаДанных.Добавить(«РегистрНакопления.Продажи»);

// Установить режим блокировки — разделяемый. Эти данные гарантировано не будут изменены другими транзакциями до окончания существующей транзакции

ЭлементБлокировки.Режим = РежимБлокировкиДанных. Разделяемый;

// Указать, что именно мы блокируем в данных регистра Продажи — все «записи», у которых значение измерения Контрагент равно значению, содержащемуся в переменной Контрагент

ЭлементБлокировки.УстановитьЗначение(«Контрагент», Контрагент);

// Создать объект Диапазон, описывающих интервал от начала месяца, к которому принадлежит указанная дата, до указанной даты

Диапазон = Новый Диапазон(НачалоМесяца(Дата), Дата);

// Указать, что именно мы блокируем в данных регистра Продажи — все «записи», у которых значение измерения Контрагент равно значению, содержащемуся в переменной Контрагент, и значение поля Период содержится в указанном диапазоне

ЭлементБлокировки.УстановитьЗначение(«Период», Диапазон);

[свернуть]

Задание условий на поля пространств блокировки с помощью указания источника данных, содержащего необходимые значения

При указании источника данных сначала необходимо задать свойство ИсточникДанных объекта ЭлементБлокировкиДанных, после чего, используя метод ИспользоватьИзИсточникаДанных(), настроить соответствие полей области блокировки данных полям источника данных (листинг 3).

Листинг 3

Листинг 3. Пример установки условия блокировки записей с помощью источника данных

БлокировкаДанных = Новый БлокировкаДанных;

// Добавить новый элемент блокировки, блокирующий «нечто» в данных регистра накопления Остатки номенклатуры

ЭлементБлокировки = БлокировкаДанных.Добавить(«РегистрНакопления.ОстаткиНоменклатуры»);

// Установить режим блокировки — исключительный. Другие транзакции, устанавливающие управляемые блокировки, не смогут даже начать чтение этих данных

ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;

// Указать, что именно мы блокируем в данных регистра Остатки номенклатуры — все «записи», у которых значение измерения Склад равно значению, содержащемуся в переменной Склад

ЭлементБлокировки.УстановитьЗначение(«Склад», Склад);

// Указать источник данных, который содержит данные для установки ограничений на другие поля этого элемента блокировки — в данном случае таблица значений СписокНоменклатуры

ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; 

// Указать, что именно мы блокируем в данных регистра Остатки номенклатуры — все «записи», у которых значение измерения Склад равно значению, содержащемуся в переменной Склад, и у которых значение измерения Номенклатура равно какому-либо значению, содержащемуся в колонке Номенклатура указанного источника данных

ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»);

[свернуть]

В качестве источника данных можно указывать:

  • результат запроса;
  • табличную часть;
  • набор записей;
  • таблицу значений.

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

Объект Диапазон также может являться значением поля источника данных.


Для установки всех созданных блокировок используется метод объекта БлокировкаДанных — Заблокировать():

  • Если метод выполняется внутри транзакции (явной или неявной), то блокировки устанавливаются в момент вызова метода. При окончании транзакции они будут сняты автоматически.
  • Если же метод Заблокировать() выполняется вне транзакции, то блокировки установлены не будут.

не работает «Заблокировать()» в попытке

Я
   assasu

13.02.18 — 06:42

Добрый день.

вот эта конструкция

Попытка

        ДокументОбъект.Заблокировать();

Исключение

        Сообщить(«блаблабла»);

КонецПопытки

вдруг перестала работать в попытке, т.е. исключения нет , я виду окно с красным крестом и вариант только закрыть приложение.

кто то встречал может?

   assasu

1 — 13.02.18 — 06:46

работаем на 8.3.9.1850, УТ 10.3

   МимохожийОднако

2 — 13.02.18 — 07:31

Отладчик до слова Попытка доходит?

   rphosts

3 — 13.02.18 — 07:36

(1) УТ 10? Это та, что на старых формах?

   assasu

4 — 13.02.18 — 07:37

да,доходит.

пробовал менять режим блокировок на автоматический — тоже самое.

   assasu

5 — 13.02.18 — 07:37

(3) да

   catena

6 — 13.02.18 — 07:59

Что написано в окне с красным крестом и в каком стратегическом месте выполняется конструкция?

Режим блокировок — это из другой оперы.

   assasu

7 — 13.02.18 — 08:32

(6) написано что объект уже заблокирован .

конструкция как раз и задумывалась как предупреждение, вновь открывающему документ. А оказалось что не работает оно

   assasu

8 — 13.02.18 — 08:35

(6) «Ошибка блокировки объекта, объект уже заблокирован»

   Сияющий в темноте

9 — 13.02.18 — 08:39

Оно же,насколько я помню,возвращает успешность блокировки,то есть исключения не будет

   assasu

10 — 13.02.18 — 08:40

(9) посмотри инет. везде только про эту конструкцию и пишут

   Гипервизор

11 — 13.02.18 — 08:44

У меня все работает. Ну не отрабатывает у вас в попытке, сделайте без попытки. Проверяйте успешность через Заблокирован().

   assasu

12 — 13.02.18 — 08:50

(11) собственно, написал  потому что оно  и работало ранее. и работало на той же платформе . появилось недавно и внезапно.

   Сти

13 — 13.02.18 — 09:36

(12) режим совместимости не меняли?

   patria0muerte

14 — 13.02.18 — 09:42

(11) Ну не совсем эти методы совместимы, если мне память не изменяет.

Там идея в том, что метод Заблокирован() определяет только объекты, заблокированные методом Заблокирован(), т.е. если объект просто открыт и изменен пользователем — то Заблокирован() все равно вернет Ложь.

Заблокировать() в Попытке я например юзаю в случаях когда мне нужно обработать пачку документов, но при этом — не трогать объекты, которые сейчас заблокированы пользователями.

   patria0muerte

15 — 13.02.18 — 09:42

+(14) *метод Заблокирован() определяет только объекты, заблокированные методом ЗаблокироваТЬ()

   patria0muerte

16 — 13.02.18 — 09:46

(0) А нафига вообще эти свистопляски? 1С же сама блокирует объект, если юзер его модифицировал

   catena

17 — 13.02.18 — 10:15

(16)Это как раз, когда надо, чтобы юзер не модифицирнул в процессе.

   patria0muerte

18 — 13.02.18 — 10:36

(17) А как он его модифицирует, если объект уже заблокирован?

   assasu

19 — 13.02.18 — 11:58

(16) свистопляска началась с того что два человека открыли один и тот же документ. ранее у одного из них всплывало окно, он его закрывал и все. Теперь все можно только закрыть аварийно. Т.е. главная проблема — аварийное завершение сеанса,хотя сам метод в попытку обернут

   catena

20 — 13.02.18 — 12:00

(18)Так вот его и надо заблокировать, чтобы пользователь его не трогал во время обработки

   assasu

21 — 13.02.18 — 12:02

(13) стоит Версия 8.2.16. кажется не менялся вообще

   assasu

22 — 13.02.18 — 12:09

(15) проверил только что. метод вернул Ложь. хотя под другим пользователем я выполнил Заблокировать()

в общем не так оно как то работает

   PiotrLoginov

23 — 13.02.18 — 12:10

(21) ох уж это «кажется»…

   assasu

24 — 13.02.18 — 12:13

(23) я прежде полистал инет. ничего не нашел по поводу изменения поведения «Заблокировать()» с изменением платформы.

   МимохожийОднако

25 — 13.02.18 — 12:14

(19) Сделай проверку ПередОткрытием() и Сообщить() при неудаче

   assasu

26 — 13.02.18 — 12:15

(25) я ее в (0) и сделал…

   МимохожийОднако

27 — 13.02.18 — 12:17

(26) В каком событии разместил?

   assasu

28 — 13.02.18 — 12:22

(27) модуль формы, Перед открытием.

пробовал так же и При открытии

   МимохожийОднако

29 — 13.02.18 — 12:46

Какая платформа? Управляемая форма или обычная?

у меня в УТ10.3

для внешней обработки работает такая конструкция

Спр=Справочники.ВнешниеОбработки.НайтиПоНаименованию(ЭтотОбъект.Метаданные().Представление());

    Если Спр.Пустая() Тогда

         Возврат;

    КонецЕсли;

    НайдОбъект=Спр.ПолучитьОбъект();

    Попытка

        НайдОбъект.Заблокировать();

    Исключение

        Предупреждение(«Обработка «+НайдОбъект+»уже открыта ранее»);// + «!»+ ОписаниеОшибки());

        Отказ=Истина;

    КонецПопытки;

   assasu

30 — 13.02.18 — 12:54

(29) работаем на 8.3.9.1850, УТ 10.3, формы обычные.

этот код выдаст «Обработка…уже открыта ранее», т.к. сработал о исключение.

Мой код аналогичен, только не доходит дело до попытки, фатальная ошибка сразу на .Заблокировать()

   МимохожийОднако

31 — 13.02.18 — 12:56

Покажи код как получаешь ДокументОбъект

   assasu

32 — 13.02.18 — 12:56

(31) ЭтотОбъект

   МимохожийОднако

33 — 13.02.18 — 12:57

(32) Это не код

   assasu

34 — 13.02.18 — 13:01

(33)

Если не ЭтоНовый() тогда

    Попытка

        ЭтотОбъект.Заблокировать();

    Исключение

        Предупреждение(«Документ открыт другим пользователем»);

    КонецПопытки;

КонецЕсли;

   Timon1405

35 — 13.02.18 — 13:29

#Если Клиент Тогда

    Предупреждение(«Документ открыт другим пользователем»);

#КонецЕсли

   assasu

36 — 13.02.18 — 13:30

(35) код не выходит в исключение. все заваливается на

ЭтотОбъект.Заблокировать();

   catena

37 — 13.02.18 — 13:36

(36)А если написать Попытка к=1/0 Исключение КонецПопытки;

   assasu

38 — 13.02.18 — 13:44

(37) это работает в сотне мест конфигурации

   patria0muerte

39 — 14.02.18 — 02:51

(19) Так, пажжжи.

У тебя есть документ и два пользователя, которые работают с ним.

— Пользователь1 открывает документ.

— Пользователь2 открывает документ.

— Пользователь1 модифицирует документ, при этом — происходит блокирование объекта средствами платформы.

— Пользователь2 при попытке изменить реквизит — получает ошибку о том, что запись уже заблокирована и не может поменять ничего в документе

Внимание вопрос: нахрена тебе его еще и кодом блокировать?

   assasu

40 — 14.02.18 — 04:57

(39)

«- Пользователь2 при попытке изменить реквизит — получает ошибку о том, что запись уже заблокирована и не может поменять ничего в документе »

Пользователь получает ошибку о том что документ заблокирован и не может ничего поменять в документе И (внимание!) у него на экране нет кнопки «Продолжить работать», он видит только окно с красным крестом и вариант закрыть приложение

   assasu

41 — 14.02.18 — 04:57

(39) я и хотел кодом предупредить его о том что кто то сидит в документе..так и код не работает тут ,все валится в аварийное завершение.

   DrZombi

42 — 14.02.18 — 06:53

(41) Любопытненько, получается, что если хотите устойчивую работу кода, то не стоит гнаться за обновлениями клиента 1С :)

   assasu

43 — 14.02.18 — 06:59

(42) да, согласен.

   DrZombi

44 — 14.02.18 — 07:05

(43) Остается иметь возможность разворачивать несколько серверов 1С, различных версий.

Полюбому у вас еще бухия есть?

   assasu

45 — 14.02.18 — 07:23

у нас все есть

   DrZombi

46 — 14.02.18 — 07:27

(45) Предложи админам установить еще один сервер 1С

   DrZombi

47 — 14.02.18 — 07:29

+ Может сейчас уже не поможет, но в будущем сможешь в торговой БД работать с ошибками одной и той же версии клиента. А не ловить новые баги от новых релизов :)

   patria0muerte

48 — 14.02.18 — 07:55

(40) «Пользователь получает ошибку о том что документ заблокирован и не может ничего поменять в документе И (внимание!) у него на экране нет кнопки «Продолжить работать», он видит только окно с красным крестом и вариант закрыть приложение»

Это (появление окна с красным крестом) происходит в тот момент, когда выполняется строчка:

ДокументОбъект.Заблокировать();

Верно?

   patria0muerte

49 — 14.02.18 — 07:56

+(48)Я просто понять не могу немного: Валится в такую же ошибку и в том случае, когда в коде нет никаких Заблокировать()?

   assasu

50 — 14.02.18 — 08:53

(48) нет. изначально такого кода не было.

нормальная реакция к которой все привыкли : открываешь повторно документ, получаешь предупреждение что открыто уже кем то , закрываешь документ и работаешь дальше. Тут нет предупреждения , можно только закрыть всю программу целиком.

   assasu

51 — 14.02.18 — 08:54

(49) да, верно… валится. а код появился как я написал в (41)

   Timon1405

52 — 14.02.18 — 09:42

(50) а в ЖР что пишет в этот момент? может прав нет на реквизиты документа или что-то подобное.

   assasu

53 — 14.02.18 — 09:51

(52) пусто в ЖР

   МимохожийОднако

54 — 14.02.18 — 10:12

Документ открывается из формы списка. Значит блокировку надо делать в этой форме в момент события выбора документа, а не через ЭтотОбъект.

   assasu

55 — 14.02.18 — 10:26

не влияет это ни на что

   strrike

56 — 14.02.18 — 10:28

ТиИ сделай

   Фрэнки

57 — 14.02.18 — 10:38

(55) // работаем на 8.3.9.1850, УТ 10.3

вроде нормальный выбор платформы. Наверное и работаете давно.

А копию базы поднять не пробовал? Может в копии этот глюк не проявит себя никак? Ну и прогнать все мыслимые надругательства на базой в плане тестирования на ошибки.

Кстати, в файловом режиме как она?

   assasu

58 — 14.02.18 — 10:57

(57) на копии и тестируем . в файле ее запустить нет возможности — размер большой.

Сейчас думаю как эту копию можно унизить и надругать.

   МимохожийОднако

59 — 14.02.18 — 11:02

(55) Краткость — сестра таланта. Видимо, не в твоём случае. Как партизан-подробности и клещами не выцепить.

(58) Создай пустую базу из файла конфигурации, заполни несколько строк и проверь.

   assasu

60 — 14.02.18 — 11:06

(60) прочти внимательно все что было выше.

еще раз для тебя :

попытка

к = 1/0;

исключание

сообщить(«ты делишь на ноль!»);

конецпопытки;

выдает «ты делишь на ноль»

а вот это

попытка

Этотобъект.Заблокировать()

исключение

сообщить(«ты делишь на ноль»);

конецпопытки

закрывает сеанс и не идет в исключение

   Фрэнки

61 — 14.02.18 — 11:16

(60) но не на всех видах документов, правильно?

Или на любых видах, где только эту конструкцию применили?

   assasu

62 — 15.02.18 — 06:26

(61) ситуация получила развитие вчера.

такая проблема наблюдается на всех видах документов.

кроме того

— само собой перестало работать динамическое обновление. даже если просто добавить пару строк в код динамически не обновиться

— изменился вход в конфигуратор , если ты вторым пользователем заходишь то сразу появляется окно с кнопкой «ОК» и предупреждением что конфигуратор занят. Ранее там была кнопка «Попробовать еще раз»

  

assasu

63 — 28.02.18 — 06:29

кому интересно :

все вылечилось с переходом на 8.3.10.2699

1С-Предприятие крутится на удалённом терминальном сервере Windows Server 2016 с MS SQL Server 2016
Оперативной памяти занято меньше половины, процессор тоже не нагружен, при этом у разных пользователей время от времени разные документы оказываются заблокированы ими же.
У некоторых пользователей RemoteApp, у некоторых тонкий клиент на компьютере, некоторые через RDP.
Происходит следующее, пользователь создаёт заказ, закрывает его и подписывает, через некоторое время (несколько минут или больше) открывает чтобы отредактировать и видит сообщение «Ошибка блокировки объекта. Объект уже заблокирован тонкий клиент»
Компьютер, пользователь и сеанс этого же пользователя, других сеансов я в консоли не вижу.
Как быть? Куда смотреть? Что читать?


  • Вопрос задан

    более трёх лет назад

  • 3803 просмотра

Пригласить эксперта

Вероятнее всего, ошибка в программном коде здесь:

пользователь создаёт заказ, закрывает его и подписывает

На объекте «Заказ» в процессе выполнение этой самой «подписи» был вызван метод «Заблокировать()», однако по окончании операции забыли вызвать метод «Разблокировать()».

P.S. В любом случае, претензию следует адресовать разработчику конфигурации. А еще точнее — тому, кто делал функцию «подписать».

Попробуйте полностью отказаться от RemoteApp. С ним всегда много проблем. Пользователь может даже не понимать через что он открыл 1С и говорить вам, что одно, хотя на самом деле все по другому, RemoteApp все усугубляет. Например пользователь может открыть один и тот же документ через RemoteApp и толстый клиент и думать что на самом деле работает в одном окне, а на самом деле утром он открыл через RemoteApp, а днем закрыл и открыл толстый клиент и пытается зайти в тот же заказ, который открыл утром.

А магия в том, что при закрытии RemoteApp, клиент 1С не закрывается, и все открытые документы так же будут открыты. И пока вы не перезагрузите сервер, чтобы сбросить все сеансы, и не подойдете к пользователю чтобы наблюдать что он делает — вы не поймете что не так.

В общем мой совет, откажитесь от RemoteApp, перезагрузите сервак и наблюдайте что будет дальше на местах.

Как быть? Куда смотреть? Что читать?

Думаю стоит смотреть в сторону — RemoteApp он таким балуется.

Попробуй переустановить обнову.
Точно в сеансах не висят зависшие? При неверной настройке, пользователя может выкидывать из текущего сеанса, worker висит, пользователь логинится заново, пытаясь править то что уже открыто в другом worker process


  • Показать ещё
    Загружается…

13 июн. 2023, в 18:22

180000 руб./за проект

13 июн. 2023, в 18:21

2000 руб./в час

13 июн. 2023, в 18:12

1000 руб./за проект

Минуточку внимания

     В последнее время наблюдается тенденция перехода в облачные технологии. 1С не исключение – работа с любого места, где есть интернет, кросс платформенность, администрирование из одного места и конфигурации развиваются с учетом работы в облаке. Возможно использование LINUX серверов, не нужны дополнительные затраты на лицензии MS. Плюсов еще много можно перечислить. С другой стороны при таком режиме работы возникают новые «баги» и «фичи». Об одном из них хотелось бы рассказать.  
     
  Итак, небольшое предприятие на пять рабочих мест: бухгалтер, кладовщик и четыре менеджера, которые постоянно в разъездах и формируют заказы на месте у клиента (работа с планшета в браузере). Арендован сервер, установлена UBUNTU, база файловая и опубликована на WEB APACHE. Сразу возникла непонятная проблема: после записи какого-либо объекта в системе при попытке повторно его изменить выдает ошибку «Объект заблокирован», причем заблокирован этим же пользователем. Такое поведение наблюдается как в WEB приложении, так и при подключении тонкого клиента через WEB. При работе напрямую с базой таких проблем нет. Разблокирование объекта происходит только при перезапуске сервиса APACHE либо по таймауту процесса APACHE. Логично предположить, что виновник APACHE.  
     
  При попытке включить технологический журнал никаких ошибок для WEB не регистрировалось. Предположили, что это особенность платформы или особенности работы WEB 1C под LINUX. Для определения места «сбоя» сервер был скопирован, установлен сервер 1С предприятия. (В LINUX сервере 1С есть недокументированная возможность работы сервера без ключа защиты по разной информации до 10 – 12 пользователей. РАБОТА СЕРВЕРА В ТАКОМ РЕЖИМЕ ДОПУСТИМА ТОЛЬКО ДЛЯ ТЕСТИРОВАНИЯ). База была переведена в серверный режим, включен технологический журнал. При активной работе в базе трех пользователей (напомню, лицензий у нас пять) появилась новая проблема – ошибки получения лицензий. При разборе технологического журнала выяснилось, что APACHE для обработки запросов стартуют 5-10 процессов, и каждый отдельно загружает модуль 1С и открывает базу – происходит блокировка и захват лишних лицензий (повторное открытие объекта происходит через другой процесс APACHE и 1С принимает его за другого клиента, хотя запрос пришел от того же клиента).
Проблема решилась установкой ограничений количества запускаемых процессов APACHE:
 
     

  и/или если у вас по другому собран сервис:  

  После изменения параметров не замечено визуально каких-либо замедлений в работе. Восстановлено предыдущее состояние сервера, изменены настройки   APACHE. В дальнейшем подобных проблем не возникало.Если возникли вопросы по облачным технологиям в 1С — обращайтесь!  
   

Александр Логачев,

        руководитель отдела разработки ООО “Кодерлайн”

 

Понравилась статья? Поделить с друзьями:
  • Ошибка блокировки объекта объект уже заблокирован сеансов
  • Ошибка блокировки клиента объект уже заблокирован
  • Ошибка блокировки объекта объект уже заблокирован приложение тонкий клиент
  • Ошибка блокировки информационной базы при выгрузки базы
  • Ошибка блокировки объекта объект уже заблокирован пользователь