Если прочитать методику перевода конфигурации на управляемые блокировки от 1С - можно там найти много всего интересного и пугающего. На самом деле всё просто: В свойствах конфигурации меняете режим блокировки данных - "Управляемый". Всё. Могу вас поздравить - вы только что перешли на управляемые блокировки. На самом деле всё несколько сложнее - но не на много.
Для начала небольшой теоретический экскурс - зачем нужны блокировки: У кого есть доступ конечно можно прочитать здесь: http://kb.1c.ru/articleView.jsp?id=30 1С озаботились написать достаточно доступную статью про блокировки данных. У кого же доступа нет в двух словах опишу для чего нужны блокировки:
Пример 1. Если после включения управляемых блокировок ничего не делать, и при этом начать параллельно проводить 2 документа (один из них ведь всё равно на долю секунды раньше), то получим приблизительно следующую картину:
Транзакция 1
Транзакция 2
Состояние остатков
Начало
|
1 шт
|
Начало
1 шт
|
|
1 шт
Чтение остатков
|
1 шт
|
Чтение остатков
1 шт
|
|
1 шт
Списание с остатков
|
0 шт
|
Списание остатков
-1 шт
Завершение
|
Завершение
Что здесь не так? Контроль остатков дал сбой. 2-ой документ успел прочитать остатки раньше, чем 1-й успел их записать. При этом увидел, что на остатках 1 штука и спокойно списал их вслед за первым. Стоит оговориться, что по факту блокировки здесь всё-таки будут. 2 документа не смогут списать остатки одновременно, это необходимо для логической целостности БД, но для решения прикладной задачи в данном примере вряд ли полезно.
Теперь постараемся исправить ситуацию - в коде проведения документа пропишем установку эксклюзивной управляемой блокировки непосредственно перед чтением остатков:
Транзакция 1
Транзакция 2
Состояние остатков
Начало
|
1 шт
|
Начало
1 шт
Блокировка
|
1 шт
Чтение остатков
|
1 шт
|
Попытка блокировки
1 шт
|
Ожидание на блокировке
1 шт
Списание с остатков
Ожидание на блокировке
0 шт
|
Ожидание на блокировке
0 шт
Завершение
Ожидание на блокировке
0 шт
Блокировка
0 шт
Чтение остатков
0 шт
|
0 шт
Отказ
0 шт
При этом 1-я транзакция блокировку успеет установить, а вторая попытается установить блокировку и будет ждать освобождения ресурса, до тех пор пока не завершится 1-я транзакиця. Стоит отметить, что блокировки действуют только до завршения транзакции, и, естественно, блокировки блокируют ресурс только для изменения из других сессий. Всё логично, но паразительно как много людей об этом не знают.
Ну теперь, когда разобрались зачем блокировки нужны остаётся только установить управляемые блокировки там где это нужно: а именно -только там где производится контроль остатков. Если у вас в базе менеджер имеет право провести документ вне зависимости от того есть товар(деньги) на остатках или нет, зачем вам тогда блокировки? Можете их просто не устанавливать, или прописать и закомментировать до лучших времён. Если же у вас производится контроль остатков то как правило это 3-4 регистра, ну максимум 10-ок. Контроль можно подвесить как в общие процедуры и функции, так и в модули набора записей РН. Код предельно простой, открываем синтаксис помошник - смотрим:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
ЭлементБлокировки.УстановитьЗначение("Качество", Справочники.Качество.НайтиПоКоду("1"));
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = ДокументОбъект.ВозвратнаяТара;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад");
Блокировка.Заблокировать();
Собственно всё сразу понятно - блокируем "товары на складх", 1 измерение становим в явном виде, значения 2-х других возьмём из источника данных - ТЧ документа.
Те кто читал книжки по 8.2 наверное помнят о "Новой логике проведения" - когда контроль остатков производится после записи движений документа. Задвались вопросом зачем это? А вот эту же табличку перерисуем так что контоль остатков и блокировка будут после записи движений:
Транзакция 1
Транзакция 2
Состояние остатков
Начало
|
1 шт
|
Начало
1 шт
|
|
1 шт
Списание с остатков
|
0 шт
|
Списание с остатков
-1 шт
Блокировка
|
-1 шт
Чтение остатков
Попытка блокировки
-1 шт
|
Ожидание на блокировке
-1 шт
|
Ожидание на блокировке
-1 шт
Завершение
Ожидание на блокировке
-1 шт
Блокировка
-1 шт
Чтение остатков
-1 шт
|
-1 шт
Отказ
0 шт
Разница с виду не значительная - прирост производительности получаем за счет того что на время списания остатков (запись их в базу, что, собственно занимает время) блокировки ещё нет. Блокировка возникает позже к концу транзакции, куда вынесен контроль отрицательных остатков, бизнес логике приложения это вполне удовлетворяет.
Зная для чего блокировки нужны можно действительно ими управлять исходя из бизнес задач которые вы решаете. СУБД разрабатываются исходя из предположения обеспечения максисальной защиты данных. В случае если вы, к примеру, осуществляете банковские транзакции блокировки должны быть везде и на максимальном уровне. Лучше заблокировать лишние записи, чем допустить противоречивость данных.
В случае же если вы продаёте булочки или шариковые ручки, на вряд ли вам нужно столь много блокировок. Браком и пересортом по человеческой вине вы теряете в сотни раз больше, чем могли бы в случае одновременного проведения двумя пользователеями двух одинаковых докуметов отгрузки.
Для варьирования между такими разными задачами в СУБД придумали уровни изоляции. Устанавливая уровень изоляции транзакций можно сказать СУБД какие блокировки накладывать в разных случаях (при записи и при чтении в транзакции) в разных случаях накладываются S (можно читать нельзя писать) или X (нельзя ни читать ни писать) блокировки.
Так в автоматическом режиме у вас почти всегда будет уровень изоляции SERIALIZABLE, который будет накладывать X блокировки где нужно и где не нужно, что будет существенно портить вам жизнь
А в управляемом у вас будет READ COMMITED, который будет накладывать и тут же снимать S блокировку при чтении, и X только при записи. Самый хитрый уровень. Быстро накладываемая S блокировка как раз позволяет проверить не наложена ли где на эти данные X блокировка, что и обеспечивает чтение только согласованных данных, как принято для данного уровня изоляции, а в случае если вы прочитали и выполнили действя, рекоммендованные в предыдущей статье, то не будет даже S блокировки при чтении, таким образом на уровне СУБД будет блокироваться только запись во время записи - что правильно и необходимо для сограсованности данных.
Как же вы поступите с управляемыми блокировками - только ваше решение. Но я бы рекоммендовал не торопиться их устанавливать. Я встречал компании в которых был автоматический режим блокировки, при этом слово "замучали блокировки" звучало даже из уст генерального директора, и при этом был отключен контроль отрицательных остатков....
Для чего нужны блокировки
Разработка - Механизмы платформы 1С
См. также
Сервисы интеграции без Шины и интеграции
Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)
Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.
13.03.2024 2693 dsdred 16
Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?
Перенос данных 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)
В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?
11.03.2024 6225 dsdred 59
Как готовить и есть массивы
Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)
Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.
24.01.2024 6107 YA_418728146 25
Планы обмена VS История данных
Перенос данных 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)
Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?
11.12.2023 7167 dsdred 36
1С-ная магия
Механизмы платформы 1С Бесплатно (free)
Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?».
06.10.2023 19285 SeiOkami 46
Дефрагментация и реиндексация после перехода на платформу 8.3.22
Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)
Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.
14.09.2023 12998 human_new 27
Валидация JSON через XDTO (включая массивы)
WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)
При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.
28.08.2023 9602 YA_418728146 6
Внешние компоненты Native API на языке Rust - Просто!
Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)
Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.
20.08.2023 6596 sebekerga 54
Дата выхода книги: ноябрь 2007.
Так что кому надо ознакомиться поближе с блокировками ищите книжку.
(1) это не копипаст.
У кого есть доступ конечно можно прочитать здесь:
минус оставил бы без зазрения совести ..
В таблице 3 1-я транзакция считала остатки ещё до фиксации изменений 2-ой транзакцией. Соответственно минуса там ещё не было... но по сути списали они уже в "-". И если бы не было блокировки обе транзакции зафиксировались бы и получился бы "-".
Имеем клиент-серверную систему и 2 запущенных клиента, оба подключены отладчиком к одному конфигуратору, в обоих открыт документ реализации всё заполнено, введено. В системе включена "новая логика проведения" и управляемые блокировки - когда остатки контролируются после проведения документа (т.е. сначала мы их пишем, потом уже проверяем на наличие отрицательных). Ставим точку останова перед процедурой наложения управляемой блокировки. Вот когда оба сеанса будут висеть на точке останова перед процедурой блокировки - снимаем остаки - там будет "-1". А потом отпускаем точку останова и смотрим как одна из транзакций "откатится", потому как будет ждать блокировку, а потом откатится, потому как получит "-1" в остатках.
Олег.
На мой взгляд, в таблице #3 представлен странный алгоритм. Цель контроля - проверить отрицательные остатки? А если начальное состояние остатков, до начала обеих транзакций, достаточно для списания, то вторая транзакция зафиксируется? И что получится на остатках?
Мне представляется ошибочным посыл, что блокировки требуются "только там где производится контроль остатков"(с) в контексте "контроль отрицательных остатков"(с).
Режим "отключен контроль отрицательных остатков"(с) не означает, что остатки могут списываться произвольным образом. Для этого существует другой режим - "вообще не вести остатки". ;-) Например, у нас включен режим "разрешить отрицательные остатки" для розничного зала. Т.е. существует такой принцип - если продавец держит в руках товар, то он имеет право его продать (пробить чек), даже если в компьютерной базе остатки на нуле. Но эти "минуса", потом, тщательно анализируются складскими работниками и службой безопасности... ;-)
На мой взгляд любое изменение данных в БД состоит из трех этапов:
1) Чтение исходных данных в оперативную память.
2) Изменение исходных данных в оперативной памяти.
3) Запись нового значения в базу данных.
И если до выполнения этой последовательности не выполнить блокировку, то результат обновления базы данных будет искажен в многопользовательском режиме.
Или я ошибаюсь? ;-)
Давайте по порядку, а то чувствую это ещё пару раз спросят :)
И самое интересное:
1) Чтение исходных данных в оперативную память.
2) Изменение исходных данных в оперативной памяти.
3) Запись нового значения в базу данных.
И если до выполнения этой последовательности не выполнить блокировку, то результат обновления базы данных будет искажен в многопользовательском режиме.
Дело в том что так и происходит, более того блокировки на уровне СУБД будут, СУБД не даст вам нарушить ссылочную целостность, т.к. используется уровень изоляции READ COMMITED. Т.е. противроречивую информацию записать не получится. Но такие блокировки логичны с точки зрения "житейской логики", что позволило мне назвать статью "убираем блокировки" 90% из них это всё-таки чтение для контроля остатков
Олег.
Чувствую у нас получится перпендикулярный разговор. ;-)
Я "не понимаю" ЭТОГО:
1) "остатки просто спсываются произвольным образом (речь не идёт о партиях)"(с)
Т.е. несколько задач могут прочесть значение остатков в память, изменить их и записать в БД случайным образом? Например, три задачи в начале собственной транзакции считывают из БД значение остатка - 3 шт. Каждая вычитает из остатка по 1 шт. Получает значение 2 шт. И по мере возможности записывает в базу значение 2 шт. А мне казалось, что после выполнения этих трех транзакций на остатках должно образоваться нулевое значение. И какое это отношение имеет к партиям? Чем партии отличаются от "просто общих" остатков на складе по конкретной позиции товара?
2) "В рознице, конечно вам блокировки не нужны если у вас файловая версия в этом случае, а если все работают в одной базе то как раз для вас"(с)
Я не понял ЧТО "как раз для" меня? У меня нет никакой файловой версии. У меня нет даже никакой 1С-ины... :-) Всё, что написано в Вашей публикации применимо к любой ИС на любой СУБД. Точнее - не применимо.
3) "СУБД не даст вам нарушить ссылочную целостность, т.к. используется уровень изоляции READ COMMITED."(с)
Поясните, пожалуйста, какое отношение имеет "ссылочная целостность" к моему примеру из пункта #1.
1) Конечно пишутся не остатки а движения. Мы в итоге знаем сколько мы хотим записать, остатки на движения никак не влияют - это общая логика 1С, вам просто нужно прочитать где-то что есть таблица итогов, есть движения, пересчет итогов и т.п. - тогда поймёте.
2) Вот не всегда... дело в том что учет остатков в 1С - это 2 таблицы остатки и движения. пишем только движения, остатки регламентно пересчитываются. Остатки к примеру, в Dynamics Ax - это индекс на таблице движений там уже могут проблемы начаться при таком отношении...
3) Нуу мне просто в голову не приходила мысль что остатки можно считать а потом записать... в принципе в теории наверное можно, какую-нить свою систему придумать на этом принципе... поэтому я и сделал вывод что вы в целом боитесь только за разрушение данных и вас успокоил :)
Олег.
1) "Я просто думал я с чуть более опытным человеком, общаюсь"(с)
Опыт бывает разный и на разных системах полученный... ;-)
2) "пишем только движения, остатки регламентно пересчитываются"(с)
Вот это и есть "опыт 1С". В "нормальных" системах разработчики понимают, что "остатки регламентно" не пересчитываются, а существуют для оперативного использования - в любой момент мгновенное получение. К примеру, почти как в "Dynamics Ax"(с).
3) "Нуу мне просто в голову не приходила мысль что остатки можно считать а потом записать"(с)
А в этом алгоритме
А в этом алгоритме
Не поверите - иначе :)))
ммм... они как бы в любой момент доступны естетсвенно. Просто есть таблица остатков - к ней досчитываются обороты. Потом регламентно пересчитываются остатки и дописываются обороты - вполне адекватное решение. Кстати именно в этом моменте я очень подозрительно смотрю именно на Dynamicx Ax. Не было ещё опыта его эксплуатации с большим количеством пользователей, но чувствую там могут быть проблемы... и ещё какие...
Олег.
Последний к Вам вопрос. ;-)
Т.е. в методе ДобавитьРасход() не выполняется обновление остатков по "принципу" трех действий из (8) сообщения?
P.S. Остатки не могут быть "в любой момент доступны"(с), если "регламентно пересчитываются"(с), т.к. доступность остатков подразумевает их актуальность сразу после воздействия на них "документом" (в терминах 1С). Это не остатки, а жесть... ;-) Раньше это называлось пакетным расчетом (обработкой). Лет, так, 40 назад... :-)
P.P.S. Кстати об "Dynamicx Ax"(с). Рекомендую посмотреть как "ведутся" остатки в других системах. В некоторых, даже, на уровне обновления (интерактивного ввода) отдельной строки "документа". И такой режим, в частности, решает проблему ожидания блокировок. Т.к. в транзакциях выполняется только необходимые действия для отдельной "хозяйственной операции"(ХО), а не для искусственного объединения ХО в документы наделяемые удивительным понятием "провести документ". ;-)
Олег.
Еще раз повторю.
Изначальный посыл Вашей статьи - ошибочен. И, естественно, дальнейшее обоснование - бессмысленны.
Блокировки нужны не "только там где производится контроль остатков"(с)
Они требуются в процессе, собственно, обновления остатков.
Т.к. во всех системах, для подобных задач, используется "принцип" трех действий из (8) сообщения. И эти блокировки следует "накладывать" даже если установлен режим "разрешить отрицательные остатки". Т.к. и отрицательные остатки должны быть верными, хотя и отрицательными. Выше по теме, я пояснил ВСЕ эти моменты.
Ставлю "минус" на публикацию, как предостережение пользователям от использования подобных методик... :-(
1) "Читать все остатки"
2) "МЕНЯЙТЕ ОСТАТКИ В ПАМЯТИ"
2) "ЗАПИСЫВАТЬ ОСТАТКИ"
И выложите на инфостат, а мы дружно на это всё посмотрим.... и откомментим конечно :))))). Сам лично "+" поставлю - чтобы подольше повисело и народ посмотрел.
Олег.
Я не вижу никакой связи между моими сообщениями в данной теме и Вашим (31) сообщением. Алгоритмы изменения "остатков" ВСЕГДА и ВЕЗДЕ делаются так, как я написал в (8) сообщении. А для уменьшения времени блокировок не следует "Читать все остатки"(с) в одной транзакции с блокировками на всё время "проведения документа". Хотя я не уверен в Вашем понимании слова - "все". Это для всех строк документа? Если так - то по этому поводу я уже написал в данной теме... Ну, естественно, если в алгоритме производится "отдельное" чтение, с блокировкой, всех остатков по строкам документа для контроля "отрицательности", а потом выполняется реальное обновление БД, - то это не продуктивно. Но, для решения подобных задач, думаю, не следует уходить в сторону "раздолбайства" в части содержания БД. А Ваша статья к этому и призывает... :-(
Еще раз. Я привел пример того, что будет с остатками при использовании Вашей методы в (12) сообщении. Это так?
Ну, тогда, я ничего не понимаю
"Read committed: ...в процессе работы одной транзакции другая может быть успешно завершена и сделанные ею изменения зафиксированы. В итоге первая транзакция будет работать с другим набором данных..."(с). Т.е., в моём примере из (12) сообщения три задачи прочли начальное значение остатков равное тройке, пока не произошло изменение этого количества из другой транзакции. И поехали вычислять остатки относительно этого количества. Для этого и требуется блокировка при чтении начальных остатков. Так?
Олег.
В процессе общения люди задают вопросы друг-другу по двум причинам:
1) Хотят понять суть обсуждения.
2) Хотят понять понимание сути собеседником.
Я Вам задаю вопросы по второй причине... ;-)
И это не "флуд", а нормальный, учтивый (уважительный) диалог с собеседником. Конечно, можно было написать, как написано в (3) сообщении и влепить "минус" на публикацию. И я не делаю подобного по отношению к Вашей "другая статья"(с), т.к. там и говорить (комментировать) нечего. :-(
А, если говорить по этой статье и Вашим пояснениям в комментариях, то - это полная пурга. Ну, например, прочтите собственную фразу: "о "Новой логике проведения" - когда контроль остатков производится после записи движений документа. "(с) и сопоставьте с Вашей трактовкой этого алгоритма таблицей #3. А какое, вообще, имеет отношение контроль остатков, если, по Вашим утверждениям: "Остатки считываются, но не меняются "(с). Т.е., по Вашему мнению, всегда просматривается всё движение каждый раз для выяснения значения остатков? А вторая таблица существует для проформы. ;-) Ну, или она существует для "регламентного" пересчета. Но тогда зачем, вообще, говорить о самом понятии "остатки" в алгоритмах "проведения документов". И не важно - отключена проверка отрицательности или она включена. Остатки, то всегда не актуальные, пока их не пересчитают "регламентной" обработкой.
Ох. И т.д. ...
А по поводу: "принято "раздолбайство" с отрицательными остатками, а в ИТ идёт "борьба с блокировками" то для нормальных людей это как-то не логично :)"(с), то, думаю, имеет смысл уточнить - кого Вы, в данном случае, называете нормальными людьми... :-)
P.S. Олег. Послушайте совет старого человека. Перечитайте, пожалуйста, свою статью и наше с Вами обсуждения. И попробуйте, изложить мою "позицию". Есть такой прием, когда собеседники не понимают друг-друга из-за того, что разговаривают о разных "вещах". Частенько это помогает избежать "мордобития"...
Вы узко мыслите, вы так и не можете понять что происходит внутри 1с. В комментариях к моей другой статье человек достаточно чётко написал как на практике происходит - если вам лень читать теорию прочитайте хотя бы что он пишет. Сама таблица остатков не меняется в 1с. Меняется таблица движений, собственно моя таблица 3 абсолютно корректна.
Олег.
Считаю Ваше (42) сообщение хамским. Мы, вроде, обсуждаем 1С и СУБД, а не узость мышления и понятливости собеседника.
Но, переходя на личности. Увы... :-(
Ваша фраза: "Сама таблица остатков не меняется в 1с."(с) - полный бред.
"Регистр накопления остатков состоит из двух таблиц: таблицы движения и таблицы итогов. В таблице движений хранятся записи, которые либо вводятся пользователем вручную, либо генерируются в процессе проведения документа или исполнения обработки. Таблица движений имеет следующую структуру: 1. Период 2. Регистратор 3. Номер строки 4. Вид движения 5. <Измерения> 6. <Ресурсы> 7. <Реквизиты> В таблице итогов хранятся остатки в разрезе всех измерений с периодичностью месяц, на начало месяца. Временной интервал, за который хранятся остатки, ограничивается установкой периода рассчитанных итогов. Период рассчитанных итогов указывается как последний день месяца, по который рассчитаны итоги. То есть если период рассчитанных итогов равен 31.07.2004, то итоги будут рассчитаны по 01.08.2004 включительно. Кроме того, в таблице итогов отдельно хранятся актуальные итоги. Таблица итогов имеет следующую структуру: 1. Период 2. <Измерения> 3. <Ресурсы> Если период рассчитанных итогов равен 31.07.2004, а самое раннее движение было сделано 02.05.2004, то итоги будут хранится за следующие периоды: 01.06.2004, 01.07.2004, 01.08.2004 и актуальные итоги."
P.S.
Относительно 1С:
а)Блокировки данных при записи выполняются на уровне СУБД (+проверяется платформой).
б)Остатки в базе считаются и пишутся на уровне платформы.
Выводы:
а) Записать неверные данные в БД вы не сможете физически, никакие блокировки тут не при чем. Если вы попробуете, например, дважды записать в регистр запись с повторяющимся набором всех измерений, то вывалится ошибка SQL нарушение уникальности индекса и ничего не выйдет. Т.е. кривые данные с точки зрения СУБД (повторяющиеся абсолютно одинаковые строки в таблице и т.п.) вы записать впринципе не сможете. Еще в платформу встроен механизм проверки корректности данных, ведь в файловом варианте она сама является сервером СУБД.
б) Если платформа что-то накосячит с записью остатков (что маловероятно, т.к. алгоритмы максимально протестированы и отптимизированыи и используются еще с 7.7 а то и раньше), то есть регламентная процедура "Пересчет итогов регистров накопления". Блокировки тут устанавливает тоже платформа и от конфигурации и типа блокировок в конфигурации абсолютно ничего не зависит.
Итог: На уровне конфигурации вы можете накладывать блокировки только на чтение данных, т.е. прочитали - заблокировали - начали что-то писать. На целостность данных это никак не влияет. Просто другая транзакция не сможет прочитать те же данные. А так как на уровне конфигурации вы пишете только движения документа, то даже без всяких блокировок остатки будут верными. Просто без блокировки во время чтения данных внутри транзакции СУБД может показать возможно неверный результат запроса, если есть незавершенные транзакции, работающие с этими данными и эти транзакции завершаться успешно. Следовательно если контроль остатков внутри транзакции не нужен, то и блокировки никуда не уперлись.
Алексей (a-novoselov).
Я с Вашими "Выводы"(с):
а) Согласен.
б) Согласен. Но, с оговоркой. Регламентные процедуры призваны обеспечивать (исправлять) актуальность и достоверность "итоговых" данных для "учетных"/"отчетных" систем. Т.е. когда "итоги" используются значительно позже совершения ХО. Например, в бухгалтерских "учетах", АвтоМехАнизированных по принципу - а потом бухгалтер (специальный оператор) берет в руки бумажный документ и "заводит" его в базу данных. И в таких "системах" не проявляется "проблема" с блокировками и/или монопольным пересчетом итогов.
А с Вашим "Итог"(с) - не могу согласиться. Т.к. если "вы пишете только движения документа"(с), то и темы для разговора не существует. Мне представляется, что разговор идет об чтении записи с целью её изменения (суть самого понятия "итоги") несколькими процессами (сессиями 1С). И в этом случае блокировка (возможно и не средствами СУБД) записи - обязательна, если есть желание получить достоверные и актуальные данные.
(81)
Олег.
Я оказался прав - для Вас "готовые системы" растут на полках магазинов. :-)
И Ваша фраза "Разработка системы это когда 10 экстра профи месяц..."(с) подтверждает мою правоту. Т.к. в "Oracle или Microsoft, ещё в SAP"(с) это делается гораздо дольше. И делается на протяжении всей жизни и развития "проекта". И важным моментом таких "проектов" является возможность расширения функционала, дабы конечному пользователю не приходилось покупать и внедрять, уже, собственную систему каждый раз как только ТЕ разработчик поймут, что они ошиблись в самом начале своего "проекта". А 1С-продуктам на это наплевать... ;-)
Что касается Вашей фразы:
"Покажите им свою разработку - они вас примут разработчиком :)."(с)
Неужели, Вы думаете, что за 38 лет общения с ЭВМ-ами, я занимался только ковырянием в 1С-е...
(84)
(cool.vlad4)
"потому как не понял (72)"(с)
Как!? Чего? Совсем? Всё? :-( :-( :-(
Если хотите, то давайте я попробую пояснить свой текст.
Видимо, я очень плохо изложил свои мыслишки...
В вашем случае при интерактивном изменении объекта будут объектные блокировки, от них отказаться никак
Вполне можно отказаться. При открытии формы документа заменять ее на форму не имеющего основного реквизита ДокументОбъект. Тогда блокировка устанавливаться не будет. Считывать в нее реквизиты объекта. При закрытии кнопкой ОК еще раз считывать изменения из БД и сравнивать изменения, внесенные пользователем с состоянием документа в БД на ммоент записи. Если данные изменения не противоречат друг другу (например один пользователи изменил цену, а второй вписал что-то в поле комментарий), то объединить эти изменения. Примерно так.
И зачем при этом обязательно открывать форму без основного реквизита? Открываете с основным, если уж все равно будете создавать в памяти новый экземпляр объекта.
Точно также как делается объединение во всяких SVN, GIT и т.п. Выдавать сообщение о том что вносимые изменения противоречат изменениям другого пользователя. Дальше пусть сам решает что делать (обычно в таких случаях пользователи созваниваются и решают чьи изменения оставить). Если поле Комментарий логически связано с ценой, то соответственно выдавать это сообщение в ситуации когда один меняет цену другой комментарий.
Вы правы в том, что здесь безусловно есть некий риск того что изменения формально не мешают друг другу, а логически не совместимы. Но это решается уже организационными мерами.
Не обязательно, просто возможный вариант решения.
(148) hogik,
Не совсем понятно, о чем речь. Если о 7.7 как платформе то вполне можно. До объема 10 пользователей/100 документов на всех в день вполне тянет в файловом варианте на терминал-сервере. А это объем работы 95% организаций использующих 1С. И всю логику, необходимую организациям ткого размера вполне можно реализовывать, не особенн задумаваясь об ограничениях платформы.
Виталий (nafa).
"А это объем работы 95% организаций использующих 1С"(с)
Я работаю в организации, которая попадает в 5%. :-)
"Не совсем понятно, о чем речь ... документов на всех ..."(с)
Речь и о платформе и о "документах". У нас не стояла задачи АвтоМехАнизировать складирование бумажных документов в "бухгалтерские" пачки. ;-)
В (68) написано
Зачем вы выложили ссылки, если там же указали что это не работает?
Данный "проект" - закрыт.
"Зачем вы выложили ссылки, если там же указали что это не работает?"(с)
На первом решении мы работали год. На втором работаем пять лет.
Первое решение "не работает" по моим оценкам и МОЕМУ понятию "работать".
Решение на CodeBase (первое), в части соблюдения ACID, работает точно так же как и решение 1С-а на MS SQL. И я считаю, что в ОБОИХ случаях это неработоспособная система.
В части надежности - это замечание не касается основного режима использования разработки, т.е. клиент-серверного режима. А про режим ПДБД (файл-серверный) написано и в первой версии описания разработки. Про его назначение и условия выполнения. На самом деле, этот режим не требуется при эксплуатации системы.
"В (68) написано"(с)
Ну, теперь мне удалось изложить своё мнение/понимание про термин "клиент-сервер" ? :-)
Вот так: "клиент-серверная СУБД"<>"SQL".
(33) я и понял потом(после прочтения той статьи) о чем речь, почему и посоветовал выражатся яснее
В таблице #3 описана последовательность действий:
Начало
Списание с остатков
Блокировка
Чтение остатков
Завершение
На самом деле рекомендовано так:
"В самом конце транзакции в явном виде записать движения по тем регистрам, которые требуют контроля остатков. Для наборов записей этих регистров следует установить опцию "БлокироватьДляИзменения" в значение ИСТИНА. ... Именно в этот момент времени будет установлена блокировка остатков регистра по данному набору значений измерений. "(с) [ссылка в конце]
Т.е. последовательность действий, примерно, вот такая:
Начало
............ (другие действия)
Блокировка
Списание с остатков
Чтение остатков (если нужен контроль "отрицательности")
Завершение
И она (блокировка) ВСЕГДА должна накладываться, т.к. служит не только для проверки остатков, но и для корректной записи движения по регистрам в части "итоговых" данных.
Повторю своё утверждение: "и отрицательные остатки должны быть верными, хотя и отрицательными"(с) И это никак не связано с тем, что "вы продаёте булочки или шариковые ручки"(с).
P.S. Очень странно, что Гилёв Вячеслав (gilv) дал положительную оценку данной "публикации", написав вот эту статью:
Олег.
Вы в своей статье написали:
"...паразительно как много людей об этом не знают."(с)
Представьте себе, что я отношусь к этим МНОГИМ. :-)
Далее, Вы даёте "ценную" рекомендацию:
"установить управляемые блокировки там где это нужно"(с)
В Вашем понимании это:
"только там где производится контроль остатков"(с)
Далее Вы пишете, что:
"Браком и пересортом по человеческой вине вы теряете в сотни раз больше, чем могли бы в случае одновременного проведения двумя пользователеями двух одинаковых докуметов отгрузки."(с)
Из этой фразы, лично я, делаю однозначный вывод: на остатках будут получаться произвольные числа. Пытаюсь, разобраться. Смотрю таблицу #3. Вызывает удивление. Спрашиваю. Получаю от Вас ответ:
"остатки просто спсываются произвольным образом (речь не идёт о партиях)"(с)
Пытаюсь дальше спрашивать. И получаю от Вас информацию:
"Остатки считываются, но не меняются "(с).
Но, тогда, зачем говорить о блокировках, если ничего не меняется.
Дык, может меняется? ;-)
А теперь ВНИМАТЕЛЬНО читаем (53) сообщение...
P.S.
Т.е. Ваша "статья" сводится к одной "мысли":
Если блокировки "мешают" системе работать быстро, то надо убрать ВСЕ лишние блокировки. И оставить только нужные.
Думаю, об этом многие люди догадываются... :-)
Если блокировки "мешают" системе работать быстро, то надо убрать ВСЕ лишние блокировки. И оставить только нужные.
Да, только моя статья вкладывает больше смысла в понятие нужные.
С тем что технические детали понять достаточно сложно я согласен, попытался объяснить как мог; кто-то всё-таки понял, кто-то попытался разобраться и понял, кто-то попытался разобраться и не понял. Я тоже понял что мне есть над чем работать в плане ясности изложения мыслей.. :)
"мне есть над чем работать в плане ясности изложения мыслей"(с)
Олег.
Не надо над этим работать. ;-) Вы совершенно ясно (и понятно) излагаете свои мысли. Лично меня, смущает само содержание этих мыслей (не отсутствие!!!). Например, нет такого выбора "оперативность или точность"(с). Думаю, допустим выбор: "оперативность или полнота"... А всё остальное и есть - "раздолбайство" и неуважение к покупателям, складским работникам, пользователям ИС, деньгам владельца и т.д.
Но это, сугубо, моё личное "восприятие" Ваших публикаций...
Всё! Спасибо за содержательную беседу и в этой теме.
Желаю успехов в ... ;-)
По-моему заставлять пользователя по 5 раз проводить документ или ждать пару минут пока проведётся - "не уважение к пользователям, покупателям, складским работникам"
А покупка Oracle или ооочень крутого "железа" - "не уважение к деньгам владельца".
К сожалению, большинство ИТ-шников мыслит так же как вы - "ну меня учили, что транзакция и блокировка должна быть" - "в учебнике так написано". И не могут взглянуть на проблему со стороны бизнеса "а что мне дороже - блокировка, или последствия её отсутствия".
Олег.
Я с Вами полностью согласен. Перечисленные Вами явления - абсолютное неуважение! А "ИТ-шников" совершенно верно учили, "что транзакция и блокировка должна быть"(с) Но, им, видимо, забыли сказать, что время ИХ выполнения должно быть соответствующее предметной области. И для этого "ИТ-шникам" надо РАБОТАТЬ, а не перекладывать "свои проблемы" на других людей... Но в "1С-ах" работать "ИТ-шникам" придется ООО-чень много, т.к. в архитектуре этих систем наличествует "конфликт" в подходе проектирования ИС "от документа" и "запросным ЯМД". Но это другая тема...;-) И, лично мне, она не интересна, "ввиду отсутствия присутствия" ;-) продуктов 1С-а в моей деятельности. Чего и Вам желаю... :-)
[quote]Если у вас в базе менеджер имеет право провести документ вне зависимости от того есть товар(деньги) на остатках или нет, зачем вам тогда блокировки?[/quote]
на мой взгляд нуждается в уточнении
Итак ситуация:
1. Товара на складе "стратегический запас", т.е. столько, что в минус они гарантированно НИКОГДА не уходят в минус.
2. Работают 2 пользователя с полными административными правами (например главбух и финдир)
По логике статьи, блокировки не нужны.
Однако, не стоит забывать, что учет может вестить по фифо/лифо и требуется распределение по партиями. И хотя общий запас товара многократно превышает расход, но остатки по отдельным партиям то могут быть маленькие. Отсутствие блокировки приведет к двойному списанию с одной и той же партии.
А вот если списание идет "по средней" то соглашусь с автором, что вполне реально подумать об отказе от блокировок.
Я не говорю, что проблема возникает во всех ситуациях. Я говорю о том, что если нет контроля остатков это не значит что не нужны блокировки.
Относительно отдельного списания партий - да, если такая технология (партии отдельно списывать) применяется, то согласен, описанной мной проблемы нет. Но
1. Ее (раздельное списание) применяют не все, так как она решает проблему производительностив в ущерб качеству отчетов.
2. Касается только оперативного проведения.
3. Конфигурация может вообще не предусматривать отдельного регистра для партий (один регистр остатков и в нем реквизит партия или аналогичный). (Мы же не только типовые рассматриваем)
Нуу в варианте если мы используем РН "товары на складах" с измерением "серия", при этом при оперативном проведении списываем партии, то по хорошему и остатки контролировать нужно бы в разрезе партий...
Только не "серия", а "ДокументПоступления".
Разница простая.
"серия" - это то, что определяется свойствами товара конкретной серии (маркировка, дата производства, срок годности и т.п.). Она как раз в типовых имеется. При отгрузке товара в зависимости от технологии работы склада серия либо указывается в заказе и кладется соответствуюшая, либо не указывается, кладется любая, фиксируется в наборном листе, далее вводится в реализаци то что положили. В типовых это измерение как раз есть в остатках.
Данная серия определяется человеком а не компьютером и от блокировок не зависит. Контроль с блокировками нужен на этапе резервирования товара дабы не зарезервировать один и тот же товар дважды. Блокировки на этапе отпуска нужны в том случае, если товар выписывается без резервирования - т.е. сразу реализацию и товар кладовщик собирает по накладной.
"ДокументПоступления" - расчетное понятие для определения себестоимости товара, когда на складе есть товар со всеми одинаковыми характеристиками но разной себестоимостью. Тут остатки не столько контролировать надо, сколько просто правильно определять дабы не списать 2 раза с одного Документа поступления. В УТ вынесено в отдельный регистр.
А где хваленная "масштабируемость" 1С-ов? Или она заключается только в возможности перенести систему на более мощное железо? :-) Вот пример. Разработчики "1С 7.7" рекомендуют переходить с DBF-ной версии на SQL-ную при количестве пользователей около 5 человек. По моему (печальному) опыту общения с 1С-ами - всё это решается и без перехода на SQL-ную версию. И без сверток БД (полный бред!!!). Но для этого пришлось ВСЁ переделать... :-( И система обслуживает 50-75 пользователей, 11 лет, на "сервере" по уровню мощности WS. Проблем и причин для смены системы - не имеется... :-)
Проблемы 1С с жуткой нестабильностью работы... неотлаженностью и неотработанностью некоторых механизмов, отчасти это диктуется ориентацией на россиийский бизнес (возможность работы задним числом, возможность работы без контроля остатков).
То что у вас нет 1с заметно, поэтому и просил не писать постов. Некоторые "фичи" или "баги" становятся понятными только после долгой практики с ними борьбы.
Олег.
Я писал только об общих вопросах ИС. И подсовывал Вам примеры из 1С-ов... ;-)
Уверяю Вас всяких "фичей и багов" хватает в любых системах. Но, на мой взгляд дилетанта, надо стараться устранять причину, а не следствие (
P.S. Вы написали: "Ну хоть кто-то понял о чём я..."(с)
Уверяю Вас, что я с первой буквы Вашей публикации понял о ЧЕМ и ПОЧЕМУ Вы говорите. :-)
Но "понимать" и "соглашаться" - это разные явления. Не надо думать, что если собеседник понял, то сразу и согласился с позицией собеседник.
По моему (печальному) опыту общения с 1С-ами - всё это решается и без перехода на SQL-ную версию. И без сверток БД (полный бред!!!). Но для этого пришлось ВСЁ переделать... :-( И система обслуживает 50-75 пользователей
А можно поподробнее про базу 7.7 на 75 рыл и без скуля?
"А можно поподробнее про базу 7.7 на 75 рыл и без скуля?"©
Можно. ;-) Всё очень просто.
Началось всё в 2000 году с моим появлением в фирме (оптовая и розничная торговля). Две территории. На одной самопальная система "до уровня" пробивки чеков на ККМ из этой системы. На другой - "1С 7.7" на три пользователя используется для распечатки выходных документов (как текстовый редактор). Поставлена задача - сделать единую ИС. Номенклатура, к тому моменту - 35000 наименований (частично пересекающаяся). Ну, и начал делать. ;-) Увы, на 1С... :-(
Сначала отказались от регистров, "монолитного" документа, понятия проведения документов, оси времени, точки актуальности, хранения итогов НА, монопольных регламентных работ и т.д. Т.е. от 1С осталась только заставка. :-)
Далее система стала расширяться по количеству пользователей. Решили проблему 1 гигабайта на системном уровне. Решили проблему 2 гигабайт на уровне схемы базы данных и методов работы с ней. Сделали собственную распределенную БД (на уровне объектов 1С) для выделения розничного зала на отдельные "сервера" и повышения отказоустойчивости (у нас режим работы 24х7). По мере увеличения участков АвтоМехАнизации появилась тенденция к увеличению количества "серверов". А т.к. в "центральном" сервере уже работало до 30 человек, и на DBF-ах сильно страдала надежность, то поменяли "движок" на клиент-серверную СУБД. Со второй попытки ;-)
Имеем интерфейс к БД 1С-а. Пишем "автономные" задачи на Си.
Ну, вроде, и все рассказал. Последние три года ничего крупного не делаю...
P.S. Попытался рассказать кратко. Именно, в аспекте "без скуля"(с) Т.к. других деталей - масса.
"Напиши статью"(с)
А кому это может понадобится? Концептуально, нового мы ничего не сделали. Думаю, более полезным будет изучать КАК и ЧТО делается в ИХНИХ системах. Универсальные решения я "опубликовал" на данном ресурсе. Единственно, что можно было бы написать - это, примерно, о роли реляционных СУБД с запросным ЯМД в "наших" задачах. Т.к. этой темой занимаюсь очень давно. Но, я уже "проверил" интерес сообщества к этой теме, пару лет назад. Получилось угрюмо и печально. ;-) Да и написано на эту тему уже очень много и, гораздо лучше, чем я это сделаю.
Вспоминаю заминусованную тему (-5 !) что-то вроде "как я не понимаю нарастающий итог".
Основная мысль которой - "можно не так".
Кто только не пытал Владимира "Скажи как ?!!".
Ответ был только один : "не так !".
Максимум что удалось вырвать кроме длиннющих размышлизмов :
это простенький код от Владимира (перебор в цикле строк таблицы "аля клиппер 87").
После чего стало всё понятно и скучно.
Игорь.
У Вас есть риск отравиться собственным ядом. ;-)
Неужели не очевидно, что проблема, обсуждаемая в данной теме, "порождается" применением запросов и построение системы "от документа" в реляционной модели?
Для примера, у меня "движение по т.н. регистрам" и проверка "отрицательности остатков" делается вызовом одной функции примерно такого вида: R=F(Измерение1,Измерение2...,Количество,ЕдИзм)
И она выдаёт значение R - информацию об "отрицательности".
Вызывается на каждую строку "документа"(в терминах 1С-а).
И не блокирует ничего, кроме ОДНОЙ строки (хозяйственной операции) только на момент её модификации. А не всего состава "документа", т.к. и документа (как многострочного агрегата) у меня в системе нету. Замечу, как и во многих ИХНИХ системах.
А что касается Вашей фразы "Максимум что удалось вырвать"(с) - замечу, что перед этим "простеньким кодом"(с), я долго пытался повернуть Ваши мозги в "нужном" (для содержательного разговора) направлении. И получал от Вас ответ, типа "Не соглашаюсь". И как можно в таком режиме разговаривать...
P.S. Но, я помню Ваше предложение решать поиск отсутствующих номеров документов запросом, а не циклом. Было очень интересно и смешно. ;-) И все остальное Вы предлагаете делать именно таким образом. Через з...
Если бы такое делалось в "ихних" системах... мы бы наверное ещё не шагнули дальше больших ЭВМ System 360 :)
Цитата
Вызывается на каждую строку "документа"
"1С Специалист" вы бы не сдали :). Очень.. ммм... продуктивное решение, правильно, зачем заморачиваться с группой записей - можно по одной их обработать, ну чуть погоняем данные с клиента на сервер - не беда, сетевые интерфейсы быстрый, "и пусть весь мир подождёт".
Должен высказаться в защиту hogik, так как самому пришлось такое делать (резервирование по факту ввода строки в документ). Причина простая. Ситуация:
Менеджер разговаривает с клиентом по телефону, формирует заказ. Получает от клиента запрос на 100 ед товара, подтверждает, переходит к следующей позиции. Доходит до конца, начинает проводить документ и выясняется, что в это время кто-то другой провел еще заказ и товар зарезервирован другим, т.е. 100 ед нет, есть только 20. Согласитесь, что перед клиентом это выглядит очень некрасиво. Ничего не оставалось делать, как резервировать товар сразу по факту ввода строки в документ. (Можно конечно нажимать "провести" после ввода каждой новой строки, но это еще большая нагрузка на сервер так как потребует пересчета резервирования всех строк документа а не только последней).
Олег.
1) "1С Специалист" вы бы не сдали :). "(с)
И не собираюсь. :-) Т.к. их представление об ИС (в части назначения СУБД) еще не "докатилось" до IBM/360. Они только-только начали понимать, что такое перфокарта.
2) В (75) сообщении всё написано. Добавлю, только к этому, что пример моей функции не использует запросов. И в нашей системе, сетевая передача информации не является узким местом. В случае использования "запросного" алгоритма при "проведении документа" по сети передаётся больше информации. Примите это на веру. Уж очень лениво заниматься арифметикой. Считали и проверяли это многократно. Есть алгоритмы, где использовать запросы эффективнее, там мы их и используем. А "ввод" данных в БД - это не тот случай...
Олег.
Вы о чем?
Мы, вроде, обсуждаем Вашу идею выбора: "оперативность или точность"(с)
Возникают "смежные" вопросы - рассказываем свой опыт друг-другу, обсуждаем...
Еще раз, спрошу. Приведите, пожалуйста, таблицу последовательности выполнения операций с БД в случае обновления "актуальных итогов" при "проведении документа" с совокупными блокировками 1С+СУБД. Если там будет обеспечена "точность", то я соглашусь с Вашими предложениями из публикации. Ну, а если не будет обеспечена, то разбежимся - каждый со своим мнением на АвтоМехАнизацию. Идет?
"...в контексте 1С, и чем данный подход отличается от традиционного."(с)
Во всех 1С-ах считается, что наименьшей единицей "взаимодействия" с ИС является документ. Для документов без табличной части - это похоже на правду. ;-) А для документов с табличной частью - это глобальная ошибка в проектировании системы. Т.к. "хозяйственной операцией" (ХО) является одна строка таких документов. Если в ИС ставится целью учитывать документы, то - этот подход оправдан. Если ставится задача АвтоМехАнизировать деятельность, непосредственно, участников ХО, то он совершает не ХО над документами, а ХО "размером" в одну строчку документа. На мой взгляд, в ИС следует "учитывать" (фиксировать) ХО, а не документы. Способы реализации такого подхода могут быть различными - как в выражении предметной области, так и в "программном" уровне.
Функция R=F(Измерение1,Измерение2...,Количество,ЕдИзм) выполняет фиксацию в БД одной ХО. И блокировка "накладывается" только на этот момент. Реализация функции зависти от модели СУБД. В моем случае:
Логическая блокировка "измерения".
Поиск по ключу и чтение итога (остатка).
Вычисление нового значения итога.
Проверка "отрицательности" (если требуется).
Запись нового значения "движения".
Обновление итоговой записи.
Снятие блокировки.
Т.е. всё очень примитивно с точки зрения общения с СУБД, в части блокировок. ;-)
Интересней логика "управляемых" блокировок в системе в целом.
Типа - иерархическая модель... :-)
Для получения уведомлений о новых публикациях автора подключите телеграм бот: Инфостарт бот
№ 91880
Создание 26.09.11 01:09
Обновление 26.09.11 18:09
Просмотры 64933
Загрузки 0
Рейтинг
175
Комментарии 163
Код открыт Не указано
Рубрики Механизмы платформы 1С
Кому Программист
Тип файла Нет файла
Платформа Платформа 1С v8.3
Конфигурация Конфигурации 1cv8
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)
![Заявка принята](/bitrix/templates/adaptive/img/landing_page_ring/check_icon.png)