Простое программное решение проблем с блокировками SQL

Описание одного из способов программного решения проблемы блокировок при проведении документов в клиент-серверной 1С.

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

Решение для случая блокировок по номенклатуре:

1. Добавить новый служебный регистр сведений "БлокировкаПроведенияДокументов". Он не будет содержать данных и необходим только как объект наложения управляемой блокировки. Добавить полные права на этот регистр в общедоступную роль.

2. В начало процедуры "ПриЗаписи" модуля проблемного документа добавить код:

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

//Исходный текст
//...
КонецПроцедуры

При возникновении блокировок по полям другого типа, необходимо в регистр "БлокировкаПроведенияДокументов" добавить новое измерение соответствующего типа и в процедуре "ПриЗаписи" указать соответствующий источник данных для элемента блокировки.

Всем удачи!

38 Comments

  1. Dream_kz
  2. capitan

    А как получалась блокировка по номенклатуре при проведении документов, что то пишете в справочник номенклатуры ?

    Reply
  3. capitan

    (1)Раздвоение личности в интернете это когда с одного своего аккаунта препираешься в комментариях с другим своим аккаунтом

    )

    По моему там тоже удивлялись такому костылю.

    Возможно конечно и толковому, но в статье нет всех исходных данных чтобы это осознать.

    Reply
  4. capitan

    На первый взгляд у вас получалась взаимоблокировка из-за повышения уровня изоляции транзакции и вы ее прикрыли костылем уведя в таймаут на блокировках.

    Reply
  5. dmitrydemenew

    (4)Свой старый аккаунт удалил. По поводу костыля — не соглашусь. Решение необычное — да, но очень простое и результативное. В большей степени адресовано программистам 1С, предпочитающим решать проблемы производительности простой и быстрой корректировкой программного кода 1С. Я не пытаюсь приуменьшить заслуги администраторов, производящих тонкие настройки оборудования или программистов, которые находят и оптимизируют проблемные области кода — у меня у самого в этой области немалый опыт. Но и не вижу причин, чтобы не использовать простые и результативные решения существенно упрощающие жизнь нашим многострадальным пользователям 1С.

    Reply
  6. capitan

    (5)Я к тому что у вас можно найти место как раз в коде и поставить такую же исключительную блокировку на номенклатуру но без регистра

    Да в принципе можно и не искать а в этом же самом месте поставить блокировку на справочник номенклатуры

    И будет то же самое

    Reply
  7. dmitrydemenew

    Если Вам известно более простое рабочее и проверенное решение — я, как и многие наши коллеги, буду рад его узнать. Поделитесь :). Только без философии и предположений — решение, проверенное в реальных боевых условиях и полностью исключающее ошибки любых блокировок, включая взаимные.

    Reply
  8. YPermitin

    (0) Забавное решение. Но я бы в продакшн не стал бы такое кидать.

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

    Плюс это явно искуственное узкое место в системе. Возможно стоит посмотреть в сторону формирования движений в фоне. А если нужно контролиовать остатки по номенклатуре, то посмотреть в сторону резервирования и использовать этот регистр для блокировки.

    Вообщем, решение выглядит как временный костыль 🙂

    Reply
  9. dmitrydemenew

    (8)Как бы мы это лекарство не обозвали, костылем ли, или по-другому — оно лекарство.

    Условия работы предприятия на котором это протестировано:

    — Круглосуточный режим работы: производство, торговля;

    — Размер свернутой рабочей БД — более 400ГБ;

    — Средний поток документов движения товаров — более 20 документов в минуту.

    — Высокий уровень контроля на уровне программы: обязательный контроль остатков, качества и пр.

    — Высокая частота повторений номенклатурных позиций в документах товародвижения;

    — Пересечение 3-х высоконагруженных участков:

    1. Центр приема заказов — резервирование товаров;

    2. Участок производства(уровень автоматизации цехов на базе 1С более 80%) — выпуск продукции, поступление на склад;

    3. Участок конвейерной сборки и комплектации на складе(20 АРМ) — перемещение, реализация товаров.

    — программные модули товародвижения предельно оптимизированы, отдел программирования 1С — 7 человек.

    До внедрения этого «костыля» была подключена система гибких блокировок от Softpoint, без нее программа не работала.

    После внедрения «костыля» программа заработала без гибких блокировок.

    Reply
  10. YPermitin

    (9) никого не хотел обидеть. Просто выглядит дейстыительно так, потому что сути проблемы не решило, а просто перевела все проблемы в ожидание общей блокировке на номенклатуре.

    P.S. Софтпоинт — настоящие профи. Плохого не посоветуют 🙂

    Reply
  11. dmitrydemenew

    Никакой обиды :). Просто многим это решение действительно может помочь — для чего, собственно и выкладывал. А клеймо «костыль» не позволяет относится к описанному решению серьезно. Основное назначение метода — исключить неконтролируемое «отваливание» рабочих сессий построением, с помощью управляемой блокировки, искусственной очереди проведения документов. Другого, более простого способа выполнить эту задачу я не нашел.

    Reply
  12. lunjio

    (11) Вы пытались исследовать суть проблемы ? я просто знаю, что некоторые программисты не брезгуют записью справочника в процедуре перед записью и другими извращениями, если вы решили проблему, конечно хорошо, но хотел бы спросить ,а исследовали ли вы суть проблемы, как-то пытались отладить понять ? Почему брезгуете комментариями к такому хитрому и сложному коду ? Я бы с удовольствием сказал спасибо, если бы вы подсказали как докопаться до истины, в таких ситуациях, а то как говорит мой начальник, про проблемный и запутанный во всех смыслах код — туда пришел один программист плюнул, второй, а потом ещё и ты нагадил.

    Reply
  13. dmitrydemenew

    Эти 16 строк типового кода не кажутся мне хитрыми и сложными. По- этому, с моей точки зрения, они не требуют особых комментариев. О том, как работает механизм управляемых блокировок написано множество статей. Переносить эту информацию в зону этой публикации я не считаю необходимым. Данная публикация- это не попытка ког то в чем то убедить. Это просто описание очень простого метода, который может реализовать любой программист 1С в любой конфигурации.

    Reply
  14. user803967

    (13), Если описываете метод то будьте добры опишите проблему(а не ее проявление)у и причины по которым проблема решена именно так. Иначе публикация вырождена — это мое мнение, не хочу обидеть вас этими словами.

    Если нет понимания причин, нет рассуждения автора то материал который вы предоставили нужен только для галочки, т.к. большая часть читающих сходу не поймет всех нюансов и переключиться на публикации, которые раскрывают суть проблемы.

    А насчет решения — сложную систему не всегда можно починить простым методом

    Решение в лоб может принести проблему, но затянутую во времени. т.е. это не решение а оттягивание.

    Reply
  15. dmitrydemenew

    Эта публикация предназначена исключительно специалистам, у которых есть реальные проблемы при работе 1С, вызванные SQL блокировками и которые понимают, что такое блокировки SQL, чем они вызваны и каковы последствия их возникновения. Если у Вас нет подобных проблем — просто пропустите эту публикацию, она не для вас. Я не хочу устраивать из публикации обучающий курс — нет у меня ни желания, ни времени. По-этому в одном я с Вами полностью согласен: та «часть читающих», которая «сходу не поймет всех нюансов» должна

    «переключиться на публикации, которые раскрывают суть проблемы». Ну а после этого — добро пожаловать!

    Reply
  16. a.doroshkevich

    В конфигурации установлен Автоматический режим блокировкой данных?

    Reply
  17. dmitrydemenew

    режим блокировкой данных — Управляемый

    Reply
  18. acsent

    скриншот ошибки вообще от 7.7

    Reply
  19. dmitrydemenew

    (18)Спасибо, скриншот исправил. Давно не видел это сообщение, забыл как выглядит. 🙂

    Reply
  20. ELInfinito

    Интересное решение. )

    Хорошо, что в свое время, когда на заре разбирания с упр. блокировками такое не придумал, а сделал все по «фен-шую».

    В сертификации на профа по тех. вопросам есть такое выражение, как «заметание грязи под ковер».

    Так вот мне думается, что это подобное решение.

    Узкие места в системе никуда не делись, просто добавили некую упреждающую блокировку.

    Это решение ВОЗМОЖНО (!) имеет право на существование, когда идет более детальный разбор, а это времянка, но оставлять такое в продакшене….я бы своих порешил )

    Reply
  21. acanta

    В вышивании крестиком нитки мулине дорогие (а церковное золотое шитье еще дороже).

    Поэтому во времена крепостного права ценились крестьянки, которые тратят минимум материала на изнанку и максимум на рисунок изделия. Есть такой шов «козлик». Простите за офф.

    Reply
  22. dmitrydemenew

    У меня к этому противоположное отношение. Очень жаль, что когда-то пытался решить проблему по феншую, потратив кучу времени, нервов и средств на приобретение «правильных» помощников и программных средств. И наоборот, очень благодарен специалистам своего отдела — решение было найдено коллективно.

    Reply
  23. lunjio

    (13)

    Ну талмуты расписывать никто не просит, можно было и просто пару комментариев. Такое ощущение вы не вникали в суть этих блокировок, тыкнули пальцем и попали, а теперь хотите поделиться решением, вместо того чтобы отловить реальную проблему. Как именно ваше решение помогает избежать конфликта блокировок можете сказать ?Накладывает их заранее ? Можете сказать одну из вероятных причин ваших блокировок ? Может не это ваше решение решило проблемы, иногда события просто совпадают, допустим кто-то ошибку исправляет или оптимизирует код, приблизительно в это же время и вы накидали это. Раз вы скрин копировали откуда-то, то возникает вопрос — были взаимоблокировки или блокировки ?

    Reply
  24. ELInfinito

    (22) Все решается «штатными» средствами.

    ЦУП + ТЖ + профайлер.

    Пробовали в демо-режиме PerfMonitor от Софтпоинта — интересная программка, но каких конских денег она стоит, это вообще нечто и эти деньги надо платить каждый год…послали лесом. Это единственное стороннее ПО, которое пробовали ради интереса.

    Это решение имеет эффект бомбы замедленного действия, ИМХО. Можно говнокодить и вроде как все хорошо…но нет.

    Чисто ИМХО. Я б не стал.

    Reply
  25. sergathome

    (6)

    Да в принципе можно и не искать а в этом же самом месте поставить блокировку на справочник номенклатуры

    И будет то же самое

    О!

    Reply
  26. dmitrydemenew

    Из множества решений любой задачи есть одно самое простое, и именно оно — лучшее. Иногда очень полезно взглянуть за границы своего туннеля восприятия реальности, возможно, это лучшее решение находится именно там. Пока что нет ни одного обоснованного ответа, почему предложенное решение недопустимо, кроме того, что оно не по «фен-шую». У меня, как у специалиста, нет цели задобрить богов 1С, моя главная цель — чтобы пользователи программ, которые я поддерживаю, были максимально удовлетворены работой этих программ.

    Reply
  27. sergathome

    (25) Решение, конечно, допустимо, но, например (6) вам правильно указал — бритвой Оккама вас папа пользоваться не научил. Так и бреетесь топором 🙂

    Регистр — лишний объект. Блокируйте элементы несущего справочника.

    Reply
  28. sergathome

    (24) все эти шаманские бубны и волшебные палочки хороши в фильмах про гарри поттеров (в маркетинге, ага), однако их волшебство может обернуться против хозяина, это факт. Причём сразу и неожиданно.

    Reply
  29. a.doroshkevich

    Ну и без описание проблемы крайне сложно оценить решение.

    Если исходить из крайне скупого описания в публикации и комментариях, то такое решение вообще не имеет права на существование.

    Проблема не решена 100%. Блокировки ушли, если ушли, совершенно по другой причине.

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

    Ещё раз повторюсь — без описание проблемы крайне сложно оценить решение…

    Без обид.

    Reply
  30. Sloth

    Интересны такие моменты:

    1. Действительно ли проблема на блокировках СУБД?

    2. Если действительно на СУБД, то как до этого дело дошло при управляемом режиме?

    3. Если проблема не на уровне СУБД, то от чего нельзя было решить имеющимся средствами, без создания «вспомогательного» элемента?

    4. Каким вообще образом было выяснено, что всему виной номенклатура?

    Reply
  31. Vyatcheslav

    Соглашусь со всеми коллегами комментаторами. Не понятно, в чем была причина проблем. Отсюда не понятно, что конкретно этот костыль исправляет и в каких случаях. Платформа 8.2 это жирный минус, она же не живет с 2015-ого, у всех давно 8.3, насколько этот костыль актуален для 8.3 и при каких обстоятельствах? Зачем создавать отдельный регистр, почему не накладывать упр.блокировки на существующие данные?

    Reply
  32. dmitrydemenew

    Что ж, повторюсь: основное назначение метода — исключить неконтролируемое «отваливание» рабочих сессий построением, с помощью управляемой блокировки, искусственной очереди проведения документов. Другого, более простого способа выполнить эту задачу я не нашел.

    Причины возникновения проблем с блокировками конкретном частном случае:

    1.Необратимое изменение типовой УПП в процессе перехода с 1С V77 на 82, связанное с переносом множества алгоритмов из V7 и серьезной доработкой конфигурации в течение многих лет разными специалистами. Глобальная автоматизация производственных процессов на базе этой конфигурации.

    2.Одновременное проведение любых из 7 видов документов по 5 основным регистрам остатков в произвольной последовательности.

    3.Высокий поток документов движения товаров — более 20 документов в минуту.

    4.Присутствие нескольких номенклатур, присутствующих в большинстве документов — как следствие частые конфликты при попытке изменения итогов регистров.

    5.Регистры, в которые записываются движения, имеют большой размер — десятки миллионов строк и более.

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

    Почему используется пустой служебный регистр? — потому, что наложить управляемую блокировку на 1 пустой регистр, более оптимально и безопасно, чем накладывать управляемые блокировки на 5 основных регистров хранения данных с миллионами записей.

    Почему не используется разделение итогов и режим версионирования MS SQL? — по причине условия обязательного и строгого контроля остатков по сложным алгоритмам.

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

    Без всяких сомнений, данная проблема может быть решена глобальным перестроением алгоритмов работы программы с переводом ее на новую платформу 1С (минимум год на разработку, установку, заполнение данными, переписывание сотни производственных и торговых отчетов, создание и настройку новой схемы обменов — в системе более 40 связанных информационных баз), специалисты по администрированию предложат немало проектов по замене и настройке оборудования. В принципе, можно найти массу решений стоимостью в миллионы или, что более вероятно, в десятки миллионов. Вот только зачем, если проблема решается практически бесплатно за 5 минут с помощью 16 строк абсолютно типового кода?

    Reply
  33. sp18s

    Автор молодец! Решил свою проблему и поделился решением с другим. Как бы оно правильно не называлось, это всё равно «решение проблемы здесь и сейчас». Удачи 🙂

    Reply
  34. user612295_death4321

    (9) А почему не взлетела если не секрет?

    В свое время когда то давно размышлял о покупке этой системы, но в конце концов перевел базу на управляемые блокировки, включил снапшоты, оптимизировал узкие места и про блокировки забыл.

    Reply
  35. СергейК

    Подскажите, правильно я думаю. При высокой повторяемости товаров в документах данная доработка превращается в механизм «одиночного» проведения документов (в один момент может проводится только один документ).

    Т.е. в условиях автора его можно заменить блокировкой одного предопределенного элемента справочника без потери производительности?

    Блокировать элементы справочника номенклатура наверное можно как предлагали, но тогда редактировать сам справочник станет затруднительно.

    В тему управляемых блокировок может кто знает. Как влияет режим совместимости + версия платформы на производительность: имеется сильно переписанная УТ 8.0 в режиме совместимости 8.2 и платформа 8.3.11. Есть ли смысл увеличивать релиз платформы вместо переработки конфигурации для повышения версии режима совместимости?

    Reply
  36. Rustig

    (24) вы не решаете проблему, вы показываете «путь», который для многих недоступен: ЦУП+ТЖ+профайлер.

    Большинство обходится без них. Я думаю, такие и придумывают простые решения, вроде представленной в публикации.

    Чтобы вы делали без ЦУПа, оставшись один-на-один с базой?

    Reply
  37. ELInfinito

    (36) Есть ТЖ, мне бы его хватило.

    Большинство проблем решается визуальным анализом кода.

    Но, бывают ситуации, когда визуальный анализ не помогает, для это есть вышеназванные инструменты.

    Так вот, что касается недоступности пути….это больше похоже на нежелание разбираться в инструментах.

    Кому он недоступен и по каким причинам ?

    А они видятся следующие:

    1. Просто тупая лень, когда чел ходит на работу протирать штаны и получать ЗП.

    2. На предприятии не могут дать доступ к оснастке сервера и все что у тебя есть — это конфигуратор. Такое часто бывает на предприятиях оборонного значения.

    3. Программист пока не знает об инструментах. Есть у меня такой знакомый, в глубинке на заводе работает. Я ему скилл прокачал.

    Reply
  38. Rustig

    может быть, а может и нет

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *