Выгоняем пользователей из серверной информационной базы
Предисловие
Для проведения регламентных работ в информационной базе 1С:Предприятия 8 часто необходимо получить монополный доступ к базе. Например, для выполнения бэкапа базы или выполнения регламентных работ на сервере СУБД (реиндексация и т.д.), необходимо отключить все активные сеансы.
Рассмотрим простой способ отключения пользователей от информационной базы с помощью стандартного функционала сервера 1С:Предприятия.
Стандартный функционал
Сразу оговорюсь, что речь будет идти о клиент-серверном варианте работы 1С:Предприятия 8. Для отключения сеансов зайдем в консоль администрирования сервера. Там найдем нужную информационную базы в списке:
Зайдя в свойства ИБ установим опцию «Блокировка начала сеансов включена». При этом может быть необходимо ввсетси логин/пароль учетной записи администратора информационной базы.
Не забывайте установить период блокировки сеанса. Также следует предусмотреть, что на время блокировки сеансов нужно остановить все фоновые задания. Делается это опицей «Блокировка регламентных заданий включена».
При необходимости можно установить текст сообщения пользователям, которым они будут уведомлены за 5 минут до блокировки сеансов, а также код разрешения для входа в информационную базу в период блокировки сеансов.
Код разрешения можно использовать для входа в информационную базу для выполнения регламентных работ, пока остальные сеансы не активные. Вводить код разрешения при подключении к базе нужно с помощью параметров. Например, так будет выглядеть параметр, переданный серверу, если код разрешения «123456».
Войдя в базу таким способом мы получим монополный доступ к информационной базе. Другие сеансы не смогут к нам присоединиться.
Уведомление пользователю о блокировке сеансов выглядит следующим образом (в зависимости от сообщения, введенного администратором). Появляется оно каждую минуту за 5 минут до периода блокировки.
По началу периода блокировки сеансов сначала появляется уведомление:
После сеанс завершается.
Активные сеансы также можно отключить, удалив их из списка активных сеансов. Подобное действие порой необходимо для завершения зависших сеансов.
На практике об отключении пользователей лучше сообщать заранее, чтобы снизить риски потери данных, введенных пользователями, но еще не сохраненных.
Начало сеанса с информационной базой запрещено
Начало сеанса с информационной базой запрещено
Ошибка запрета начала сеанса возникает в файловой и клиент-серверных вариантах информационных баз 1С.
Когда такое сообщение возникает?
Вообще данный механизм предназначен для блокировки входа пользователя в базу на время регламентных работ/
Администратор системы может установить такую блокировку.
Механизм автообновления, выполнения резервного копирования также устанавливает блокировку на время обновления и снимает после его окончания. Иногда обратно он ее не снимает.
Как установить такую блокировку в файловой базе?
В управляемой форме — версия 3.0 Бухгалтерии предприятия, Управление небольшой фирмой или Управление торговлей 11.2
Зайти в меню Администрирование в подраздел «Поддержка и обслуживание», а там нажать на ссылку «Блокировка работы пользователей»
В открывшемся диалоге доступно:
После этого система в течении 1-5 минут отключит пользователей от системы.
В клиент-серверной базе
Становимся на базу данных – нажимаем правой кнопкой мыши и выбираем «Свойства»:
Устанавливаем флажок «Блокировка начала сеансов включена»
При входе у пользователей будет возникать вот такое сообщение:
1С сама запустится:
Как войти в такую базу в момент ее блокировки?
Для того чтобы зайти необходимо запустить 1С с ключем /UC и указать секретный код
Например вот так (я указал этот ключ «Секретный» поэтому его и ввожу):
Варианты альтернативного входа
Если забыли код или забыли внести окончание периода
Нулевую рекламную идею можно помножить на миллион долларов – все равно получится нуль.
Как включить блокировку соединений с информационной базой 1C для всех пользователей
Оглавление
Введение
На практике часто возникает необходимость выгнать всех пользователей из 1С или завершить сеансы принудительно с последующей настройкой блокировки начала новых сеансов. Для чего это нужно? Для того чтобы разработчик мог спокойно применить все изменеия в конфигурации базы данных и пользователи не помешали ему в этом.
Включаем блокировку соединений с информационной базой 1C
Подключаемся на свой сервер 1С, открываем консоль кластеров, находи свою базу данных, прожимаем правой кнопкой мыши по базе и заходим в свойства нашей базы данных 1С.
Тут мы отмечаем чекбокс напротив Блокировка начала сеансов включена. Ниже мы можем настроить начало и конец блокировки сеансов установив необходимую нам дату в формате yyy-mm-dd hh:mm:ss. А при необходимости доступа к базе 1С мы можем установить Код разрешения для монопольного доступа в базу. Теперь все попытки пользователей ломиться в базу будут обречены, так что они будут ломиться в IT отдел 😁.
Внимание: Также на время блокировки рекомендую останавливать все фоновые задания, отметив чекбоксом пункт Блокировка регламентных заданий включена.
Завершаем зависшие сеансы из консоли кластера серверов 1С
Но 1С была бы не 1С, если бы она работала нормально и никогда не глючила. К чему это я? Есть такие фантомные 👽 обитатели на кластерах 1С как зависшие сеаны. Их то нам как раз и необходимо схлопнуть! В консоли выбираем нашу базу, в раскрышемся списке переходим по пункту Сеансы и в окне справа будут все активные сеансы (в том числе и наши зависшие). Выбираем все сеансы и Правая кнопка мыши/ Удалить
Внимание: Во избежание всемирного коллапса и хаоса, так как пользователи могут проработать весь день и ни разу не сохранить введёные или данные в документ, обязательно уведомлите их заранее и перед завершением сеанса сообщите дополнительно о вашем намерении и необходимости завершении их сеансов.
Получаем монополный доступ к информационной базе с кодом разрешения
Всё, блокировку настроили, сеансы подчистили. Как теперь попасть в информационную базу 1С? Запускаем 1С предприятие, выбираем нашу базу, нажимаем Изменить/ Далее и в поле Дополнительные параметры запуска вводим нашь код разрешения через пробел от ключа /uc вначале параметра. Готово, Можно стартовать!
1с параметр блокировки сеансов

Остановимся на самом начале. А именно на том месте, когда 1С, при попытке сохранить обновленную конфигурацию, скажет: — «Ошибка исключительной блокировки информационной базы». Происходит такое от того, что в информационной базе в момент сохранения работают другие пользователи. Для дальнейшего обновления необходимо выгрузить пользователей и продолжить сохранение.
Также одним из вариантов применения автоматической блокировки сеансов по расписанию на сервере 1С будет настройка резервного копирования баз 1С.
Вообще, в жизни найдется много ситуаций, когда может потребоваться предложенная для обсуждения функциональность.
Средство разработки Powershell (PS)
Сначала нам нужно определиться со средством для написания нашей управляющей подпрограммы (скрипта). Ранее серверы и рабочие станции на ОС Windows для написания командных сценариев и подпрограмм использовали командную строку (cmd). Современные серверные ОС под управлением Windows используют более совершенный аналог cmd — расширяемое средство автоматизации Windows PowerShell.
Наш рассматриваемый опыт будет выполняться на сервере с ОС Windows 2012 R2 и кластере серверов на базе 1С Предприятие 8.3. В связи с этим и разработку командного сценария мы будем делать на Windows PowerShell.
Обращаем Ваше внимание на то, что во имя избежания всяческих казусов с правами, все работы следует производить от имени пользователя с полными правами.
Регистрация СОМ объекта
Также для разработки нам потребуется зарегистрированный СОМ-объект V83.COMConnector. Если такой класс не зарегистрирован, то после входа в PowerShell с администраторскими привилегиями нужно выполнить несложную команду: regsvr32 «C:\Program Files (x86)\1cv8\8.3.х.xxxx\bin\comcntr.dll», где вместо «х» нужно указать версию используемой Вами платформы.
Автоматизация блокировки начала сеансов в 1С.
Настроить данную автоматизацию нам поможет зарегистрированное COM-соединение, а собственно менеджер COM-соединений 1С. При администрировании кластера серверов в части работы с информационной базой этот менеджер обладает рядом достаточно эффективных функций. Это, например, такие широко применяемые конструкции:
Итак, откроем обычный текстовый редактор (Блокнот) и напишем скрипт следующего содержания:
Блокировки данных в 1С:Предприятии 8
Краткое содержание:
1. Что такое блокировка данных и зачем она нужна
2. Объектные блокировки
3. Транзакционные блокировки
4. Автоматические транзакционные блокировки
5. Управляемые транзакционные блокировки
6. Перевод конфигурации в режим управляемых блокировок
При одновременной работе нескольких пользователей с одной и той же информационной базой периодически возникают ситуации, когда два или более пользователей пытаются не только одновременно прочитать одни те же данные, но и внести в них какие-то изменения. Очевидно, что если в таких случаях не предусмотреть возможности подключения специальных механизмов системы, то могут возникнуть проблемы, связанные с целостностью и достоверностью данных, хранимых в информационной базе.
Описанию возникающих проблем, а также путей их решения в системе 1С:Предприятия 8.1 и посвящена данная статья.
Что такое блокировка
Прежде чем начать изучение механизмов 1С:Предприятия, обеспечивающих конкурентный доступ пользователей к данным, познакомимся с тем, что такое блокировки, когда они возникают и можно ли обойтись без блокировок.
Рассмотрим простой пример. Продавец продает яблоки. Так получилось, что продавец очень рассеян и ему приходится абсолютно все записывать. По этой же причине все яблоки у него пронумерованны.
Пришел покупатель Иванов и ему понравилось яблоко №4. Он хочет его купить. Иванов достает кошелек и отсчитывает деньги (рис. 1).
Рис. 1. Иванов хочет купить яблоко №4
Рис. 2. Продавец «заблокировал» яблоко №4
Обратите внимание, что на самом деле яблоко все еще находится у продавца, Иванов его не купил. Может быть и не сможет купить (например окажется, что не хватает денег). Но у продавца уже записано, что это яблоко нельзя предлагать другим покупателям до тех пор, пока Иванов не завершит процесс покупки. Этот процесс, состоящий из нескольких взаимосвязанных действий (выбор яблока, отсчитывание денег, передача денег продавцу, передача яблока покупателю) называется транзакцией. Блокировка должна быть установлена в момент выбора Ивановым яблока №4 и снята после завершения транзакции покупки.
Тем временем подходит Петров и тоже хочет купить яблоко. Он сможет купить любое яблоко, кроме яблока №4 (рис. 3).
Рис. 3. Петров сможет купить любое яблоко, кроме яблока №4
Таким образом смысл блокировки в том, чтобы запретить некоторые действия над общим ресурсом на некоторое ограниченное время. В данном случае Петрову запрещено выбирать яблоко №4 до тех пор, пока Иванов не завершил свою транзакцию покупки. То есть, Петров находится в состоянии ожидания на блокировке.
Если же блокировка на яблоко №4 установлена, то это гарантирует однозначный исход: Иванов гарантированно сможет купить яблоко, если у него хватит денег. Если же он откажется от покупки, то только в этом случае яблоко из 4 ячейки сможет купить Петров.
Следует понимать, что в силу различных причин блокировки могут быть как «хорошими» (необходимыми), так и «плохими» (избыточными).
Рассмотрим еще один вариант развития событий, который поясняет откуда берутся «плохие» блокировки.
Покупатель Иванов хочет купить одно яблоко. Он перебирает все яблоки из ящика по одному, выбирая, какое лучше. При этом продавец записывает в своей книге все яблоки, которые понравились Иванову (рис. 4).
Рис. 4. Продавец блокирует все яблоки, которые нравятся Иванову
В это время подходит Петров и не может купить ни одного яблока, потому что они все заблокированы Ивановым (рис. 5).
Рис. 5. Петров не может купить ни одного яблока
Петров ждет некоторое время, обижается и уходит (рис. 6). Это событие соответствует ошибке «Превышение времени ожидания блокировки».
Рис. 6. Петров не дождался и ушел
А Иванов, в результате, выбирает одно единственное яблоко (самое лучшее) и покупает только его (рис. 7).
Рис. 7. Иванов покупает только одно яблоко
Таким образом все остальные яблоки были заблокированы зря. Если бы этих блокировок не было, то Петров, возможно, тоже купил бы яблоко.
В данном случае (в отличие от первого примера) Петров как раз столкнулся с «плохими» (избыточными) блокировками.
Подводя итог сказанному важно отметить, что «хорошие» блокировки обязательно должны присутствовать в прикладном решении. Именно благодаря им обеспечивается предсказуемость действий пользователей, целостность и непротиворечивость данных.
С «плохими» блокировками нужно бороться и в идеале их не должно существовать в прикладном решении. Причины возникновения плохих блокировок могут быть самыми разнообразными: прикладная логика, особенности работы той или иной СУБД и т.д. В данной статье мы познакомимся лишь с механизмами системы 1С:Предприятие 8.1, которые используют блокировки и дадим рекомендации по правильному их использованию. Тема же анализа существующих блокировок и их оптимизации достаточно сложная и объемная, и выходит за рамки данной статьи.
Объектные и транзакционные блокировки
В системе 1С:Предприятие 8 существуют два механизма, при работе которых используется термин блокировка. Зачастую это приводит к путанице и позволяет думать, что речь идет об одних и тех же блокировках или об одном и том же механизме. На самом деле это не так. Каждый из этих механизмов предназначен для обеспечения конкуретной работы пользователей, однако в своей, определенной области, и при этом блокировки, используемые одним и другим механизмами, имеют совершенно различный смысл (рис. 8).
Рис. 8. Объектные и транзакционные блокировки
Логическая модель данных 1С:Предприятия 8 предполагает, что на самом «верхнем» уровне абстрации пользователь имеет дело с объектами системы, как совокупностью неделимых данных. Такими объектами, например, являются элементы справочников, документы и др. Элемент справочника может содержать большое количество реквизитов, несколько табличных частей, но все эти данные необходимо изменять одновременно и согласованно. Механизм объектных блокировок как раз и позволяет осуществлять конкурентный доступ пользователей к данным 1С:Предприятия в терминах объектов информационной базы. Как правило в большинстве случаев это связано с интерактивной работой пользователей в формах: редактирование существующих объектов, удаление, создание новых и др.
Таким образом и тот, и другой механизмы обеспечивают конкурентную работу пользователей, однако области их действия и смысл устанавливаемых блокировок являются совершенно разными.
Далее рассмотрим работу этих двух механизмов более подробно.
Механизм объектных блокировок
Объектная пессимистическая блокировка
Пессимистическая блокировка объектов базы данных предназначена для того, чтобы запретить изменение данных определенного объекта другими сеансами или данным сеансом до тех пор, пока блокировка не будет снята этим объектом встроенного языка.
В основном механизм пессимистической блокировки используется системой 1С:Предприятие 8.1 для блокировки объектов, редактируемых в форме. В тот момент, когда пользователь начинает модификацию объекта в форме, расширение формы устанавливает пессимистическую блокировку. Если после этого другой пользователь, например, попытается выполнить редактирование того же объекта, ему будет выдано сообщение о том, что не удалось заблокировать объект. Когда пользователь, редактировавший объект, закроет форму объекта, расширение формы снимет пессимистическую блокировку.
Рис. 9. Пример работы пессимистической блокировки
Таким образом пессимистическая блокировка гарантирует, что пользователь, начав изменять данные объекта, сможет записать эти изменения в информационную базу.
Рассматривая возможность взаимного влияния механизмов объектных и транзакционных блокировок, напомним, что объектные блокировки не влияют на операции над данными и на процесс течения транзакций (обратите внимание, на рис 8 они расположены на разных уровнях работы с данными). Если блокировка объекта вызвала исключение, то оно, как было указано выше, может быть обработано разработчиком конфигурации и не приведет к обязательному откату транзакции. С другой стороны, блокировки объектов, установленные в течение транзакции, сохраняются при фиксации транзакции и снимаются при откате транзакции.
Объектная оптимистическая блокировка
Оптимистическая блокировка запрещает запись объекта в базу данных, если после считывания объекта он был изменен в базе данных другими сеансами или другими программными объектами этого же сеанса.
Фактически, оптимистическая блокировка представляет собой проверку, которая выполняется перед записью объекта в базу данных. Эта проверка построена на анализе номера версии объекта, хранящейся в базе данных и номера версии, помещенной в память компьютера в момент считывания данных из информационной базы. Если при записи объекта номера его версий отличаются, то будет выдано предупреждение о том, что версия объекта изменилась или он был удален, то есть сработает оптимистическая блокировка.
Рис. 10. Пример работы оптимистической блокировки
Таким образом оптимистическая блокировка гарантирует, что пользователь изменяет актуальные данные объекта, которые хранятся в информационной базе, а не какой-то их предыдущий вариант.
Механизм транзакционных блокировок
Общие сведения о транзакциях и блокировках СУБД
Прежде чем перейти к рассмотрению механизмов платформы 1С:Предприятие, познакомимся в общих чертах с понятиями, которые будут использованы далее.
Понятие транзакционной блокировки неразрывно связано с понятием транзакции.
Возможные проблемы при многопользовательском доступе к одним и тем же данным
Работа в многопользовательской среде требует соблюдения определенного компромисса между требованиями предсказуемости, целостности и непротиворечивости данных информационной базы и требованиями параллельности работы.
Как известно, при одновременном чтении и изменении одних и тех же данных конкурирующими транзакциями могут возникнуть следующие проблемы одновременного доступа:
Вывод. Нельзя одновременно изменять одни и те же данные;
Рис. 12. Иллюстрация проблемы «грязного» чтения
Выводы. Нельзя повторно читать измененные и записанные данные, если эти же самые данные уже были прочитаны до внесения в них изменений;
Рис. 13. Иллюстрация проблемы неповторяемого чтения
Пример. Допустим, компания занимается продажей товаров и состоит из нескольких отделов. В случае, когда объем продаж сотрудников одного отдела превышает 1000 рублей, то каждый сотрудник отдела получает премию 20 % от суммы своих продаж. В противном случае, размер премии составляет 10 %. Очевидно, что процесс начисления премии сотрудникам каждого отдела будет состоять из нескольких операций:
Предположим, что данные о продажах вводит Транзакция №2, а размер премии рассчитывает Транзакция №1. Тогда при одновременной работе транзакций может возникнуть ситуация, показанная на рис. 14. Таким образом, Транзакция №1 в двух одинаковых выборках строк получил разные результаты.
Выводы. Нельзя вводить новые данные (удалить имеющиеся), если они могут попасть в уже один раз прочитанные данные при повторном чтении.
Рис. 14. Иллюстрация проблемы фантомов
Строго говоря, список вышеперечисленных проблем не является окончательным.
Уровни изоляции транзакций
В зависимости от используемого уровня изоляции, СУБД накладывает различные типы блокировок на различные объекты базы данных на различное время.
Режим автоматических блокировок
Режим автоматических блокировок в 1С:Предприятии 8.1 полностью аналогичен механизму транзакционных блокировок, использовавшемуся в версии 8.0. В этом режиме 1С:Предприятие целиком «полагается» на возможности, предоставляемые СУБД (рис. 15).
Рис. 15. Автоматические блокировки в транзакции 1С:Предприятия 8
Такой подход позволяет разработчику не задумываться о достаточно сложных вопросах блокирования нужных данных в транзакции. Однако СУБД не имеет информации о логической структуре данных 1С:Предприятия, и платформе приходится использовать достаточно высокие уровни изоляции транзакций СУБД для того, чтобы обеспечить целостность и непротиворечивость данных (табл. 3): Repeatable Read и Serializable для MS SQL Server, Serializable для IBM DB2 и блокировка таблиц целиком для PostgreSQL.
Таблица 3. Блокировки СУБД, используемые в режиме автоматических блокировок в транзакции
Файловая база данных
Repeatable Read или Serializable
Зачастую такой подход приводит к возникновению «плохих» (избыточных) блокировок и не позволяет достичь желаемой параллельности работы пользователей. В клиент-серверном варианте блокировка данных происходит на уровне записей, однако может быть заблокирована и вся таблица целиком (например, в результате выбора СУБД неоптимального плана выполнения запроса ). Тип блокировок, устанавливаемых в том или ином случае, зависит от вида операции, используемого 1С:Предприятием уровня изоляции транзакций и определяется внутренними механизмами самой СУБД (например, MS SQL Server).
Режим управляемых блокировок
В 1С:Предприятии версии 8.1 реализован дополнительный режим работы, позволяющий использовать собственный менеджер транзакционных блокировок 1С:Предприятия, независимый от используемой СУБД (рис. 16).
Рис. 16. Управляемые блокировки в транзакции 1С:Предприятия 8.1
При работе в этом режиме система использует гораздо более низкий уровень изоляции транзакций для MS SQL Server и IBM DB2, и блокировку на уровне записей для PostgreSQL (см. таблицу 3). Это позволяет достичь более высокой параллельности работы пользователей.
Таблица 3. Блокировки СУБД, используемые в режиме управляемых блокировок в транзакции
Файловая база данных
Однако этот уровень изоляции транзакций СУБД уже не может сам по себе обеспечить целостность и непротиворечивость данных во всех случаях. Поэтому 1С:Предприятие 8.1 при модификации данных методами встроенного языка (например, метод Записать() у объектных данных) устанавливает собственные управляемые блокировки в транзакции, которые обрабатываются собственным менеджером транзакционных блокировок. Эти блокировки также могут быть установлены и разработчиком самостоятельно в тех местах кода, где требуется обеспечить неизменность считываемых в транзакции данных (разделяемая блокировка) или запретить чтение данных другими транзакциями (исключительная блокировка).
Управляемые блокировки 1С:Предприятия учитывают логическую структуру прикладного решения поэтому позволяют максимально точно блокировать необходимые области данных (в отличие от использовавшихся ранее блокировок СУБД, которым не известна логическая структура системы). Таким образом менеджер управляемых блокировок позовляет максимально избежать возникновения «плохих» (избыточных) блокировок, блокируюя только действительно необходимые области данных.
В результате любой запрос к данным прежде всего обрабатывается собственным менеджером транзакционных блокировок 1С:Предприятия 8.1 (см. рис. 16). Сюда войдут как управляемые блокировки, автоматически установленные платформой при вызове методов, изменяющих данные, так и блокировки, прописанные программистом в явном виде в коде конфигурации.
Если на уровне 1С:Предприятия 8.1 конфликт управляемых блокировок не обнаруживается, то запрос передается далее, на исполнение СУБД. СУБД также использует собственный механизм блокировок для определения конфликтующих транзакций, но уже с более низким уровнем изоляции транзакций, чем в режиме автоматических блокировок.
Установка режима управления блокировками для объектов конфигурации
В структуре объектов конфигурации существует несколько возможностей для задания режима управления блокировками.
Прежде всего существует свойство Режим управления блокировкой данных самой конфигурации (рис. 17).
Рис. 17. Список значений свойства «Режим управления блокировкой данных» в палитре свойств Конфигурации
При выборе значений Автоматический или Управляемый режим блокировок при чтении или записи данных любого объекта конфигурации будет определяться именно этим выбранным значением.
Рис. 18. Список значений свойства «Режим управления блокировкой данных» в палитре свойств объекта конфигурации
Этот режим предназначен для постепенного или частичного перевода конфигурации в режим управляемых блокировок. Он позволяет отдельным объектам метаданных работать с управляемыми блокировками (например, наиболее «проблемным» документам и регистрам), в то время как остальные объекты работают в режиме автоматических блокировок.
Важной особенностью работы в режиме Автоматический и управляемый является то, что не во всех ситуациях работа с данными объекта будет выполняться именно в том режиме, который для него указан. Рассмотрим эту особенность подробно.
Внутри одной транзакции, которая начата и не завершена 1С:Предприятием, может быть начата еще одна (или несколько) транзакций. Такая логика работы обеспечивается платформой автоматически, а также поддерживается средствами встроенного языка.
Таблица 3. Сочетания режимов управления блокировками в транзакции
Режим существующей транзакции
Режим начинаемой транзакции
Начинаемая транзакция будет выполнена в автоматическом режиме
Начинаемая транзакция будет выполнена в управляемом режиме
Начинаемая транзакция будет выполнена в автоматическом режиме
Будет вызвана исключительная ситуация
Указанная ранее особенность проявляется в последних двух строках таблицы. Если существующая транзакция начата в автоматическом режиме, то начинаемая транзакция таже будет выполнена в автоматическом режиме, даже в том случае, если явно (во втроенном языке) или неявно (в свойствах объекта конфигурации) для нее установлен управляемый режим блокировок.
Разберем эту особенность на двух примерах.
Например, запись элемента справочника выполняется из встроенного языка внутри транзакции, открытой разработчиком. В этом случае «первой» (явной) транзакцией будет транзакция, инициированная разработчиком, а «второй» (неявной) будет транзакция, открываемая платформой при выполнении метода Записать() объекта справочника.
Если же разработчик открывает транзакцию в управляемом режиме, то он должен быть уверен в том, что для записываемого в этой транзакции справочника, в свойствах метаданных указан управляемый режим блокировок в транзакции. В противном случае при записи элемента справочника будет вызвана исключительная ситуация (см. табл. 3, 2 и 4 строки).
Далее все аналогично предыдущему примеру. Если для документа в метаданных установлен автоматический режим управления блокировками, то независимо от того, какой режим установлен в метаданных для регистра накопления, запись его набора записей всегда будет выполняться в автоматическом режиме.
Если же для документа установлен управляемый режим блокировок в транзакции, то для регистра накопления таже должен быть установлен управляемый режим, иначе при проведении документа будет вызвана исключительная ситуация.
Из этих примеров можно сделать следующий общий вывод. Если, например, стоит задача повысить параллельность работы при проведении отдельного документа, не переводя при этом всю конфигурацию в управляемый режим, то последовательность действий должна быть следующей:
свойство конфигурации Режим управления блокировкой данных необходимо установить в значение Автоматический и управляемый ;
свойство Режим управления блокировкой данных объекта метаданных документ необходимо установить в значение Управляемый ;
у всех регистров, по которым данный документ выполняет движения, следует установить свойство Режим управления блокировкой данных в значение Управляемый ;
проанализировать процедуру проведения документа на предмет наличия:
явных вызовов транзакций
неявных вызовов транзакций, которые выполняются системой при модификации данных каких-либо объектов конфигурации
для найденных явных и неявных вызовов транзакций обеспечить их выполнение в управляемом режиме
в теле процедуры проведения документа установить необходимые управляемые блокировки (об этом см. далее).
Установка управляемых блокировок

Рис. 19. Набор свойств и методов объекта «БлокировкаДанных» доступных в Синтакс-помощнике
Новый экземпляр данного объекта может быть создан с помощью одноименного конструктора и представляет собой коллекцию элементов блокировки данных. Изначально эта коллекция пуста и задача разработчика состоит в добавлении в эту коллекцию некоторого количества элементов блокировки.
Пространство блокировок с суффиксом НаборЗаписей используется в тех случаях, когда необходимо заблокировать сами записи данного объекта (например, при добавлении новых записей).
Пространство блокировок без суффикса используется тогда, анализируются некоторые данные этого объекта (например, остатки регистра), или когда выполняются какие-либо операции, приводящие к изменению существующих данных объекта (например, восстановление границы последовательности).
После того, как элемент блокировки, соответствующий некоторому пространству блокировок, добавлен, следует установить для этого элемента режим блокировки (разделяемая или исключительная) и определить значения полей блокировки, чтобы указать, какие же именно «записи» будут заблокированы (для каждого пространства блокировок в платформе определены имена полей, значения которых могут задаваться при установке тех или иных блокировок).
Следует понимать, что, в данном случае речь не идет о реальных записях базы данных. Несмотря на то, что управляемые блокировки описываются в терминах объектов метаданных и их полей, эти блокировки никак не связаны с реальной структурой хранения данных 1С:Предприятия в СУБД. Это всего лишь записи о том, что заблокировано «нечто».
Иногда можно провести аналогию между управляемыми блокировками и реальными записями СУБД. Например, для объектных данных блокировка объекта с указанной ссылкой будет «соответствовать» блокировке всех записей, содержащих указанную ссылку, во всех таблицах этого объекта метаданных (в основной таблице и в таблицах его табличных частей).
Условия необходимо ставить именно на те поля, имена которых приведены в списке имен пространств блокировок. Для каждого пространства блокировок количество устанавливаемых условий не ограничено. Условия могут быть заданы или на равенство значения поля какому-либо значению, или на вхождение значения поля в указанный диапазон.
Существует два способа задания условий на поля пространств блокировки:
Листинг 1. Пример установки условия блокировки записей с помощью явного указания имени поля и его значения
Листинг 2. Пример установки условия блокировки записей с помощью задания диапазона
Листинг 3. Пример установки условия блокировки записей с помощью источника данных
В качестве источника данных можно указывать результат запроса, табличную часть, набор записей или таблицу значений. При установке соответствия полей, именами полей источника будут являться имена колонок результата запроса, имена реквизитов табличной части, имена измерений или имена колонок таблицы значений соответственно. Заметим, что объект Диапазон также может являться значением поля источника данных.
Рис. 20. Схема вызова метода «Заблокировать()» объекта «БлокировкаДанных»
Как следует из рисунка, если этот метод выполняется внутри транзакции (явной или неявной), то блокировки устанавливаются в момент вызова метода. При окончании транзакции они будут сняты автоматически. Если же метод Заблокировать() выполняется вне транзакции, то блокировки установлены не будут.
Рекомендации по модификации конфигураций при переходе к режиму управляемых блокировок
При переводе созданных ранее прикладных решений с версии 1С:Предприятие 8.0 на версию 1С:Предприятие 8.1 они требуют определенной степени доработки с точки зрения перехода к работе в режиме управляемых блокировок. Дадим ряд рекомендаций, позволяющих определить последовательность действий разработчика в случае реализации вышеупомянутого перевода:
В режиме управляемых блокировок, за счет использования другого уровня изоляции транзакций СУБД, конструкция ДЛЯ ИЗМЕНЕНИЯ языка запросов не работает. Таким образом, если в транзакции встречаются запросы, содержащие эту конструкцию, перед их выполнением необходимо устанавливать исключительную управляемую блокировку на читаемые данные. Это позволит в управляемом режиме обеспечить поведение, аналогичное поведению в автоматическом режиме.
Разбирая программный код, обратите внимание на соответствие условий при блокировке данных и в тексте запроса.
Листинг 4. Пример установки исключительной блокировки при проведении документа «РасходнаяНакладная»
Теперь расмотрим подробнее вопрос необходимости установки именно исключительной управляемой блокировки.
Каким образом управляемая блокировка препятствует изменению данных? В результате выполнения метода Заблокировать() в менеджере транзакционных блокировок появляются записи о тех данных, которые мы блокируем (естественно, если они не конфликтуют с существующими блокировками) (рис. 21).
Рис. 21. Установка управляемых блокировок
При любой попытке модификации данных информационной базы система автоматически будет пытаться установить исключительные управляемые блокировки для модифицируемых данных. Таким образом, если окажется, что другая транзакция пытается модифицировать те данные, которые мы уже заблокировали, менеджер транзакционных блокировок не даст ей установить нужные блокировки, т.к. исключительная блокировка, которую пытается установить другая транзакция, не совместима с нашей разделяемой блокировкой (рис. 22).
Рис. 22. Невозможно установить исключительную блокировку на номенклатуру 2
Значит система не сможет изменить данные, заблокированные нами до тех пор, пока наша транзакция не закончится и наша блокировка не будет снята автоматически при завершении транзакции (рис. 23).
Рис. 23. Исполнение кода продолжается после завершения нашей транзакции
Рис. 24. Разделяемые блокировки совместимы друг с другом
Затем мы закончили читать данные и хотим записать в этот регистр «новые остатки» для прочитанной номенклатуры. Мы не можем это сделать, т.к. для этого система должна установить исключительную блокировку на записываемые данные, но этому мешает разделяемая блокировка, установленная на часть этих данных другой транзакцией. Наша транзакция становится в очередь, ожидая снятия разделяемой блокировки, установленной другой транзакцией (рис. 25).
Рис. 25. Наша транзакция не может установить исключительную блокировку на номенклатуру 2
В это время другая транзакция также закончила чтение данных и хочет записать в этот регистр «новые остатки» для прочитанной номенклатуры. Она не может это сделать, т.к. для этого система должна установить исключительную блокировку на записываемые данные, но этому мешает разделяемая блокировка, установленная на часть этих данных нашей транзакцией. Другая транзакция становится в очередь, ожидая снятия разделяемой блокировки, установленной нашей транзакцией транзакцией (рис. 26).
Рис. 26. Конфликт блокировок: другая транзакция также не может установить блокировку на номенклатуру 2
В результате получается конфликт блокировок (deadlock), который может быть разрешен только принудительной отменой одной из транзакций.
Поэтому в данном случае необходима исключительная блокировка (рис. 27).
Рис. 27. Установка исключительных блокировок
В этом случае, когда другая транзакция, использующая управляемые блокировки, попытается начать чтение данных, которые мы заблокировали, она не сможет этого сделать. Менеджер тразакционных блокировок не даст ей установить никакую управляемую блокировку (ни разделяемую, ни исключительную) на наши данные, т.к. они не совместимы с нашей исключительной блокировкой (рис. 28).
Рис. 28. Другая транзакция не может установить блокировку на номенклатуру 2
В результате исполнение кода в другой транзакции будет остановлено и система будет ожидать снятия нашей исключительной блокировки. А наша транзакция сможет завершится, т.к. другая транзакция не имеет возможности заблокировать те записи, которые понадобятся нам для модификации (рис. 29).
Рис. 29. Наша транзакция успешно завершается












































