Тип: Строка. Содержит путь к реквизиту формы, для которого было выведено сообщение, или к данным объекта. Например, путь к реквизиту Номенклатура в строке с индексом 10 табличной части документа, в которой произошла ошибка: ТабличнаяЧастьСоставДокумента[10].Номенклатура.
Полное описание, параметры и ограничения
СообщениеПользователю.Поле (UserMessage.Field)
СообщениеПользователю (UserMessage)
Поле (Field)
Доступен, начиная с версии 8.2.
Использование:
Чтение и запись.
Описание:
Тип: Строка.
Содержит путь к реквизиту формы, для которого было выведено сообщение, или к данным объекта.
Например, путь к реквизиту Номенклатура в строке с индексом 10 табличной части документа, в которой произошла ошибка: ТабличнаяЧастьСоставДокумента[10].Номенклатура.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Заполнить собственный черновик структурой и проверить обязательные поля
Один собственный новый объект получает тему и количество через настоящий ОбработкаЗаполнения. ПроверитьЗаполнение проверяет два подготовленных обязательных реквизита и вызывает отдельный обработчик для ограничения количества.
Где и как запускать
Полный отдельный МОДУЛЬ ОБЪЕКТА Документы → УчебныйЧерновик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-результаты.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Привязать понятное сообщение проверки к полю учебной формы
Вместо исключения без указания места создаём СообщениеПользователю для конкретного реквизита и текущей формы. Никаких ссылок на рабочие объекты не требуется.
Где и как запускать
Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.
Подготовка
Создайте отдельную учебную внешнюю обработку с пустой управляемой основной формой. Каждую задачу запускайте в своей копии формы.
Не добавляйте вручную реквизит ЗначениеПримера, поле ПолеПримера и команду УчебноеДействие: их создаст код.
В свойствах формы → События свяжите ПриСозданииНаСервере с одноимённой процедурой. Вставьте весь модуль, включая клиентские и серверные процедуры.
Сохраните учебную EPF и откройте через Файл → Открыть в тонком или толстом клиенте Windows. Рабочие данные не читаются и не записываются.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Новые = Новый Массив;
ТипРеквизита = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));
Новые.Добавить(Новый РеквизитФормы("ЗначениеПримера", ТипРеквизита));
ЭтаФорма.ИзменитьРеквизиты(Новые);
ЭтаФорма.ЗначениеПримера = "";
Поле = Элементы.Добавить("ПолеПримера", Тип("ПолеФормы"));
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "ЗначениеПримера";
Поле.Заголовок = "Название учебного товара";
КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
КомандаДействия.Действие = "УчебноеДействие";
КомандаДействия.Заголовок = "Проверить название";
КомандаДействия.Подсказка = "Действие только над данными учебной формы";
КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
Кнопка.ИмяКоманды = КомандаДействия.Имя;
Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры
&НаКлиенте
Процедура УчебноеДействие(Команда)
Если Не ПустаяСтрока(ЗначениеПримера) Тогда
Сообщить("Название заполнено. Товар в базу не записан.");
Возврат;
КонецЕсли;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Укажите название учебного товара.";
Сообщение.Поле = "ЗначениеПримера";
Сообщение.ИдентификаторНазначения = ЭтаФорма.УникальныйИдентификатор;
Сообщение.Сообщить();
КонецПроцедуры
Разбор по шагам
Проверяем фактический строковый реквизит, не заголовок визуального элемента.
СообщениеПользователю содержит текст ошибки и привязку к данным формы.
Поле задаётся путём реквизита ЗначениеПримера, а не именем элемента ПолеПримера.
ИдентификаторНазначения указывает текущую форму; сообщение не должно привязываться к другой открытой форме с похожими данными.
Метод Сообщить публикует подготовленное сообщение. До записи товара или вызова API выполнение не доходит.
Как проверить результат
На пустом поле кнопка выводит Укажите название учебного товара.
Привязка сообщения относится к реквизиту текущей формы; переход по сообщению должен указывать на её поле.
После ввода Книга выводится успешная проверка без создания товара.
Ожидаемый результат
Показано адресное сообщение валидации с точной связью реквизит → поле → форма.
На что обратить внимание
Поле — путь к данным, а не обязательно имя элемента интерфейса.
Сообщение не возвращает Отказ автоматически: реальная процедура записи должна отдельно запретить действие при ошибке.
В уроке нет объекта базы, поэтому КлючДанных и УстановитьДанные намеренно не заполняются фиктивными ссылками.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.