Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Блокировка блокирует, хотя не должна 2 страниц V   1 2 >          
Vofka Подменю пользователя
сообщение 27.04.12, 13:17
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13962
Из: Киев
Спасибо сказали: 4524 раз
Рейтинг: 3647.7

Есть документ с ТЧ "Материалы", в которой содержатся Номенклатура, Количество, Цена и Сумма. В обработке проведения есть такой код:

ТЧ = Материалы.Выгрузить();
Блокировка = Новый БлокировкаДанных;
НовыйОбъектБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиМатериалов");
НовыйОбъектБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
НовыйОбъектБлокировки.ИсточникДанных = ТЧ;
НовыйОбъектБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");        
Блокировка.Заблокировать();


Сам регистр ОстаткиМатериалов имеет измерения Номенклатура, ОтвественныйСотрудник и ресурсы Количество, Сумма.

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

Кто-то может в курсе почему один документ блокирует второй?

logist Подменю пользователя
сообщение 27.04.12, 13:46
Сообщение #2

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

А если режим блокировки "Разделяемый"?


Signature
Личные бесплатные консультации не даю, для этого есть форум!

Vofka Подменю пользователя
сообщение 27.04.12, 14:02
Сообщение #3

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13962
Из: Киев
Спасибо сказали: 4524 раз
Рейтинг: 3647.7

С разделяемым то же самое.

ЗЫ. Платформа, кстати, 8.2.14.537.

Ardi Подменю пользователя
сообщение 27.04.12, 14:05
Сообщение #4

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

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


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Vofka Подменю пользователя
сообщение 27.04.12, 14:36
Сообщение #5

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13962
Из: Киев
Спасибо сказали: 4524 раз
Рейтинг: 3647.7

Цитата(Ardi @ 27.04.12, 15:05) *
Оно пишет какую именно таблицу не может заблокировать?

Да
Цитата
Не удалось заблокировать таблицу '_Document15'.

Я не проверял, что это за таблица, но почему-то мне кажется, что это таблица проводимого документа.

Ardi Подменю пользователя
сообщение 27.04.12, 14:56
Сообщение #6

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

Что за задержка в сеансе?
Наверно правильней в документах по 10 тыс. строк сделать?


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Batchir Подменю пользователя
сообщение 27.04.12, 15:09
Сообщение #7

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1427 раз
Рейтинг: 0

Ну так Вы ж блокируете "РегистрНакопления.ОстаткиМатериалов", а ругается на таблицу документов.
Попробуйте в момент блокировки провести другой документ, который двигает по этому регистру, подозреваю что проблем не будет.

Сообщение отредактировал Batchir - 27.04.12, 15:11

Ardi Подменю пользователя
сообщение 27.04.12, 15:47
Сообщение #8

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

Цитата(Batchir @ 27.04.12, 16:09) *
Ну так Вы ж блокируете

Ну так всё остальное что нужно тоже блокируется. Только в автоматическом режиме. И таблицы целиком.
И в момент постановки на паузу таблица документов уже почему-то перешла в режим блокировки.
ИМХО.

Сообщение отредактировал Ardi - 27.04.12, 15:47


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Batchir Подменю пользователя
сообщение 27.04.12, 16:05
Сообщение #9

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1427 раз
Рейтинг: 0

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

ИМХО скорее всего идет следующая последовательность
1. Начало общей транзакции перед записью и проведением документа.
2. Запись документа. В этот момент таблица блокируется, т.к. именно в момент записи появляется инфо о том что изменились данные.
3. Проведение документа. В этот момент таблица документов блокирована, разблокируется после завершения/отмены транзакции.
4. Окончание общей транзакции после записи и проведения документа. Таблица документов разблокирована.

если на этапе после 2 и перед 4 поставить паузу, то в этот период таблица документа заблокирована, т.к. были её изменения в транзакции
и любая попытка изменить в ней данные приведет к сообщению о блокировке.

Сообщение отредактировал Batchir - 27.04.12, 16:07

Ardi Подменю пользователя
сообщение 27.04.12, 16:09
Сообщение #10

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

Запись документа и проведение - разные транзакции. ИМХО.
Иначе одновременное проведение не существовало бы.

Сообщение отредактировал Ardi - 27.04.12, 16:11


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

alex040269 Подменю пользователя
сообщение 27.04.12, 16:09
Сообщение #11

Крутой
Иконка группы
Группа: Местный
Сообщений: 1626
Из: Гуляйполе
Спасибо сказали: 236 раз
Рейтинг: 0

А без блокировки блокирует? Может еще где-то блокировка вкоде имеется или режим автоматический???


Signature
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
ЗиУП

Batchir Подменю пользователя
сообщение 27.04.12, 16:17
Сообщение #12

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1427 раз
Рейтинг: 0

Цитата(Ardi @ 27.04.12, 17:09) *
Запись документа и проведение - разные транзакции. ИМХО.

Да?
НачатьТранзакцию();
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
ЗафиксироватьТранзакцию();


А нажать кнопку нового документа "ОК" (запись с проведением) документ запишется если есть ошибки при проведении?
Нет. А событие ПриЗаписи вызывается и в этот момент идет запись документа в таблицу и таблица блокируется, но в событии ОбработкаПроведения идет откат. Как оказывается не записанным документ если запись и проведение не выполняются в единой транзакции? ХЗ, может я чего то не так говорю.

alex040269 Подменю пользователя
сообщение 27.04.12, 16:24
Сообщение #13

Крутой
Иконка группы
Группа: Местный
Сообщений: 1626
Из: Гуляйполе
Спасибо сказали: 236 раз
Рейтинг: 0

Цитата(Batchir @ 27.04.12, 17:17) *
А событие ПриЗаписи вызывается и в этот момент идет запись документа в таблицу


ПередЗаписью()

Запись документ

ПриЗаписи()

.....

Завершение транзакции



Signature
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
ЗиУП

Ardi Подменю пользователя
сообщение 27.04.12, 16:27
Сообщение #14

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

Batchir
Это не та транзакция.


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Batchir Подменю пользователя
сообщение 28.04.12, 7:28
Сообщение #15

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1427 раз
Рейтинг: 0

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

Последовательность действий, приводящая к взаимной блокировке:

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

Сообщение отредактировал Batchir - 28.04.12, 7:33

alex040269 Подменю пользователя
сообщение 28.04.12, 9:30
Сообщение #16

Крутой
Иконка группы
Группа: Местный
Сообщений: 1626
Из: Гуляйполе
Спасибо сказали: 236 раз
Рейтинг: 0

Цитата(Batchir @ 28.04.12, 8:28) *
Транзакция Т1 записывает документ в таблицу документов, устанавливая эксклюзивную блокировку.
Транзакция Т2 пытается записать документ и обновить записи в таблице. При этом она пытается установить эксклюзивную блокировку, но ей это не удается, т.к. на таблицу уже установлена эксклюзивная блокировка транзакцией Т1.
Транзакция Т2 ожидает, когда транзакция Т1 закончится и снимет установленную блокировку. Только после этого она может быть выполнена.

Все это логично, НО 1с зачем-то сделали управляемые блокировки и управлять блокировками таблиц документов НЕЛЬЗЯ!
Да и блокироваться таблица документов должна вся только при добавлении НОВОГО документа, при изменении документа должна блокироваться только соответствующая запись. (во всяком случае так было еще в КДИППЕРЕ).


Signature
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
ЗиУП

Batchir Подменю пользователя
сообщение 28.04.12, 9:55
Сообщение #17

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1427 раз
Рейтинг: 0

Выдержка с ИТС:
Цитата
...
При разработке (или доработке) системы следует всегда использовать сформулированное выше правило: блокировка в транзакции должна изначально осуществляться с максимально необходимым уровнем изоляции. Это позволит полностью исключить возникновение таких взаимоблокировок в системе.

Типичной ошибкой в коде конфигурации, которая может приводить к возникновению взаимоблокировок данного вида, является неблокирующее чтение и последующая запись в рамках одной транзакции:
1. Автоматический режим:
а. Чтение без опции "ДЛЯ ИЗМЕНЕНИЯ" и последующая запись.
б. Чтение в объектной технике и последующая запись.
2. Управляемый режим:
Чтение без установки блокировки (либо с установкой разделяемой блокировки) и последующая запись.

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

Спасибо сказали: alex040269, logist,

alex040269 Подменю пользователя
сообщение 28.04.12, 15:06
Сообщение #18

Крутой
Иконка группы
Группа: Местный
Сообщений: 1626
Из: Гуляйполе
Спасибо сказали: 236 раз
Рейтинг: 0

Vofka , огласите решение, пожалста.


Signature
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
ЗиУП

Vofka Подменю пользователя
сообщение 28.04.12, 15:15
Сообщение #19

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13962
Из: Киев
Спасибо сказали: 4524 раз
Рейтинг: 3647.7

alex040269, решения пока нету.

Но я забыл про один очень важный момент: я провожу эксперименты на файловой базе. Почему-то думаю, что на SQL оно себя будет вести по другому. О результатах отпишу (скорей всего после праздников).

Сообщение отредактировал Vofka - 28.04.12, 15:15

alex040269 Подменю пользователя
сообщение 28.04.12, 15:36
Сообщение #20

Крутой
Иконка группы
Группа: Местный
Сообщений: 1626
Из: Гуляйполе
Спасибо сказали: 236 раз
Рейтинг: 0

На файловой в любом случае блокируется ВСЯ таблица.


Signature
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
ЗиУП

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


2 страниц V   1 2 >
Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 24.06.24, 10:45
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!