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