Тип: КоллекцияОбъектовМетаданных. Коллекция объектов метаданных, которые описывают все подписки на события, определенные в конфигурации. Элементами коллекции являются объекты типа ОбъектМетаданных: ПодпискаНаСобытие.
Полное описание, параметры и ограничения
ОбъектМетаданныхКонфигурация.ПодпискиНаСобытия (ConfigurationMetadataObject.EventSubscriptions)
ОбъектМетаданныхКонфигурация (ConfigurationMetadataObject)
ПодпискиНаСобытия (EventSubscriptions)
Доступен, начиная с версии 8.1.
Использование:
Только чтение.
Описание:
Тип: КоллекцияОбъектовМетаданных.
Коллекция объектов метаданных, которые описывают все подписки на события, определенные в конфигурации.
Элементами коллекции являются объекты типа ОбъектМетаданных: ПодпискаНаСобытие.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Составить карту категорий объектов текущей конфигурации
Инвентаризация схемы: сколько определено справочников, документов, регистров, форм и сервисов. Это не число товаров или документов в базе.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Запускайте в учебной копии конфигурации. Примеры читают структуру метаданных, но не создают объекты, не записывают регистры и не проводят документы.
Сверяйте вывод с деревом конфигурации в Конфигураторе. Имена, длины и настройки в УНФ, КА2, БП, УТ 11 и УТ 10.3 могут различаться.
Для запуска на старой версии некоторые новые категории могут отсутствовать. Здесь используется именно API 8.5.1.1343.
Категории = Новый Соответствие;
Категории.Вставить("Справочники", Метаданные.Справочники);
Категории.Вставить("Документы", Метаданные.Документы);
Категории.Вставить("Журналы документов", Метаданные.ЖурналыДокументов);
Категории.Вставить("Перечисления", Метаданные.Перечисления);
Категории.Вставить("Константы", Метаданные.Константы);
Категории.Вставить("Регистры сведений", Метаданные.РегистрыСведений);
Категории.Вставить("Регистры накопления", Метаданные.РегистрыНакопления);
Категории.Вставить("Регистры бухгалтерии", Метаданные.РегистрыБухгалтерии);
Категории.Вставить("Регистры расчета", Метаданные.РегистрыРасчета);
Категории.Вставить("Планы счетов", Метаданные.ПланыСчетов);
Категории.Вставить("Планы видов характеристик", Метаданные.ПланыВидовХарактеристик);
Категории.Вставить("Планы видов расчета", Метаданные.ПланыВидовРасчета);
Категории.Вставить("Планы обмена", Метаданные.ПланыОбмена);
Категории.Вставить("Бизнес-процессы", Метаданные.БизнесПроцессы);
Категории.Вставить("Задачи", Метаданные.Задачи);
Категории.Вставить("Последовательности", Метаданные.Последовательности);
Категории.Вставить("Нумераторы", Метаданные.НумераторыДокументов);
Категории.Вставить("Общие модули", Метаданные.ОбщиеМодули);
Категории.Вставить("Подписки на события", Метаданные.ПодпискиНаСобытия);
Категории.Вставить("Регламентные задания", Метаданные.РегламентныеЗадания);
Категории.Вставить("Общие реквизиты", Метаданные.ОбщиеРеквизиты);
Категории.Вставить("Параметры сеанса", Метаданные.ПараметрыСеанса);
Категории.Вставить("Определяемые типы", Метаданные.ОпределяемыеТипы);
Категории.Вставить("Обработки", Метаданные.Обработки);
Категории.Вставить("Отчеты", Метаданные.Отчеты);
Категории.Вставить("Общие формы", Метаданные.ОбщиеФормы);
Категории.Вставить("Общие команды", Метаданные.ОбщиеКоманды);
Категории.Вставить("Группы команд", Метаданные.ГруппыКоманд);
Категории.Вставить("Общие макеты", Метаданные.ОбщиеМакеты);
Категории.Вставить("Общие картинки", Метаданные.ОбщиеКартинки);
Категории.Вставить("Подсистемы", Метаданные.Подсистемы);
Категории.Вставить("Интерфейсы", Метаданные.Интерфейсы);
Категории.Вставить("Стили", Метаданные.Стили);
Категории.Вставить("Элементы стиля", Метаданные.ЭлементыСтиля);
Категории.Вставить("Цвета палитры", Метаданные.ЦветаПалитры);
Категории.Вставить("Языки", Метаданные.Языки);
Категории.Вставить("Роли", Метаданные.Роли);
Категории.Вставить("Роли автономных ограничений", Метаданные.РолиОграниченияАвтономнойКонфигурации);
Категории.Вставить("Функциональные опции", Метаданные.ФункциональныеОпции);
Категории.Вставить("Параметры функциональных опций", Метаданные.ПараметрыФункциональныхОпций);
Категории.Вставить("Критерии отбора", Метаданные.КритерииОтбора);
Категории.Вставить("Хранилища настроек", Метаданные.ХранилищаНастроек);
Категории.Вставить("HTTP-сервисы", Метаданные.HTTPСервисы);
Категории.Вставить("Web-сервисы", Метаданные.WebСервисы);
Категории.Вставить("WS-ссылки", Метаданные.WSСсылки);
Категории.Вставить("WebSocket-клиенты", Метаданные.WebSocketКлиенты);
Категории.Вставить("Сервисы интеграции", Метаданные.СервисыИнтеграции);
Категории.Вставить("Боты", Метаданные.Боты);
Категории.Вставить("Пакеты XDTO", Метаданные.ПакетыXDTO);
Категории.Вставить("Внешние источники данных", Метаданные.ВнешниеИсточникиДанных);
ВсегоОписаний = 0;
Для Каждого Категория Из Категории Цикл
Количество = Категория.Значение.Количество();
Сообщить(СтрШаблон("%1: %2", Категория.Ключ, Количество));
ВсегоОписаний = ВсегоОписаний + Количество;
КонецЦикла;
Сообщить("Учтено верхнеуровневых описаний: " + Строка(ВсегоОписаний));
Сообщить(Категории.Количество() = 50);Разбор по шагам
У каждой категории берём коллекцию метаданных напрямую из корня текущей конфигурации.
Соответствие связывает понятную подпись с коллекцией. Цикл вызывает Количество описаний, не выбирает данные прикладных таблиц.
Разделяем прикладные объекты, исполняемые модули/события, интерфейс/оформление, права/опции и интеграционные контракты.
Пустая коллекция допустима: отсутствие WebSocket-клиентов или планов расчёта не является ошибкой конфигурации.
Итог складывает только верхний уровень. Вложенные реквизиты, формы объектов и колонки сюда не включаются.
Как проверить результат
В выводе ровно 50 категорий с неотрицательными количествами.
Сверьте два значения со своим деревом Конфигурация: например, Справочники и ОбщиеМодули.
Пустая учебная база может иметь документы в метаданных и 0 документов в данных. Создание экземпляра документа не изменяет этот отчёт.
Ожидаемый результат
Получена карта состава схемы без чтения товаров, пользователей, документов и секретов интеграций.
На что обратить внимание
ОбщиеФормы не включает все формы каждого справочника: они вложены в соответствующие объекты.
Количество HTTPСервисов не доказывает публикацию, доступность или правильность HTTP-ответов.
Количество Роли не означает число пользователей и не раскрывает назначенные пользователю права.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Заполнить собственный черновик структурой и проверить обязательные поля
Один собственный новый объект получает тему и количество через настоящий ОбработкаЗаполнения. ПроверитьЗаполнение проверяет два подготовленных обязательных реквизита и вызывает отдельный обработчик для ограничения количества.
Где и как запускать
Полный отдельный МОДУЛЬ ОБЪЕКТА Документы → УчебныйЧерновик85. ЭтотОбъект — его настоящий модульный контекст; отдельный вызывающий серверный общий модуль дан в supportingModules и подготовке. Платформа 8.5.1.1343; здесь не запускался.
Подготовка
Создайте НОВУЮ пустую файловую учебную базу на 8.5.1.1343. Корень конфигурации назовите УчебноеЗаполнение85. Не используйте типовую базу и не добавляйте объекты в рабочие конфигурации.
Документы → Добавить → УчебныйЧерновик85. Проведение=Запретить. Не создавайте движений, табличных частей, форм, оснований ввода и дополнительных реквизитов. Историю данных выключите. Остальные прикладные объекты не добавляйте.
В собственном документе создайте ровно два реквизита: Тема — единственный тип Строка, длина 40, переменная длина; Количество — единственный тип Число, разрядность 3, дробная часть 0, знак Неотрицательный.
У обоих реквизитов установите в Конфигураторе Проверка заполнения=Показывать ошибку. В BSL это значение перечисления ПроверкаЗаполнения.ВыдаватьОшибку, а не выдуманное ПоказыватьОшибка.
Для стандартных реквизитов документа проверка заполнения должна быть Не проверять. Код обходит Описание.СтандартныеРеквизиты и подтверждает этот контракт; если он не выполняется, исправьте только свою учебную подготовку до запуска опыта.
В Документы → УчебныйЧерновик85 → Модуль объекта вставьте только основной полный code этого урока. Он содержит Перем, экспортный исполнитель, оба нативных обработчика и все вспомогательные процедуры. Не переносите его в общий модуль.
Модуль менеджера документа, модули приложения/сеанса, формы документа и все прочие модули конфигурации остаются пустыми. Подписок на события, расширений конфигурации и внешних обработчиков документов нет. Код содержат только явно предоставленные модуль объекта, серверный общий модуль и модуль собственной формы запуска.
Создайте общий модуль УчебныйЗапускЗаполнения85: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь; клиентские и внешнее соединение выключены; повторное использование возвращаемых значений Не использовать. Полный текст находится отдельно в supportingModules и продублирован далее.
Полный вызывающий серверный общий модуль; вставьте его отдельно в Общие → Общие модули → УчебныйЗапускЗаполнения85 → Модуль:
Процедура ВыполнитьПример() Экспорт
ПроверитьУчебнуюСхему();
Черновик = Документы.УчебныйЧерновик85.СоздатьДокумент();
Черновик.ВыполнитьУчебноеЗаполнение();
Если Не Черновик.ЭтоНовый() Тогда
ВызватьИсключение "Собственный черновик оказался записан";
КонецЕсли;
Сообщить("Черновик остался в памяти: " + Черновик.Тема + ", количество " + Строка(Черновик.Количество));
КонецПроцедурыПроцедура ПроверитьУчебнуюСхему()
Если Метаданные.Документы.Количество() <> 1 Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Тогда
ВызватьИсключение "Нужна собственная пустая конфигурация УчебноеЗаполнение85";
КонецЕсли;
Описание = Метаданные.Документы.Найти("УчебныйЧерновик85");
Если Описание = Неопределено Тогда
ВызватьИсключение "Не найден собственный УчебныйЧерновик85";
КонецЕсли;
Свойства = Метаданные.СвойстваОбъектов;
Если Описание.Проведение <> Свойства.Проведение.Запретить
Или Описание.Реквизиты.Количество() <> 2 Или Описание.ТабличныеЧасти.Количество() <> 0 Тогда
ВызватьИсключение "Собственный документ должен иметь два реквизита, без проведения и табличных частей";
КонецЕсли;
Тема = Описание.Реквизиты.Найти("Тема");
Количество = Описание.Реквизиты.Найти("Количество");
Если Тема = Неопределено Или Количество = Неопределено Тогда
ВызватьИсключение "Не найдены оба собственных реквизита";
КонецЕсли;
Если Тема.Тип.Типы().Количество() <> 1 Или Не Тема.Тип.СодержитТип(Тип("Строка")) Тогда
ВызватьИсключение "Тема должна иметь единственный тип Строка";
КонецЕсли;
Если Тема.Тип.КвалификаторыСтроки.Длина <> 40
Или Тема.Тип.КвалификаторыСтроки.ДопустимаяДлина <> ДопустимаяДлина.Переменная
Или Тема.ПроверкаЗаполнения <> ПроверкаЗаполнения.ВыдаватьОшибку Тогда
ВызватьИсключение "Длина и обязательность темы отличаются от подготовки";
КонецЕсли;
Если Количество.Тип.Типы().Количество() <> 1 Или Не Количество.Тип.СодержитТип(Тип("Число")) Тогда
ВызватьИсключение "Количество должно иметь единственный тип Число";
КонецЕсли;
Если Количество.Тип.КвалификаторыЧисла.Разрядность <> 3
Или Количество.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 0
Или Количество.Тип.КвалификаторыЧисла.ДопустимыйЗнак <> ДопустимыйЗнак.Неотрицательный
Или Количество.ПроверкаЗаполнения <> ПроверкаЗаполнения.ВыдаватьОшибку Тогда
ВызватьИсключение "Тип и обязательность количества отличаются от подготовки";
КонецЕсли;
Для Каждого СтандартныйРеквизит Из Описание.СтандартныеРеквизиты Цикл
Если СтандартныйРеквизит.ПроверкаЗаполнения <> ПроверкаЗаполнения.НеПроверять Тогда
ВызватьИсключение "В этом опыте автоматическая проверка включена только для Тема и Количество";
КонецЕсли;
КонецЦикла;
КонецПроцедурыОбновите конфигурацию только своей учебной базы. Создайте собственную внешнюю обработку УчебныйПускЗаполнения85 с одной пустой управляемой формой Форма. В редакторе формы добавьте команду Выполнить, назначьте ей действие Выполнить и перетащите команду на форму как кнопку. В модуль формы вставьте полный отдельный текст далее и нажмите кнопку в учебной базе.
Полный модуль собственной управляемой формы запуска; не переносите его в объектный или общий модуль:
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Собственный опыт заполнения завершён");
КонецПроцедуры&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныйЗапускЗаполнения85.ВыполнитьПример();
КонецПроцедурыОсновной code — модуль объекта; supportingModules[0].code — отдельный серверный общий модуль, supportingModules[1].code — отдельная управляемая форма запуска. Эти три контекста нельзя склеить в один исполняемый файл. ЭтотОбъект не объявляйте как локальную переменную, параметр или модульную Перем.
Вызов СоздатьДокумент создаёт только свой новый объект в памяти. Заполнить и ПроверитьЗаполнение не заменяют Записать; модуль не записывает и не проводит документ. Никаких реальных документов, БД, файлов, сети, почты или печати здесь не используют.
Код сверяется со справкой установленной 8.5.1.1343, но здесь в 1С не запускался. Python-модель фиксированных структур и статические валидаторы не являются выполнением событий платформы.
Перем ВызововЗаполнения;
Перем ВызововПроверки;
Процедура ВыполнитьУчебноеЗаполнение() Экспорт
ПроверитьУчебныйЧерновик();
Если ЭтотОбъект.Тема <> "" Или ЭтотОбъект.Количество <> 0 Тогда
ВызватьИсключение "Исполнитель должен получить собственный новый пустой экземпляр";
КонецЕсли;
ВызововЗаполнения = 0;
ВызововПроверки = 0;
ПроверитьПолныйЧерновик("", 0);
ПроверитьРезультатЗаполнения(Ложь, 1);
ПроверитьОтказЗаполнения(Неопределено, "", 0);
ПроверитьОтказЗаполнения(Новый Структура("Тема", "Азбука"), "", 0);
ПроверитьОтказЗаполнения(Новый Структура("Тема,Количество", "Азбука", "3"), "", 0);
ПроверитьОтказЗаполнения(Новый Структура("Тема,Количество", "Азбука", 0), "", 0);
ПроверитьОтказЗаполнения(Новый Структура("Тема,Количество", "Азбука", 11), "", 0);
ПроверитьОтказЗаполнения(Новый Структура("Тема,Количество", "Азбука", 1.5), "", 0);
ПроверитьОтказЗаполнения(Новый Структура("Тема,Количество", "12345678901234567890123456789012345678901", 3), "", 0);
ПроверитьОтказЗаполнения(Новый Структура("Тема,Количество", "", 3), "", 0);
ЭтотОбъект.Заполнить(Новый Структура("Тема,Количество", "Азбука", 3));
ПроверитьПолныйЧерновик("Азбука", 3);
ПроверитьРезультатЗаполнения(Истина, 2);
ЭтотОбъект.Заполнить(Новый Структура("Тема,Количество", "Азбука", 1));
ПроверитьПолныйЧерновик("Азбука", 1);
ПроверитьРезультатЗаполнения(Истина, 3);
ЭтотОбъект.Заполнить(Новый Структура("Тема,Количество", "Азбука", 10));
ПроверитьПолныйЧерновик("Азбука", 10);
ПроверитьРезультатЗаполнения(Истина, 4);
ПроверитьОтказЗаполнения(Новый Структура("Тема", "Другое"), "Азбука", 10);
ЭтотОбъект.Количество = 0;
ПроверитьРезультатЗаполнения(Ложь, 5);
ПроверитьПолныйЧерновик("Азбука", 0);
ЭтотОбъект.Тема = "";
ЭтотОбъект.Количество = 3;
ПроверитьРезультатЗаполнения(Ложь, 6);
ПроверитьПолныйЧерновик("", 3);
ЭтотОбъект.Тема = "Азбука";
ЭтотОбъект.Количество = 11;
ПроверитьРезультатЗаполнения(Ложь, 7);
ПроверитьПолныйЧерновик("Азбука", 11);
ЭтотОбъект.Заполнить(Новый Структура("Тема,Количество", "Азбука", 10));
ПроверитьРезультатЗаполнения(Истина, 8);
ПроверитьПолныйЧерновик("Азбука", 10);
Если ВызововЗаполнения <> 13 Или ВызововПроверки <> 8 Тогда
ВызватьИсключение "Не совпало число реальных входов в два обработчика";
КонецЕсли;
Сообщить("ОбработкаЗаполнения: 13 входов; ОбработкаПроверкиЗаполнения: 8 входов");
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПроверитьУчебныйЧерновик();
Если ВызововЗаполнения = Неопределено Тогда
ВызововЗаполнения = 0;
КонецЕсли;
ВызововЗаполнения = ВызововЗаполнения + 1;
Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Тогда
ВызватьИсключение "Наш обработчик принимает только собственную структуру";
КонецЕсли;
НоваяТема = Неопределено;
НовоеКоличество = Неопределено;
Если Не ДанныеЗаполнения.Свойство("Тема", НоваяТема)
Или Не ДанныеЗаполнения.Свойство("Количество", НовоеКоличество) Тогда
ВызватьИсключение "Нужны оба свойства: Тема и Количество";
КонецЕсли;
Если ДанныеЗаполнения.Количество() <> 2 Тогда
ВызватьИсключение "Наша структура должна содержать ровно два свойства";
КонецЕсли;
Если ТипЗнч(НоваяТема) <> Тип("Строка") Или ТипЗнч(НовоеКоличество) <> Тип("Число") Тогда
ВызватьИсключение "Тема должна быть строкой, количество числом";
КонецЕсли;
Если Не ЗначениеЗаполнено(НоваяТема) Или СтрДлина(НоваяТема) > 40 Тогда
ВызватьИсключение "Нужна непустая тема не длиннее 40 символов";
КонецЕсли;
Если НовоеКоличество < 1 Или НовоеКоличество > 10 Или НовоеКоличество <> Цел(НовоеКоличество) Тогда
ВызватьИсключение "Количество нашего черновика должно быть целым от 1 до 10";
КонецЕсли;
ЭтотОбъект.Тема = НоваяТема;
ЭтотОбъект.Количество = НовоеКоличество;
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
ПроверитьУчебныйЧерновик();
Если ВызововПроверки = Неопределено Тогда
ВызововПроверки = 0;
КонецЕсли;
ВызововПроверки = ВызововПроверки + 1;
Если ПроверяемыеРеквизиты.Количество() <> 2
Или ПроверяемыеРеквизиты.Найти("Тема") = Неопределено
Или ПроверяемыеРеквизиты.Найти("Количество") = Неопределено Тогда
ВызватьИсключение "Платформа должна проверить ровно собственные Тема и Количество";
КонецЕсли;
Если ЭтотОбъект.Количество > 10 Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Количество учебного черновика не должно превышать 10";
Сообщение.Поле = "Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьУчебныйЧерновик()
ПроверитьУчебнуюСхему();
Если ЭтотОбъект.Метаданные().Имя <> "УчебныйЧерновик85" Или Не ЭтотОбъект.ЭтоНовый() Тогда
ВызватьИсключение "Нужен только собственный новый УчебныйЧерновик85";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьПолныйЧерновик(ОжидаемаяТема, ОжидаемоеКоличество)
Если ЭтотОбъект.Тема <> ОжидаемаяТема Или ЭтотОбъект.Количество <> ОжидаемоеКоличество
Или Не ЭтотОбъект.ЭтоНовый() Тогда
ВызватьИсключение "Полный состав или новый статус собственного черновика не совпал";
КонецЕсли;
Сообщить("Проверен черновик: " + ЭтотОбъект.Тема + ", количество " + Строка(ЭтотОбъект.Количество));
КонецПроцедуры
Процедура ПроверитьОтказЗаполнения(НеверныеДанные, ОжидаемаяТема, ОжидаемоеКоличество)
БылоВызовов = ВызововЗаполнения;
Отклонено = Ложь;
Попытка
ЭтотОбъект.Заполнить(НеверныеДанные);
Исключение
Отклонено = Истина;
КонецПопытки;
Если Не Отклонено Или ВызововЗаполнения <> БылоВызовов + 1 Тогда
ВызватьИсключение "Неверный ввод должен попасть в собственный обработчик и быть отклонён";
КонецЕсли;
ПроверитьПолныйЧерновик(ОжидаемаяТема, ОжидаемоеКоличество);
Сообщить("Неверный ввод отклонён собственным ОбработкаЗаполнения");
КонецПроцедуры
Процедура ПроверитьРезультатЗаполнения(ОжидаемыйРезультат, ОжидаемоВызовов)
Результат = ЭтотОбъект.ПроверитьЗаполнение();
Если Результат <> ОжидаемыйРезультат Или ВызововПроверки <> ОжидаемоВызовов Тогда
ВызватьИсключение "Не совпали результат проверки или число входов в событие";
КонецЕсли;
Сообщить("ПроверитьЗаполнение: " + Строка(Результат));
КонецПроцедуры
Процедура ПроверитьУчебнуюСхему()
Если Метаданные.Документы.Количество() <> 1 Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Тогда
ВызватьИсключение "Нужна собственная пустая конфигурация УчебноеЗаполнение85";
КонецЕсли;
Описание = Метаданные.Документы.Найти("УчебныйЧерновик85");
Если Описание = Неопределено Тогда
ВызватьИсключение "Не найден собственный УчебныйЧерновик85";
КонецЕсли;
Свойства = Метаданные.СвойстваОбъектов;
Если Описание.Проведение <> Свойства.Проведение.Запретить
Или Описание.Реквизиты.Количество() <> 2 Или Описание.ТабличныеЧасти.Количество() <> 0 Тогда
ВызватьИсключение "Собственный документ должен иметь два реквизита, без проведения и табличных частей";
КонецЕсли;
Тема = Описание.Реквизиты.Найти("Тема");
Количество = Описание.Реквизиты.Найти("Количество");
Если Тема = Неопределено Или Количество = Неопределено Тогда
ВызватьИсключение "Не найдены оба собственных реквизита";
КонецЕсли;
Если Тема.Тип.Типы().Количество() <> 1 Или Не Тема.Тип.СодержитТип(Тип("Строка")) Тогда
ВызватьИсключение "Тема должна иметь единственный тип Строка";
КонецЕсли;
Если Тема.Тип.КвалификаторыСтроки.Длина <> 40
Или Тема.Тип.КвалификаторыСтроки.ДопустимаяДлина <> ДопустимаяДлина.Переменная
Или Тема.ПроверкаЗаполнения <> ПроверкаЗаполнения.ВыдаватьОшибку Тогда
ВызватьИсключение "Длина и обязательность темы отличаются от подготовки";
КонецЕсли;
Если Количество.Тип.Типы().Количество() <> 1 Или Не Количество.Тип.СодержитТип(Тип("Число")) Тогда
ВызватьИсключение "Количество должно иметь единственный тип Число";
КонецЕсли;
Если Количество.Тип.КвалификаторыЧисла.Разрядность <> 3
Или Количество.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 0
Или Количество.Тип.КвалификаторыЧисла.ДопустимыйЗнак <> ДопустимыйЗнак.Неотрицательный
Или Количество.ПроверкаЗаполнения <> ПроверкаЗаполнения.ВыдаватьОшибку Тогда
ВызватьИсключение "Тип и обязательность количества отличаются от подготовки";
КонецЕсли;
Для Каждого СтандартныйРеквизит Из Описание.СтандартныеРеквизиты Цикл
Если СтандартныйРеквизит.ПроверкаЗаполнения <> ПроверкаЗаполнения.НеПроверять Тогда
ВызватьИсключение "В этом опыте автоматическая проверка включена только для Тема и Количество";
КонецЕсли;
КонецЦикла;
КонецПроцедурыУчебныйЗапускЗаполнения85
Конфигуратор → Общие → Общие модули → УчебныйЗапускЗаполнения85 → Модуль
Полный отдельный серверный общий модуль УчебныйЗапускЗаполнения85; здесь не запускался.
Процедура ВыполнитьПример() Экспорт
ПроверитьУчебнуюСхему();
Черновик = Документы.УчебныйЧерновик85.СоздатьДокумент();
Черновик.ВыполнитьУчебноеЗаполнение();
Если Не Черновик.ЭтоНовый() Тогда
ВызватьИсключение "Собственный черновик оказался записан";
КонецЕсли;
Сообщить("Черновик остался в памяти: " + Черновик.Тема + ", количество " + Строка(Черновик.Количество));
КонецПроцедуры
Процедура ПроверитьУчебнуюСхему()
Если Метаданные.Документы.Количество() <> 1 Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Тогда
ВызватьИсключение "Нужна собственная пустая конфигурация УчебноеЗаполнение85";
КонецЕсли;
Описание = Метаданные.Документы.Найти("УчебныйЧерновик85");
Если Описание = Неопределено Тогда
ВызватьИсключение "Не найден собственный УчебныйЧерновик85";
КонецЕсли;
Свойства = Метаданные.СвойстваОбъектов;
Если Описание.Проведение <> Свойства.Проведение.Запретить
Или Описание.Реквизиты.Количество() <> 2 Или Описание.ТабличныеЧасти.Количество() <> 0 Тогда
ВызватьИсключение "Собственный документ должен иметь два реквизита, без проведения и табличных частей";
КонецЕсли;
Тема = Описание.Реквизиты.Найти("Тема");
Количество = Описание.Реквизиты.Найти("Количество");
Если Тема = Неопределено Или Количество = Неопределено Тогда
ВызватьИсключение "Не найдены оба собственных реквизита";
КонецЕсли;
Если Тема.Тип.Типы().Количество() <> 1 Или Не Тема.Тип.СодержитТип(Тип("Строка")) Тогда
ВызватьИсключение "Тема должна иметь единственный тип Строка";
КонецЕсли;
Если Тема.Тип.КвалификаторыСтроки.Длина <> 40
Или Тема.Тип.КвалификаторыСтроки.ДопустимаяДлина <> ДопустимаяДлина.Переменная
Или Тема.ПроверкаЗаполнения <> ПроверкаЗаполнения.ВыдаватьОшибку Тогда
ВызватьИсключение "Длина и обязательность темы отличаются от подготовки";
КонецЕсли;
Если Количество.Тип.Типы().Количество() <> 1 Или Не Количество.Тип.СодержитТип(Тип("Число")) Тогда
ВызватьИсключение "Количество должно иметь единственный тип Число";
КонецЕсли;
Если Количество.Тип.КвалификаторыЧисла.Разрядность <> 3
Или Количество.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 0
Или Количество.Тип.КвалификаторыЧисла.ДопустимыйЗнак <> ДопустимыйЗнак.Неотрицательный
Или Количество.ПроверкаЗаполнения <> ПроверкаЗаполнения.ВыдаватьОшибку Тогда
ВызватьИсключение "Тип и обязательность количества отличаются от подготовки";
КонецЕсли;
Для Каждого СтандартныйРеквизит Из Описание.СтандартныеРеквизиты Цикл
Если СтандартныйРеквизит.ПроверкаЗаполнения <> ПроверкаЗаполнения.НеПроверять Тогда
ВызватьИсключение "В этом опыте автоматическая проверка включена только для Тема и Количество";
КонецЕсли;
КонецЦикла;
КонецПроцедурыУчебныйПускЗаполнения85.Форма
Собственная внешняя обработка УчебныйПускЗаполнения85 → Управляемая форма Форма → Модуль
Полный отдельный модуль собственной управляемой формы с предоставленным клиентским и серверным обработчиками; здесь не запускался.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Собственный опыт заполнения завершён");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныйЗапускЗаполнения85.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Сначала подготовить именно собственную пустую схему из двух реквизитов. Проверить версию, конфигурацию, единственный документ, отсутствие табличных частей и подписок, readonly типы/квалификаторы и флаги ПроверкаЗаполнения.
Отдельный серверный общий модуль выполняет эту защиту до СоздатьДокумент, затем вызывает экспортный ВыполнитьУчебноеЗаполнение у своего экземпляра. Основной текст находится в модуле объекта, поэтому ЭтотОбъект обозначает этот экземпляр.
Первый ПроверитьЗаполнение получает Ложь у пустых Тема и Количество. Наш callback только считает вход и оставляет массив двух путей без изменений; незаполненность проверяет платформа по подготовленным флагам.
Заполнить инициирует ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка). Переданное значение попадает в первый параметр. ТекстЗаполнения здесь не используется; стандартная обработка явно выключена.
Метод Заполнить допускает произвольное основание, но собственный алгоритм принимает ровно Структура с двумя ключами Тема и Количество. Проверить наличие, типы, непробельную тему до 40 символов и целое количество 1..10 до присваивания реквизитам.
Восемь неверных входов — Неопределено, отсутствие Количество, строковое число,0,11,1.5, тема длиной 41 и пустая тема — должны войти в реальный callback и вызвать исключение. После каждого оба собственных реквизита остаются пустыми.
Заполнить структурой Азбука/3: проверить оба реквизита и новый статус. ПроверитьЗаполнение возвращает Истина и вызывает свой отдельный callback второй раз.
Проверить нижнюю и верхнюю бизнес-границы: заполнение Азбука/1 и Азбука/10 успешно, обе проверки дают Истина. Отсутствующий ключ при уже заполненном черновике не должен частично заменить тему на Другое.
Присвоить только собственному черновику Количество=0. Число 0 отличается от корректных положительных количеств, но является значением по умолчанию числового типа: автоматическая проверка обязательности возвращает Ложь.
Отдельно оставить Количество=3, а Тема="": автоматическая проверка темы возвращает Ложь. Эти случаи не устанавливают Отказ в нашем обработчике и не подменяют результат произвольным булевым присваиванием.
Задать собственное Количество=11 при непустой теме. Число заполнено по системной проверке; собственный ОбработкаПроверкиЗаполнения устанавливает Отказ=Истина и отправляет понятное сообщение. Метод возвращает Ложь по этому дополнительному правилу.
Массив ПроверяемыеРеквизиты не очищается и не редактируется: все системные проверки остаются. Проверить наличие ровно Тема и Количество; неожиданная схема вызывает явное исключение.
Последнее корректное заполнение Азбука/10 восстанавливает свои два реквизита. Проверка даёт Истина; проверить 13 реальных входов в заполнение,8 входов в проверку и новый статус. Документ остаётся без записи.
Как проверить результат
Последовательность результатов восьми вызовов ПроверитьЗаполнение: Ложь,Истина,Истина,Истина,Ложь,Ложь,Ложь,Истина.
При пустом объекте ожидаются сообщения обязательности Тема и Количество; затем отдельно при количестве 0 — сообщение Количество, при пустой теме — сообщение Тема. Точный текст системного сообщения определяется платформой.
При количестве 11 ожидается собственное сообщение Количество учебного черновика не должно превышать 10; массив системно проверяемых путей сохраняется.
Девять негативных попыток заполнения дают сообщения нашего отказа и сохраняют обе прежние величины. Четыре успешных заполнения дают 3,1,10,10; итог Азбука/10.
Итоговые счётчики: 13 входов ОбработкаЗаполнения,8 входов ОбработкаПроверкиЗаполнения. Каждый контроль состава проверяет Тема,Количество и ЭтоНовый.
Нарушьте в своей копии схемы обязательность, тип, длину или разрядность: начальная защита должна остановить сценарий до создания черновика. Изменения схемы этот модуль сам не выполняет.
Ожидаемый результат
Полный объектный модуль, отдельный серверный общий модуль и отдельная форма запуска задают настоящий маршрут собственного заполнения и проверки. Проверяются оба реквизита, отрицательные входы, числовые границы и различие системного контроля обязательности от собственного Отказ.
На что обратить внимание
Нативное Заполнить само по себе не обещает заполнить наши поля по совпадению имён. В данном опыте весь алгоритм явно написан в ОбработкаЗаполнения, стандартная обработка выключена.
СтандартнаяОбработка=Ложь не отменяет действие. Неверное основание наш callback отклоняет исключением; все проверки стоят до двух присваиваний. Это не обещание транзакционного отката при произвольной ошибке после присваивания.
ОбработкаЗаполнения в установленной 8.5.1.1343 имеет три параметра. Нельзя копировать сюда встречающийся в другой конфигурации обработчик с двумя параметрами без сверки.
ПроверитьЗаполнение не записывает документ и не проверяет бизнес-правила автоматически. Обязательность задана метаданными, верхняя граница 10 реализована собственным event; его Отказ связан с реальным результатом метода.
ЭтотОбъект readonly: модуль читает сам контекст и меняет его собственные реквизиты, не присваивает другое значение свойству ЭтотОбъект. В общем модуле этот контекст не возникает.
Сообщение связано с собственным объектом и полем Количество, однако объект не открыт в форме. Переход к конкретному полю формы и визуальное позиционирование сообщения здесь не обещаются.
В исходной справке event проверки есть пример удаления путей; здесь такой алгоритм не используется. Очистка массива подавила бы системную проверку и изменила смысл урока.
Условия пустых остальных модулей и отсутствия расширений задаются подготовкой нового стенда. Код проверяет доступную схему и подписки, но не анализирует тексты сторонних модулей и не выдаёт это за runtime-доказательство.
Нативная справка описывает отключение безопасного режима на время этих обработчиков; пример должен выполняться только с полностью предоставленным собственным кодом в подготовленном новом стенде.
Здесь выполнены только Python-модели и статическая сверка установленной справки. Счётчики событий и ожидаемые сообщения — проверки для последующего запуска в вашей учебной 1С, не уже полученные runtime-результаты.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.