БизнесПроцессОбъект.<Имя бизнес-процесса>.Заблокировать

Методы · Lock

Выполняет блокировку объекта от изменения другими режимами или пользователями.

Синтаксис

Заблокировать()

Примеры платформы

Попытка
    БизнесПроцесс.Заблокировать();
Исключение
    Предупреждение(НСтр("ru = 'Невозможно заблокировать бизнес-процесс.';"
     + " en = 'Can't lock the business process.'"));
КонецПопытки;
Полное описание, параметры и ограничения

БизнесПроцессОбъект.<Имя бизнес-процесса>.Заблокировать (BusinessProcessObject.<Business process name>.Lock)

БизнесПроцессОбъект.<Имя бизнес-процесса> (BusinessProcessObject.<Business process name>)

Заблокировать (Lock)

Доступен, начиная с версии 8.0.

Синтаксис:
Заблокировать()
Описание:

Выполняет блокировку объекта от изменения другими режимами или пользователями.

Доступность:

Сервер, толстый клиент, внешнее соединение.

Пример:

Попытка
БизнесПроцесс.Заблокировать();
Исключение
Предупреждение(НСтр("ru = 'Невозможно заблокировать бизнес-процесс.';"
+ " en = 'Can't lock the business process.'"));
КонецПопытки;

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Пройти собственный жизненный цикл бизнес-процесса без запуска маршрута

Один свой объект УчебныйПроцесс85: проверенное основание заполнения, настоящий текстовый макет, сохранённая идентичность, владение блокировкой, две пометки и ограниченная очистка.

Где и как запускать

Полный серверный общий модуль УчебныйЦикл85 нового стенда УчебныйЦиклЗадач85; отдельные полные модули объекта и управляемой формы ниже.

Подготовка

  1. Новая пустая конфигурация УчебныйЦиклЗадач85 на платформе 8.5.1.1343. Рабочие УТ/КА/УНФ/БП и копии с существующими задачами не подходят; урок будущим ручным запуском создаёт и непосредственно удаляет только одну свою запись.

  2. Управляемое приложение, толстый клиент Windows. Только один ваш пользователь, один клиент и один учебный опыт; фоновых заданий, других писателей, обмена, подписок и внешних действий в стенде нет.

  3. Задачи → УчебнаяЗадача85: строковый номер длиной9 с автонумерацией, наименование длиной100; реквизиты Маркер85 (Строка36) и Комментарий85 (Строка100), без обязательного заполнения.

  4. Бизнес-процессы → УчебныйПроцесс85: строковый номер длиной9 с автонумерацией, реквизиты Маркер85 (Строка36) и Комментарий85 (Строка100); свойство Задача=УчебнаяЗадача85.

  5. Карта маршрута процесса: Старт → одиночное действие Опыт85 → Финиш. Без адресации, групповых/вложенных точек и обработчиков. В этом уроке маршрут не запускается, задачи из него не порождаются.

  6. В каждом объекте создайте макет Паспорт85 вида Текстовый документ и впишите одну строку УчебныйПаспорт85. Макет не является файлом на диске; никакой печати не будет.

  7. В модуль именно исследуемого объекта вставьте целиком отдельный ОбработкаЗаполнения из карточки. Все другие обработчики объекта должны отсутствовать; для второго урока нужен его собственный одноимённый обработчик в другом объекте.

  8. Общие → Общие модули → УчебныйЦикл85: Сервер=Истина, ВызовСервера=Истина, Глобальный=Ложь, Привилегированный=Ложь; клиенты, внешнее соединение и повторное использование выключены. Вставьте полный основной код только одного урока.

  9. Для другого урока целиком замените код собственного УчебныйЦикл85, не объединяйте два ВыполнитьПример85. Учебные имена не относятся к модулям ваших рабочих конфигураций.

  10. Обработки → ЗапускЦикла85 → управляемая форма Форма: ПодтверждаюПустойСтенд85 и Занято85 типа Булево, Итог85 типа Строка неограниченной длины. Исходно флажки Ложь; занятость и итог только для просмотра.

  11. Команда и кнопка ВыполнитьСвойЦикл85 с одноимённым действием. Полный модуль этой формы приведён отдельно; вызов передаёт серверу только ваше согласие, никогда пользовательскую ссылку на запись.

  12. Нажмите F7 и обновите только пустой стенд. runtimeVerifiedScenarios=0: при подготовке справочника 1С, запись, блокировки, пометки и удаление не выполнялись.

  13. Перед будущим ручным запуском администратор проверяет отсутствие чужих пользователей, заданий и записей. Выборка исследуемого вида должна быть пустой; код откажется использовать уже существующий объект.

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

  15. Маркер и плановый UUID генерирует сам код; их нельзя вводить вручную для выбора рабочей записи. При ошибке они показываются для точного ручного разбора владельцем собственного стенда.

  16. Операции создания и окончательного удаления имеют отдельные собственные транзакции. Блокировка показывается на уже зафиксированной записи и освобождается до упражнения с пометками; это не обещание транзакционной изоляции всего цикла.

  17. В этом уроке основной код исследует УчебныйПроцесс85. Модуль ОбработкаЗаполнения вставляется именно в него, не в модуль формы или общего модуля.

Функция ВыполнитьПример85(Согласие) Экспорт
    Если Не Согласие Тогда
        ВызватьИсключение "Нужен собственный новый пустой стенд УчебныйЦиклЗадач85 и согласие";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Нельзя начинать учебный цикл внутри чужой транзакции";
    КонецЕсли;
    Выборка = БизнесПроцессы.УчебныйПроцесс85.Выбрать();
    Если Выборка.Следующий() Тогда
        ВызватьИсключение "Учебный вид объекта не пуст; существующие записи не используются";
    КонецЕсли;
    Маркер = Строка(Новый УникальныйИдентификатор);
    Идентификатор = Новый УникальныйИдентификатор;
    СвояСсылка = БизнесПроцессы.УчебныйПроцесс85.ПолучитьСсылку(Идентификатор);
    Если СвояСсылка.ПолучитьОбъект() <> Неопределено Тогда
        ВызватьИсключение "Плановый идентификатор уже существует; эта запись не своя";
    КонецЕсли;
    Процесс = БизнесПроцессы.УчебныйПроцесс85.СоздатьБизнесПроцесс();
    Процесс.УстановитьСсылкуНового(СвояСсылка);
    СозданаСвояЗапись = Ложь;
    СвояБлокировка = Ложь;
    ОшибкаОпыта = "";
    ОшибкаОчистки = "";
    Паспорт = "";
    Попытка
        Процесс.Дата = ТекущаяДата();
        Основание = Новый Структура("Маркер85,Комментарий85", Маркер, "Заполнено своим обработчиком");
        Процесс.Заполнить(Основание);
        Если Процесс.ЭтотОбъект <> Процесс Или Процесс.Маркер85 <> Маркер
            Или Процесс.Комментарий85 <> "Заполнено своим обработчиком" Тогда
            ВызватьИсключение "Собственный обработчик не заполнил этот реальный объект";
        КонецЕсли;
        Макет = Процесс.ПолучитьМакет("Паспорт85");
        Если ТипЗнч(Макет) <> Тип("ТекстовыйДокумент") Тогда
            ВызватьИсключение "Паспорт85 должен быть собственным текстовым макетом";
        КонецЕсли;
        Паспорт = Макет.ПолучитьТекст();
        Если СтрНайти(Паспорт, "УчебныйПаспорт85") = 0 Тогда
            ВызватьИсключение "В текстовом макете нет своего ожидаемого заголовка";
        КонецЕсли;
        НачатьТранзакцию();
        Попытка
            Процесс.Записать();
            ЗафиксироватьТранзакцию();
            СозданаСвояЗапись = Истина;
        Исключение
            Если ТранзакцияАктивна() Тогда
                ОтменитьТранзакцию();
            КонецЕсли;
            ВызватьИсключение;
        КонецПопытки;
        Процесс.Прочитать();
        Если Процесс.Ссылка <> СвояСсылка Или Процесс.Маркер85 <> Маркер Тогда
            ВызватьИсключение "После записи не подтверждена собственная идентичность";
        КонецЕсли;
        Если Процесс.Заблокирован() Тогда
            ВызватьИсключение "Этот объект уже владеет блокировкой до опыта; не считаем её новой своей";
        КонецЕсли;
        Процесс.Заблокировать();
        СвояБлокировка = Истина;
        Если Не Процесс.Заблокирован() Тогда
            ВызватьИсключение "Получение блокировки этим объектом не подтвердилось";
        КонецЕсли;
        Процесс.Разблокировать();
        СвояБлокировка = Ложь;
        Если Процесс.Заблокирован() Тогда
            ВызватьИсключение "Этот объект всё ещё владеет блокировкой после снятия";
        КонецЕсли;
        Процесс.Прочитать();
        Если Процесс.Модифицированность() Тогда
            ВызватьИсключение "Перед пометкой объект должен быть прочитанным и неизменённым";
        КонецЕсли;
        Процесс.УстановитьПометкуУдаления(Истина);
        Процесс.Прочитать();
        Если Не Процесс.ПометкаУдаления Или Процесс.Маркер85 <> Маркер Тогда
            ВызватьИсключение "Пометка своего объекта не подтвердилась";
        КонецЕсли;
        Процесс.УстановитьПометкуУдаления(Ложь);
        Процесс.Прочитать();
        Если Процесс.ПометкаУдаления Или Процесс.Маркер85 <> Маркер Тогда
            ВызватьИсключение "Снятие пометки своего объекта не подтвердилось";
        КонецЕсли;
    Исключение
        ОшибкаОпыта = ОписаниеОшибки();
    КонецПопытки;
    Если СвояБлокировка Тогда
        Попытка
            Процесс.Разблокировать();
            СвояБлокировка = Ложь;
        Исключение
            ОшибкаОчистки = "Не снята собственная блокировка: " + ОписаниеОшибки();
        КонецПопытки;
    КонецЕсли;
    Если СозданаСвояЗапись И Не СвояБлокировка Тогда
        Попытка
            Проверенный = СвояСсылка.ПолучитьОбъект();
            Если Проверенный <> Неопределено Тогда
                Если Проверенный.Ссылка <> СвояСсылка Или Проверенный.Маркер85 <> Маркер
                    Или Проверенный.Стартован Или Проверенный.Завершен Тогда
                    ВызватьИсключение "Запись больше не соответствует собственному неактивному опыту; не удаляем";
                КонецЕсли;
                НачатьТранзакцию();
                Попытка
                    Проверенный.Удалить();
                    ЗафиксироватьТранзакцию();
                Исключение
                    Если ТранзакцияАктивна() Тогда
                        ОтменитьТранзакцию();
                    КонецЕсли;
                    ВызватьИсключение;
                КонецПопытки;
            КонецЕсли;
            Если СвояСсылка.ПолучитьОбъект() <> Неопределено Тогда
                ВызватьИсключение "Собственная запись осталась после удаления";
            КонецЕсли;
        Исключение
            ОшибкаОчистки = ОшибкаОчистки + " " + ОписаниеОшибки();
        КонецПопытки;
    КонецЕсли;
    Если ОшибкаОпыта <> "" Или ОшибкаОчистки <> "" Тогда
        ВызватьИсключение ОшибкаОпыта + " " + ОшибкаОчистки
            + " Свой плановый UUID: " + Строка(Идентификатор) + "; маркер: " + Маркер;
    КонецЕсли;
    Возврат "Заполнение, текстовый макет, собственная блокировка и две пометки проверены. Своя запись удалена. "
        + Паспорт + "; маркер опыта: " + Маркер;
КонецФункции
ОбработкаЗаполнения УчебныйПроцесс85

УчебныйЦиклЗадач85 → Бизнес-процессы → УчебныйПроцесс85 → Модуль объекта

Полный модуль собственного объекта УчебныйПроцесс85; единственный обработчик заполнения с точными тремя параметрами.

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Тогда
        ВызватьИсключение "Для этого учебного объекта нужно своё структурированное основание";
    КонецЕсли;
    Маркер = Неопределено;
    Комментарий = Неопределено;
    Если Не ДанныеЗаполнения.Свойство("Маркер85", Маркер)
        Или Не ДанныеЗаполнения.Свойство("Комментарий85", Комментарий) Тогда
        ВызватьИсключение "В собственном основании нет обоих реквизитов";
    КонецЕсли;
    Если ТипЗнч(Маркер) <> Тип("Строка") Или СтрДлина(Маркер) <> 36
        Или ТипЗнч(Комментарий) <> Тип("Строка") Или СтрДлина(Комментарий) > 100 Тогда
        ВызватьИсключение "Неверные типы или длины собственного основания";
    КонецЕсли;
    ЭтотОбъект.Маркер85 = Маркер;
    ЭтотОбъект.Комментарий85 = Комментарий;
    СтандартнаяОбработка = Ложь;
КонецПроцедуры
ЗапускЦикла85

УчебныйЦиклЗадач85 → Обработки → ЗапускЦикла85 → Формы → Форма → Модуль

Полный клиентский модуль формы с согласием и серверным вызовом своего УчебныйЦикл85.

&НаКлиенте
Процедура ВыполнитьСвойЦикл85(Команда)
    Если Не ПодтверждаюПустойСтенд85 Или Занято85 Тогда
        ВызватьИсключение "Нужно собственное подтверждение и отсутствие другого опыта";
    КонецЕсли;
    Занято85 = Истина;
    Попытка
        Итог85 = УчебныйЦикл85.ВыполнитьПример85(ПодтверждаюПустойСтенд85);
    Исключение
        Занято85 = Ложь;
        Итог85 = ОписаниеОшибки();
        ВызватьИсключение;
    КонецПопытки;
    Занято85 = Ложь;
КонецПроцедуры

Разбор по шагам

  1. Сервер проверяет конфигурацию, версию, согласие, отсутствие внешней транзакции и существующих записей исследуемого вида. UUID и маркер генерируются внутри урока.

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

  3. Заполнить получает собственную структуру. Отдельный трёхпараметровый обработчик в модуле объекта проверяет типы и длины, пишет Маркер85/Комментарий85 через ЭтотОбъект; основной код проверяет результат и саму идентичность объекта.

  4. ПолучитьМакет возвращает собственный Паспорт85. Тип проверяется до ПолучитьТекст; заголовок проверяется без предположения о завершающем переводе строки и без печати.

  5. Собственный объект записывается в отдельной транзакции. Только после успешной фиксации выставляется СозданаСвояЗапись и выполняется Прочитать для проверки сохранённой ссылки и маркера.

  6. Заблокирован сначала проверяет отсутствие владения именно этим экземпляром. Заблокировать получает собственную блокировку, повторная проверка подтверждает её; Разблокировать снимает её до дальнейших действий.

  7. Прочитать подготавливает неизменённый сохранённый объект. УстановитьПометкуУдаления(Истина) сам записывает пометку; после чтения проверяются пометка и маркер. Затем аналогично снимается пометка.

  8. При ошибке независимая завершающая попытка снимает только подтверждённую собственную блокировку. Пока она не снята, окончательное удаление не начинается.

  9. Очистка получает объект только по созданной этим запуском ссылке, проверяет маркер и неактивное состояние. Удалить выполняется в своей транзакции, отсутствие объекта проверяется по реальной ссылке; ошибки не превращаются в успех.

Как проверить результат

  1. Маркер и комментарий заполнены именно отдельным обработчиком ОбработкаЗаполнения, а текст макета содержит УчебныйПаспорт85.

  2. После создания сохранённая ссылка и маркер совпадают с собственным планом; новый UUID сам по себе не принимается за существующую запись.

  3. Владение блокировкой у одного экземпляра меняется Ложь → Истина → Ложь; конкурентная блокировка другого клиента этим не проверяется.

  4. Пометка на своей записи меняется Ложь → Истина → Ложь, после каждого вызова значение читается заново.

  5. После штатной очистки СвояСсылка.ПолучитьОбъект() возвращает Неопределено. В коде нет выбора пользовательской записи или удаления по произвольному входному UUID.

  6. Ошибки основной операции и очистки отображаются вместе с собственным плановым UUID/маркером; нет ложного успешного результата при оставшейся записи или неснятой блокировке.

Ожидаемый результат

При будущем собственном ручном успешном запуске заполнение, макет, владение блокировкой и обе пометки подтверждены; единственная созданная уроком запись непосредственно удалена.

На что обратить внимание

  1. ОбработкаЗаполнения у задачи и процесса имеет три параметра: ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка. Двухпараметровая сигнатура для этих объектов в установленной справке неверна.

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

  3. ЭтотОбъект только читается и указывает на тот же объект, не создаёт вторую запись. В модуле объекта через него заполняются реквизиты именно текущего нового экземпляра.

  4. ПолучитьМакет возвращает тип, определённый видом вашего метаданного макета. Здесь требуется ТекстовыйДокумент; нельзя всегда считать результат ТабличныйДокумент и вызывать печать.

  5. Заблокирован проверяет владение блокировкой конкретным объектом встроенного языка. Это не проверка «вообще никто не заблокировал запись» и не монитор блокировок других пользователей.

  6. Блокировка считается своей только после успешного Заблокировать. Нельзя безусловно Разблокировать чужой или заранее заблокированный объект; завершающая попытка снимает только подтверждённую собственную блокировку.

  7. УстановитьПометкуУдаления самостоятельно записывает изменение и вызывает ПередЗаписью. Если объект модифицирован, метод выдаёт исключение; поэтому сначала Прочитать и проверка неизменённости.

  8. Пометка не удаляет запись из базы. В этом опыте сначала ставится и затем снимается пометка, а непосредственное Удалить демонстрируется отдельно в контролируемой очистке своей записи.

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

  10. Отдельная пустая база и единственный писатель обязательны: проверки UUID/маркера не являются полной защитой от конкурентного изменения между проверкой и удалением. Это учебный цикл, не production-служба удаления.

  11. Прочитать недопустим для нового незаписанного объекта. Здесь чтение начинается только после подтверждённой фиксации создания, а не сразу после СоздатьЗадачу или СоздатьБизнесПроцесс.

  12. При аварии или неоднозначной ошибке фиксации запись может остаться. Код не объявляет её своей без подтверждения создания, не угадывает другие записи и показывает плановый UUID/маркер для ручного разбора.

  13. Запись объекта не запускает маршрут и не выполняет задачу. Здесь не вызываются Старт, ВыполнитьЗадачу, интерактивная активация или создание задач маршрутом.

  14. Статические проверки не являются запуском в 1С или проверкой конкурентного клиента. Записи, блокировки и удаление здесь реально не выполнялись; runtimeVerifiedScenarios=0.

  15. Файлы, архивы, сеть, печать и резервные копии не используются. Текстовый макет хранится в метаданных нового стенда и читается только в память.

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

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.