Паспорт движений расчёта: регистратор, три периода и фактические интервалы

Учебные задачи

Читаем реальные сохранённые движения собственного документа 001; сравниваем общий обход, выборку регистратора и один индексированный отбор. Отличаем месяц регистрации, заданное действие, базу и фактический период.

Где и как запускать

Полный обычный клиентский общий модуль УчебнаяВыборкаРасчета85 → УчебныеПаспортаРасчета85. Читает собственные сохранённые движения; подготовка отдельным объектным модулем. Не выполнялся.

Подготовка

  1. Создайте НОВУЮ отдельную файловую базу 8.5.1.1343: имя конфигурации УчебнаяВыборкаРасчета85, совместимость НеИспользовать, обычное приложение/толстый клиент. Не рабочая ЗУП/КА2/УТ/БП и не их копия. Нет расширений, общих реквизитов, разделителей, подписок, обмена, истории и фоновых прикладных заданий. Одна сессия. Здесь 1С не запускалась: runtimeVerifiedScenarios=0.

  2. План видов расчёта Уч85ВидыПаспорта: строковый код 10, наименование 100, ИспользованиеПериодаДействия=Да, ЗависимостьОтВидовРасчета=ПоПериодуРегистрации. Единственный предопределённый вид УчебноеНачисление с кодом DEMO и именем Учебное начисление. Базовые/ведущие/вытесняющие виды пусты. Модули плана пустые. Этот вид не содержит формулу зарплаты.

  3. Регистр расчёта Уч85Паспорта: периодичность Месяц, план Уч85ВидыПаспорта, Период действия=Да, Базовый период=Да. Единственное измерение Участник: Строка(10), Индексировать, базовое; ресурс Сумма: Число(15,2). Без графика, перерасчётов и других полей; модуль набора пустой. В этом варианте обязательные флаги периодов включены, не переиспользуйте стенд предыдущего урока с выключенными периодами.

  4. Документ Уч85Паспорт: номер Строка(3), длина 3, без реквизитов и табличных частей, Проведение=Разрешить; в Движения включите только Уч85Паспорта. В модуль ОБЪЕКТА вставьте полный отдельный ОбработкаПроведения ниже. Остальные обработчики пустые. Сначала F7 и обновление только своего стенда.

  5. Вручную создайте ровно один документ: номер 001, дата 15.10.2026 12:00:00. Проведите его только в своей новой учебной базе. Это БУДУЩАЯ реальная запись подготовки: платформа запишет две строки движений и рассчитает фактические периоды. Здесь никакая запись или проведение не выполнялись. Основной урок ниже только читает уже сохранённые строки.

  6. Общий модуль УчебныеПаспортаРасчета85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, Привилегированный=Нет; остальные клиентские флаги=Нет. Вставьте полный основной модуль. Обработка УчебныеПаспортаРасчета85 → обычная форма Пульт → кнопка Выполнить → действие ВыполнитьНажатие; её полный отдельный модуль ниже. Не смешивайте три модуля в одном.

  7. После собственного проведения откройте Пульт. Не создавайте второй документ, не меняйте движения вручную и не добавляйте Записать в основной модуль. Две строки имеют реальную ссылку 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.ВыполнитьПример();
КонецПроцедуры

Разбор по шагам

  1. В подготовке участвует собственное настоящее проведение, а не плановый UUID. ОбработкаПроведения заполняет выбранный набор Движения и ставит Записывать=Истина; платформа сохранит его в транзакции проведения. В обработчик не переносится guard с запретом любой активной транзакции, НачатьТранзакцию и ручной Записать отсутствуют.

  2. Основной модуль проверяет флаги действия/базы и периодичность. У необязательных полей нет универсального существования: БазовыйПериод* доступны лишь при включённой базе, ПериодДействия* и ФактическийПериодДействия — лишь при включённом действии.

  3. Читаем единственный сохранённый проведённый 001 и сохраняем его Ссылка. Это документ-регистратор, не номер документа и не случайная ссылка. Наличие лишнего документа, неправильной даты, пометки или отсутствующих зависимостей подготовки останавливает урок.

  4. Выбрать формирует специализированную выборку, не массив и не объект записи. Следующий надо вызвать перед первым чтением свойств и далее до False; после False текущую строку не читаем.

  5. Сравниваем Активность=True, Сторно=False, НомерСтроки=1/2 и ВидРасчета с настоящим своим предопределённым видом. НомерСтроки начинается с 1, а не с индекса 0. Ресурс Сумма сам по себе не доказывает вычисление зарплаты.

  6. Документ датирован серединой октября, но ПериодРегистрации помесячного регистра — 01.10.2026. ПериодДействия тоже месяц начала действия, хотя сами начало/конец A и B разные. Базовый период — весь сентябрь; он не обязан совпадать ни с регистрацией, ни с действием.

  7. ФактическийПериодДействия — ФиксированныйМассив элементов ЭлементФактическогоПериодаДействия. Читаем readonly ДатаНачала/ДатаОкончания каждого. У собственного стенда без вытесняющих зависимостей один интервал совпадает с заданным действием; при реальном вытеснении это предположение уже неверно.

  8. ВыбратьПоРегистратору получает настоящую ссылку 001 и повторяет A/B. Общий Выбрать получает календарный интервал регистрации и Структура ровно с одним индексированным измерением Участник=B; порядок только Возр/Убыв, не произвольный список полей. Ожидается лишь B с исходным номером строки 2.

  9. Ноябрьская выборка пуста и проверяется только через Следующий. После обхода сверяем точный состав/порядок ключей: неизвестные и повторные строки не допускаются. Все свойства выборки только читаются.

Как проверить результат

  1. Будущий тест: F7 всех трёх модулей, проведение только своего 001, запуск Пульта. Общий и по-регистратору обходы дают A/B; одноэлементный отбор даёт B; ноябрь пуст.

  2. ПериодРегистрации и ПериодДействия обеих строк — 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 только в этом стенде без вытеснения.

  3. Реальный регистратор совпадает с сохранённым 001, НомерСтроки 1/2, активность True, сторно False, вид настоящий. Суммы 100/200 — заданные учебные значения, не расчёт зарплаты.

  4. Если фактический массив пуст, не совпал или движения отсутствуют, опыт НЕ успешен: проверить собственное проведение, выбранный набор и флаги, не подменять проверку захардкоженным массивом.

  5. При выключенном действии/базе основной guard должен остановить опыт до чтения условных полей. При добавленном втором документе или непредусмотренной зависимости урок также отказывает.

Ожидаемый результат

Будущий результат: три согласованных обхода реально сохранённых движений и различие регистрации/действия/базы/фактических интервалов. Главный модуль ничего не записывает; подготовка требует своего ручного проведения. В 1С не проверялось.

На что обратить внимание

  1. Это технический опыт паспорта строк, не методология зарплаты и не вычисление базы. Для ПолучитьБазу/графика нужен другой полностью подготовленный урок.

  2. ФиксированныйМассив и его элементы readonly; никакого Новый ЭлементФактическогоПериодаДействия и присвоения свойств выборки нет.

  3. Фактический период может состоять из нескольких непересекающихся интервалов из-за вытеснения. Равенство одному заданному интервалу — проверка только нашего стенда без таких правил.

  4. В экспорте два пункта ФактическийПериодДействия: второй содержит технический суффикс. Обе исходные страницы установленной справки описывают тот же член. В BSL используется одно настоящее имя, суффикс не является API и не вставляется в код.

  5. Основной модуль только читает, но самостоятельная подготовка через проведение реально сохраняет данные. Поэтому весь урок не помечен как полностью беззаписный; рабочие базы запрещены.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.