ФормаКлиентскогоПриложения.РазблокироватьДанныеФормыДляРедактирования

Методы · UnlockFormDataForEdit

Снимает блокировку данных формы для редактирования.

Синтаксис

РазблокироватьДанныеФормыДляРедактирования()
Полное описание, параметры и ограничения

ФормаКлиентскогоПриложения.РазблокироватьДанныеФормыДляРедактирования (ClientApplicationForm.UnlockFormDataForEdit)

ФормаКлиентскогоПриложения (ClientApplicationForm)

РазблокироватьДанныеФормыДляРедактирования (UnlockFormDataForEdit)

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

Синтаксис:
РазблокироватьДанныеФормыДляРедактирования()
Описание:

Снимает блокировку данных формы для редактирования.

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

Тонкий клиент, веб-клиент, сервер, толстый клиент.
Вызов метода выполняет обращение к серверу.

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

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

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

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

Получить блокировку своей карточки, проверить изменение формы и отменить его

Только объектная форма реально записанной собственной карточки. Чужое незаписанное редактирование отклоняется; тестовое наименование меняется в данных формы, возвращается назад и полученная блокировка снимается без Записать.

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

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

Подготовка

  1. Создайте с нуля пустую конфигурацию УчебныеОповещенияФорм85 на платформе8.5.1.1343, управляемое приложение, Такси. Без рабочих данных, расширений, подписок, разделителей и чужих обработчиков.

  2. Справочники → УчебныеКарточки85: неиерархический, Наименование длиной80, стандартная автонумерация кода. Добавьте реквизит Метка85 типа Строка длиной36. В новом справочнике исходно нет ни одного элемента.

  3. Создайте управляемую форму списка УчебныйСписок85 и назначьте основной формой списка. Основной реквизит Список типа ДинамическийСписок, главная таблица Справочник.УчебныеКарточки85, без произвольного запроса. Таблица формы Карточки привязана к Список; в ней выводятся Код и Наименование.

  4. В списке создайте реквизиты Метка85 типа Строка36, ПерваяКарточка85, ВтораяКарточка85, НоваяКарточка85 типа СправочникСсылка.УчебныеКарточки85, ПодтверждаюПустойСтенд типа Булево и Итог85 типа Строка неограниченной длины. Ссылки, метку и Итог показывайте только для просмотра.

  5. Добавьте команды и кнопки ПодготовитьСвоиКарточки85, ОткрытьНаблюдателя85, ПерейтиККниге85, ПерейтиКРучке85, ОткрытьСвойРедактор85. Действия — одноимённые процедуры основного модуля списка. Назначьте форме ОбработкаЗаписиНового с точной сигнатурой из модуля.

  6. Общие формы → УчебныйНаблюдатель85, управляемая. Параметр Метка85 типа Строка36; реквизиты Метка85 Строка36, АктивнаяКарточка85 типа СправочникСсылка.УчебныеКарточки85 и Итог85 Строка. Все отображаемые поля только для просмотра. Вставьте модуль наблюдателя и назначьте ПриСозданииНаСервере и ОбработкаАктивизации.

  7. Общие формы → УчебныйРедактор85, управляемая. Параметр Метка85 Строка36; реквизиты Метка85 Строка36, Наименование85 Строка80, СозданнаяКарточка85 типа СправочникСсылка.УчебныеКарточки85, ПодтверждаюЗапись85 Булево, Итог85 Строка. Метка, ссылка и итог только для просмотра; добавьте кнопку ЗаписатьСвоюНовую85 и назначьте ПриСозданииНаСервере.

  8. Справочник → Формы → УчебнаяКарточка85, управляемая форма объекта, основная форма объекта. Основной реквизит Объект автоматически связан с учебным справочником. Добавьте несохраняемые реквизиты ПодтверждаюОпыт85 Булево и Итог85 Строка, команду ПроверитьСвоюБлокировку85 и её кнопку; модуль объектной формы указан отдельно.

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

  10. Вручную откройте свой список, подтвердите пустой стенд и подготовьте две карточки. Подготовка реально записывает Книга и Ручка только при вашем будущем запуске; обе получают один новый UUID. Повторная подготовка непустого справочника отклоняется, автоматического удаления данных нет.

  11. Все дополнительные модули вставляются в свои отдельные формы, не в основной модуль списка. Открывайте наблюдателя и редактор только кнопками списка: ПолучитьФорму передаёт реального владельца, метку и ключ уникальности. Отдельно открытая общая форма не является тем же опытом.

  12. Основной код — полный модуль объектной формы УчебнаяКарточка85. Откройте Книга или Ручка стандартным открытием строки своего списка; убедитесь, что Объект содержит реальную сохранённую карточку с Метка85.

  13. До опыта форма должна быть немодифицированной, без других редакторов этой карточки. Установите ПодтверждаюОпыт85 только после проверки своего стенда. Не редактируйте другие поля во время выполнения команды.

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

УчебныеОповещенияФорм85 → Справочники → УчебныеКарточки85 → Формы → УчебныйСписок85 → Модуль

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

&НаКлиенте
Перем Наблюдатель85;

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

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

&НаКлиенте
Процедура ОткрытьНаблюдателя85(Команда)
    Если ПерваяКарточка85.Пустая() Тогда
        ВызватьИсключение "Сначала подготовьте свою пару";
    КонецЕсли;
    ПараметрыНаблюдателя = Новый Структура("Метка85", Метка85);
    Наблюдатель85 = ПолучитьФорму("ОбщаяФорма.УчебныйНаблюдатель85", ПараметрыНаблюдателя, ЭтаФорма, Метка85);
    Если Наблюдатель85 = Неопределено Тогда
        ВызватьИсключение "Создание собственной формы наблюдателя отклонено";
    КонецЕсли;
    Наблюдатель85.Открыть();
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОткрытьСвойРедактор85(Команда)
    Если ПерваяКарточка85.Пустая() Тогда
        ВызватьИсключение "Сначала подготовьте собственную пару";
    КонецЕсли;
    ПараметрыРедактора = Новый Структура("Метка85", Метка85);
    Редактор = ПолучитьФорму("ОбщаяФорма.УчебныйРедактор85", ПараметрыРедактора, ЭтаФорма, Метка85);
    Если Редактор = Неопределено Тогда
        ВызватьИсключение "Создание своего редактора отклонено";
    КонецЕсли;
    Редактор.Открыть();
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаЗаписиНового(НовыйОбъект, Источник, СтандартнаяОбработка)
    Если ТипЗнч(Источник) <> Тип("ФормаКлиентскогоПриложения") Тогда
        Возврат;
    КонецЕсли;
    Если Источник.ИмяФормы <> "ОбщаяФорма.УчебныйРедактор85" Тогда
        Возврат;
    КонецЕсли;
    Если Источник.Метка85 <> Метка85 Или ТипЗнч(НовыйОбъект) <> Тип("СправочникСсылка.УчебныеКарточки85") Тогда
        Возврат;
    КонецЕсли;
    НоваяКарточка85 = НовыйОбъект;
    Итог85 = "Владелец получил свою новую карточку. Стандартное позиционирование списка оставлено включённым.";
КонецПроцедуры
УчебныйНаблюдатель85

УчебныеОповещенияФорм85 → Общие формы → УчебныйНаблюдатель85 → Модуль

Полный модуль собственного наблюдателя для команд формы списка.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Метка85 = Параметры.Метка85;
    Итог85 = "Ожидается активизация своей карточки владельцем";
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаАктивизации(АктивныйОбъект, Источник)
    Если ТипЗнч(Источник) <> Тип("ФормаКлиентскогоПриложения") Тогда
        Возврат;
    КонецЕсли;
    Если Источник <> ВладелецФормы Или Источник.ИмяФормы <> "Справочник.УчебныеКарточки85.Форма.УчебныйСписок85" Тогда
        Возврат;
    КонецЕсли;
    Если Источник.Метка85 <> Метка85 Или ТипЗнч(АктивныйОбъект) <> Тип("СправочникСсылка.УчебныеКарточки85") Тогда
        Возврат;
    КонецЕсли;
    АктивнаяКарточка85 = АктивныйОбъект;
    Итог85 = "Получена активизация именно своей формы-владельца";
КонецПроцедуры
УчебныйРедактор85

УчебныеОповещенияФорм85 → Общие формы → УчебныйРедактор85 → Модуль

Полный модуль собственного редактора для одноимённой команды формы списка.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Метка85 = Параметры.Метка85;
    Наименование85 = "Тетрадь";
КонецПроцедуры

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

&НаСервере
Функция СоздатьСвоюКарточкуНаСервере()
    Если Не ПодтверждаюЗапись85 Тогда
        ВызватьИсключение "Только свой подтверждённый стенд";
    КонецЕсли;
    Если Не СозданнаяКарточка85.Пустая() Тогда
        ВызватьИсключение "В этом редакторе уже создана одна собственная карточка";
    КонецЕсли;
    Если Строка(Новый УникальныйИдентификатор(Метка85)) <> Метка85 Тогда
        ВызватьИсключение "Нужна настоящая метка собственной подготовленной пары";
    КонецЕсли;
    ИмяКарточки = СокрЛП(Наименование85);
    Если ИмяКарточки = "" Или СтрДлина(ИмяКарточки) > 80 Тогда
        ВызватьИсключение "Укажите учебное наименование длиной1–80 символов";
    КонецЕсли;
    Своя = Справочники.УчебныеКарточки85.СоздатьЭлемент();
    Своя.Наименование = ИмяКарточки;
    Своя.Метка85 = Метка85;
    Своя.Записать();
    СозданнаяКарточка85 = Своя.Ссылка;
    Возврат СозданнаяКарточка85;
КонецФункции

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

  1. До блокировки проверяются собственная конфигурация, согласие, точное имя объектной формы, сохранённая ссылка, немодифицированная форма и действительный UUID учебной метки.

  2. ЗаблокироватьДанныеФормыДляРедактирования относится к сохраняемым данным этой реальной объектной формы. Флаг получения ставится только после успешного возврата метода.

  3. Наименование меняется на Проверка в памяти только в данных формы. Вызов Записать отсутствует, поэтому это не учебная перезапись карточки в базе.

  4. Исходное наименование восстанавливается независимо от ошибки основной части. Модифицированность возвращается в Ложь только потому, что до опыта немодифицированная форма была обязательным условием.

  5. РазблокироватьДанныеФормыДляРедактирования вызывается отдельно и только если этот опыт подтвердил получение блокировки. Ошибка восстановления формы не пропускает попытку снятия блокировки.

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

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

  1. Опыт отказывается от новой незаписанной карточки или формы с незавершённым редактированием.

  2. После опыта в форме осталось первоначальное наименование, признака модифицированности нет.

  3. Запись объекта в этом модуле не вызывается; первоначальное имя в учебной базе не перезаписывается.

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

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

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

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

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

  2. Модифицированность=Ложь не отменяет произвольные изменения данных. В этом уроке первоначальная форма чистая и меняется только одно известное поле, которое сначала восстанавливается.

  3. Не снимайте блокировку по принципу всегда: если получение не подтвердилось, этот опыт не считает блокировку своей.

  4. Снятие блокировки не означает запись формы, а блокировка редактирования не тождественна длительной транзакционной блокировке движений регистров.

  5. Ошибка или падение клиента может нарушить нормальное завершение. Не используйте этот пример как универсальный механизм восстановления production-сеанса.

  6. Здесь 1С и второй тестовый клиент не запускались. Статическая проверка имён методов не доказывает конкурентную работу и фактическое владение блокировками в реальной базе.

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

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

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

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

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