#0
by Sun_Storm
Добрый день! Есть такая проблема в УПП: При перепроведении документов "Перемещение товаров" и "Реализация товаров и услуг" происходят взаимоблокировки. В процессе расследования было выяснено, что взаимоблокировки возникают на регистре ПартииТоваровНаСкладах при чтении остатков. У регистра включено разделение итогов. Первая блокировка регистра ставится в момент удаления старых движений (удалять движения автоматически выключено). После этого, видимо, в момент чтения остатков блокировка хочет захватить таблицу остатков, часть которой уже может быть захвачена. Редакция УПП: 1.3.62.1 переписанная. Механизм типовой. По идее, если после записи идет чтение, то для набора записей нужно ставить свойство БлокироватьДляИзменения, но при удалении движений оно не ставиться. Либо убрать у регистра свойство Разделение итогов. Однако смущает то, что такая проблема есть в типовом механизме. Сталкивался ли кто-нибудь с такой проблемой? Если да, то как лучше решать? Может я чего-нибудь не учел и в УПП есть какая-то настройка на этот счет?
#1
by NcSteel
ну так двигай партии отдельно, зачем самой реализаций списывать и расчитывать партии. А вообще Рауз форева
#3
by Sun_Storm
Был выбран именно онлайн расчет партий, ещё до меня, сейчас так работает. Тем более что механизм типовой. Да, это ещё один вариант исправить ситуацию. Сейчас базы под рукой нет, однако если там идет рассчет остатков, то управляемая блокировка все же должна быть до чтения остатков. Однако даже если она есть, то все равно при удалении движений будет блокировка СУБД части записей таблицы итогов (до удаления движения там никаких блокировок точно не ставится). Так что если только ставить управляемую блокировку ещё до удаления движений. Получается, что сначала идет удаление движений - запись, потом чтение остатков, потом запись уже нового набора. А когда идет сначала запись, потом чтение, можно вроде как использовать свойство БлокироватьДляИзменения (если, конечно, проблема в блокировке именно по разделителю). Кстати, между двумя документами ПеремещениеТоваров тоже идет такая взаимоблокировка. Они там все используют одни и те же процедуры для удаления движений и для чтения остатков. Есть у кого-нибудь УПП с онлайн расчетом партий и типовым перемещением? Если открыть две сессии и поперепроводить там перемещения взаимоблокировки есть? Возможно есть какие-то галки, которые можно проставить и все будет работать, а я просто о них не знаю. А так завтра попробую сначала поставить БлокироватьДляИзменения в истину/убрать разделитель и протестировать, если не получится, тогда буду писать управляемые.
#4
by РазДва
очевидных проблем в типовой нет со взаимоблокировками, проблема может быть в том план запроса блокирует больший диапазон, чем номенклатура, которая в документе. Характеристики используются?
#7
by Sun_Storm
В общем, основная проблема не в отсутствие упр. блокировок (хотя, конечно, блокировки надо будет поставить), а в не оптимальном запросе. Итоговый запрос, который блокирует регистр при проверке остатков такой: КОНЕЦ) И (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад)
#9
by Sun_Storm
Его план получается вот такой (не знаю, как тут отформатируется): Rows Executes StmtText StmtId NodeId Parent PhysicalOp LogicalOp Argument DefinedValues EstimateRows EstimateIO EstimateCPU AvgRowSize TotalSubtreeCost OutputList Warnings Type Parallel EstimateExecutions
#10
by NcSteel
+ Так же естественно при проверке остатков и записи может блокироваться большой диапозон запией который приводит к эскалации. Так что лучшим решением это отложенное проведение по партиям.
#13
by Sun_Storm
Старый я что-то не сохранил, это при помещении во временную таблицу партии товаров на складах, там из-за условия по ИЛИ план возвращает 56000 записей для физ таблицы партий.
#16
by Sun_Storm
Блокировки-то есть, но вот только перед удалением движений никаких блокировок не ставится, а сам факт удаления движений порождает Х-блокировку СУБД. по небольшому набору. А потом при проверке остатков из-за запроса ещё проставляется S-блокировка на больший диапазон.
#19
by Sun_Storm
Ну так в том месте где нужно, управляемых блокировок нет. А я сказал только о блокировках СУБД. После исправления запроса риск взаимоблокировки все равно останется.
#20
by NcSteel
Блокировки есть, так где они нужны они установлены. При записи набора явно прописывать блокировки не нужно. Еще раз, тебя не смущает эскалация? Так что решение тут дано не раз
#21
by Sun_Storm
Эскалация? Конечно я её исправлю. Я просто говорю, что взаимоблокировки все равно будут. Гораздо реже (может даже не встретятся), но будут.
#24
by Sun_Storm
Решение у меня есть. Я просто отписываюсь, в чем в итоге была проблема и как её буду исправлять.
#25
by Sun_Storm
Почему ты считаешь, что при записи набора не надо прописывать блокировки? Ведь при контроле остатков, даже если убрать эскалацию, все равно будет блокироваться больший диапазон, чем блокируется при удалении движений? По крайней мере у меня после того, как я убрал условие по ИЛИ в параметрах вирт таблицы (ну ещё вынес подзапросы во временные на всякий случай) все равно выбиралось около 400 записей в процессе работы плана запроса.
#28
by Sun_Storm
Возможно, действительно, после исправления запроса будут выбираться только записи по набору измерений в наборе и тогда останется только поставить флаг БлокироватьДляИзменения при записи набора (разделение включено) и не ставить управляемые блокировки. Надо смотреть...
#29
by Sun_Storm
Только этого может быть недостаточно. Например, если мы в проведенном документе добавили строку, а потом нажали перепровести, то у нас: Удаляются движения - блокировка набора без новой строки. Запрос остатка - Блокировка всех записей с новой строкой. Результат предсказуем.
#31
by Sun_Storm
Пока результат такой - после оптимизации запроса взаимоблокировки остались. После детального изучения выяснилось, что 56000 строк после выполнения Clustered index seek - это если не использовать индекс ни по складу, ни по номенклатуре. После оптимизации запроса - 400 строк это без использования индекса по номенклатуре. Посмотрел, какие там вообще индексы есть. Оказалось, по номенклатуре вообще индекса нет. Номенклатура стоит первым измерением, но для регистров накопления это не важно. Снял замок с номенклатуры и проиндексировал. Сейчас протестировал - взаимоблокировок не тех документах, на которых раньше были сейчас нет. Это с учетом нового запроса и прописанных мною блокировок. Завтра уберу управляемые блокировки, оставлю только флаг БлокироватьДляИзменения на будущее и снова протестирую.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
- V7: Запрос реквизита документа из справочника партий в регистре партий
- УПП/Бух НИОКР. Как это сделать в УПП?
- из УПП в УПП
- УПП Можно ли в Упп посмотреть проводки по группе док-в?
- v7: v8: УПП. как начислять в УПП налог?
- УПП Попыталься в упп залить данные по ОКОФ с ИТС диска xml файл...
- Не заполняется измерения в регистре партий. (УТ 10.3)
- УПП 1.2 ---> УПП 1.3
- УПП перенос данных из 1С 7.7 в УПП 8 1.3
В этой группе 1С
- (1С PUT) Загрузка на яндекс диск командой PUT из 1С
- Произвольная цена в заказе покупателя 1С УТ для Украины
- БП 3.0 КОРП. Не закрывается 90-й счет.
- Библиотека подключаемого оборудования для мобильных приложений
- Печать 2 экземпляров на одной странице. БП30
- v7: В текстовом комментарии обнаружен недопустимый знак.
- При выводе из 1с в WORD поля заполнения выделены жирным шрифтом.
- УТ 11. Не печатается торг-12
- v7: AddIn.XMLParser вылетает 1С
- Восстановить базу SQLite (журнал регистрации)
- БП 3.0 Реализация отгруженных товаров курс валюты
- Реверс строки в 1С
- БСП 2.3.1.84 - при внедрении ошибки прут
- Не попадает корректировочный счет-фактура в книгу покупок (БП 3.0)
- УТ 10.3 Очень медленный запуск после перезагрузки
- УСО 2.0 или 1.3?
- СтрРазделить: почему функция с указанным именем не определена?
- Печать документов IrfanView
- Бухгалтерия Предприятия 3.0 Замена и объединение элементов
- 1C ERP:Разделить зарплату и страховые взносы в отчете