gifts2017

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

Опубликовал Ольга Ашлапова (aosolya) в раздел Программирование - Практика программирования

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

Самый первый шаг, который нужно сделать это перевести саму конфигурацию на автоматический и управляемый режим.

2 шаг: Тот документ который хотим перевести в управляемый режим, в свойствах на вкладке прочее, тоже переводим в режим: Управляемый

3 шаг: Открываем модуль объекта этого документа, и в обработке проведения пишем блокировки. Хорошо рассказано про блокировки вот здесь: http://1cexpo.ru/informacziya/27-blokirovki-dannyx-v-1spredpriyatii-8.html, если вы сними еще не ознакомились.

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

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

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

 

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

 

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

2. После того, как вы заблокировали нужные вам регистры накопления, вам нужно все регистры к которым идет обращение, или просто они хотябы упоминаются в этом модуле, их ВСЕ нужно (также в их свойствах, на вкладке прочее) перевести в управляемый режим, я еще раз повторюсь ВСЕ РЕГИСТРЫ (накопления, сведения), не важно блокировали вы их или нет!

Очень часто вываливается ошибка о менеджере блокировок и что-то там о невозможности использовать автоматический режим(к сожалению не сделала скриншот в свое время), это происходит вызов исключительной ситуации, когда главный документ по которому делается проведение, в управляемом режиме, а ему "подчиненный" остался в автоматическом, об этом написано в той статье на которую я дала ссылку. Иногда ошибки показывают на общий модуль, это тоже означает(как было в моем случае), что просто это функция вызывается оттуда, а там что-нибудь прописано о каком-нибудь регистреСведения например, или делается запрос из него, а этот регистр остался в автоматическом режиме, поэтоому просмотрите все внимательно, потому что эти внутренние транзакции бывают очень коварны)))

После того как вы все это сделали, тестируйте свою работу).Как то так я победила свою маленькую задачу с блокировками, я надеюсь,что кто-нибудь здесь найдет для себя что-то полезное) Если статья оказалась не бесполезной с вас плюсик))

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Доржи Балбаров (Angeros) 29.10.12 10:58
Вообще то первоисточник инфы по 1с блокировкам находиться тут: http://kb.1c.ru/
Остальное в целом пере посты...
2. Николай Зайков (Mortiferus) 17.07.13 13:12
Лучше все-таки в качестве источника данных передавать не саму табличную часть, а результат запроса. При проведении документа это будет шустрее работать.
3. Николай Зайков (Mortiferus) 17.07.13 13:22
И еще интересно, что заблокирует такая конструкция:
ЭБТовВП.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
ЭБТовВП.ИспользоватьИзИсточникаДанных("СкладКомпании", "СкладКомпании"); ?
Судя по кавычкам 2-го параметра во второй строке, используется реквизит табличной части СкладКомпании, а не реквизит шапки документа. Т.е. заблокируются все записи где встречаются и номенклатура из списка номенклатуры и склад из списка складов?
4. ZLENKO.PRO (ZLENKO) 12.08.13 16:55
5. Игорь Дзеса (Kamikadze) 23.11.16 21:50
А зачем переводить на управляемые блокировки все регистры регистратора?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа