Тимак
17.10.11
✎
16:47
Не удалось заблокировать запись. Действие (изменение, удаление или блокировка записи) не выполнено.
Ошибка блокировки объекта. Объект уже заблокирован: компьютер RB_Barysheva, пользователь: Барышева, сеанс: 7610, начат 12,10,2011 в 8.25.15, приложение: Толстый клиент!
Привет всем. Объясните пожалуйста, что это такое и возможна ли эта ошибка изза сети?
Jstunner
17.10.11
✎
16:48
наверняка
Тимак
17.10.11
✎
16:49
Этот толстый клиент появился когда базу 1сник перевел на скэль.
Александр_
Тверь
17.10.11
✎
16:50
(0) а что не понятно написано?
Некто пытается произвести действия с объектом, но данный объект уже заблокирован другим пользователем. Это тоже самое, что вы решили покататься на машине, а на ней уже уехала жена.
Тимак
17.10.11
✎
16:52
Мне просто не понятно, что с этой бедой делать.
Александр_
Тверь
17.10.11
✎
16:53
(4) если коротко и по делу — ничего.
Ну или позвать специалиста.
hhhh
17.10.11
✎
16:54
(4) найти компьютер Барышевой и выкинуть в окно.
Тимак
17.10.11
✎
16:54
Сервер — свитч — пользователи
Свитч заменили, кабели переобжали, сетевухи даже на некоторых компах поменяли
Maxus43
17.10.11
✎
16:55
просто в данный момент юзер Барышева что то делает с тем объектом… нашли толстого клиента то этого?)
Александр_
Тверь
17.10.11
✎
16:56
(7) ваше заявление вызывает как минимум улыбку.
ошибка в (0) НИКАКОГО отношения к свитчам, кабелям и сетевухам не имеет.
Вообще ваш пост похож на провакацию.
Тимак
17.10.11
✎
16:56
не нашли.
Maxus43
17.10.11
✎
16:57
открываем консоль, убиваем сессию этого юзера. всё.
Maxus43
17.10.11
✎
16:57
* консоль 1с
Тимак
17.10.11
✎
16:58
(11) убиваем, но потом опять появляется
Александр_
Тверь
17.10.11
✎
16:58
(10)
я предлагаю вам натуральный эксперемент!
возьмите двух юзеров, возьмите листок бумажки и ручку (ручка и есть тот самый объект) и попросите юзеров ОДНОВРЕМЕННО написать что-нибудь на листочке и посмотрите что получится. Это суть проблемы.
Конкретно сейчас — найдите пользователя «Барышева» и закройте ему программу.
Александр_
Тверь
17.10.11
✎
16:59
(13) ну тогда перегрузите сервер предприятия, для вас это будет проще всего
Тимак
17.10.11
✎
16:59
(9)если к этим вещам эта ошибка не имеет никакого отношения, то к чему имеет.
Александр_
Тверь
17.10.11
✎
16:59
(16) см (3) и (14)
Тимак
17.10.11
✎
17:00
и сервер перезагружали и закрывали пользователей у которых появляется данная ошибка, но тем не менее каждый день на протяжении недели это происходит!
Александр_
Тверь
17.10.11
✎
17:01
(18) ну это и будет происходить. Вобщем-то это «нормальная» ситуация, при кривых руках
Александр_
Тверь
17.10.11
✎
17:01
прочитайте на тему SQL блокировки
Maxus43
17.10.11
✎
17:01
(18) просто юзер барышева заходи в какойнить справочник, меняет там букву, не записывает и не закрывает элемент и уходит по своим делам пить чай и делать маникюр, в итоге все курят
Тимак
17.10.11
✎
17:04
Я понимаю что это за ошибка, как от нее избавиться
Тимак
17.10.11
✎
17:06
Если это в сети, то будем мы искать проблему в сети, если в 1с то нужно сказать 1снику пусть чето там делает.
hhhh
17.10.11
✎
17:08
убрать Барышеву из списка пользователей, чтобы она не могла войти в программу.
Maxus43
17.10.11
✎
17:08
в юзере проблема, не закрывает свои изменения, видимо лень.
хотя конечно может и сессия зависать, это уже может и от сети, если глючит
Тимак
17.10.11
✎
17:09
да не только барышева, почти у всех такая ерунда выскакивает переодически
hhhh
17.10.11
✎
17:09
в общем, вызывайте 1сника.
Maxus43
17.10.11
✎
17:10
пакеты не теряются в сети? ну и в антивирус всё что связано с 1с как исключение впихать
Тимак
17.10.11
✎
17:11
(27) 1сник кричит это изза сетки
(28) пинг хороший
Maxus43
17.10.11
✎
17:14
антивирус на серваке процессы rphost мониторит?
Тимак
17.10.11
✎
17:15
(30)нет
Maxus43
17.10.11
✎
17:16
вместе с 1сником медитируйте, чо ещё сказать…
Тимак
17.10.11
✎
17:17
(32) видимо предется.
Александр_
Тверь
17.10.11
✎
18:09
(28) объясни мне, как потеря пакетов может быть связана с блокировками в БД? Вдруг я чего не знаю.
apokrit
17.10.11
✎
18:15
(34) К блокировкам БД сабж никакого отношения не имеет.
(0) Возможно код кривой в форме — где-то циклическая ссылка висит.
Александр_
Тверь
18.10.11
✎
07:54
(35) Это был сарказм.
Не удалось заблокировать запись. |
Я |
Тимак
17.10.11 — 16:47
Не удалось заблокировать запись. Действие (изменение, удаление или блокировка записи) не выполнено.
Ошибка блокировки объекта. Объект уже заблокирован: компьютер RB_Barysheva, пользователь: Барышева, сеанс: 7610, начат 12,10,2011 в 8.25.15, приложение: Толстый клиент!
Привет всем. Объясните пожалуйста, что это такое и возможна ли эта ошибка изза сети?
Jstunner
1 — 17.10.11 — 16:48
наверняка
Тимак
2 — 17.10.11 — 16:49
Этот толстый клиент появился когда базу 1сник перевел на скэль.
Александр_Тверь
3 — 17.10.11 — 16:50
(0) а что не понятно написано?
Некто пытается произвести действия с объектом, но данный объект уже заблокирован другим пользователем. Это тоже самое, что вы решили покататься на машине, а на ней уже уехала жена.
Тимак
4 — 17.10.11 — 16:52
Мне просто не понятно, что с этой бедой делать.
Александр_Тверь
5 — 17.10.11 — 16:53
(4) если коротко и по делу — ничего.
Ну или позвать специалиста.
hhhh
6 — 17.10.11 — 16:54
(4) найти компьютер Барышевой и выкинуть в окно.
Тимак
7 — 17.10.11 — 16:54
Сервер — свитч — пользователи
Свитч заменили, кабели переобжали, сетевухи даже на некоторых компах поменяли
Maxus43
8 — 17.10.11 — 16:55
просто в данный момент юзер Барышева что то делает с тем объектом… нашли толстого клиента то этого?)
Александр_Тверь
9 — 17.10.11 — 16:56
(7) ваше заявление вызывает как минимум улыбку.
ошибка в (0) НИКАКОГО отношения к свитчам, кабелям и сетевухам не имеет.
Вообще ваш пост похож на провакацию.
Тимак
10 — 17.10.11 — 16:56
не нашли.
Maxus43
11 — 17.10.11 — 16:57
открываем консоль, убиваем сессию этого юзера. всё.
Maxus43
12 — 17.10.11 — 16:57
* консоль 1с
Тимак
13 — 17.10.11 — 16:58
(11) убиваем, но потом опять появляется
Александр_Тверь
14 — 17.10.11 — 16:58
(10)
я предлагаю вам натуральный эксперемент!
возьмите двух юзеров, возьмите листок бумажки и ручку (ручка и есть тот самый объект) и попросите юзеров ОДНОВРЕМЕННО написать что-нибудь на листочке и посмотрите что получится. Это суть проблемы.
Конкретно сейчас — найдите пользователя «Барышева» и закройте ему программу.
Александр_Тверь
15 — 17.10.11 — 16:59
(13) ну тогда перегрузите сервер предприятия, для вас это будет проще всего
Тимак
16 — 17.10.11 — 16:59
(9)если к этим вещам эта ошибка не имеет никакого отношения, то к чему имеет.
Александр_Тверь
17 — 17.10.11 — 16:59
(16) см (3) и (14)
Тимак
18 — 17.10.11 — 17:00
и сервер перезагружали и закрывали пользователей у которых появляется данная ошибка, но тем не менее каждый день на протяжении недели это происходит!
Александр_Тверь
19 — 17.10.11 — 17:01
(18) ну это и будет происходить. Вобщем-то это «нормальная» ситуация, при кривых руках
Александр_Тверь
20 — 17.10.11 — 17:01
прочитайте на тему SQL блокировки
Maxus43
21 — 17.10.11 — 17:01
(18) просто юзер барышева заходи в какойнить справочник, меняет там букву, не записывает и не закрывает элемент и уходит по своим делам пить чай и делать маникюр, в итоге все курят
Тимак
22 — 17.10.11 — 17:04
Я понимаю что это за ошибка, как от нее избавиться
Тимак
23 — 17.10.11 — 17:06
Если это в сети, то будем мы искать проблему в сети, если в 1с то нужно сказать 1снику пусть чето там делает.
hhhh
24 — 17.10.11 — 17:08
убрать Барышеву из списка пользователей, чтобы она не могла войти в программу.
Maxus43
25 — 17.10.11 — 17:08
в юзере проблема, не закрывает свои изменения, видимо лень.
хотя конечно может и сессия зависать, это уже может и от сети, если глючит
Тимак
26 — 17.10.11 — 17:09
да не только барышева, почти у всех такая ерунда выскакивает переодически
hhhh
27 — 17.10.11 — 17:09
в общем, вызывайте 1сника.
Maxus43
28 — 17.10.11 — 17:10
пакеты не теряются в сети? ну и в антивирус всё что связано с 1с как исключение впихать
Тимак
29 — 17.10.11 — 17:11
(27) 1сник кричит это изза сетки
(28) пинг хороший
Maxus43
30 — 17.10.11 — 17:14
антивирус на серваке процессы rphost мониторит?
Тимак
31 — 17.10.11 — 17:15
(30)нет
Maxus43
32 — 17.10.11 — 17:16
вместе с 1сником медитируйте, чо ещё сказать…
Тимак
33 — 17.10.11 — 17:17
(32) видимо предется.
Александр_Тверь
34 — 17.10.11 — 18:09
(28) объясни мне, как потеря пакетов может быть связана с блокировками в БД? Вдруг я чего не знаю.
apokrit
35 — 17.10.11 — 18:15
(34) К блокировкам БД сабж никакого отношения не имеет.
(0) Возможно код кривой в форме — где-то циклическая ссылка висит.
Александр_Тверь
36 — 18.10.11 — 07:54
(35) Это был сарказм.
Ошибка при повторном обмене РИБ
Автор PavelBaryshev, 24 мар 2011, 06:47
0 Пользователей и 1 гость просматривают эту тему.
Добрый день, подскажите что за ошибка и как от нее избавится, настроен РИБ Управление торговлей 10.3, обмен выгружает в локальный каталог. При повторном выполнении обмена выскакивает такая ошибка:
Ошибка при записи изменений при обмене: Ошибка при вызове метода контекста (НачатьЗапись): Не удалось заблокировать запись. Действие (изменение, удаление или блокировка записи) не выполнено.
Запись заблокирована пользователем 'Программист 1С', с компьютера 'PROGRAMMIST_1C', из приложения '1С:Предприятие', соединение '15'.
Запись изменений текущей информационной базы в файл обмена завершилась с ошибками!
База у меня на SQL, и вот такая вот беда, а ошибка вылетает вот в этой строке
Если ЭтоРИБ Тогда
// Создаем новое сообщение
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
[color=black]ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);[/color]
// для РИБ изменения в информационной базе
ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, СтруктураНастроекОбменаДанными.КоличествоЭлементовВТранзакцииНаВыгрузкуДанных);
// Завершаем запись сообщения
ЗаписьСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();
СтруктураНастроекОбменаДанными.РезультатЗаписиДанных = Истина;
Иначе
ЭтотУзелОбмена = ПолучитьТекущийУзелИБ(УзелОбмена).ПолучитьОбъект();
глТекущийУзел = ПолучитьТекущийУзелИБ(УзелОбмена).ПолучитьОбъект();
// план обмена самостоятельно читает изменения от узла
СтруктураНастроекОбменаДанными.РезультатЗаписиДанных = ЭтотУзелОбмена.ВыгрузитьИзмененияДанныхДляУзла(УзелОбмена,
СтруктураНастроекОбменаДанными.КоличествоЭлементовВТранзакцииНаВыгрузкуДанных, ЗаписьXML);
КонецЕсли;
в общем модуле «ПроцедурыОбменаДанными» в «Процедура ЗаписатьСообщенияСИзмененеиямиДляУзла(СтруктураНастроекОбменаДанными, Знач ИмяФайлаОбменаДанными)»
Тоже столкнулся с данной проблемой. Перезапуск 1С помог.
Подвисшие сеансы пользователя скорее всего…. нужно перезапистить сервер 1С или сервер на котором база лежит…
Кто-нибудь знает как повторить обмен выбранными документами с 1с бухгалтерией?
Теги:
- Форум 1С
-
►
ОБЩИЙ ТЕМАТИЧЕСКИЙ ФОРУМ 1С -
►
Обмен данными -
►
Ошибка при повторном обмене РИБ
Похожие темы (5)
Поиск
0 / 0 / 0 Регистрация: 11.09.2014 Сообщений: 14 |
|
1 |
|
Блокировка документа тем же компьютером, на котором возникает ошибка блокировки01.04.2015, 08:18. Показов 3645. Ответов 9
Здравствуйте, подскажите, пожалуйста: Р.S.: зарплатная база 0 |
Модератор 3711 / 2907 / 573 Регистрация: 10.03.2011 Сообщений: 11,447 Записей в блоге: 1 |
|
01.04.2015, 12:02 |
2 |
kittybello, типовая? 0 |
0 / 0 / 0 Регистрация: 11.09.2014 Сообщений: 14 |
|
01.04.2015, 12:07 [ТС] |
3 |
конкретно єтот документ не изменялся, а так правки в конфирурации были 0 |
Модератор 3711 / 2907 / 573 Регистрация: 10.03.2011 Сообщений: 11,447 Записей в блоге: 1 |
|
01.04.2015, 13:24 |
4 |
Вариант базы какой Клиент сервер? Добавлено через 1 минуту 0 |
0 / 0 / 0 Регистрация: 11.09.2014 Сообщений: 14 |
|
01.04.2015, 13:28 [ТС] |
5 |
сейчас нет возможности посмотреть, но вы не могли бы более развернуто объяснить: что это дает? 0 |
Модератор 3711 / 2907 / 573 Регистрация: 10.03.2011 Сообщений: 11,447 Записей в блоге: 1 |
|
01.04.2015, 13:33 |
6 |
В какую сторону копать. Возможно что то работает в фоне от имени этого пользователя 0 |
0 / 0 / 0 Регистрация: 11.09.2014 Сообщений: 14 |
|
01.04.2015, 13:34 [ТС] |
7 |
клиент-сервер 0 |
841 / 604 / 211 Регистрация: 24.07.2013 Сообщений: 2,101 |
|
04.04.2015, 09:46 |
8 |
При проведнии документа «Прием на работу» изменяется справочник «Сотрудники». Возможно в этот момент принимаемый сотрудник открыт и редактируется. 0 |
0 / 0 / 0 Регистрация: 11.09.2014 Сообщений: 14 |
|
07.04.2015, 08:04 [ТС] |
9 |
да, я думала об этом, однако же в форме элемента справочника Сотрудники предусмотрено создание док Прием на работу 0 |
0 / 0 / 0 Регистрация: 11.09.2014 Сообщений: 14 |
|
09.04.2015, 10:22 [ТС] |
10 |
Действительно, после обновления при проведении кадровых док. вносятся изменения и в эл. спр. Сотрудники орг. Всем спасибо за отзывчивость) 0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
09.04.2015, 10:22 |
10 |
Добрый день,
хотела поправить докумет — а с ним не дают делать никакие действия
Пишет Не удалось заблокировать запись. Действие не выполнено. Ошибка блокировки объекта Объект уже заблокирован.Тонкий клиент
ЭТО ЧТО???? подскажиете как убрать -пожалуйста
1С:Предприятие 8.3 (8.3.4.408)
Конфигурация Бухгалтерия предприятия, редакция 3.0 (3.0.32.7)
Один и тот же документ редактируют два оператора.
Заполнить, проверить и подать уведомление о сумме налога
Да, но я одна!!! одна пргорамма, на один компьютер .
Как снять — нужно поравить документ????
ВСЕМ СПАСИБО!!, перезагрузила — ошибки ушли
При попытке изменения документа появляется сообщение Не удалось заблокировать запись…Объект уже заблокирован…сеанс такой-то дата утро. На кластере сервера нет такого сеанса, в блокировках — есть, все поля пустые кроме колонок «Блокировка» и «Заблокировано в».
обычно возникает, когда другой пользователь уже работает с документом
пользователь уже несколько раз выходил и заходил в базу, чтобы получить возможность работы со своим документом, который он заблокировал.
утром были сбои на сервере 1С у всех. Сейчас работа наладилась. Из-за одного документа одного пользователя опять прерывать работу всех не хочется. На SQL сервере убил процесс, созданный примерно в это время, не помогло. Есть какие-нибудь средства 1С или SQL для снятия такой блокировки?
Тэги:
Комментарии доступны только авторизированным пользователям
-
14.01.2020, 12:13
#1
Гость форума
Ошибки после перехода на новую платформу
Добрый день.
Имеется: WinServer 2016 Standart + Microsoft SQL Server 2008 R2, Типовые конфигурации БП 3.0 и ЗУП 3.1, платформа 8.3.13.1926.
Проблема: после установки новой платформы не важно какого релиза 8.3.14…. 8.3.15…. 8.3.16…. появляются ошибки при проведении корректировок реализации, появляются десятки, сотни фоновых заданий и соединений в кластере 1С, которые после удалению плодятся снова и снова. Ошибки такие в БД такие:
«Невосстановимая ошибка. Ошибка при выполнении запроса POST к ресурсу /e1cib/misc».
«На сервере 1С: предприятия проишла неисправимая ошибка, приложение будет закрыто»
«Не удалось заблокировать запись. Ошибка блокировки обьекта, обьект уже заблокирован пользователем Admin», — хотя я и работаю под этим пользователем, но документ не открывал, а ошибка говорит обратное.Наверное большинство релизов платформ перепробовали, и всегда глюки такие. Пришлось вернуться на платформу 8.3.13.1926, где проблем не обнаружено.
Может кто-нибудь сталкивался с подобным или есть идеи?
Спасибо.
-
16.01.2020, 12:44
#2
Пришел за помощью
Re: Ошибки после перехода на новую платформу
Та же ерунда. Такие же симптомы и ошибки. Только первую не видел, возможно просто не хватило терпения. Сервер линуксовый, постгрес. Прет какой-то сплошной select по всем базам при отсутствии подключений. Непонятная фоновая возня и процы жрутся. Остановился на 8.3.15.1830 — хоть ошибок нет . 1ч пошла вразнос. Тоже замер в недоумении.
-
16.01.2020, 16:00
#3
Гость форума
Re: Ошибки после перехода на новую платформу
Сообщение от dimbor2
Та же ерунда. Такие же симптомы и ошибки. Только первую не видел, возможно просто не хватило терпения. Сервер линуксовый, постгрес. Прет какой-то сплошной select по всем базам при отсутствии подключений. Непонятная фоновая возня и процы жрутся. Остановился на 8.3.15.1830 — хоть ошибок нет . 1ч пошла вразнос. Тоже замер в недоумении.
А вы серверный кэш 1С не чистили? Сеансовый который, хранится тут: «C:Program Files1cv8srvinforeg_1541snccntx+n» ? На одном ресурсе просто подсказали попробовать.
Версию 8.3.15.1830 кстати, как раз и не ставили. Надеюсь, что эта версия будет рабочей. Самое главное, чтобы сервер фоновыми соединениями не загружался и документы проводились, а то рабочий процесс из-за этого встает.
-
16.01.2020, 19:26
#4
Пришел за помощью
Re: Ошибки после перехода на новую платформу
Серверный кэш (и все клиентские) при смене платформы полностью чистится в обязаловку. Наступал без этого на отказ стартовать, т.ч.вошло в привычку.
1830 по совпадению (случайному ли?) указана сейчас как минимально необходимая для БП 3. Если б не эти наглые требования, обновляться бы не полезли. Работает — не трогай. Это очень хороший жизненный закон.
-
20.01.2020, 11:34
#5
Гость форума
Re: Ошибки после перехода на новую платформу
Доброго дня.
Удалось поставить новую платформу 8.3.15.1830 только после очистки серверного кэша 1с, в папке: «C:Program Files1cv8srvinforeg_1541snccntx».
Фоновой фигни и ошибок нет, вроде все отлично.
-
20.01.2020, 14:15
#6
Пришел за помощью
Re: Ошибки после перехода на новую платформу
Ну да. Мои «питомцы» тоже жаловаться перестали. Но на самом деле, говоря цинично: Хорошо ,что она и у вас на виндовсе засбоила. Глядишь, через релиз — другой они там в 1ч одумаются и починят. Чисто линуксовые глюки могут тянуться годами.
-
17.02.2020, 09:21
#7
Гость форума
Re: Ошибки после перехода на новую платформу
Я поменял платформу на сервере и клиенте, вроде перестала такая ошибка лезть.
Ошибка выполнения запроса по причине не удалось заблокировать таблицу
Ошибка конфликта блокировок — одна из распространенных ошибок, возникающих в момент одновременной записи одного видов объекта несколькими пользователями. В данном случае, где-то производится запись объекта, а мы выполняем выборку данных, заблокированных для изменения.
Куда смотреть, если конфликт блокировок не проходит?
- Бывает, в момент проведения приложение выводит модальное окно: например, «Предупреждение», до тех пор, пока это окно висит, а транзакция не зафиксирована, будет возникать ошибка блокировки. Следует проверить у всех пользователей: нет ли таких ошибок.
- Если вы программист и в процессе отладки поставили точку останова в модуле проведения, то также пока вы не продолжите код, остальные пользователи не смогут записать связанный с вашей блокировкой объект. Такие остановки на рабочих базах необходимо производить кратковременно.
- Если производится процедура закрытия месяца, расчета себестоимости, то необходимо просто подождать, ведь такие ресурсоемкие операции производтся не так часто, если это критично, то выполнять их следует в нерабочее время. Это ж относится к операциям группового перепроведения.
- Блокировки могут возникать в момент обмена между информационными базами (распределенными или при обмне торговли с бухгалтерией). Тут, следует обратить внимание принимаются ли подтверждения об отправляемых данных, возможно одни и теже данные посылаются постоянно, хотя они уже не меняются. Вариантом решения, когда данные приходят корректно — более частый обмен. Меньшие порции грузятся быстрее. Если ваши данные не пересекаются, то можно расмотреть вариант обмена в нерабочее время — в обед, ночью, утром (снижается актуальность).
- Если у вас база файловая, то такие конфликты происходят чаще, если это влияет на производительность, то следует подумать о клиент-серверном варианте
- Установленный postrgres сервер выполнял запросы значительно медленней, чем даже бесплатная экспресс версия от Microsoft, пришлось откатиться на нее обратно.
- На клиент серверной версии в консоли сервера можно посмотреть пользователя, который захватил больше всего объектов. Случается при формирование очень большой выборки 1С «зависает», пользователь закрывает 1С, но запрос продолжает свое выполнение. Удаление его из консоли гораздо быстрее решает проблему
- Файловая база в терминальном режиме работает быстрее, чем просто по сети, даже если сетка быстрая, кэширование диска выполняет свою функцию
- ssd диски ускоряют запись, если у вас не специализированный сервер с 10 Raid, а обычный диск, то переход к ssd верное решение для нагруженных систем.
- На более производительных серверах проблема возникает реже.
- Настройка ограничений на проверяемые файлы в антивирусе, может снизить нагрузку на сервер и его диск
- Использование ограничения на уровне записей, негативно сказывается на производительности, иногда из этого вытекает проблема конфликта блокировок
- Реиндексация таблиц информационной базы может исправить ошибки, влияющие на производительность
- Для более детального исследования проблемы можно использовать технологический журнал от 1С — специальный механизм, записывающий запросы и другие события в работе системы.
Единственные настоящие поэты нашего времени служат в рекламных агентствах.
При попытке изменения документа появляется сообщение Не удалось заблокировать запись…Объект уже заблокирован…сеанс такой-то дата утро. На кластере сервера нет такого сеанса, в блокировках — есть, все поля пустые кроме колонок «Блокировка» и «Заблокировано в».
обычно возникает, когда другой пользователь уже работает с документом
пользователь уже несколько раз выходил и заходил в базу, чтобы получить возможность работы со своим документом, который он заблокировал.
утром были сбои на сервере 1С у всех. Сейчас работа наладилась. Из-за одного документа одного пользователя опять прерывать работу всех не хочется. На SQL сервере убил процесс, созданный примерно в это время, не помогло. Есть какие-нибудь средства 1С или SQL для снятия такой блокировки?
Тэги:
Комментарии доступны только авторизированным пользователям
Транзакция — это неделимая, с точки зрения воздействия на базу данных, последовательность операций манипулирования данными, выполняющаяся по принципу «все или ничего», и переводящая базу данных из одного целостного состояния в другое целостное состояние.
Если по каким-либо причинам одно из действий транзакции невыполнимо или произошло какое-либо нарушение работы системы, база данных возвращается в то состояние, которое было до начала транзакции (происходит откат транзакции).
Блокировка (в общем случае) — это информация о том, что данный ресурс «захвачен» кем-то для выполнения какого-то действия.
Суть блокировки:
- запрет некоторых действий над общим ресурсом на некоторое ограниченное время.
В силу различных причин блокировки могут быть:
- необходимыми («хорошими») — благодаря им обеспечивается предсказуемость действий пользователей, целостность и непротиворечивость данных;
- избыточными («плохими»).
В системе 1С:Предприятие 8 различают:
- объектные блокировки (позволяют осуществлять конкурентный доступ пользователей к данным 1С:Предприятия в терминах объектов информационной базы, например, при интерактивной работе пользователей в формах: редактировании существующих объектов, удалении, создании новых и др.);
- транзакционные блокировки (обеспечивают конкурентный доступ к данным в целях целостности и непротиворечивости хранимых данных).
Виды блокировок объектов базы данных 1С:
- объектная пессимистическая;
- объектная оптимистическая;
Объектная пессимистическая блокировка
Пессимистическая блокировка объектов базы данных предназначена для запрета изменения данных определенного объекта другими сеансами или данным сеансом до тех пор, пока блокировка не будет снята этим объектом встроенного языка.
При этом блокировка данных для редактирования не запрещает запись заблокированных данных в других пользовательских сеансах (или в других экземплярах объекта в этом же сеансе), а лишь не позволяет нескольким объектам одновременно установить блокировку одних и тех же данных.
Пессимистическая блокировка объектов базы данных:
- используется системой 1С:Предприятие для блокировки объектов, редактируемых в форме;
- устанавливается:
- автоматически — в момент начала модификации объекта в форме, указанного в качестве основного реквизита формы (при этом если другой пользователь попытается выполнить редактирование того же объекта, ему будет выдано сообщение о том, что не удалось заблокировать объект);
- программно — метод объектов Заблокировать() или метод глобального контекста ЗаблокироватьДанныеДляРедактирования().
- снимается, когда пользователь, редактировавший объект, закроет форму объекта.
Пример
Отсюда
Войдем в информационную базу под пользователем Иванов, откроем форму элемента 1С:Предприятие 8.0. Управление торговлей справочника Номенклатура (код 12) и изменим цену продажи с 420,00 на 450,00. Не сохраняя сделанные изменения, войдем в информационную базу еще раз, но теперь под именем пользователя Петров. Откроем форму того же элемента справочника и попробуем изменить значение какого-либо реквизита. Любая попытка изменения приведет к появлению специального окна с сообщением об ошибке:
[свернуть]
Таким образом пессимистическая блокировка гарантирует, что пользователь, начав изменять данные объекта, сможет записать эти изменения в информационную базу.
Использование объектной пессимистической блокировки
Прежде чем изменять существующий объект информационной базы из кода на встроенном языке, следует предварительно его заблокировать (установить «блокировку данных для редактирования» или «объектную блокировку»), тем самым:
- убедиться, не заблокирован ли он другими объектами;
- попытаться предотвратить его изменение другими пользовательскими сеансами (или другими экземплярами объекта в этом же сеансе).
В противном случае, если при изменении и записи из встроенного языка не устанавливать блокировку объекта на время редактирования, то может возникнуть, например, ситуация, когда пользователь не сможет сохранить свои изменения, если эти же самые данные были конкурентно изменены в другом сеансе.
Примеры
Отсюда
Пример № 1.
Требуется заблокировать объект и, если это удалось, модифицировать данные. В противном случае – проинформировать пользователя об отказе в выполнении операции с помощью сообщения вида:
«Не удалось заблокировать запись. Действие (изменение, удаление или блокировка записи) не выполнено. Ошибка блокировки объекта. Объект уже заблокирован: компьютер: <имя компьютера>, пользователь: <имя пользователя>, сеанс: <номер сеанса>, начат: <дата и время>, приложение: <тип клиентского приложения>».
ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект(); // Выполнить блокировку объекта от изменения другими режимами // или пользователями; в случае блокировки — // вывести пользователю сообщение об исключении. ФайлОбъект.Заблокировать(); // Затем изменить и записать объект ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка(); ФайлОбъект.Записать(); |
Аналогичным образом, можно воспользоваться методом глобального контекста ЗаблокироватьДанныеДляРедактирования:
ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект(); // Выполнить блокировку объекта от изменения другими режимами // или пользователями; в случае блокировки — // вывести пользователю сообщение об исключении. ЗаблокироватьДанныеДляРедактирования(ДанныеФайла.Ссылка); // Затем изменить и записать объект ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка(); ФайлОбъект.Записать(); |
Пример № 2.
Требуется пропустить обработку объекта, если он заблокирован для редактирования. При очередном вызове процедуры (например, из фонового или регламентного задания) будет предпринята повторная попытка изменения объекта.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Объект = ТекущаяВерсия.ПолучитьОбъект(); // Выполнить блокировку объекта от изменения другими режимами // или пользователями УстановитьПолноеНаименование = Истина; Попытка ФайлОбъект.Заблокировать(); Исключение // в случае блокировки — не выполнять изменение объекта УстановитьПолноеНаименование = Ложь; // записать предупреждение в журнал регистрации ЗаписьЖурналаРегистрации(НСтр(«ru = ‘Фоновое обновление имен файлов'», Метаданные.ОсновнойЯзык.КодЯзыка), УровеньЖурналаРегистрации.Предупреждение,, ФайлОбъект, ОписаниеОшибки()); КонецПопытки; // Пропустить обработку объекта, если он заблокирован. Если УстановитьПолноеНаименование Тогда Объект.ПолноеНаименование = ПолноеНаименование; Объект.Записать(); КонецЕсли; |
[свернуть]
Не следует проверять блокировку объектов для редактирования в следующих случаях:
- при выполнении отдельных операций, имеющих по логике работы больший приоритет по сравнению с интерактивными действиями пользователя (например, загрузка данных при обмене);
- при действиях, которые гарантированно выполняются в монопольном режиме (например, в процедурах обновления и первоначального заполнения данных информационной базы).
Для снятия пессимистической блокировки разработчик может использовать метод объекта Разблокировать(), причем использовать его для того же самого экземпляра объекта, для которого ранее была установлена блокировка.
ВАЖНО! Объектные блокировки не влияют на операции над данными и на процесс течения транзакций (они расположены на другом уровне работы с данными):
- если блокировка объекта вызвала исключение, то оно может быть обработано разработчиком конфигурации и не приведет к обязательному откату транзакции;
- блокировки объектов, установленные в течение транзакции, сохраняются при фиксации транзакции и снимаются при откате транзакции.
Объектная оптимистическая блокировка
Оптимистическая блокировка запрещает запись объекта в базу данных, если после считывания объекта он был изменен в базе данных другими сеансами или другими программными объектами этого же сеанса.
Таким образом оптимистическая блокировка гарантирует, что пользователь изменяет актуальные данные объекта, которые хранятся в информационной базе, а не какой-то их предыдущий вариант.
Фактически, оптимистическая блокировка представляет собой проверку, которая выполняется перед записью объекта в базу данных. Эта проверка построена на анализе номера версии объекта, хранящейся в базе данных и номера версии, помещенной в память компьютера в момент считывания данных из информационной базы. Если при записи объекта номера его версий отличаются, то будет выдано предупреждение о том, что версия объекта изменилась или он был удален, то есть сработает оптимистическая блокировка.
Примеры
Отсюда
Рассмотрим пример. Откроем два сеанса работы с прилагаемой к работе информационной базой: один под пользователем Иванов, а другой — под пользователем Петров. В обоих сеансах откроем откроем форму элемента Управление торговлей справочника Номенклатура (код 12). Теперь в сеансе, открытом от имени пользователя Иванов, изменим цену продажи с 420,00 на 450,00 и запишем сделанные изменения. После этого, в сеансе, открытом от имени пользователя Петров попробуем изменить значение какого-либо реквизита. Любая попытка изменения приведет к появлению другого окна с сообщением об ошибке:
[свернуть]
Механизм транзакционных блокировок
Возможные проблемы при многопользовательском доступе к одним и тем же данным
Подробнее…
Работа в многопользовательской среде требует соблюдения определенного компромисса между требованиями предсказуемости, целостности и непротиворечивости данных информационной базы и требованиями параллельности работы.
Как известно, при одновременном чтении и изменении одних и тех же данных конкурирующими транзакциями могут возникнуть следующие проблемы одновременного доступа:
- Проблема потерянного изменения (англ. The Lost Update Problem) — если две транзакции изменяют одни и те же данные, взяв в качестве первоисточника начальное значение этих данных, то в системе останутся изменения внесенные той транзакцией, которая записала свои изменения последней, поскольку эти изменения заменят собой все изменения, внесенные до этого. Вывод:
- нельзя одновременно изменять одни и те же данные.
- Проблема «грязного» чтения (англ. The Uncommitted Dependency Problem) — если одна транзакция начнет считывать некоторые данные не дождавшись окончания внесения изменений, вносимых в эти данные другой транзакцией, то достаточно вероятен случай, когда прочитанные данные будут содержать неверную информацию. Вывод:
- нельзя читать уже измененные, но еще не записанные данные.
- Проблема неповторяемого чтения (англ. The Inconsistent Analysis Problem) — если одна транзакция несколько раз считывает одни и те же данные, а вторая — вносит изменения в эти данные между циклами чтения данных первой транзакции, то при повторном считывании первая транзакция может получить другой набор данных. Вывод:
- нельзя повторно читать измененные и записанные данные, если эти же самые данные уже были прочитаны до внесения в них изменений.
- Проблема чтения фантомов (англ. The Phantom Read Problem) — если первая транзакция считывает данные и потом на их основе осуществляет определенные действия, а вторая транзакция в этот момент добавляет в эти данные новую информацию, то как и в предыдущем случае это может привести к некорректному результату. Вывод:
- нельзя вводить новые данные (удалить имеющиеся), если они могут попасть в уже один раз прочитанные данные при повторном чтении.
Строго говоря, список вышеперечисленных проблем не является окончательным.
[свернуть]
Уровни изоляции транзакций
Уровни изоляции транзакций в современных СУБД являются механизмом гибкой настройки ограничений, позволяющих:
- допустить параллельное выполнение транзакций ради увеличения производительности системы;
- обеспечить необходимую степень целостности данных (ограничить параллельность транзакций при работе с одними ресурсами).
Например, 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С:Предприятием уровня изоляции транзакций и определяется внутренними механизмами самой СУБД (например, 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С:Предприятия конфликт управляемых блокировок не обнаруживается, то запрос передается далее, на исполнение СУБД;
- СУБД использует собственный механизм блокировок для определения конфликтующих транзакций, но уже с более низким уровнем изоляции транзакций, чем в режиме автоматических блокировок.
Установка режима управления блокировками для объектов конфигурации
В структуре объектов конфигурации существует несколько возможностей для задания режима управления блокировками:
- через свойство «Режим управления блокировкой данных» в палитре свойств конфигурации и(или) объекта;
- установка управляемых блокировок средствами встроенного языка.
Установка режима управления блокировками через свойство «Режим управления блокировкой данных» в палитре свойств конфигурации или объекта
- режим Автоматический — используются автоматические блокировки, устанавливаемые СУБД. Собственный менеджер блокировок 1C:Предприятия не задействован.
- режим Управляемый — система всегда самостоятельно устанавливает необходимые управляемые блокировки, обрабатываемые собственным менеджером транзакционных блокировок (независимо от того, какие режимы управления блокировками установлены для конкретных объектов конфигурации). Этот режим предназначен для работы всей конфигурации только с управляемыми блокировками в транзакции.
- режим Автоматический и управляемый — для конкретного объекта конфигурации режим блокировки будет определяться значением свойства Режим управления блокировкой данных самого объекта конфигурации. Этот режим предназначен для постепенного или частичного перевода конфигурации в режим управляемых блокировок. Он позволяет отдельным объектам метаданных работать с управляемыми блокировками (например, наиболее «проблемным» документам и регистрам), в то время как остальные объекты работают в режиме автоматических блокировок.
Сочетания режимов управления блокировками в транзакции в режиме Автоматический и управляемый:
Режим существующей транзакции | Режим начинаемой транзакции | Результат |
---|---|---|
Автоматический | Автоматический | Начинаемая транзакция будет выполнена в автоматическом режиме |
Управляемый | Управляемый | Начинаемая транзакция будет выполнена в управляемом режиме |
Автоматический | Управляемый | Начинаемая транзакция будет выполнена в автоматическом режиме |
Управляемый | Автоматический | Будет вызвана исключительная ситуация |
Особенности режимов управления блокировками для документов
Транзакция, единая для пользователя может представлять собой несколько транзакций с точки зрения платформы.
Интерактивное проведение документа по регистру делает две транзакции:
- запись самого документа;
- внутри этой записи (транзакции) запись набора строк по регистру.
В зависимости от режима управления блокировками для самого документа и двигаемого им регистра, возможны четыре ситуации:
- Режим документа Автоматический, режим регистра Автоматический -> запись по регистру в автоматическом режиме
- Режим документа Управляемый, режим регистра Управляемый-> запись по регистру в управляемом режиме
- Режим документа Автоматический, режим регистра Управляемый -> запись по регистру в автоматическом режиме
- Режим документа Управляемый, режим регистра Автоматический -> исключительная ситуация (ошибка)
[свернуть]
Если, например, стоит задача повысить параллельность работы при проведении отдельного документа, не переводя при этом всю конфигурацию в управляемый режим, то последовательность действий должна быть следующей:
- свойство конфигурации Режим управления блокировкой данных необходимо установить в значение Автоматический и управляемый;
- свойство Режим управления блокировкой данных объекта метаданных документ необходимо установить в значение Управляемый;
- у всех регистров, по которым данный документ выполняет движения, следует установить свойство Режим управления блокировкой данных в значение Управляемый;
- проанализировать процедуру проведения документа на предмет наличия:
- явных вызовов транзакций
- неявных вызовов транзакций, которые выполняются системой при модификации данных каких-либо объектов конфигурации
- для найденных явных и неявных вызовов транзакций обеспечить их выполнение в управляемом режиме
- для явных вызовов — параметр метода НачатьТранзакцию();
- для неявных вызовов — свойство Режим управления блокировкой данных модифицируемого объекта конфигурации;
- в теле процедуры проведения документа установить необходимые управляемые блокировки.
Установка управляемых блокировок средствами встроенного языка
Средствами встроенного языка установка управляемых блокировок внутри явной или скрытой (неявной) транзакции происходит с помощью специального объекта БлокировкаДанных, который предназначен для явной блокировки данных от чтения или изменения другими сессиями.
Описание доступных свойств и методов которого можно посмотреть в синтакс-помощнике в ветви «Общие объекты» — «Управление блокировкой данных».
Новый экземпляр данного объекта может быть создан с помощью одноименного конструктора и представляет собой коллекцию элементов блокировки данных. Изначально эта коллекция пуста и задача разработчика состоит в добавлении в эту коллекцию некоторого количества элементов блокировки.
При добавлении нового элемента блокировки для него необходимо указать пространство блокировок, которое будет блокировать данный элемент. Пространства блокировок определены в платформе 1С:Предприятия 8.1 и соответствуют структуре прикладных объектов конфигурации.
Допустимы следующие имена пространств блокировок и имена полей пространств блокировок:
- для объектных данных (справочник, документ и др.) определено единственное пространство блокировки — сам объект данных;
- для необъектных данных (например, регистры) определено по два пространства блокировок, которые имеют разный логический смысл.
Перечень допустимых имен
Имя пространства блокировок | Поля пространства блокировок |
---|---|
Справочник.<имя> | Ссылка |
Документ.<имя> | Ссылка |
ПланОбмена.<имя> | Ссылка |
ПланСчетов.<имя> | Ссылка |
БизнеcПроцесс.<имя> | Ссылка |
Задача.<имя> | Ссылка |
ПланВидовРасчета.<имя> | Ссылка |
ПланВидовХарактеристик.<имя> | Ссылка |
РегистрСведений.<имя>.НаборЗаписей — только для регистра сведений, подчиненного регистратору | Регистратор |
РегистрСведений.<имя> | Период — если есть; <имя измерения> |
РегистрНакопления.<имя>.НаборЗаписей | Регистратор |
РегистрНакопления.<имя> | Период; <имя измерения> |
РегистрБухгалтерии.<имя>.НаборЗаписей | Регистратор |
РегистрБухгалтерии.<имя> | Период; <вид движения> — значение системного перечисления ВидДвиженияБухгалтерии; Счет — обязательное поле; Субконто; <вид субконто>; <имя измерения> |
РегистрРасчета.<имя>.НаборЗаписей | Регистратор |
РегистрРасчета.<имя> | ПериодРегистрации; ПериодДействия; <имя измерения> |
Перерасчет.<имя>.НаборЗаписей | ОбъектПерерасчета |
Перерасчет.<имя> | ВидРасчета |
Последовательность.<имя>.НаборЗаписей | Регистратор |
Последовательность.<имя> | <имя измерения> |
Константа.<имя> |
Пространство блокировок с суффиксом НаборЗаписей используется в тех случаях, когда необходимо заблокировать сами записи данного объекта (например, при добавлении новых записей).
Пространство блокировок без суффикса используется тогда, анализируются некоторые данные этого объекта (например, остатки регистра), или когда выполняются какие-либо операции, приводящие к изменению существующих данных объекта (например, восстановление границы последовательности).
[свернуть]
Порядок действий при установке управляемых блокировок средствами встроенного языка:
- добавить элемент блокировки, соответствующий некоторому пространству блокировок;
- установить для этого элемента режим блокировки (разделяемая или исключительная);
- определить значения полей блокировки (указать, какие же именно записи будут заблокированы — для каждого пространства блокировок в платформе определены имена полей, значения которых могут задаваться при установке тех или иных блокировок).
ВНИМАНИЕ!
Следует понимать, что, в данном случае речь не идет о реальных записях базы данных. Несмотря на то, что управляемые блокировки описываются в терминах объектов метаданных и их полей, эти блокировки никак не связаны с реальной структурой хранения данных 1С:Предприятия в СУБД. Это всего лишь записи о том, что заблокировано «нечто».
Иногда можно провести аналогию между управляемыми блокировками и реальными записями СУБД. Например, для объектных данных блокировка объекта с указанной ссылкой будет «соответствовать» блокировке всех записей, содержащих указанную ссылку, во всех таблицах этого объекта метаданных (в основной таблице и в таблицах его табличных частей).
Однако в других случаях провести такую аналогию достаточно затруднительно, да и не нужно. Например, при блокировке регистра бухгалтерии с указанием значения вида субконто, мы запрещаем другим транзакциям каким-либо образом изменять «записи» регистра бухгалтерии, у которых значение вида субконто равно указанному нами. Как при этом данное условие «проецируется» на реальную структуру данных регистра бухгалтерии — для нас совершенно не важно.
При установке новых блокировок менеджер анализирует имеющиеся блокировки. Если оказывается, что «нечто», что мы пытаемся заблокировать, уже заблокировано ранее, сравниваются режимы существующей и новой блокировок. Если режимы совместимы — новая блокировка устанавливается. Если режимы не совместимы — новая блокировка ожидает снятия существующей блокировки.
[свернуть]
Условия необходимо ставить именно на те поля, имена которых приведены в списке имен пространств блокировок. Условия могут быть заданы или на равенство значения поля какому-либо значению, или на вхождение значения поля в указанный диапазон.
Для каждого пространства блокировок количество устанавливаемых условий не ограничено.
Способы задания условий на поля пространств блокировки
Существует два способа задания условий на поля пространств блокировки:
- с помощью явного задания имени поля и его значения;
- с помощью указания источника данных, содержащего необходимые значения.
Задание условий на поля пространств блокировки с помощью явного задания имени поля и его значения
При явном задании имени поля и его значения необходимо использовать метод УстановитьЗначение() объекта ЭлементБлокировкиДанных. В этом случае имя и значение указывают в качестве параметров метода, например так, как показано в листинге 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. Пример установки условия блокировки записей с помощью источника данных
БлокировкаДанных = Новый БлокировкаДанных; // Добавить новый элемент блокировки, блокирующий «нечто» в данных регистра накопления Остатки номенклатуры ЭлементБлокировки = БлокировкаДанных.Добавить(«РегистрНакопления.ОстаткиНоменклатуры»); // Установить режим блокировки — исключительный. Другие транзакции, устанавливающие управляемые блокировки, не смогут даже начать чтение этих данных ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; // Указать, что именно мы блокируем в данных регистра Остатки номенклатуры — все «записи», у которых значение измерения Склад равно значению, содержащемуся в переменной Склад ЭлементБлокировки.УстановитьЗначение(«Склад», Склад); // Указать источник данных, который содержит данные для установки ограничений на другие поля этого элемента блокировки — в данном случае таблица значений СписокНоменклатуры ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; // Указать, что именно мы блокируем в данных регистра Остатки номенклатуры — все «записи», у которых значение измерения Склад равно значению, содержащемуся в переменной Склад, и у которых значение измерения Номенклатура равно какому-либо значению, содержащемуся в колонке Номенклатура указанного источника данных ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»); |
[свернуть]
В качестве источника данных можно указывать:
- результат запроса;
- табличную часть;
- набор записей;
- таблицу значений.
При установке соответствия полей, именами полей источника будут являться имена колонок результата запроса, имена реквизитов табличной части, имена измерений или имена колонок таблицы значений соответственно.
Объект Диапазон также может являться значением поля источника данных.
Для установки всех созданных блокировок используется метод объекта БлокировкаДанных — Заблокировать():
- Если метод выполняется внутри транзакции (явной или неявной), то блокировки устанавливаются в момент вызова метода. При окончании транзакции они будут сняты автоматически.
- Если же метод Заблокировать() выполняется вне транзакции, то блокировки установлены не будут.