Снимает блокировку данных формы для редактирования.
Синтаксис
РазблокироватьДанныеФормыДляРедактирования()Полное описание, параметры и ограничения
ФормаКлиентскогоПриложения.РазблокироватьДанныеФормыДляРедактирования (ClientApplicationForm.UnlockFormDataForEdit)
ФормаКлиентскогоПриложения (ClientApplicationForm)
РазблокироватьДанныеФормыДляРедактирования (UnlockFormDataForEdit)
Доступен, начиная с версии 8.2.
Синтаксис:
РазблокироватьДанныеФормыДляРедактирования()
Описание:
Снимает блокировку данных формы для редактирования.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент.
Вызов метода выполняет обращение к серверу.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Получить блокировку своей карточки, проверить изменение формы и отменить его
Только объектная форма реально записанной собственной карточки. Чужое незаписанное редактирование отклоняется; тестовое наименование меняется в данных формы, возвращается назад и полученная блокировка снимается без Записать.
Где и как запускать
Полный клиентский модуль собственной управляемой объектной формы учебного справочника; изменение одного поля в памяти, без записи объекта.
Подготовка
Создайте с нуля пустую конфигурацию УчебныеОповещенияФорм85 на платформе8.5.1.1343, управляемое приложение, Такси. Без рабочих данных, расширений, подписок, разделителей и чужих обработчиков.
Справочники → УчебныеКарточки85: неиерархический, Наименование длиной80, стандартная автонумерация кода. Добавьте реквизит Метка85 типа Строка длиной36. В новом справочнике исходно нет ни одного элемента.
Создайте управляемую форму списка УчебныйСписок85 и назначьте основной формой списка. Основной реквизит Список типа ДинамическийСписок, главная таблица Справочник.УчебныеКарточки85, без произвольного запроса. Таблица формы Карточки привязана к Список; в ней выводятся Код и Наименование.
В списке создайте реквизиты Метка85 типа Строка36, ПерваяКарточка85, ВтораяКарточка85, НоваяКарточка85 типа СправочникСсылка.УчебныеКарточки85, ПодтверждаюПустойСтенд типа Булево и Итог85 типа Строка неограниченной длины. Ссылки, метку и Итог показывайте только для просмотра.
Добавьте команды и кнопки ПодготовитьСвоиКарточки85, ОткрытьНаблюдателя85, ПерейтиККниге85, ПерейтиКРучке85, ОткрытьСвойРедактор85. Действия — одноимённые процедуры основного модуля списка. Назначьте форме ОбработкаЗаписиНового с точной сигнатурой из модуля.
Общие формы → УчебныйНаблюдатель85, управляемая. Параметр Метка85 типа Строка36; реквизиты Метка85 Строка36, АктивнаяКарточка85 типа СправочникСсылка.УчебныеКарточки85 и Итог85 Строка. Все отображаемые поля только для просмотра. Вставьте модуль наблюдателя и назначьте ПриСозданииНаСервере и ОбработкаАктивизации.
Общие формы → УчебныйРедактор85, управляемая. Параметр Метка85 Строка36; реквизиты Метка85 Строка36, Наименование85 Строка80, СозданнаяКарточка85 типа СправочникСсылка.УчебныеКарточки85, ПодтверждаюЗапись85 Булево, Итог85 Строка. Метка, ссылка и итог только для просмотра; добавьте кнопку ЗаписатьСвоюНовую85 и назначьте ПриСозданииНаСервере.
Справочник → Формы → УчебнаяКарточка85, управляемая форма объекта, основная форма объекта. Основной реквизит Объект автоматически связан с учебным справочником. Добавьте несохраняемые реквизиты ПодтверждаюОпыт85 Булево и Итог85 Строка, команду ПроверитьСвоюБлокировку85 и её кнопку; модуль объектной формы указан отдельно.
Нажмите F7 и обновите только новый стенд. runtimeVerifiedScenarios=0: 1С здесь не запускалась, учебные элементы не создавались, блокировки и оповещения не выполнялись. Код и проверки подготовлены статически.
Вручную откройте свой список, подтвердите пустой стенд и подготовьте две карточки. Подготовка реально записывает Книга и Ручка только при вашем будущем запуске; обе получают один новый UUID. Повторная подготовка непустого справочника отклоняется, автоматического удаления данных нет.
Все дополнительные модули вставляются в свои отдельные формы, не в основной модуль списка. Открывайте наблюдателя и редактор только кнопками списка: ПолучитьФорму передаёт реального владельца, метку и ключ уникальности. Отдельно открытая общая форма не является тем же опытом.
Основной код — полный модуль объектной формы УчебнаяКарточка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)) <> Метка85 Тогда
ВызватьИсключение "Нужна настоящая метка собственной подготовленной пары";
КонецЕсли;
ИмяКарточки = СокрЛП(Наименование85);
Если ИмяКарточки = "" Или СтрДлина(ИмяКарточки) > 80 Тогда
ВызватьИсключение "Укажите учебное наименование длиной1–80 символов";
КонецЕсли;
Своя = Справочники.УчебныеКарточки85.СоздатьЭлемент();
Своя.Наименование = ИмяКарточки;
Своя.Метка85 = Метка85;
Своя.Записать();
СозданнаяКарточка85 = Своя.Ссылка;
Возврат СозданнаяКарточка85;
КонецФункцииРазбор по шагам
До блокировки проверяются собственная конфигурация, согласие, точное имя объектной формы, сохранённая ссылка, немодифицированная форма и действительный UUID учебной метки.
ЗаблокироватьДанныеФормыДляРедактирования относится к сохраняемым данным этой реальной объектной формы. Флаг получения ставится только после успешного возврата метода.
Наименование меняется на Проверка в памяти только в данных формы. Вызов Записать отсутствует, поэтому это не учебная перезапись карточки в базе.
Исходное наименование восстанавливается независимо от ошибки основной части. Модифицированность возвращается в Ложь только потому, что до опыта немодифицированная форма была обязательным условием.
РазблокироватьДанныеФормыДляРедактирования вызывается отдельно и только если этот опыт подтвердил получение блокировки. Ошибка восстановления формы не пропускает попытку снятия блокировки.
Ошибки основной операции, восстановления и снятия блокировки объединяются. Успешный итог означает нормальное завершение методов и локальное восстановление; конкурентное поведение другого клиента отдельно не проверялось.
Как проверить результат
Опыт отказывается от новой незаписанной карточки или формы с незавершённым редактированием.
После опыта в форме осталось первоначальное наименование, признака модифицированности нет.
Запись объекта в этом модуле не вызывается; первоначальное имя в учебной базе не перезаписывается.
При ошибке блокировки или снятия выводится исключение, а не сообщение об успехе. Поведение конкурирующего клиента требует отдельного ручного теста только в своём стенде.
Ожидаемый результат
Тестовое редактирование данных собственной формы отменено, успешно полученная блокировка снята; объект не записывался.
На что обратить внимание
Нужна объектная форма с основным реквизитом Объект, не общая форма с произвольной ссылкой. Блокировка данных формы не заменяется блокировкой переменной.
Модифицированность=Ложь не отменяет произвольные изменения данных. В этом уроке первоначальная форма чистая и меняется только одно известное поле, которое сначала восстанавливается.
Не снимайте блокировку по принципу всегда: если получение не подтвердилось, этот опыт не считает блокировку своей.
Снятие блокировки не означает запись формы, а блокировка редактирования не тождественна длительной транзакционной блокировке движений регистров.
Ошибка или падение клиента может нарушить нормальное завершение. Не используйте этот пример как универсальный механизм восстановления production-сеанса.
Здесь 1С и второй тестовый клиент не запускались. Статическая проверка имён методов не доказывает конкурентную работу и фактическое владение блокировками в реальной базе.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.