Блокировка данных объекта для редактирования из кода
Область применения: управляемое приложение, обычное приложение.
1.1. Прежде чем изменять существующий объект информационной базы из кода на встроенном языке, следует предварительно его заблокировать (установить «блокировку данных для редактирования» или «объектную блокировку»), тем самым, во-первых, убедиться, не заблокирован ли он другими объектами, во-вторых, попытаться предотвратить его изменение другими пользовательскими сеансами (или другими экземплярами объекта в этом же сеансе).
В противном случае, если при изменении и записи из встроенного языка не устанавливать блокировку объекта на время редактирования, то может возникнуть, например, ситуация, когда пользователь не сможет сохранить свои изменения, если эти же самые данные были конкурентно изменены в другом сеансе.
При этом блокировка данных для редактирования не запрещает запись заблокированных данных в других пользовательских сеансах (или в других экземплярах объекта в этом же сеансе), а лишь не позволяет нескольким объектам одновременно установить блокировку одних и тех же данных. В отличие от транзакционных блокировок данных, пессимистическая блокировка данных для редактирования предназначена для обеспечения конкурентной работы пользователей с объектами информационной базы 1С:Предприятия (элементами справочников, документами и т.д.) Подробнее о блокировке данных для редактирования см. документацию по платформе 1С:Предприятие 8 .
1.2. Для блокировки данных для редактирования из встроенного языка следует вызывать метод объектов Заблокировать или метод глобального контекста ЗаблокироватьДанныеДляРедактирования .
Пример № 1. Требуется заблокировать объект и, если это удалось, модифицировать данные. В противном случае – проинформировать пользователя об отказе в выполнении операции с помощью сообщения вида:
«Не удалось заблокировать запись. Действие (изменение, удаление или блокировка записи) не выполнено. Ошибка блокировки объекта. Объект уже заблокирован: компьютер: , пользователь: , сеанс: , начат: , приложение: ».
ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект();
// Выполнить блокировку объекта от изменения другими режимами
// или пользователями; в случае блокировки —
// вывести пользователю сообщение об исключении.
ФайлОбъект.Заблокировать();
// Затем изменить и записать объект
ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка();
ФайлОбъект.Записать();
Аналогичным образом, можно воспользоваться методом глобального контекста ЗаблокироватьДанныеДляРедактирования :
ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект();
// Выполнить блокировку объекта от изменения другими режимами
// или пользователями; в случае блокировки —
// вывести пользователю сообщение об исключении.
ЗаблокироватьДанныеДляРедактирования(ДанныеФайла.Ссылка);
// Затем изменить и записать объект
ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка();
ФайлОбъект.Записать();
Пример № 2. Требуется пропустить обработку объекта, если он заблокирован для редактирования. При очередном вызове процедуры (например, из фонового или регламентного задания) будет предпринята повторная попытка изменения объекта.
ФайлОбъект = ТекущаяВерсия.ПолучитьОбъект();
// Выполнить блокировку объекта от изменения другими режимами или пользователями.
УстановитьПолноеНаименование = Истина;
Попытка
ФайлОбъект.Заблокировать();
Исключение
// в случае блокировки — не выполнять изменение объекта
УстановитьПолноеНаименование = Ложь;
// записать предупреждение в журнал регистрации
ЗаписьЖурналаРегистрации(НСтр(«ru = ‘Фоновое обновление имен файлов'», Метаданные.ОсновнойЯзык.КодЯзыка),
УровеньЖурналаРегистрации.Предупреждение,, ФайлОбъект, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
// Пропустить обработку объекта, если он заблокирован.
Если УстановитьПолноеНаименование Тогда
ФайлОбъект.ПолноеНаименование = ПолноеНаименование;
ФайлОбъект.Записать();
КонецЕсли;
1.3. При редактировании данных в формах, платформа 1С:Предприятие автоматически устанавливает блокировку объекта, указанного в качестве основного реквизита формы.
2. Не следует проверять блокировку объектов для редактирования в следующих случаях:
- при выполнении отдельных операций, имеющих по логике работы больший приоритет по сравнению с интерактивными действиями пользователя. Например, загрузка данных при обмене;
- при действиях, которые гарантированно выполняются в монопольном режиме. Например, в процедурах обновления и первоначального заполнения данных информационной базы.
Данные были изменены или удалены другим пользователем 1с как обойти
Описание ошибки:
Ошибка » Данные были изменены или удалены другим пользователем» может возинкать при сохранении элемента справочника или при сохранении/проведении какого либо документа.
В управляемом интерфейсе после нажатия кнопки «ОК» откроется еще окно с описанием текста ошибки: «Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!»

В базе с обычным интерфейсом ошибка может возникнут при попытке пользователя просто внести какие-то изменения в форме.

Демонстрация возникновения ошибки на практическом примере:
Если в базе 1С 8 работает несколько (два-три) пользователя, то вероятность встретить данную ошибку стремится к нулю. Если в базе работает несколько десятков пользователей, то шансы возникновения данной ошибки при работе со справочниками и документами повышаются существенно. Но не стоит паниковать при появлении данной ошибки. Она лишь говорит о том, что документ или элемент справочника уже успел изменить и сохранить другой пользователь. Пользователю, который получил такую ошибку ничего не остается, как просто закрыть форму документа или элемента справочника без сохранения внесенных изменений. Открыть форму и снова нести изменения, которые не удалось сохранить.
Рассмотрим более подробно, как развиваются события в базе, приводящие к возникновению ошибки «Данные были изменены или удалены другим пользователем». Условно пусть будет «Пользователь 1» базы и «Пользователь 2». Пользователь 1 открывает форму документа и вносит изменения. При этому Пользователь 2 так же открывает форму этого же документа и тоже вносит изменения и успевает раньше Пользователя 2 нажать кнопку сохранения или проведения документа. Все, в документе сохранились изменения, Пользователь 2 оказался быстрее. 1С не поддерживает совместную одновременную работу в одном объекте базы (в данном примере это документ). Поэтому Пользователь 1 получит ошибку, т.к. пытался сохранить изменения уже после того, как это сделал Пользователь 2. Даже не смотря на то, что Пользователь 1 раньше открыл форму документа для редактирования.
В некоторых конфигурациях, работающих в режиме управляемого приложения разработчики постарались предусмотреть параллельный режим редактирования объектов базы пользователями.
Данные были изменены или удалены другим пользователем 1с 8.3
eva17476 20.10.2014
УСНО. Добрый день! При заполнения справочника «Организации», после введения всех данных и попытки записать и закрыть, в 1С 8.3 появляется сообщение с красным крестом: «Данные были изменены или удалены другим пользователем. Ок».
Нажимаю Ок. Справочник «Организация» не закрывается. Нажимаю «Закрыть» в правом верхнем углу, пишут «Данные были изменены. Сохранить изменения?» Выбираю Ок. «Данные были изменены или удалены др.пользователем».
Lada 20.10.2014
Добрый день!
Видела такую ошибку при работе в тонком клиенте на БУХ 3.0. Решается обновлением формы.
Блокировки MySQL: виды, проблемы и способы обнаружения

Рано или поздно любой разработчик или администратор СУБД, имеющий дело с MySQL, сталкивается с проблемой блокировок. Всё дело в природе MySQL как системы с конкурентным доступом на чтение/запись. Я расскажу о видах блокировок в MySQL, их преимуществах и недостатках, о проблемах, которые они вызывают, а также дам полезные советы по обнаружению и способам борьбы с блокировками.
Примечание: Для полного понимания статьи я очень рекомендую ознакомиться с темой транзакций и их уровнями изолированности в базах данных.
Краткая аналогия с блокировками баз данных
Представим, что вы разрабатываете программу для совместного редактирования текстовых документов, наподобие Google Docs. Вы закончили работу над первой версией и обнаружили, что ваши пользователи, работающие одновременно в программе, перетирают изменения друг друга. Вы решаете добавить в базу данных какое-нибудь булево значение is_locked, которое будет принимать значение true, если документ открыт пользователем. И если в этом случае другой пользователь попытается редактировать документ, ему придется подождать, пока первый не закончит свою работу. Такая схема будет работать, но не позволит поддерживать одновременное редактирование документа, поскольку только один пользователь сможет изменять документ в текущий момент времени.
Чтение документа, на первый взгляд, не имеет проблем. Что плохого, когда несколько пользователей читают документ? Однако что произойдет, если кто-нибудь из администраторов решит удалить документ, который открыт у пользователей? То есть даже чтение документов требует некоторых мер предосторожности.
Если представить, что набор документов — это таблица в базе данных, а каждый документ — это строка, то очень легко понять, что в базах данных присутствуют подобные проблемы. И тут мы приходим к классической задаче управления конкурентным доступом.
Конкурентный доступ и виды блокировок
Конкурентный доступ является одной из главных проблем в системах управления базами данных. Что делать, когда несколько клиентов пытаются изменить одни и те же данные? А что если один из клиентов пытается получить данные, изменяемые другим в этот же момент времени? Можно привести много подобных примеров. Для разрешения этой проблемы в MySQL используется два типа блокировок: разделяемые (shared locks) и монолитные (exclusive locks). Их ещё называют блокировками на чтение и на запись. Блокировки на чтение являются разделяемыми, или неблокирующими. Это означает, что множество клиентов может читать запись в одно и то же время. Блокировки на запись являются эксклюзивными, то есть они не дадут другим клиентам захватывать блокировки на чтение/запись, поскольку это единственный безопасный способ гарантировать наличие единственного клиента, записывающего в данный момент времени.
Табличные блокировки
MySQL использует табличные блокировки для подсистем хранения MyISAM, MEMORY, MERGE, но вы можете явно заблокировать таблицу в любой подсистеме хранения командой LOCK TABLES, о которой мы поговорим ниже.
Табличная блокировка аналогична примеру выше. Когда клиент хочет записать что-нибудь в таблицу, он захватывает монолитную блокировку (exclusive lock) ко всей таблице. Остальные клиенты должны дождаться снятия блокировки. Если в текущий момент нет клиентов, которые изменяют данные, то все клиенты, читающие их, захватывают разделяемую блокировку (shared lock), которая не будет конфликтовать с другими блокировками на чтение.
Сервер MySQL содержит две очереди табличных блокировок, называемые read lock queue (очередь блокировок на чтение) и write lock queue (очередь блокировок на запись). Очередь блокировок на запись имеет приоритет перед очередью блокировок на чтение, то есть, если очередь блокировок на запись не пуста, то сервер MySQL будет освобождать её, пока она не опустеет, и только потом приступит к очереди блокировок на чтение. Это поведение можно изменить, запустив сервер MySQL с флагом —low-priority-updates, тогда очередь блокировок на чтение получит более высокий приоритет.
Проанализировать конкуренцию за блокировку таблиц можно командой
SHOW STATUS LIKE ‘Table%’.
