Разделяем считанный набор, модифицированность и проверку заполнения. Ожидаемая ошибка заполнения не означает исключение или запись в базу.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Создайте НОВУЮ пустую файловую базу, имя корневой конфигурации УчебныеОстатки85. Не добавляйте эти объекты в УТ/КА2/УНФ/БП. Режим управления блокировкой данных конфигурации — Управляемый.
Документы → Добавить: УчебноеДвижение85. Номер: Строка длиной 40, автонумерация выключена. Модули объекта и менеджера оставьте пустыми; не добавляйте обработчики, подписки и обязательные пользовательские реквизиты.
Регистры накопления → Добавить: УчебныеОстатки85. Вид регистра Остатки. Единственное измерение КодТовара: Строка 50, индексировать, проверка заполнения Показывать ошибку. Единственный ресурс Количество: Число 12,3, неотрицательное. Дополнительных реквизитов нет.
В списке регистраторов выберите только собственный документ УчебноеДвижение85. Оставьте модули регистра пустыми, использование итогов включённым. Планы обмена, разделители, историю данных и фоновые задания для урока не создавайте.
Обновите конфигурацию базы данных. Создайте серверный общий модуль УчебныеЗадачи и команду собственной обработки. Фрагмент вставьте внутрь ВыполнитьПример() Экспорт; запускайте задачи по отдельности.
Первые задачи работают с незаписанными наборами. Только задачи с пометкой «в собственной транзакции» временно записывают два собственных документа и движения, затем обязательно отменяют транзакцию. В рабочей базе этот код не запускайте.
Если Метаданные.Документы.Количество() <> 1
Или Метаданные.РегистрыНакопления.Количество() <> 1
Или Метаданные.Документы.Найти("УчебноеДвижение85") = Неопределено Тогда
ВызватьИсключение "Разрешены только собственный учебный документ и регистр";
КонецЕсли;
Описание = Метаданные.РегистрыНакопления.Найти("УчебныеОстатки85");
Если Описание = Неопределено Тогда
ВызватьИсключение "Сначала создайте собственный учебный регистр";
КонецЕсли;
Если Описание.ВидРегистра <> Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки
Или Описание.Измерения.Количество() <> 1
Или Описание.Ресурсы.Количество() <> 1
Или Описание.Реквизиты.Количество() <> 0
Или Описание.Измерения.Найти("КодТовара") = Неопределено
Или Описание.Ресурсы.Найти("Количество") = Неопределено Тогда
ВызватьИсключение "Нужен регистр остатков с КодТовара и Количество";
КонецЕсли;
Менеджер = РегистрыНакопления.УчебныеОстатки85;
СсылкаНаНесохраненный = Документы.УчебноеДвижение85.ПолучитьСсылку(Новый УникальныйИдентификатор);
Набор = Менеджер.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаНесохраненный);
Набор.Прочитать();
Сообщить(Набор.Количество() = 0);
Сообщить(Набор.Выбран());
Сообщить(Не Набор.Модифицированность());
ОписаниеНабора = Набор.Метаданные();
Сообщить(ОписаниеНабора.Имя = "УчебныеОстатки85");
Запись = Набор.Добавить();
Запись.Период = Дата(2026, 9, 15, 10, 0, 0);
Запись.Регистратор = СсылкаНаНесохраненный;
Запись.Активность = Истина;
Запись.ВидДвижения = ВидДвиженияНакопления.Приход;
Запись.Количество = 3;
// КодТовара пока не заполнен намеренно.
Сообщить(Не Набор.ПроверитьЗаполнение());
Запись.КодТовара = "TRAIN-" + Строка(Новый УникальныйИдентификатор);
Сообщить(Набор.ПроверитьЗаполнение());
Сообщить(Набор.Модифицированность());
Сообщить(Не Набор.Выбран());Разбор по шагам
Устанавливаем отбор по собственной новой ссылке ДО Прочитать. Документ по ней не сохраняли, движений для него нет.
После чтения набор пуст, Выбран=Истина и Модифицированность=Ложь. Метаданные подтверждает имя регистра.
Добавляем своё движение обычным Добавить и явно задаём ВидДвижения. Код оставляем пустым только для отрицательного теста.
ПроверитьЗаполнение возвращает Ложь и формирует сообщение по полю КодТовара. Это контролируемая учебная ошибка.
После заполнения кода проверка проходит, набор модифицирован и уже не является неизменённым считанным состоянием. Записи в базу нет.
Как проверить результат
Восемь булевых проверок Истина. Сообщение о незаполненном КодТовара между ними ожидаемо.
Если первая ПроверитьЗаполнение прошла, проверьте настройку измерения «Показывать ошибку», а не убирайте отрицательный тест.
Ожидаемый результат
Новичок понимает, что чтение, изменение и проверка обязательных полей — отдельные этапы до сохранения.
На что обратить внимание
ПроверитьЗаполнение не доказывает бизнес-корректность, наличие регистратора в базе или отсутствие конкурентных изменений.
Прочитать перезаписывает текущий набор в памяти. Здесь он новый; не теряйте несохранённые изменения рабочего набора.
Без отбора по регистратору можно случайно прочитать больше данных; здесь отбор установлен заранее.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.