Форма.ОтключитьОбработчикИзмененияДанных

Методы · DetachDataChangeHandler

Отключает процедуру-обработчик, ранее подключенную для вызова при изменении указанных данных в форме или подчиненных формах.

Синтаксис

ОтключитьОбработчикИзмененияДанных(<ИмяДанных>)

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

ОтключитьОбработчикИзмененияДанных("ПолеВвода1");
Полное описание, параметры и ограничения

Форма.ОтключитьОбработчикИзмененияДанных (Form.DetachDataChangeHandler)

Форма (Form)

ОтключитьОбработчикИзмененияДанных (DetachDataChangeHandler)

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

Синтаксис:
ОтключитьОбработчикИзмененияДанных(<ИмяДанных>)
Параметры:

<ИмяДанных> (обязательный)
Тип: Строка.
Имя данных (путь к данным), изменения которых отслеживаются обработчиком. Могут быть указаны данные, связанные с реквизитами формы, табличными частями, а также подчиненные данные - реквизиты этих объектов. Например, "Реквизит1.Наименование".
Параметр может содержать только один путь к данным, т.е. метод применяется для одного реквизита.
Описание:

Отключает процедуру-обработчик, ранее подключенную для вызова при изменении указанных данных в форме или подчиненных формах.

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

Толстый клиент.

Пример:

ОтключитьОбработчикИзмененияДанных("ПолеВвода1");

См. также:
Форма, метод ПодключитьОбработчикИзмененияДанных

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

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

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

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

Следить за своими полями и отключать обработчики

Обычная форма наблюдает за именем товара и количеством, отмечает изменение, обновляет данные в состоянии покоя и проверяет заполнение. Подписки отключаются явно; обработчик ожидания не считается точным таймером.

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

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

Подготовка

  1. Создайте НОВУЮ пустую конфигурацию УчебныеОкна85 на платформе 8.5.1.1343, без бизнес-объектов, расширений, подписок и регламентных заданий. Уроки относятся только к обычным формам толстого клиента, не к управляемой форме, тонкому или веб-клиенту. Ничего в рабочих УТ, КА, УНФ или БП не изменяйте. Здесь база, формы и код в 1С не запускались: runtimeVerifiedScenarios=0.

  2. Создайте общий модуль УчебныеОкна85: Клиент (обычное приложение)=Да, Сервер=Нет, Глобальный=Нет, Вызов сервера=Нет. Вставьте полный отдельный модуль проверки стенда из блока ниже. Он проверяет собственную пустую конфигурацию.

  3. Создайте свою новую внешнюю обработку с обычной формой. Реквизиты: ИмяТовара (Строка,80), Количество (Число,3,0,неотрицательное), Изменений и Обновлений (Число,9,0,неотрицательное). Разместите редактируемые поля ИмяТовара/Количество и поля счётчиков только для просмотра.

  4. Добавьте обычные кнопки Наблюдать, Остановить, ПроверитьДанные и назначьте одноимённые обработчики. Назначьте события ПриОткрытии, ПередЗакрытием и ОбработкаПроверкиЗаполнения формы. Вставьте полный основной модуль и проверьте 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. Наблюдать сначала снимает старые подписки, затем подключает ровно два пути данных. Обработчик ДанныеИзменились имеет один параметр — путь. Для скалярных полей ОтслеживатьПодчиненныеДанные=Ложь задано явно.

  2. При интерактивном изменении своих полей увеличивается счётчик и Модифицированность становится Истина. Это признак состояния формы со звёздочкой в заголовке, не запись данных в базу. Изменение счётчика не входит в отслеживаемые пути, поэтому не создаёт рекурсивную подписку.

  3. ОбновитьВПокое не имеет параметров. Интервал 1 означает период ожидания системы, не гарантированную секунду: обработчик работает только в состоянии покоя и может задерживаться. Обновить обновляет данные этой собственной формы; по счётчику нельзя доказать обновление чужих данных или отсутствие внутренних запросов.

  4. ПроверитьЗаполнение вызывает собственную ОбработкаПроверкиЗаполнения. Пустое имя или неположительное количество устанавливают Отказ=Истина. ПроверяемыеРеквизиты не очищаются, поэтому существующая системная проверка не подменяется.

  5. Остановить, повторное Наблюдать, исключение при подключении и ПередЗакрытием вызывают один общий механизм отключения. Флаги фиксируют только реально выполненные подключения; не нужно вызывать отключение для произвольного чужого обработчика.

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

  1. В будущем ручном тесте нажмите ПроверитьДанные сразу: заполнение должно быть отвергнуто. Введите Книга и 3; повторная проверка должна вернуть Истина, но ничего в базу не записать.

  2. Нажмите Наблюдать, интерактивно измените имя и количество. Проверьте путь в сообщениях, счётчик и признак Модифицированность. Остановите наблюдение: следующие изменения больше не должны вызывать ваш обработчик. Не утверждайте, что любые программные присваивания обязательно вызывают то же событие.

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

  4. Для отдельного опыта с интервалом 0,5 обязательно установите Однократно=Истина; нативный контракт не разрешает периодический интервал меньше 1. Не заменяйте реальные события прямым вызовом функции как доказательством подписки.

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

Подготовлен полный модуль собственной формы с двумя подписками, обработкой покоя, проверкой заполнения и отключением. Вызовы в 1С и их время не проверены: runtimeVerifiedScenarios=0.

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

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

  2. Модифицированность не является операцией сохранения и не заменяет ПроверитьЗаполнение.

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

  4. ПередЗакрытием здесь только отключает собственные подписки и не меняет Отказ/СтандартнаяОбработка. Нет изменения рабочих объектов, очистки профилей или настоящего запуска.

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

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

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

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

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