Читаем реальные сохранённые движения собственного документа 001; сравниваем общий обход, выборку регистратора и один индексированный отбор. Отличаем месяц регистрации, заданное действие, базу и фактический период.
Где и как запускать
Полный обычный клиентский общий модуль УчебнаяВыборкаРасчета85 → УчебныеПаспортаРасчета85. Читает собственные сохранённые движения; подготовка отдельным объектным модулем. Не выполнялся.
Подготовка
Создайте НОВУЮ отдельную файловую базу 8.5.1.1343: имя конфигурации УчебнаяВыборкаРасчета85, совместимость НеИспользовать, обычное приложение/толстый клиент. Не рабочая ЗУП/КА2/УТ/БП и не их копия. Нет расширений, общих реквизитов, разделителей, подписок, обмена, истории и фоновых прикладных заданий. Одна сессия. Здесь 1С не запускалась: runtimeVerifiedScenarios=0.
План видов расчёта Уч85ВидыПаспорта: строковый код 10, наименование 100, ИспользованиеПериодаДействия=Да, ЗависимостьОтВидовРасчета=ПоПериодуРегистрации. Единственный предопределённый вид УчебноеНачисление с кодом DEMO и именем Учебное начисление. Базовые/ведущие/вытесняющие виды пусты. Модули плана пустые. Этот вид не содержит формулу зарплаты.
Регистр расчёта Уч85Паспорта: периодичность Месяц, план Уч85ВидыПаспорта, Период действия=Да, Базовый период=Да. Единственное измерение Участник: Строка(10), Индексировать, базовое; ресурс Сумма: Число(15,2). Без графика, перерасчётов и других полей; модуль набора пустой. В этом варианте обязательные флаги периодов включены, не переиспользуйте стенд предыдущего урока с выключенными периодами.
Документ Уч85Паспорт: номер Строка(3), длина 3, без реквизитов и табличных частей, Проведение=Разрешить; в Движения включите только Уч85Паспорта. В модуль ОБЪЕКТА вставьте полный отдельный ОбработкаПроведения ниже. Остальные обработчики пустые. Сначала F7 и обновление только своего стенда.
Вручную создайте ровно один документ: номер 001, дата 15.10.2026 12:00:00. Проведите его только в своей новой учебной базе. Это БУДУЩАЯ реальная запись подготовки: платформа запишет две строки движений и рассчитает фактические периоды. Здесь никакая запись или проведение не выполнялись. Основной урок ниже только читает уже сохранённые строки.
Общий модуль УчебныеПаспортаРасчета85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, Привилегированный=Нет; остальные клиентские флаги=Нет. Вставьте полный основной модуль. Обработка УчебныеПаспортаРасчета85 → обычная форма Пульт → кнопка Выполнить → действие ВыполнитьНажатие; её полный отдельный модуль ниже. Не смешивайте три модуля в одном.
После собственного проведения откройте Пульт. Не создавайте второй документ, не меняйте движения вручную и не добавляйте Записать в основной модуль. Две строки имеют реальную ссылку 001, номера 1/2, участников A/B, суммы 100/200, общую регистрацию октябрь и базу сентябрь; действие A — 1–15 октября, B — 16–31 октября.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойКонтекст();
Регистр = Метаданные.РегистрыРасчета.Уч85Паспорта;
План = Метаданные.ПланыВидовРасчета.Уч85ВидыПаспорта;
Если Метаданные.Документы.Количество() <> 1 Или Метаданные.РегистрыРасчета.Количество() <> 1
Или Метаданные.ПланыВидовРасчета.Количество() <> 1
Или Регистр.ПланВидовРасчета <> План Или Регистр.Периодичность <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраРасчета.Месяц
Или Не Регистр.ПериодДействия Или Не Регистр.БазовыйПериод
Или Не План.ИспользованиеПериодаДействия
Или План.ЗависимостьОтВидовРасчета <> Метаданные.СвойстваОбъектов.ИспользованиеБазыПланаВидовРасчета.ПоПериодуРегистрации
Или Регистр.Измерения.Количество() <> 1 Или Регистр.Измерения.Найти("Участник") = Неопределено
Или Регистр.Ресурсы.Количество() <> 1 Или Регистр.Ресурсы.Найти("Сумма") = Неопределено
Или Регистр.Перерасчеты.Количество() <> 0 Тогда
ВызватьИсключение "Нужен собственный регистр с включёнными действием и базой, а не другой стенд без этих свойств";
КонецЕсли;
ДокументыПодготовки = Документы.Уч85Паспорт.Выбрать();
Если Не ДокументыПодготовки.Следующий() Тогда
ВызватьИсключение "Сначала вручную сохраните и проведите собственный 001";
КонецЕсли;
СвойРегистратор = ДокументыПодготовки.Ссылка;
Если ДокументыПодготовки.Номер <> "001" Или ДокументыПодготовки.Дата <> Дата(2026, 10, 15, 12, 0, 0)
Или Не ДокументыПодготовки.Проведен Или ДокументыПодготовки.ПометкаУдаления
Или СвойРегистратор.Пустая() Тогда
ВызватьИсключение "Нужен настоящий проведённый собственный документ 001 без пометки";
КонецЕсли;
Если ДокументыПодготовки.Следующий() Тогда
ВызватьИсключение "Не должно быть других документов собственного стенда";
КонецЕсли;
СвойВид = ПланыВидовРасчета.Уч85ВидыПаспорта.УчебноеНачисление;
ОбъектВида = СвойВид.ПолучитьОбъект();
Если ОбъектВида = Неопределено Тогда
ВызватьИсключение "Нужен реально созданный собственный предопределённый вид";
КонецЕсли;
Если ОбъектВида.БазовыеВидыРасчета.Количество() <> 0
Или ОбъектВида.ВедущиеВидыРасчета.Количество() <> 0
Или ОбъектВида.ВытесняющиеВидыРасчета.Количество() <> 0 Тогда
ВызватьИсключение "Этот опыт не допускает базовых, ведущих или вытесняющих зависимостей";
КонецЕсли;
ПрочитатьПаспорта(РегистрыРасчета.Уч85Паспорта.Выбрать(), СвойРегистратор, СвойВид, "A,B");
ПрочитатьПаспорта(РегистрыРасчета.Уч85Паспорта.ВыбратьПоРегистратору(СвойРегистратор), СвойРегистратор, СвойВид, "A,B");
ПрочитатьПаспорта(РегистрыРасчета.Уч85Паспорта.Выбрать(Дата(2026, 10, 1), Дата(2026, 10, 31, 23, 59, 59),
Новый Структура("Участник", "B"), "Возр"), СвойРегистратор, СвойВид, "B");
Пустая = РегистрыРасчета.Уч85Паспорта.Выбрать(Дата(2026, 11, 1), Дата(2026, 11, 30, 23, 59, 59));
Если Пустая.Следующий() Тогда
ВызватьИсключение "В ноябре собственных движений нет";
КонецЕсли;
Сообщить("Прочитаны реальные движения 001, вариант по регистратору и один индексированный отбор. Записать в этом общем модуле нет.");
КонецПроцедуры
Процедура ПрочитатьПаспорта(Выборка, СвойРегистратор, СвойВид, ОжидаемыеКлючи)
Если ТипЗнч(Выборка) <> Тип("РегистрРасчетаВыборка.Уч85Паспорта") Тогда
ВызватьИсключение "Нужна настоящая специализированная выборка своего регистра";
КонецЕсли;
НайденныеКлючи = Новый Массив;
Пока Выборка.Следующий() Цикл
Ключ = Выборка.Участник;
Если Ключ = "A" Тогда
Номер = 1;
Начало = Дата(2026, 10, 1);
Конец = Дата(2026, 10, 15, 23, 59, 59);
Сумма = 100;
ИначеЕсли Ключ = "B" Тогда
Номер = 2;
Начало = Дата(2026, 10, 16);
Конец = Дата(2026, 10, 31, 23, 59, 59);
Сумма = 200;
Иначе
ВызватьИсключение "Неизвестное движение своего стенда";
КонецЕсли;
Если НайденныеКлючи.Найти(Ключ) <> Неопределено Или Выборка.Регистратор <> СвойРегистратор
Или Выборка.НомерСтроки <> Номер Или Выборка.ВидРасчета <> СвойВид
Или Не Выборка.Активность Или Выборка.Сторно Или Выборка.Сумма <> Сумма
Или Выборка.ПериодРегистрации <> Дата(2026, 10, 1)
Или Выборка.ПериодДействия <> Дата(2026, 10, 1)
Или Выборка.ПериодДействияНачало <> Начало Или Выборка.ПериодДействияКонец <> Конец
Или Выборка.БазовыйПериодНачало <> Дата(2026, 9, 1)
Или Выборка.БазовыйПериодКонец <> Дата(2026, 9, 30, 23, 59, 59) Тогда
ВызватьИсключение "Не совпал паспорт собственной сохранённой строки расчёта";
КонецЕсли;
ФактическиеИнтервалы = Выборка.ФактическийПериодДействия;
Если ТипЗнч(ФактическиеИнтервалы) <> Тип("ФиксированныйМассив") Тогда
ВызватьИсключение "Фактический период — фиксированный массив, не одна пара дат";
КонецЕсли;
Если ФактическиеИнтервалы.Количество() <> 1 Тогда
ВызватьИсключение "В собственном опыте без вытеснения ожидается один фактический интервал";
КонецЕсли;
Для Каждого Интервал Из ФактическиеИнтервалы Цикл
Если ТипЗнч(Интервал) <> Тип("ЭлементФактическогоПериодаДействия")
Или Интервал.ДатаНачала <> Начало Или Интервал.ДатаОкончания <> Конец Тогда
ВызватьИсключение "Фактический интервал без вытеснения должен совпасть с заданным действием";
КонецЕсли;
Сообщить(Ключ + ": фактический интервал " + Строка(Интервал.ДатаНачала) + " — " + Строка(Интервал.ДатаОкончания));
КонецЦикла;
НайденныеКлючи.Добавить(Ключ);
Сообщить("Строка " + Строка(Выборка.НомерСтроки) + ": регистрация " + Строка(Выборка.ПериодРегистрации)
+ "; месяц действия " + Строка(Выборка.ПериодДействия) + "; база " + Строка(Выборка.БазовыйПериодНачало)
+ " — " + Строка(Выборка.БазовыйПериодКонец));
КонецЦикла;
Если СтрСоединить(НайденныеКлючи, ",") <> ОжидаемыеКлючи Тогда
ВызватьИсключение "Количество и порядок собственных строк отличаются от подготовленных";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойКонтекст()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужен собственный стенд УчебнаяВыборкаРасчета85 платформы 8.5.1.1343";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедурыУч85Паспорт.МодульОбъекта
УчебнаяВыборкаРасчета85 → Документы → Уч85Паспорт → Модуль объекта
Полный модуль своего документа, только для будущего ручного проведения; выполняется в транзакции проведения. Не выполнялся.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или ЭтотОбъект.Номер <> "001" Или ЭтотОбъект.Дата <> Дата(2026, 10, 15, 12, 0, 0) Тогда
Отказ = Истина;
ВызватьИсключение "Проводить можно только собственный учебный 001 в подготовленном стенде";
КонецЕсли;
Набор = ЭтотОбъект.Движения.Уч85Паспорта;
Набор.Записывать = Истина;
Набор.Очистить();
Для Номер = 1 По 2 Цикл
Запись = Набор.Добавить();
Запись.Активность = Истина;
Запись.Сторно = Ложь;
Запись.ПериодРегистрации = ЭтотОбъект.Дата;
Запись.ВидРасчета = ПланыВидовРасчета.Уч85ВидыПаспорта.УчебноеНачисление;
Запись.БазовыйПериодНачало = Дата(2026, 9, 1);
Запись.БазовыйПериодКонец = Дата(2026, 9, 30, 23, 59, 59);
Если Номер = 1 Тогда
Запись.Участник = "A";
Запись.Сумма = 100;
Запись.ПериодДействияНачало = Дата(2026, 10, 1);
Запись.ПериодДействияКонец = Дата(2026, 10, 15, 23, 59, 59);
Иначе
Запись.Участник = "B";
Запись.Сумма = 200;
Запись.ПериодДействияНачало = Дата(2026, 10, 16);
Запись.ПериодДействияКонец = Дата(2026, 10, 31, 23, 59, 59);
КонецЕсли;
КонецЦикла;
КонецПроцедурыУчебныеПаспортаРасчета85.Пульт
УчебнаяВыборкаРасчета85 → Обработки → УчебныеПаспортаРасчета85 → Формы → Пульт → Модуль
Полный модуль собственной обычной формы; не выполнялся.
Процедура ВыполнитьНажатие(Кнопка)
УчебныеПаспортаРасчета85.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
В подготовке участвует собственное настоящее проведение, а не плановый UUID. ОбработкаПроведения заполняет выбранный набор Движения и ставит Записывать=Истина; платформа сохранит его в транзакции проведения. В обработчик не переносится guard с запретом любой активной транзакции, НачатьТранзакцию и ручной Записать отсутствуют.
Основной модуль проверяет флаги действия/базы и периодичность. У необязательных полей нет универсального существования: БазовыйПериод* доступны лишь при включённой базе, ПериодДействия* и ФактическийПериодДействия — лишь при включённом действии.
Читаем единственный сохранённый проведённый 001 и сохраняем его Ссылка. Это документ-регистратор, не номер документа и не случайная ссылка. Наличие лишнего документа, неправильной даты, пометки или отсутствующих зависимостей подготовки останавливает урок.
Выбрать формирует специализированную выборку, не массив и не объект записи. Следующий надо вызвать перед первым чтением свойств и далее до False; после False текущую строку не читаем.
Сравниваем Активность=True, Сторно=False, НомерСтроки=1/2 и ВидРасчета с настоящим своим предопределённым видом. НомерСтроки начинается с 1, а не с индекса 0. Ресурс Сумма сам по себе не доказывает вычисление зарплаты.
Документ датирован серединой октября, но ПериодРегистрации помесячного регистра — 01.10.2026. ПериодДействия тоже месяц начала действия, хотя сами начало/конец A и B разные. Базовый период — весь сентябрь; он не обязан совпадать ни с регистрацией, ни с действием.
ФактическийПериодДействия — ФиксированныйМассив элементов ЭлементФактическогоПериодаДействия. Читаем readonly ДатаНачала/ДатаОкончания каждого. У собственного стенда без вытесняющих зависимостей один интервал совпадает с заданным действием; при реальном вытеснении это предположение уже неверно.
ВыбратьПоРегистратору получает настоящую ссылку 001 и повторяет A/B. Общий Выбрать получает календарный интервал регистрации и Структура ровно с одним индексированным измерением Участник=B; порядок только Возр/Убыв, не произвольный список полей. Ожидается лишь B с исходным номером строки 2.
Ноябрьская выборка пуста и проверяется только через Следующий. После обхода сверяем точный состав/порядок ключей: неизвестные и повторные строки не допускаются. Все свойства выборки только читаются.
Как проверить результат
Будущий тест: F7 всех трёх модулей, проведение только своего 001, запуск Пульта. Общий и по-регистратору обходы дают A/B; одноэлементный отбор даёт B; ноябрь пуст.
ПериодРегистрации и ПериодДействия обеих строк — 01.10.2026. База — 01.09–30.09 23:59:59. Фактический интервал A — 01.10–15.10 23:59:59, B — 16.10–31.10 23:59:59 только в этом стенде без вытеснения.
Реальный регистратор совпадает с сохранённым 001, НомерСтроки 1/2, активность True, сторно False, вид настоящий. Суммы 100/200 — заданные учебные значения, не расчёт зарплаты.
Если фактический массив пуст, не совпал или движения отсутствуют, опыт НЕ успешен: проверить собственное проведение, выбранный набор и флаги, не подменять проверку захардкоженным массивом.
При выключенном действии/базе основной guard должен остановить опыт до чтения условных полей. При добавленном втором документе или непредусмотренной зависимости урок также отказывает.
Ожидаемый результат
Будущий результат: три согласованных обхода реально сохранённых движений и различие регистрации/действия/базы/фактических интервалов. Главный модуль ничего не записывает; подготовка требует своего ручного проведения. В 1С не проверялось.
На что обратить внимание
Это технический опыт паспорта строк, не методология зарплаты и не вычисление базы. Для ПолучитьБазу/графика нужен другой полностью подготовленный урок.
ФиксированныйМассив и его элементы readonly; никакого Новый ЭлементФактическогоПериодаДействия и присвоения свойств выборки нет.
Фактический период может состоять из нескольких непересекающихся интервалов из-за вытеснения. Равенство одному заданному интервалу — проверка только нашего стенда без таких правил.
В экспорте два пункта ФактическийПериодДействия: второй содержит технический суффикс. Обе исходные страницы установленной справки описывают тот же член. В BSL используется одно настоящее имя, суффикс не является API и не вставляется в код.
Основной модуль только читает, но самостоятельная подготовка через проведение реально сохраняет данные. Поэтому весь урок не помечен как полностью беззаписный; рабочие базы запрещены.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.