Чтение ограничено будущим незаписанным документом. Отбор задан до Прочитать, а смена отбора снимает признак считанного набора.
Где и как запускать
Полный серверный общий модуль отдельного стенда. Только чтение по двум своим новым UUID; чтение без отбора исключено.
Подготовка
Создайте новую пустую файловую базу с именем корня УчебныеНаборыРасчета85. Это отдельный учебный стенд, не ЗУП, КА2, УНФ, УТ или БП. Других документов, регистров и справочников в нём не должно быть.
Создайте план видов расчёта УчебныеВиды85: тип кода Строка, длина кода 10, наименования 100; использование периода действия выключено, зависимость от видов расчёта Не использовать. Реквизиты и табличные части не добавляйте.
В предопределённых видах плана создайте УчебноеНачисление с кодом DEMO и наименованием Учебная сумма. Не задавайте зависимости или вытесняющие виды. Это вид учебного расчёта, не формула зарплаты.
Создайте документ УчебныйРегистратор85 без реквизитов и табличных частей. Создайте регистр расчёта УчебныеСуммы85: периодичность Месяц, план УчебныеВиды85; период действия и базовый период выключены; график и перерасчёты не задавайте. На вкладке Движения собственного документа отметьте только этот регистр.
Добавьте в регистр измерение МеткаОперации: Строка(80), Проверка заполнения — Выдавать ошибку; единственный ресурс Сумма: Число(15,2). Других измерений, ресурсов и реквизитов не добавляйте. Обновите конфигурацию учебной базы, чтобы создать предопределённый вид.
Оставьте модули документа и набора пустыми, без подписок на события. Создайте серверный общий модуль УчебныеЗаписиРасчета с флагом Сервер, без Привилегированный. Вставьте полный модуль выбранного урока и вызовите ВыполнитьПример из своей серверной команды учебной обработки.
ПолучитьСсылку своего менеджера с новым UUID формирует непустое ссылочное значение собственного типа. Объект документа не создаётся и не записывается; непустая ссылка не доказывает существование документа. Наборы меняются только в памяти; вызовов Записать нет. Отдельный урок чтения ограничен своими новыми плановыми ссылками.
Код не вычисляет зарплату, налоги, базу или фактический период действия. Примеры сверены со справкой установленной платформы, но автоматически в 1С не исполнялись.
Процедура ВыполнитьПример() Экспорт
ПроверитьУчебнуюСхему();
СвояСсылка = СоздатьСвоюСсылкуРегистратора();
Набор = РегистрыРасчета.УчебныеСуммы85.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СвояСсылка);
Набор.Записывать = Ложь;
Набор.ДополнительныеСвойства.Вставить("Назначение", "Чтение своей будущей ссылки");
Сообщить(Не Набор.Выбран());
Сообщить(Не Набор.Записывать);
Сообщить(Не Набор.ОбменДанными.Загрузка);
Сообщить(Набор.ДополнительныеСвойства.Назначение = "Чтение своей будущей ссылки");
Набор.Прочитать();
Сообщить(Набор.Количество() = 0);
Сообщить(Набор.Выбран());
Сообщить(Не Набор.Модифицированность());
ДругаяСвояСсылка = СоздатьСвоюСсылкуРегистратора();
Набор.Отбор.Регистратор.Установить(ДругаяСвояСсылка);
Сообщить(Не Набор.Выбран());
КонецПроцедуры
Процедура ПроверитьУчебнуюСхему()
Если Метаданные.Документы.Количество() <> 1 ИЛИ Метаданные.ПланыВидовРасчета.Количество() <> 1 ИЛИ Метаданные.РегистрыРасчета.Количество() <> 1 ИЛИ Метаданные.Справочники.Количество() <> 0 ИЛИ Метаданные.РегистрыСведений.Количество() <> 0 ИЛИ Метаданные.РегистрыНакопления.Количество() <> 0 ИЛИ Метаданные.РегистрыБухгалтерии.Количество() <> 0 Тогда
ВызватьИсключение "Нужна отдельная пустая учебная конфигурация УчебныеНаборыРасчета85";
КонецЕсли;
План = Метаданные.ПланыВидовРасчета.Найти("УчебныеВиды85");
Регистр = Метаданные.РегистрыРасчета.Найти("УчебныеСуммы85");
Документ = Метаданные.Документы.Найти("УчебныйРегистратор85");
Если План = Неопределено ИЛИ Регистр = Неопределено ИЛИ Документ = Неопределено Тогда
ВызватьИсключение "Не найдены три собственных объекта учебной схемы";
КонецЕсли;
Если План.ТипКода <> Метаданные.СвойстваОбъектов.ТипКодаПланаВидовРасчета.Строка
ИЛИ План.ДлинаКода <> 10 ИЛИ План.ДлинаНаименования <> 100
ИЛИ План.ИспользованиеПериодаДействия
ИЛИ План.ЗависимостьОтВидовРасчета <> Метаданные.СвойстваОбъектов.ИспользованиеБазыПланаВидовРасчета.НеИспользовать
ИЛИ План.Реквизиты.Количество() <> 0 ИЛИ План.ТабличныеЧасти.Количество() <> 0
ИЛИ Документ.Реквизиты.Количество() <> 0 ИЛИ Документ.ТабличныеЧасти.Количество() <> 0 Тогда
ВызватьИсключение "План видов или документ отличаются от подготовки";
КонецЕсли;
Если Регистр.Периодичность <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраРасчета.Месяц
ИЛИ Регистр.ПериодДействия ИЛИ Регистр.БазовыйПериод
ИЛИ Регистр.ПланВидовРасчета <> План
ИЛИ Регистр.Измерения.Количество() <> 1 ИЛИ Регистр.Ресурсы.Количество() <> 1
ИЛИ Регистр.Реквизиты.Количество() <> 0 ИЛИ Регистр.Перерасчеты.Количество() <> 0 Тогда
ВызватьИсключение "Регистр должен быть помесячным, без периодов действия, базы и перерасчетов";
КонецЕсли;
Метка = Регистр.Измерения.Найти("МеткаОперации");
Сумма = Регистр.Ресурсы.Найти("Сумма");
Если Метка = Неопределено ИЛИ Сумма = Неопределено Тогда
ВызватьИсключение "Нужны собственные поля МеткаОперации и Сумма";
КонецЕсли;
Если Метка.Тип.Типы().Количество() <> 1 ИЛИ НЕ Метка.Тип.СодержитТип(Тип("Строка"))
ИЛИ Метка.Тип.КвалификаторыСтроки.Длина <> 80
ИЛИ Метка.ПроверкаЗаполнения <> ПроверкаЗаполнения.ВыдаватьОшибку
ИЛИ Сумма.Тип.Типы().Количество() <> 1 ИЛИ НЕ Сумма.Тип.СодержитТип(Тип("Число"))
ИЛИ Сумма.Тип.КвалификаторыЧисла.Разрядность <> 15
ИЛИ Сумма.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 2 Тогда
ВызватьИсключение "Типы полей и проверка заполнения отличаются от подготовки";
КонецЕсли;
КонецПроцедуры
Функция СоздатьСвоюСсылкуРегистратора()
ПлановаяСсылка = Документы.УчебныйРегистратор85.ПолучитьСсылку(Новый УникальныйИдентификатор);
Если ТипЗнч(ПлановаяСсылка) <> Тип("ДокументСсылка.УчебныйРегистратор85") Или ПлановаяСсылка.Пустая() Тогда
ВызватьИсключение "Нужна собственная непустая плановая ссылка регистратора";
КонецЕсли;
Возврат ПлановаяСсылка;
КонецФункцииРазбор по шагам
Проверить отдельный стенд и создать новый случайный UUID своего незаписанного документа.
Создать пустой набор, установить отбор по этому регистратору. До чтения Выбран=Ложь.
Записывать=Ложь относится к записи движений документа, не является запретом вызова собственного Записать. Безопасность урока обеспечена отсутствием любой записи.
Прочитать по своей будущей ссылке: в пустом учебном стенде записей нет, однако набор считается прочитанным.
Изменить отбор на другую новую собственную ссылку. Выбран снова Ложь; второе чтение не вызывается.
Как проверить результат
Восемь сообщений Истина, в том числе пустой прочитанный набор и сброс Выбран после изменения отбора.
Чтение не перечисляет чужие документы и не использует пустой отбор. Дополнительная метка хранится лишь в структуре своего экземпляра.
Ожидаемый результат
Признаки чтения и изменения показаны на безопасном конкретном отборе без получения рабочих расчётных данных.
На что обратить внимание
Ноль записей не означает, что набор не прочитан: это отдельные вопросы.
Модифицированность не обнаруживает изменения, выполненные другими пользователями.
Свойство ОбменДанными только читается; не включайте Загрузка для обхода проверок.
Флаг Записывать не является защитой от прямого Записать у отдельного набора. Такой вызов в коде отсутствует.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.