РегистрБухгалтерииМенеджер.<Имя регистра бухгалтерии>.УстановитьИспользованиеИтогов

Методы · SetTotalsUsing

Устанавливает признак использования итогов. Если использование итогов отключено, то при записи набора записей регистра не будет производиться пересчет итогов, но при этом будут не доступны виртуальные таблицы расчета остатков и оборотов. Данный режим работы регистра позволяет повысить скорость записи набора записей регистра. Он может быть полезен при массовых загрузках данных. При установке признака использования итогов производится пересчет только тех итогов, которые зависят от движений, сделанных в момент, когда итоги были выключены.

Синтаксис

УстановитьИспользованиеИтогов(<Признак>)
Полное описание, параметры и ограничения

РегистрБухгалтерииМенеджер.<Имя регистра бухгалтерии>.УстановитьИспользованиеИтогов (AccountingRegisterManager.<Accounting register name>.SetTotalsUsing)

РегистрБухгалтерииМенеджер.<Имя регистра бухгалтерии> (AccountingRegisterManager.<Accounting register name>)

УстановитьИспользованиеИтогов (SetTotalsUsing)

Доступен, начиная с версии 8.0.

Синтаксис:
УстановитьИспользованиеИтогов(<Признак>)
Параметры:

<Признак> (обязательный)
Тип: Булево.
Признак использования итогов. Ложь - пересчет итогов не производится.
Описание:

Устанавливает признак использования итогов. Если использование итогов отключено, то при записи набора записей регистра не будет производиться пересчет итогов, но при этом будут не доступны виртуальные таблицы расчета остатков и оборотов.
Данный режим работы регистра позволяет повысить скорость записи набора записей регистра. Он может быть полезен при массовых загрузках данных.
При установке признака использования итогов производится пересчет только тех итогов, которые зависят от движений, сделанных в момент, когда итоги были выключены.

Доступность:

Сервер, толстый клиент, внешнее соединение.

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Обслужить итоги своего бухгалтерского регистра и сверить кассу500

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

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

Полный собственный серверный общий модуль УчебныйПультБухИтогов85 с ВызовСервера. Отдельный полный модуль управляемой формы пульта; толстый клиент8.5.1.1343. Подготовка данных выполняется только отдельной ручной кнопкой перед обслуживанием.

Подготовка

  1. Новый одноразовый файловый стенд на собственнойVM, не копия/расширение рабочейУТ/КА/БП/УНФ. Имя корневой конфигурации: УчебноеОбслуживаниеБухИтогов85. Только однаИБ/один свой пользователь-администратор/один сеанс; другие сеансы, фоновые работы и внешние программы вручную исключены.

  2. Платформа именно8.5.1.1343, толстый клиент управляемое приложение. Режим совместимости Не использовать, режим блокировок управляемый. Флажок формы подтверждает ручную подготовку, не доказывает отсутствие другого сеанса или физическую изоляцию.

  3. Планы счетов → УчебныеСчетаИтогов85: кодСтрока20, без пользовательских реквизитов/признаков учета, Максимальное количество субконто0 и нет плана видов характеристик. Это игрушечный план, не нормативный бухучет.

  4. Создайте3предопределенных счета: УчебнаяКасса кодOWN-CASH видАктивный; УчебныеЗапасы кодOWN-STOCK видАктивный; УчебныйКапитал кодOWN-CAPITAL видПассивный. Каждый балансовый, не удален, родитель пустой, таблицаВидыСубконто пуста. Других счетов/групп/обычных записей нет.

  5. Документы → УчебныйПакетИтогов85: номерСтрока40, автонумерация выключена, проведение запрещено. Единственный реквизит UUIDОпыта85, единственный тип УникальныйИдентификатор. Табличных частей нет, модуль документа пустой.

  6. Регистры бухгалтерии → УчебныеБухИтоги85: планУчебныеСчетаИтогов85, КорреспонденцияДа, Длина уточнения периода3. Единственный регистратор УчебныйПакетИтогов85.

  7. Единственное измерение регистра UUIDОпыта85: единственный типУникальныйИдентификатор, БалансовыйДа, ИндексированиеИндексировать, обязательное заполнение. Единственный ресурс Сумма: Число15,2, БалансовыйДа. Реквизитов/других измерений/ресурсов нет. Модуль набора пустой.

  8. Все другие справочники/документы/планы/регистры/общие реквизиты/подписки/регламентные задания/внешние источники/расширения отсутствуют. У собственного пользователя права чтения/записи/изменения только своей схемы и администрирования нового учебного стенда; никакого привилегированного режима.

  9. Один общий модуль УчебныйПультБухИтогов85: СерверДа, Вызов сервераДа; остальные клиентские/внешнее соединение/глобальный/привилегированныйНет; Повторное использование возвращаемых значений Не использовать. Вставьте основной полный серверный модуль целиком.

  10. Одна общая управляемая форма УчебнаяФормаБухИтогов85. Реквизит ИтогБух85: Строка неограниченной длины, многострочное поле ТолькоПросмотрДа. Реквизит ПодтвержденЕдинственныйСвойСеанс85: Булево, начальноеЛожь, флажок.

  11. Две команды/кнопки формы: ПодготовитьСвойОпыт85 и СледующийСвойЭтап85; действия одноименных процедур. Вставьте дополнительный полный модуль формы. Client state — переменные модуля, не реквизиты/записиИБ.

  12. F7 и обновление только собственной новой конфигурации. Убедитесь, что предопределенные счета создались как данные; документы/проводки должны быть0. Общее использование итогов нового регистра должно быть включено до опыта; код его при подготовке автоматически не исправляет.

  13. Откройте единственную общую форму вручную через функции учебной базы. После собственной ручной проверки одиночного стенда отметьте флажок. ПодготовитьСвойОпыт85 нажимается ОДИН раз: это отдельная явная ручная подготовка данных перед административными этапами, не автоматический запуск при открытии.

  14. Подготовка генерирует свой UUID, записывает один собственный документ и3проводки в одной собственной транзакции:01.10.2026 09:00 ДтКасса/КтКапитал1000;02.10 10:00 ДтЗапасы/КтКасса3×250=750;02.10 15:00 ДтКасса/КтЗапасы1×250=250. Набор замещается только под только что созданным собственным регистратором после проверки0данных всейИБ.

  15. Commit подготовки сохраняет только свои документ/3движения. Ошибка после commit не означает отмену данных; при неизвестном результате повтор подготовки запрещен. Транзакция подготовки не обещает отката административных настроек последующих отдельных шагов.

  16. Сумма строк1000+750+250=2000 — не остаток. Независимая модель: касса1000−750+250=500; запасы750−250=500; кредит капитала1000. Касса оборотыДт1250/Кт750; запасыДт750/Кт250; капиталДт0/Кт1000.

  17. Субконто полностью отсутствуют. В методах менеджера Остатки/Обороты их параметры условно отсутствовали бы; этот урок не угадывает колонки managerTable, а использует ДОКУМЕНТИРОВАННЫЕ виртуальные таблицы запросов и поля СуммаОстатокДт/Кт, СуммаОборотДт/Кт с собственными алиасамиДт/Кт.

  18. Для отчетной границы создается Граница по точнойДате: до покупки Исключая, после покупки Включая. Дата для Остатки менеджера означала бы начало дня, поэтому нельзя подменять границу временем10:00 в простоДате. На конец03.10 Исключая должны получиться500/500/1000.

  19. Нажимайте СледующийСвойЭтап85 вручную по одному разу, читайте результат перед следующим.12шагов: диапазонSep–Oct; minOct; maxNov; переключение текущих; разделения; использованиеИтоговЛожь; использованиеИтоговИстина; пересчетОктября; отдельное включение текущих; пересчет текущих; полный; отдельный возврат двух булевых режимов.

  20. Исходные3Булево/2Дата реально читаются после подготовки и копируются независимо. Каждый следующий шаг требует точного совпадения всего currentprofile с последним собственным подтвержденным snapshot и вновь проверяет ВСЕ3движения/единственный документ/ровно3счета. Нет hiddensetter по чужому состоянию.

  21. Изменение режима/пересчет относится ко ВСЕМУ своему регистру, не только UUIDотбору. Поэтому обязательны проверки всего регистра/одна собственнаяИБ/один сеанс. Совпадение снимков не гарантирует атомарность или исключает вмешательство между проверкой и действием.

  22. При выключенном общем использовании итогов raw3строки проверяются, но виртуальные остатки/обороты намеренно НЕ вызываются. В этот промежуток урок не записывает новые движения: не выдумывает массовую загрузку или обязательный пересчет новых записей.

  23. УстановитьИспользованиеТекущихИтогов возвращаетБулево, native не описывает его как прежний флаг/успех. Только тип ответа и независимый freshgetter подтверждают новое состояние. Разделение относится к параллельности записей итогов, не разделению данных и не измеренному ускорению одного сеанса.

  24. Месячные периоды хранения не фильтруют/не удаляют проводки: минимум нормализуется к началу месяца, максимум по31.10 соответствует итогам01.11, по30.11 —01.12. При режиме8.3.2илиниже getter минимума мог бы вернуть0001; этот режим исключен.

  25. После каждого включенного этапа заново сверяются реальные virtual500/500/1000, обороты и обе точные границы покупки. Не ищем любое совпавшее число в произвольной колонке. Шаг9отдельно подтверждает включение текущих до их пересчета на10шаге; допустимость вызова при выключенном режиме не предполагаем. После полного пересчета12шаг явно возвращает исходные текущие/разделение с промежуточнымfreshreadback; общее использование уже вернулосьИстина на7шаге.

  26. Диапазон хранения итогов остается собственным новым Oct–Nov и НЕ восстанавливается. Это намеренно одноразовая учебнаяИБ, не инструмент возвращения всех административных настроек. Ошибка любого этапа означает неизвестное состояние; автоматического retry/rollback/слепого восстановления нет.

  27. ПолучитьМакет исключен: установленнаяRU/EN HTML+.st показывают0params без объясненного выбора собственного макета. ПолучитьФорму/ПолучитьФормуСписка здесь не добавлены ради числа; требуются отдельные preparedordinaryform workflows.

  28. Actual1C/DB/UI/network/files/settings0: сейчас только написаны модули/проверены статически; подготовка/запись/commit/настройки описаны для будущего ручного запуска в собственнойИБ. Production/config/root только чтение, новых резервных копий/архивов0.

Функция ПодготовитьСвоиПроводки85() Экспорт
    ПроверитьСвоюСхемуИтогов85();
    Счета = ПрочитатьТриСвоихСчета85();
    Если СобственноеКоличество85("Документ.УчебныйПакетИтогов85") <> 0
        Или СобственноеКоличество85("РегистрБухгалтерии.УчебныеБухИтоги85") <> 0 Тогда
        ВызватьИсключение "Подготовка только один раз в новой собственной базе с0документов/проводок; существующее не замещаем";
    КонецЕсли;
    Менеджер = РегистрыБухгалтерии.УчебныеБухИтоги85;
    Если Не Менеджер.ПолучитьИспользованиеИтогов() Тогда
        ВызватьИсключение "В новом стенде вручную подготовьте включенное использование итогов до урока; скрытого включения нет";
    КонецЕсли;
    UUIDОпыта = Новый УникальныйИдентификатор;
    НачатьТранзакцию();
    Попытка
        Документ = Документы.УчебныйПакетИтогов85.СоздатьДокумент();
        Документ.Дата = Дата(2026, 10, 2, 16, 0, 0);
        Документ.Номер = Строка(UUIDОпыта);
        Документ.UUIDОпыта85 = UUIDОпыта;
        Документ.Записать();
        Набор = Менеджер.СоздатьНаборЗаписей();
        Набор.Отбор.Регистратор.Установить(Документ.Ссылка);
        ДобавитьСвоюПроводку85(Набор, Дата(2026, 10, 1, 9, 0, 0), Счета.Касса, Счета.Капитал, 1000, UUIDОпыта, Документ.Ссылка);
        ДобавитьСвоюПроводку85(Набор, Дата(2026, 10, 2, 10, 0, 0), Счета.Запасы, Счета.Касса, 3 * 250, UUIDОпыта, Документ.Ссылка);
        ДобавитьСвоюПроводку85(Набор, Дата(2026, 10, 2, 15, 0, 0), Счета.Касса, Счета.Запасы, 1 * 250, UUIDОпыта, Документ.Ссылка);
        Набор.Записать(Истина);
        UUIDДокумента = Строка(Документ.Ссылка.УникальныйИдентификатор());
        ПроверитьВсеСвоиПроводки85(UUIDДокумента, Строка(UUIDОпыта));
        ЗафиксироватьТранзакцию();
    Исключение
        Если ТранзакцияАктивна() Тогда
            ОтменитьТранзакцию();
        КонецЕсли;
        ВызватьИсключение;
    КонецПопытки;
    ПроверитьСвоиЧислаИтогов85(UUIDДокумента, Строка(UUIDОпыта));
    Профиль = ПрочитатьФактическийПрофиль85();
    Возврат Новый Структура("UUIDДокумента,UUIDОпыта,Исходный,Ожидаемый,Этап,Результат",
        UUIDДокумента, Строка(UUIDОпыта), Профиль, КопироватьСвойПрофиль85(Профиль), 0,
        "Подготовлены только собственные3проводки. Касса500, запасы500, кредит капитала1000. Следующий шаг1.");
КонецФункции

Процедура ДобавитьСвоюПроводку85(Набор, Период, СчетДт, СчетКт, Сумма, UUIDОпыта, СвояСсылка)
    Запись = Набор.Добавить();
    Запись.Период = Период;
    Запись.Активность = Истина;
    Запись.Регистратор = СвояСсылка;
    Запись.СчетДт = СчетДт;
    Запись.СчетКт = СчетКт;
    Запись.UUIDОпыта85 = UUIDОпыта;
    Запись.Сумма = Сумма;
КонецПроцедуры

Функция ВыполнитьСледующийСвойЭтап85(Состояние) Экспорт
    ПроверитьСвоюСхемуИтогов85();
    ПроверитьСвоеСостояние85(Состояние);
    ПроверитьВсеСвоиПроводки85(Состояние.UUIDДокумента, Состояние.UUIDОпыта);
    До = ПрочитатьФактическийПрофиль85();
    Если Не СовпадаютСвоиПрофили85(До, Состояние.Ожидаемый) Тогда
        ВызватьИсключение "Настройки уже не равны своему последнему подтвержденному состоянию; чужое изменение не перезаписываем";
    КонецЕсли;
    Если До.Итоги Тогда
        ПроверитьСвоиЧислаИтогов85(Состояние.UUIDДокумента, Состояние.UUIDОпыта);
    КонецЕсли;
    Менеджер = РегистрыБухгалтерии.УчебныеБухИтоги85;
    Шаг = Состояние.Этап + 1;
    Если Шаг = 1 Тогда
        Менеджер.УстановитьМинимальныйИМаксимальныйПериодыРассчитанныхИтогов(Дата(2026, 9, 1), Дата(2026, 10, 31, 23, 59, 59));
        Текст = "Задан диапазон хранения месячных итогов с сентября по октябрь; он не является отбором/удалением проводок.";
    ИначеЕсли Шаг = 2 Тогда
        Менеджер.УстановитьМинимальныйПериодРассчитанныхИтогов(Дата(2026, 10, 15, 12, 0, 0));
        Текст = "Минимум изменен на октябрь; native приводит произвольную дату к началу месяца.";
    ИначеЕсли Шаг = 3 Тогда
        Менеджер.УстановитьМаксимальныйПериодРассчитанныхИтогов(Дата(2026, 11, 30, 23, 59, 59));
        Текст = "Максимум задан по ноябрь; проверяем реальный getter и неизменные хозяйственные числа.";
    ИначеЕсли Шаг = 4 Тогда
        Ответ = Менеджер.УстановитьИспользованиеТекущихИтогов(Не Состояние.Исходный.Текущие);
        Если ТипЗнч(Ответ) <> Тип("Булево") Тогда
            ВызватьИсключение "Setter текущих итогов должен вернуть Булево; его смысл не объявляем старым флагом или доказательством ускорения";
        КонецЕсли;
        Текст = "Текущие итоги переключены относительно реального исходного флага; общий расчет остатков остается доступен.";
    ИначеЕсли Шаг = 5 Тогда
        Менеджер.УстановитьРежимРазделенияИтогов(Не Состояние.Исходный.Разделение);
        Текст = "Переключено разделение записей итогов. Один сеанс не измеряет параллельность и не доказывает ускорение.";
    ИначеЕсли Шаг = 6 Тогда
        Менеджер.УстановитьИспользованиеИтогов(Ложь);
        Текст = "Общее использование итогов выключено для всего своего регистра. Проверяем только raw3строки; виртуальные остатки/обороты не вызываем.";
    ИначеЕсли Шаг = 7 Тогда
        Менеджер.УстановитьИспользованиеИтогов(Истина);
        Текст = "Использование итогов включено обратно. Здесь при выключенном флаге новых движений не было: не изображаем массовую загрузку.";
    ИначеЕсли Шаг = 8 Тогда
        Менеджер.ПересчитатьИтогиЗаПериод(Дата(2026, 10, 1), Дата(2026, 10, 31, 23, 59, 59));
        Текст = "Пересчитаны итоги собственного октября; параметры этой операции Дата, не Граница отчетного остатка.";
    ИначеЕсли Шаг = 9 Тогда
        Если Не До.Текущие Тогда
            Ответ = Менеджер.УстановитьИспользованиеТекущихИтогов(Истина);
            Если ТипЗнч(Ответ) <> Тип("Булево") Тогда
                ВызватьИсключение "Не подтвержден тип отдельного включения текущих итогов перед их пересчетом";
            КонецЕсли;
        КонецЕсли;
        Текст = "Отдельная ручная подготовка текущих итогов к пересчету: freshgetter должен подтвердитьИстина; не предполагаем допустимость пересчета при выключенном режиме.";
    ИначеЕсли Шаг = 10 Тогда
        Если Не До.Текущие Тогда
            ВызватьИсключение "Свой пересчет текущих итогов вызываем только после подтвержденного включения отдельным предыдущим этапом";
        КонецЕсли;
        Менеджер.ПересчитатьТекущиеИтоги();
        Текст = "Пересчитаны текущие итоги. Никакого обещания включения флага Текущие, удаления движений или восстановления рабочих данных.";
    ИначеЕсли Шаг = 11 Тогда
        Менеджер.ПересчитатьИтоги();
        Текст = "Выполнен полный пересчет только единственного своего регистра; исходные проводки и суммы заново проверены.";
    ИначеЕсли Шаг = 12 Тогда
        Ответ = Менеджер.УстановитьИспользованиеТекущихИтогов(Состояние.Исходный.Текущие);
        Если ТипЗнч(Ответ) <> Тип("Булево") Тогда
            ВызватьИсключение "Ответ отдельного возврата текущих итогов не подтвержден; дальнейшую настройку не выполняем";
        КонецЕсли;
        ВозвратТекущих = ПрочитатьФактическийПрофиль85();
        Если ВозвратТекущих.Текущие <> Состояние.Исходный.Текущие
            Или ВозвратТекущих.Итоги <> До.Итоги Или ВозвратТекущих.Разделение <> До.Разделение
            Или ВозвратТекущих.Минимум <> До.Минимум Или ВозвратТекущих.Максимум <> До.Максимум Тогда
            ВызватьИсключение "Промежуточное свежее чтение возврата не подтверждено; второй флаг не трогаем";
        КонецЕсли;
        Менеджер.УстановитьРежимРазделенияИтогов(Состояние.Исходный.Разделение);
        Текст = "Два булевых режима возвращены явным отдельным шагом. Диапазон хранения итогов намеренно изменен и НЕ восстановлен: это одноразовая собственнаяИБ.";
    Иначе
        ВызватьИсключение "Свой маршрут уже завершен; повторных неявных изменений нет";
    КонецЕсли;
    После = ПрочитатьФактическийПрофиль85();
    ПроверитьФактическийРезультатЭтапа85(Шаг, До, После, Состояние.Исходный);
    ПроверитьВсеСвоиПроводки85(Состояние.UUIDДокумента, Состояние.UUIDОпыта);
    Если После.Итоги Тогда
        ПроверитьСвоиЧислаИтогов85(Состояние.UUIDДокумента, Состояние.UUIDОпыта);
        Текст = Текст + " Fresh readback: касса500, запасы500, капиталКт1000; обороты кассыДт1250/Кт750, запасовДт750/Кт250.";
    Иначе
        Текст = Текст + " Fresh rawreadback: собственных3записи, сумма строк2000; это НЕ остаток счета.";
    КонецЕсли;
    Возврат Новый Структура("UUIDДокумента,UUIDОпыта,Исходный,Ожидаемый,Этап,Результат",
        Состояние.UUIDДокумента, Состояние.UUIDОпыта, КопироватьСвойПрофиль85(Состояние.Исходный), После, Шаг, Текст);
КонецФункции

Процедура ПроверитьФактическийРезультатЭтапа85(Шаг, До, После, Исходный)
    Если Шаг = 1 Тогда
        Если После.Минимум <> Дата(2026, 9, 1) Или После.Максимум <> Дата(2026, 11, 1) Тогда
            ВызватьИсключение "Фактические месячные границы сентября/октября не подтверждены";
        КонецЕсли;
    ИначеЕсли Шаг = 2 Тогда
        Если После.Минимум <> Дата(2026, 10, 1) Или После.Максимум <> До.Максимум Тогда
            ВызватьИсключение "Свежий getter должен подтвердить начало октября без изменения максимума";
        КонецЕсли;
    ИначеЕсли Шаг = 3 Тогда
        Если После.Максимум <> Дата(2026, 12, 1) Или После.Минимум <> До.Минимум Тогда
            ВызватьИсключение "Свежий getter должен подтвердить итоговую границу01.12 после ноября";
        КонецЕсли;
    КонецЕсли;
    Если Шаг = 4 Тогда
        Если После.Текущие <> (Не Исходный.Текущие) Тогда
            ВызватьИсключение "Реальное переключение текущих итогов не подтверждено";
        КонецЕсли;
    ИначеЕсли Шаг = 5 Тогда
        Если После.Разделение <> (Не Исходный.Разделение) Тогда
            ВызватьИсключение "Реальное переключение разделения не подтверждено";
        КонецЕсли;
    ИначеЕсли Шаг = 6 Тогда
        Если После.Итоги Тогда
            ВызватьИсключение "Общее использование итогов должно быть выключено";
        КонецЕсли;
    ИначеЕсли Шаг = 7 Тогда
        Если Не После.Итоги Тогда
            ВызватьИсключение "Общее использование итогов должно быть включено";
        КонецЕсли;
    ИначеЕсли Шаг = 9 Тогда
        Если Не После.Текущие Тогда
            ВызватьИсключение "Нужен подтвержденный включенный режим перед собственным пересчетом текущих итогов";
        КонецЕсли;
    ИначеЕсли Шаг = 12 Тогда
        Если После.Текущие <> Исходный.Текущие Или После.Разделение <> Исходный.Разделение Или После.Итоги <> Исходный.Итоги Тогда
            ВызватьИсключение "Отдельный возврат исходных булевых режимов не подтвержден";
        КонецЕсли;
    КонецЕсли;
    Если Шаг <> 6 И Не После.Итоги Тогда
        ВызватьИсключение "Виртуальные расчеты следующего этапа требуют включенного общего использования итогов";
    КонецЕсли;
    Если Шаг <> 4 И Шаг <> 9 И Шаг <> 12 И После.Текущие <> До.Текущие Тогда
        ВызватьИсключение "Неожиданно изменился другой булев режим; состояние не принимаем";
    КонецЕсли;
    Если Шаг <> 5 И Шаг <> 12 И После.Разделение <> До.Разделение Тогда
        ВызватьИсключение "Неожиданно изменилось разделение; состояние не принимаем";
    КонецЕсли;
    Если Шаг >= 4 И (После.Минимум <> До.Минимум Или После.Максимум <> До.Максимум) Тогда
        ВызватьИсключение "Неожиданно изменились месячные периоды вне своего этапа настройки; новое состояние не принимаем";
    КонецЕсли;
КонецПроцедуры

Функция ПрочитатьФактическийПрофиль85()
    Менеджер = РегистрыБухгалтерии.УчебныеБухИтоги85;
    Профиль = Новый Структура("Итоги,Текущие,Разделение,Минимум,Максимум",
        Менеджер.ПолучитьИспользованиеИтогов(), Менеджер.ПолучитьИспользованиеТекущихИтогов(),
        Менеджер.ПолучитьРежимРазделенияИтогов(), Менеджер.ПолучитьМинимальныйПериодРассчитанныхИтогов(),
        Менеджер.ПолучитьМаксимальныйПериодРассчитанныхИтогов());
    ПроверитьТипыСвоегоПрофиля85(Профиль);
    Возврат Профиль;
КонецФункции

Процедура ПроверитьТипыСвоегоПрофиля85(Профиль)
    Если ТипЗнч(Профиль) <> Тип("Структура") Или Профиль.Количество() <> 5 Тогда
        ВызватьИсключение "Собственный фактический профиль имеет5точных полей";
    КонецЕсли;
    Для Каждого Имя Из СтрРазделить("Итоги,Текущие,Разделение,Минимум,Максимум", ",") Цикл
        Если Не Профиль.Свойство(Имя) Тогда
            ВызватьИсключение "Нет поля фактического профиля";
        КонецЕсли;
    КонецЦикла;
    Если ТипЗнч(Профиль.Итоги) <> Тип("Булево") Или ТипЗнч(Профиль.Текущие) <> Тип("Булево")
        Или ТипЗнч(Профиль.Разделение) <> Тип("Булево") Или ТипЗнч(Профиль.Минимум) <> Тип("Дата") Или ТипЗнч(Профиль.Максимум) <> Тип("Дата") Тогда
        ВызватьИсключение "Нужны реальные3Булево и2Дата, а не выдуманные исходные настройки";
    КонецЕсли;
КонецПроцедуры

Функция КопироватьСвойПрофиль85(Профиль)
    ПроверитьТипыСвоегоПрофиля85(Профиль);
    Возврат Новый Структура("Итоги,Текущие,Разделение,Минимум,Максимум", Профиль.Итоги,
        Профиль.Текущие, Профиль.Разделение, Профиль.Минимум, Профиль.Максимум);
КонецФункции

Функция СовпадаютСвоиПрофили85(Первый, Второй)
    ПроверитьТипыСвоегоПрофиля85(Первый);
    ПроверитьТипыСвоегоПрофиля85(Второй);
    Возврат Первый.Итоги = Второй.Итоги И Первый.Текущие = Второй.Текущие И Первый.Разделение = Второй.Разделение
        И Первый.Минимум = Второй.Минимум И Первый.Максимум = Второй.Максимум;
КонецФункции

Процедура ПроверитьСвоеСостояние85(Состояние)
    Если ТипЗнч(Состояние) <> Тип("Структура") Или Состояние.Количество() <> 6 Тогда
        ВызватьИсключение "Нужен реальный собственный state из подготовки/предыдущего этапа";
    КонецЕсли;
    Для Каждого Имя Из СтрРазделить("UUIDДокумента,UUIDОпыта,Исходный,Ожидаемый,Этап,Результат", ",") Цикл
        Если Не Состояние.Свойство(Имя) Тогда
            ВызватьИсключение "Не хватает поля собственного состояния";
        КонецЕсли;
    КонецЦикла;
    Если ТипЗнч(Состояние.Этап) <> Тип("Число") Или Состояние.Этап <> Цел(Состояние.Этап)
        Или Состояние.Этап < 0 Или Состояние.Этап > 11 Тогда
        ВызватьИсключение "Нужен собственный последовательный целый этап0..11";
    КонецЕсли;
    ПроверитьТипыСвоегоПрофиля85(Состояние.Исходный);
    ПроверитьТипыСвоегоПрофиля85(Состояние.Ожидаемый);
    Если Не Состояние.Исходный.Итоги Тогда
        ВызватьИсключение "В собственном исходном профиле общее использование итогов было включено";
    КонецЕсли;
КонецПроцедуры

Функция КаноническийСвойUUID85(Текст)
    Если ТипЗнч(Текст) <> Тип("Строка") Или СтрДлина(Текст) <> 36 Тогда
        ВызватьИсключение "Нужна каноническая строка собственного UUID";
    КонецЕсли;
    UUID = Новый УникальныйИдентификатор(Текст);
    Если Строка(UUID) <> Текст Или UUID = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
        ВызватьИсключение "Нужен ненулевой канонический UUID, не чужая/пустая ссылка";
    КонецЕсли;
    Возврат UUID;
КонецФункции

Процедура ПроверитьВсеСвоиПроводки85(UUIDДокумента, UUIDОпыта)
    UUID = КаноническийСвойUUID85(UUIDОпыта);
    Ссылка = Документы.УчебныйПакетИтогов85.ПолучитьСсылку(КаноническийСвойUUID85(UUIDДокумента));
    Документ = Ссылка.ПолучитьОбъект();
    Если Документ = Неопределено Тогда
        ВызватьИсключение "Собственный документ должен действительно существовать, ссылку не изображаем готовым объектом";
    КонецЕсли;
    Если Документ.ПометкаУдаления Или Документ.UUIDОпыта85 <> UUID Или Документ.Дата <> Дата(2026, 10, 2, 16, 0, 0)
        Или Документ.Номер <> UUIDОпыта Или СобственноеКоличество85("Документ.УчебныйПакетИтогов85") <> 1 Тогда
        ВызватьИсключение "Разрешен только единственный свой неизменный документ/UUID";
    КонецЕсли;
    Счета = ПрочитатьТриСвоихСчета85();
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ П.Период,П.Регистратор,П.Активность,П.СчетДт,П.СчетКт,П.UUIDОпыта85,П.Сумма
        |ИЗ РегистрБухгалтерии.УчебныеБухИтоги85 КАК П
        |УПОРЯДОЧИТЬ ПО П.Период";
    Данные = Запрос.Выполнить().Выгрузить();
    Если ТипЗнч(Данные) <> Тип("ТаблицаЗначений") Или Данные.Количество() <> 3 Тогда
        ВызватьИсключение "ВЕСЬ собственный регистр должен содержать ровно3свои проводки, не3строки отфильтрованной чужой базы";
    КонецЕсли;
    Периоды = Новый Массив;
    Периоды.Добавить(Дата(2026, 10, 1, 9, 0, 0));
    Периоды.Добавить(Дата(2026, 10, 2, 10, 0, 0));
    Периоды.Добавить(Дата(2026, 10, 2, 15, 0, 0));
    Дебет = Новый Массив;
    Дебет.Добавить(Счета.Касса);
    Дебет.Добавить(Счета.Запасы);
    Дебет.Добавить(Счета.Касса);
    Кредит = Новый Массив;
    Кредит.Добавить(Счета.Капитал);
    Кредит.Добавить(Счета.Касса);
    Кредит.Добавить(Счета.Запасы);
    Суммы = Новый Массив;
    Суммы.Добавить(1000);
    Суммы.Добавить(3 * 250);
    Суммы.Добавить(1 * 250);
    СуммаСтрок = 0;
    Для Индекс = 0 По 2 Цикл
        Проводка = Данные[Индекс];
        Если ТипЗнч(Проводка.Период) <> Тип("Дата") Или ТипЗнч(Проводка.Активность) <> Тип("Булево")
            Или ТипЗнч(Проводка.Сумма) <> Тип("Число") Или ТипЗнч(Проводка.UUIDОпыта85) <> Тип("УникальныйИдентификатор") Тогда
            ВызватьИсключение "Не совпали типы реально записанной своей проводки";
        КонецЕсли;
        Если Проводка.Период <> Периоды[Индекс] Или Не Проводка.Активность Или Проводка.Регистратор <> Ссылка
            Или Проводка.UUIDОпыта85 <> UUID Или Проводка.СчетДт <> Дебет[Индекс]
            Или Проводка.СчетКт <> Кредит[Индекс] Или Проводка.Сумма <> Суммы[Индекс] Тогда
            ВызватьИсключение "Изменена/добавлена не собственная точная проводка; обслуживание всего регистра запрещено";
        КонецЕсли;
        СуммаСтрок = СуммаСтрок + Проводка.Сумма;
    КонецЦикла;
    Если СуммаСтрок <> 2000 Тогда
        ВызватьИсключение "Сумма собственных движений1000+750+250 должна быть2000; это не остаток кассы";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСвоиЧислаИтогов85(UUIDДокумента, UUIDОпыта)
    ПроверитьВсеСвоиПроводки85(UUIDДокумента, UUIDОпыта);
    Если Не РегистрыБухгалтерии.УчебныеБухИтоги85.ПолучитьИспользованиеИтогов() Тогда
        ВызватьИсключение "При выключенных итогах виртуальные таблицы не вызываем; только rawподсчет";
    КонецЕсли;
    Счета = ПрочитатьТриСвоихСчета85();
    UUID = КаноническийСвойUUID85(UUIDОпыта);
    Конец = Новый Граница(Дата(2026, 10, 3), ВидГраницы.Исключая);
    ПроверитьОстатокСвоегоСчета85(Конец, UUID, Счета.Касса, 1000 - 3 * 250 + 1 * 250, 0);
    ПроверитьОстатокСвоегоСчета85(Конец, UUID, Счета.Запасы, 3 * 250 - 1 * 250, 0);
    ПроверитьОстатокСвоегоСчета85(Конец, UUID, Счета.Капитал, 0, 1000);
    ДоПокупки = Новый Граница(Дата(2026, 10, 2, 10, 0, 0), ВидГраницы.Исключая);
    ПослеПокупки = Новый Граница(Дата(2026, 10, 2, 10, 0, 0), ВидГраницы.Включая);
    ПроверитьОстатокСвоегоСчета85(ДоПокупки, UUID, Счета.Касса, 1000, 0);
    ПроверитьОстатокСвоегоСчета85(ПослеПокупки, UUID, Счета.Касса, 1000 - 3 * 250, 0);
    ПроверитьОстатокСвоегоСчета85(ДоПокупки, UUID, Счета.Запасы, 0, 0);
    ПроверитьОстатокСвоегоСчета85(ПослеПокупки, UUID, Счета.Запасы, 3 * 250, 0);
    Начало = Новый Граница(Дата(2026, 10, 1), ВидГраницы.Включая);
    ПроверитьОборотСвоегоСчета85(Начало, Конец, UUID, Счета.Касса, 1000 + 1 * 250, 3 * 250);
    ПроверитьОборотСвоегоСчета85(Начало, Конец, UUID, Счета.Запасы, 3 * 250, 1 * 250);
    ПроверитьОборотСвоегоСчета85(Начало, Конец, UUID, Счета.Капитал, 0, 1000);
КонецПроцедуры

Процедура ПроверитьОстатокСвоегоСчета85(ГраницаОстатка, UUID, Счет, ОжидаемыйДт, ОжидаемыйКт)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ О.СуммаОстатокДт КАК Дт, О.СуммаОстатокКт КАК Кт
        |ИЗ РегистрБухгалтерии.УчебныеБухИтоги85.Остатки(&Граница, Счет = &Счет, , UUIDОпыта85 = &UUID) КАК О";
    Запрос.УстановитьПараметр("Граница", ГраницаОстатка);
    Запрос.УстановитьПараметр("Счет", Счет);
    Запрос.УстановитьПараметр("UUID", UUID);
    ПроверитьСвоюЧисловуюТаблицу85(Запрос.Выполнить().Выгрузить(), ОжидаемыйДт, ОжидаемыйКт);
КонецПроцедуры

Процедура ПроверитьОборотСвоегоСчета85(Начало, Конец, UUID, Счет, ОжидаемыйДт, ОжидаемыйКт)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ О.СуммаОборотДт КАК Дт, О.СуммаОборотКт КАК Кт
        |ИЗ РегистрБухгалтерии.УчебныеБухИтоги85.Обороты(&Начало, &Конец, , Счет = &Счет, , UUIDОпыта85 = &UUID) КАК О";
    Запрос.УстановитьПараметр("Начало", Начало);
    Запрос.УстановитьПараметр("Конец", Конец);
    Запрос.УстановитьПараметр("Счет", Счет);
    Запрос.УстановитьПараметр("UUID", UUID);
    ПроверитьСвоюЧисловуюТаблицу85(Запрос.Выполнить().Выгрузить(), ОжидаемыйДт, ОжидаемыйКт);
КонецПроцедуры

Процедура ПроверитьСвоюЧисловуюТаблицу85(Таблица, ОжидаемыйДт, ОжидаемыйКт)
    Если ТипЗнч(Таблица) <> Тип("ТаблицаЗначений") Или Таблица.Колонки.Количество() <> 2
        Или Таблица.Колонки.Найти("Дт") = Неопределено Или Таблица.Колонки.Найти("Кт") = Неопределено Тогда
        ВызватьИсключение "Нужен реальный результат запроса с точно названными2числовыми колонками";
    КонецЕсли;
    Если Таблица.Количество() = 0 Тогда
        Если ОжидаемыйДт <> 0 Или ОжидаемыйКт <> 0 Тогда
            ВызватьИсключение "Реально пустая таблица не доказывает ненулевой ожидаемый остаток/оборот";
        КонецЕсли;
        Возврат;
    КонецЕсли;
    Если Таблица.Количество() <> 1 Тогда
        ВызватьИсключение "Свой счет/UUID без субконто должен дать не больше1строки, неизвестное не агрегируем незаметно";
    КонецЕсли;
    СтрокаЧисел = Таблица[0];
    Если ТипЗнч(СтрокаЧисел.Дт) <> Тип("Число") Или ТипЗнч(СтрокаЧисел.Кт) <> Тип("Число")
        Или СтрокаЧисел.Дт <> ОжидаемыйДт Или СтрокаЧисел.Кт <> ОжидаемыйКт Тогда
        ВызватьИсключение "Виртуальные числа отличаются от независимого расчета по собственным3проводкам";
    КонецЕсли;
КонецПроцедуры

Функция СобственноеКоличество85(Таблица)
    Если Таблица <> "Документ.УчебныйПакетИтогов85" И Таблица <> "РегистрБухгалтерии.УчебныеБухИтоги85"
        И Таблица <> "ПланСчетов.УчебныеСчетаИтогов85" Тогда
        ВызватьИсключение "Динамический запрос разрешен только для3точно своих таблиц";
    КонецЕсли;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Строк ИЗ " + Таблица;
    Данные = Запрос.Выполнить().Выгрузить();
    Если ТипЗнч(Данные) <> Тип("ТаблицаЗначений") Или Данные.Количество() <> 1 Или ТипЗнч(Данные[0].Строк) <> Тип("Число") Тогда
        ВызватьИсключение "Не получен реальный числовой count собственной таблицы";
    КонецЕсли;
    Возврат Данные[0].Строк;
КонецФункции

Функция ПрочитатьТриСвоихСчета85()
    Касса = ПланыСчетов.УчебныеСчетаИтогов85.УчебнаяКасса;
    Запасы = ПланыСчетов.УчебныеСчетаИтогов85.УчебныеЗапасы;
    Капитал = ПланыСчетов.УчебныеСчетаИтогов85.УчебныйКапитал;
    Если Касса.Пустая() Или Запасы.Пустая() Или Капитал.Пустая() Или Касса = Запасы Или Касса = Капитал Или Запасы = Капитал
        Или СобственноеКоличество85("ПланСчетов.УчебныеСчетаИтогов85") <> 3 Тогда
        ВызватьИсключение "Нужны ровно3разных существующих собственных предопределенных счета";
    КонецЕсли;
    Для Каждого Счет Из Новый Структура("Касса,Запасы,Капитал", Касса, Запасы, Капитал) Цикл
        Объект = Счет.Значение.ПолучитьОбъект();
        Если Объект = Неопределено Тогда
            ВызватьИсключение "Ссылка собственного счета должна реально иметь объект";
        КонецЕсли;
        Если Объект.ПометкаУдаления Или Не Объект.Предопределенный Или Объект.Забалансовый Или Объект.ВидыСубконто.Количество() <> 0 Тогда
            ВызватьИсключение "Свой счет балансовый, предопределенный, без удаления/субконто";
        КонецЕсли;
    КонецЦикла;
    Если Касса.Вид <> ВидСчета.Активный Или Запасы.Вид <> ВидСчета.Активный Или Капитал.Вид <> ВидСчета.Пассивный Тогда
        ВызватьИсключение "Виды собственных счетов отличаются от независимой модели";
    КонецЕсли;
    Возврат Новый Структура("Касса,Запасы,Капитал", Касса, Запасы, Капитал);
КонецФункции

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

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 1 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 1 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 1 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры
Полный модуль управляемой общей формы УчебнаяФормаБухИтогов85

Собственная CF → Общие → Общие формы → УчебнаяФормаБухИтогов85 → Модуль.

Собственная управляемая форма толстого клиента; две реальные команды явно вызывают свой серверный общий модуль без кэша и привилегий.

&НаКлиенте
Перем СвойОпытИтогов85;
&НаКлиенте
Перем ИсходНеизвестен85;

&НаКлиенте
Процедура ПодготовитьСвойОпыт85(Команда)
    ПроверитьСвоегоКлиентаИтогов85();
    Если СвойОпытИтогов85 <> Неопределено Или ИсходНеизвестен85 = Истина Тогда
        ВызватьИсключение "Подготовка не повторяется при существующем или неизвестном своем опыте";
    КонецЕсли;
    Если Не ПодтвержденЕдинственныйСвойСеанс85 Тогда
        ВызватьИсключение "Сначала вручную проверьте только свою одноразовуюИБ/один сеанс/отсутствие фоновых работ; флажок не является APIдоказательством";
    КонецЕсли;
    ИсходНеизвестен85 = Истина;
    Попытка
        СвойОпытИтогов85 = УчебныйПультБухИтогов85.ПодготовитьСвоиПроводки85();
        ИсходНеизвестен85 = Ложь;
        ИтогБух85 = СвойОпытИтогов85.Результат + Символы.ПС + "Свой документ:" + СвойОпытИтогов85.UUIDДокумента
            + Символы.ПС + "СвойUUID:" + СвойОпытИтогов85.UUIDОпыта;
    Исключение
        ИтогБух85 = "Подготовка не подтверждена. После commit данные могли сохраниться, возврат RPCмог потеряться."
            + " Не повторяйте подготовку и не меняйте рабочие базы. Диагностируйте только новый свой стенд; итог не называем откатанным.";
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура СледующийСвойЭтап85(Команда)
    ПроверитьСвоегоКлиентаИтогов85();
    Если СвойОпытИтогов85 = Неопределено Или ИсходНеизвестен85 = Истина Тогда
        ВызватьИсключение "Нет собственного подтвержденного состояния; автоматического повторения/rollbackнет";
    КонецЕсли;
    Если СвойОпытИтогов85.Этап >= 12 Тогда
        ВызватьИсключение "Все12явных шагов завершены; повторный маршрут не запускаем";
    КонецЕсли;
    Если Не ПодтвержденЕдинственныйСвойСеанс85 Тогда
        ВызватьИсключение "Допуск только для своего одноразового одиночного стенда";
    КонецЕсли;
    ИсходНеизвестен85 = Истина;
    Попытка
        СвойОпытИтогов85 = УчебныйПультБухИтогов85.ВыполнитьСледующийСвойЭтап85(СвойОпытИтогов85);
        ИсходНеизвестен85 = Ложь;
        ИтогБух85 = "Подтвержден свой этап" + Строка(СвойОпытИтогов85.Этап) + ":" + Символы.ПС + СвойОпытИтогов85.Результат;
    Исключение
        ИтогБух85 = "Административный этап не подтвержден. Его изменения могут сохраниться; прежний ожидаемый профиль НЕ является текущим."
            + " Не нажимайте повторно, не восстанавливайте вслепую. На этом одноразовом стенде ручная диагностика/окончание опыта; рабочих данных не касаемся.";
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвоегоКлиентаИтогов85()
#Если ТолстыйКлиентУправляемоеПриложение Тогда
#Иначе
    ВызватьИсключение "Этот пульт подготовлен только для толстого управляемого клиента";
#КонецЕсли
КонецПроцедуры

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

  1. Подготовьте строго новую схему и один собственный сеанс. Отдельная кнопка подготовки проверяет0документов/движений, создает один настоящий собственный документ и3проводки, затем commit и числовойreadback. Результат подготовки не подменяется неизвестной ссылкой.

  2. На каждый следующий ручной шаг передается только настоящее состояние прошлого ответа. Сервер проверяет exactschema, все существующие3проводки и равенство5фактических настроек последнему snapshot, а не только UUIDотбор чужой базы.

  3. Шаги1–3 изменяют месячные периоды хранения: Sep–Oct, минимумOct, максимумNov. Они не являются фильтрами движений: independentraw и отчетные500/500/1000 должны сохраниться.

  4. Шаги4–5 меняют текущие итоги/разделение относительно прочитанных исходныхBool. NativeBool ответа текущих итогов не изображается старым значением; freshgetter проверяет действительное состояние.

  5. Шаг6 выключает общие итоги всего своего регистра; читаются только3rawстроки/2000, не недоступные виртуальные таблицы. Шаг7 возвращает общий флагИстина и проверяет заново реальные остатки/обороты.

  6. Шаг8пересчитывает октябрь. Шаг9отдельно готовит включенный режим текущих; шаг10пересчитывает текущие, шаг11всеитоги. Каждый ручной этап проверяет freshqueries и точную before/after границу покупки.

  7. Шаг12 отдельно возвращает только собственные исходные текущие/разделение, с промежуточным чтением перед вторым setter и финальной проверкой. Месячный диапазон намеренно остается измененным на одноразовом стенде.

  8. При исключении client помечает исход неизвестным и запрещает дальнейшие кнопки. Настройки/данные могут уже измениться: никакого атомарного обещания/автоматического rollback/повторения по старому snapshot.

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

  1. Подготовка: весь собственный регистр ровно3активных строки с единственным настоящимUUID/регистратором и периодами09:00/10:00/15:00; сумма строк2000. Неподготовленная ссылка/лишний счет/документ/проводка/расширение вызывает отказ.

  2. Виртуальные проверки: конец03.10 — кассаДт500/Кт0, запасыДт500/Кт0, капиталДт0/Кт1000; обороты1250/750,750/250,0/1000. Нет поиска любого подходящего числа среди произвольных колонок.

  3. До покупки10:00 Исключая: касса1000, запасы0. Включая тот же момент: касса250, запасы750. При нулевом ожидаемом остатке настоящий пустой результат допускается, при ненулевом — нет.

  4. Все5настроек берутся из реальных getters; шаг1минимум01.09/max01.11, шаг2min01.10, шаг3max01.12. Изменение месячного диапазона не меняет суммы3проводок.

  5. При общихИтогахЛожь нет виртуальных вызовов, только rawreadback. После включения и каждого пересчета все числовые проверки заново проходят. SetterBool — только тип, не неизученная семантикауспеха.

  6. В собственной одноразовой отрицательной подготовке измените/добавьте одну проводку либо профиль между шагами: следующий guard должен отказать ДО следующего setter; не исправлять чужое/не замещать набор.

  7. После успешного шага12 все исходные булевые режимы подтвержденыgetter; диапазонOct–Nov явно НЕ восстановлен. При failedstage дальнейшие команды заблокированы, не объявляется rollback.

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

Свой регистр обслужен явными отдельными стадиями; независимые остатки/обороты/границы подтверждают неизменность3проводок. Булевые режимы возвращаются только при успешном отдельном шаге; измененный диапазон остается только в одноразовой собственнойИБ.

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

  1. Урок является моделью для обучения API, не нормативным бухучетом, налоговой рекомендацией, оптимизацией рабочей базы или способом исправить повреждение данных.

  2. Ни фильтрUUID, ни snapshot не ограничивает setter/recalc отдельной проводкой и не доказывает исключительность сеанса. Поэтому только подготовленная новая одноразоваяИБ и ручной запрет параллельных работ.

  3. Не перенимайте арности/reportcolumns из конфигурации с субконто или без корреспонденции. Здесь поля запроса подтверждены nativeвиртуальными таблицами с корреспонденцией, aliasesДт/Кт заданы самим уроком.

  4. Настройки итогов не входят в обещанный откат транзакции подготовки. Нет восстановления диапазона, автоматического retry/finallyrestore, привилегированного режима или productionопераций.

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

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

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

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

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

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