Отключает процедуру-обработчик, ранее подключенную для вызова при изменении указанных данных в форме или подчиненных формах.
Синтаксис
ОтключитьОбработчикИзмененияДанных(<ИмяДанных>)Примеры платформы
ОтключитьОбработчикИзмененияДанных("ПолеВвода1");Полное описание, параметры и ограничения
Форма.ОтключитьОбработчикИзмененияДанных (Form.DetachDataChangeHandler)
Форма (Form)
ОтключитьОбработчикИзмененияДанных (DetachDataChangeHandler)
Доступен, начиная с версии 8.0.
Синтаксис:
ОтключитьОбработчикИзмененияДанных(<ИмяДанных>)
Параметры:
<ИмяДанных> (обязательный)
Тип: Строка.
Имя данных (путь к данным), изменения которых отслеживаются обработчиком. Могут быть указаны данные, связанные с реквизитами формы, табличными частями, а также подчиненные данные - реквизиты этих объектов. Например, "Реквизит1.Наименование".
Параметр может содержать только один путь к данным, т.е. метод применяется для одного реквизита.
Описание:
Отключает процедуру-обработчик, ранее подключенную для вызова при изменении указанных данных в форме или подчиненных формах.
Доступность:
Толстый клиент.
Пример:
ОтключитьОбработчикИзмененияДанных("ПолеВвода1");
См. также:
Форма, метод ПодключитьОбработчикИзмененияДанных
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Следить за своими полями и отключать обработчики
Обычная форма наблюдает за именем товара и количеством, отмечает изменение, обновляет данные в состоянии покоя и проверяет заполнение. Подписки отключаются явно; обработчик ожидания не считается точным таймером.
Где и как запускать
Полный модуль своей обычной формы внешней обработки. Только толстый клиент, не запускался.
Подготовка
Создайте НОВУЮ пустую конфигурацию УчебныеОкна85 на платформе 8.5.1.1343, без бизнес-объектов, расширений, подписок и регламентных заданий. Уроки относятся только к обычным формам толстого клиента, не к управляемой форме, тонкому или веб-клиенту. Ничего в рабочих УТ, КА, УНФ или БП не изменяйте. Здесь база, формы и код в 1С не запускались: runtimeVerifiedScenarios=0.
Создайте общий модуль УчебныеОкна85: Клиент (обычное приложение)=Да, Сервер=Нет, Глобальный=Нет, Вызов сервера=Нет. Вставьте полный отдельный модуль проверки стенда из блока ниже. Он проверяет собственную пустую конфигурацию.
Создайте свою новую внешнюю обработку с обычной формой. Реквизиты: ИмяТовара (Строка,80), Количество (Число,3,0,неотрицательное), Изменений и Обновлений (Число,9,0,неотрицательное). Разместите редактируемые поля ИмяТовара/Количество и поля счётчиков только для просмотра.
Добавьте обычные кнопки Наблюдать, Остановить, ПроверитьДанные и назначьте одноимённые обработчики. Назначьте события ПриОткрытии, ПередЗакрытием и ОбработкаПроверкиЗаполнения формы. Вставьте полный основной модуль и проверьте F7. Данные — собственные реквизиты внешней обработки, не объект документа/справочника.
Перем ИмяПодключено;
Перем КоличествоПодключено;
Перем ОжиданиеПодключено;
Процедура ПриОткрытии()
УчебныеОкна85.ПроверитьСвойПустойСтенд();
ИмяТовара = "";
Количество = 0;
Изменений = 0;
Обновлений = 0;
ИмяПодключено = Ложь;
КоличествоПодключено = Ложь;
ОжиданиеПодключено = Ложь;
ЭтаФорма.Модифицированность = Ложь;
КонецПроцедуры
Процедура Наблюдать(Кнопка)
ОстановитьНаблюдение();
Попытка
ЭтаФорма.ПодключитьОбработчикИзмененияДанных("ИмяТовара", "ДанныеИзменились", Ложь);
ИмяПодключено = Истина;
ЭтаФорма.ПодключитьОбработчикИзмененияДанных("Количество", "ДанныеИзменились", Ложь);
КоличествоПодключено = Истина;
ЭтаФорма.ПодключитьОбработчикОжидания("ОбновитьВПокое", 1, Ложь);
ОжиданиеПодключено = Истина;
Исключение
ОстановитьНаблюдение();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ДанныеИзменились(Путь) Экспорт
Если Путь <> "ИмяТовара" И Путь <> "Количество" Тогда
Возврат;
КонецЕсли;
Изменений = Изменений + 1;
ЭтаФорма.Модифицированность = Истина;
Сообщить("Изменились собственные данные: " + Путь);
КонецПроцедуры
Процедура ОбновитьВПокое() Экспорт
Если Не ОжиданиеПодключено Тогда
Возврат;
КонецЕсли;
ЭтаФорма.Обновить();
Обновлений = Обновлений + 1;
КонецПроцедуры
Процедура Остановить(Кнопка)
ОстановитьНаблюдение();
КонецПроцедуры
Процедура ОстановитьНаблюдение()
Если ИмяПодключено Тогда
ЭтаФорма.ОтключитьОбработчикИзмененияДанных("ИмяТовара");
ИмяПодключено = Ложь;
КонецЕсли;
Если КоличествоПодключено Тогда
ЭтаФорма.ОтключитьОбработчикИзмененияДанных("Количество");
КоличествоПодключено = Ложь;
КонецЕсли;
Если ОжиданиеПодключено Тогда
ЭтаФорма.ОтключитьОбработчикОжидания("ОбновитьВПокое");
ОжиданиеПодключено = Ложь;
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьДанные(Кнопка)
МожноПродолжить = ЭтаФорма.ПроверитьЗаполнение();
Если ТипЗнч(МожноПродолжить) <> Тип("Булево") Тогда
ВызватьИсключение "Проверка заполнения должна возвращать Булево";
КонецЕсли;
Если МожноПродолжить Тогда
Сообщить("Собственные данные прошли проверку; запись в базу не выполняется");
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ПустаяСтрока(ИмяТовара) Или Количество <= 0 Тогда
Отказ = Истина;
Сообщить("Введите имя своего товара и положительное количество");
КонецЕсли;
КонецПроцедуры
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
ОстановитьНаблюдение();
КонецПроцедурыУчебныеОкна85.ПроверкаСтенда
Своя конфигурация УчебныеОкна85 → Общие → Общие модули → УчебныеОкна85
Полный общий модуль только обычного клиента; не выполнялся.
Процедура ПроверитьСвойПустойСтенд() Экспорт
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
Наблюдать сначала снимает старые подписки, затем подключает ровно два пути данных. Обработчик ДанныеИзменились имеет один параметр — путь. Для скалярных полей ОтслеживатьПодчиненныеДанные=Ложь задано явно.
При интерактивном изменении своих полей увеличивается счётчик и Модифицированность становится Истина. Это признак состояния формы со звёздочкой в заголовке, не запись данных в базу. Изменение счётчика не входит в отслеживаемые пути, поэтому не создаёт рекурсивную подписку.
ОбновитьВПокое не имеет параметров. Интервал 1 означает период ожидания системы, не гарантированную секунду: обработчик работает только в состоянии покоя и может задерживаться. Обновить обновляет данные этой собственной формы; по счётчику нельзя доказать обновление чужих данных или отсутствие внутренних запросов.
ПроверитьЗаполнение вызывает собственную ОбработкаПроверкиЗаполнения. Пустое имя или неположительное количество устанавливают Отказ=Истина. ПроверяемыеРеквизиты не очищаются, поэтому существующая системная проверка не подменяется.
Остановить, повторное Наблюдать, исключение при подключении и ПередЗакрытием вызывают один общий механизм отключения. Флаги фиксируют только реально выполненные подключения; не нужно вызывать отключение для произвольного чужого обработчика.
Как проверить результат
В будущем ручном тесте нажмите ПроверитьДанные сразу: заполнение должно быть отвергнуто. Введите Книга и 3; повторная проверка должна вернуть Истина, но ничего в базу не записать.
Нажмите Наблюдать, интерактивно измените имя и количество. Проверьте путь в сообщениях, счётчик и признак Модифицированность. Остановите наблюдение: следующие изменения больше не должны вызывать ваш обработчик. Не утверждайте, что любые программные присваивания обязательно вызывают то же событие.
В состоянии покоя счётчик Обновлений должен расти по вызовам обработчика, но не по точным секундам. Во время действий пользователя или временной блокировки пауза допустима. После Остановить рост прекращается; срабатывания и интерфейс здесь не проверены.
Для отдельного опыта с интервалом 0,5 обязательно установите Однократно=Истина; нативный контракт не разрешает периодический интервал меньше 1. Не заменяйте реальные события прямым вызовом функции как доказательством подписки.
Ожидаемый результат
Подготовлен полный модуль собственной формы с двумя подписками, обработкой покоя, проверкой заполнения и отключением. Вызовы в 1С и их время не проверены: runtimeVerifiedScenarios=0.
На что обратить внимание
ПодключитьОбработчикОжидания нельзя использовать как точный таймер; дробный интервал меньше 1 допустим только однократно.
Модифицированность не является операцией сохранения и не заменяет ПроверитьЗаполнение.
Обновить не означает универсальное обновление всех форм и не является доказательством отсутствия чтения платформой служебных данных.
ПередЗакрытием здесь только отключает собственные подписки и не меняет Отказ/СтандартнаяОбработка. Нет изменения рабочих объектов, очистки профилей или настоящего запуска.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.