РегистрыБухгалтерииМенеджер

Типы · AccountingRegistersManager

Доступ к объекту осуществляется через свойство глобального контекста РегистрыБухгалтерии. Используется для доступа к объектам, управляющим регистрами бухгалтерии.

Примеры платформы

ОсновнойРегистр = РегистрыБухгалтерии.Основной;
Форма = ОсновнойРегистр.ПолучитьФорму("ФормаСписка");
Полное описание, параметры и ограничения

РегистрыБухгалтерииМенеджер (AccountingRegistersManager)

РегистрыБухгалтерииМенеджер (AccountingRegistersManager)

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

Элементы коллекции:
РегистрБухгалтерииМенеджер.<Имя регистра бухгалтерии>
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются менеджеры регистров бухгалтерии.
Возможно обращение к менеджеру регистра бухгалтерии посредством оператора [...]. В качестве аргумента передается имя регистра бухгалтерии, как оно задано в конфигурации.

Свойства:
<Имя регистра бухгалтерии> (<Accounting register name>)

Описание:

Доступ к объекту осуществляется через свойство глобального контекста РегистрыБухгалтерии. Используется для доступа к объектам, управляющим регистрами бухгалтерии.

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

Сервер, толстый клиент, внешнее соединение.
Возможен обмен с сервером.

Пример:

ОсновнойРегистр = РегистрыБухгалтерии.Основной;
Форма = ОсновнойРегистр.ПолучитьФорму("ФормаСписка");

См. также:
Глобальный контекст, свойство РегистрыБухгалтерии

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

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

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

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

Субконто и границы: свой складской остаток без записи бухгалтерских данных

Проверить собственные1000/250/100, разобрать отдельную nativeкопиюСубконто и получить actual0/650/650 по точным границам собственногоdate/ref/U.

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

Собственная новая WindowsFileCF8.5.1.1343/обычный толстый клиент; полный client-only общий модуль. ПрограммаDBwrite0/runtime0.

Подготовка

  1. Только отдельный собственный учебный стенд Windows8.5.1.1343. Вручную создайте НОВУЮ FileИБ в C:\1c-labs\OwnSubcontoBoundaries85_e49c34a0-32a9-49b0-a880-414c01ff73c8\IB. Если каталог/регистрация уже существуют, остановитесь: не очищайте и не переиспользуйте их. Код требует точную native строку регистрации File="C:\1c-labs\OwnSubcontoBoundaries85_e49c34a0-32a9-49b0-a880-414c01ff73c8\IB";. Это имя каталога с маркером урока, не измеренный UUID самойИБ. Здесь каталоги/VM/ИБ/1С не создавались и не запускались.

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

  3. Один собственный пользователь Субконто85Ученик и одна полная роль этой новойИБ, включая именно Администрирование: nativeПолучитьПользователей требует административные права. CurrentUser сопоставляется с actualUsers[0] по UUID, UUID не публикуется. До подготовки fixture оставьте application/common/form/recordset модули пустыми. Остальные модули урока вообще не добавляйте.

  4. Документ УчебныйРегистраторСубконто85: ПроведениеЗапретить; НомерСтрока16/автонумерацияНет/контрольуникальностиДа; единственный реквизит Маркер85Строка36, табличных частей нет. В Движения включите только собственный регистр ниже. Document module пустой. Ручное сохранение регистратора не является проведением.

  5. ПВР УчебныеВидыСубконтоГраниц85: ИерархическийНет, КодСтрока8, НаименованиеСтрока50; ТипЗначенияХарактеристик толькоСтрока16; один реквизитМаркер85Строка36, табличных частей/предопределённых видов нет. Подготовьте вручную ровно два своих вида: WH/Склад85 и BT/Партия85, каждому явноТипЗначенияСтрока16 и Маркер85=e49c34a0-32a9-49b0-a880-414c01ff73c8. Это настоящие сохранённые ссылки ПВР, не имена/UUID вместо ссылки.

  6. ПланСчетов УчебныеСчетаСубконтоГраниц85: КодСтрока8, НаименованиеСтрока50, ВидыСубконто=свойПВР, МаксКоличествоСубконто2; один реквизитМаркер85Строка36. Без признаковучёта/признаковучётасубконто/пользовательскихтабличныхчастей/предопределённыхсчетов. Ручной единственный счет50/Учебный запас85/Активный/ЗабалансовыйНет/Маркер=e49c34a0-32a9-49b0-a880-414c01ff73c8. Его настоящая специальная табличная частьВидыСубконто: строка1 actualWH, ПредопределенноеЛожь, ТолькоОборотыЛожь; строка2 actualBT, ПредопределенноеЛожь, ТолькоОборотыИстина. НомерСтроки только читается, не задаётся кодом.

  7. РегистрБухгалтерии УчебныйУчетСубконтоГраниц85: КорреспонденцияНет, ПланСчетов=свой, ДлинаУточненияПериода3, единственный регистраторсвойДокумент. Одно измерениеМаркер85Строка36/БалансовыйДа, один ресурсСумма85Число15,2/БалансовыйДа; реквизитов нет. Итоги вручную заранее включены в своём пустом стенде. Без корреспонденции используются Счет/ВидДвижения/Субконто, не СчетДт/Кт/СубконтоДт/Кт.

  8. Создайте две обычные формы регистра: Проверка85 с главнымСписок85 типаРегистрБухгалтерииСписок.УчебныйУчетСубконтоГраниц85 и Набор85 с главнымНабор85 типаРегистрБухгалтерииНаборЗаписей.УчебныйУчетСубконтоГраниц85. Для ручной подготовки пока используйте штатные обычные формы и стандартные команды без модулей урока и запретов. Только в своейИБ руками сохраните документSUB-85/10.10.2026 12:00/Маркер=e49c34a0-32a9-49b0-a880-414c01ff73c8/ПроведенFalse/ПометкаУдаленияFalse.

  9. Ручной fixture одного собственного native набора регистра под actualSUB-85: ровно3активные строки, всеПериод10.10.2026 12:00, actualСчет50, Маркер=e49c34a0-32a9-49b0-a880-414c01ff73c8. Строка1Дебет1000; строка2Кредит250; строка3Кредит100. У КАЖДОЙ два nativeсубконто: ключactualWH→Цех85, ключactualBT→Опыт85. Сохраните штатной командой только этот свой новый набор. Программа ниже не Записывает/Проводит/Удаляет данные. Не включайтеОбменДанными.Загрузка и не отключайте проверки платформы.

  10. УточнениеПериода записи только читается по raw11347. Не назначайте его поНомеруСтроки/черезsetter/черезSQL. Урок читает actualU у всех3реальных строк и отказывает, если они отличаются, нецелые или вне0..998. Здесь не утверждается, что платформа присвоила0/1/2 или вообще0: будущие реальные данные должны подтвердить общийdate/ref/U. Если ручной fixture так не подготовился, остановитесь, не подделывайте его.

  11. После fixture в Конфигураторе: ОбщийМодульГраницыСубконто85, ГлобальныйНет, КлиентОбычноеПриложениеДа, КлиентУправляемоеНет, СерверНет, ВнешнееСоединениеНет. CODE целиком. В File/обычном приложении препроцессорный символТолстыйКлиентОбычноеПриложение бывает у обеих частей; это НЕ универсальный запрет server, поэтому commonmodule здесь именно client-only metadata.

  12. HUB_FORM целиком в собственнуюПроверка85→Модуль. Добавьте Вывод85ТабличныйДокумент и Статус85Строка2000. ПолеТабличногоДокументаВывод85 Данные=Вывод85/ТолькоПросмотрИстина. КнопкаОткрытьНабор85 nativeНажатие→ОткрытьНабор85(Кнопка). FormПередОткрытием→ПередОткрытием(Отказ,СтандартнаяОбработка)2; ПриОткрытии→ПриОткрытии()0. Никакой ручной имитации события.

  13. SET_FORM целиком вНабор85→Модуль. ТабличноеПолеСтроки85 Данные=Набор85; видимые колонкиПериод,Регистратор,НомерСтроки,Активность,ВидДвижения,Счет,УточнениеПериода,Маркер85,Сумма85 и nativeсубконто штатно. Статус85Строка2000 readonly. Удалите стандартные команды/контекстное меню записи, создания, удаления и редактирования. FormПередОткрытием2/ПриОткрытии0/ПередЗаписью(Отказ)1 строго привязаны к native событиям. Настройка readonly не означает отключение просмотра.

  14. RECORDSET_MODULE целиком в Регистр→МодульНабораЗаписей ПОСЛЕ fixture. Это другое nativeПередЗаписью(Отказ,Замещение)2; всегдаОтказИстина, без client-onlycallee и UI, также в server/external контекстах. APPLICATION целиком вМодульОбычногоПриложения, nativeПриНачалеРаботыСистемы0. Вручную обновите только своюCF. Код не компилировался и не запускался здесь.

  15. Будущий запуск читает ПОЛНЫЕ источники безГДЕ:1document/2kind/1account/3rawrows/6subconto/2accountpolicyrows. Из nativeТолькоОбороты выбирает именно actualWH для балансовой virtualtable; по оборотнойПартии остаток не обещается. Реальная выборка/набор подтверждают typedAccount/ВидДвижения/Субконто и тот же собственный состав.

  16. Nativefunctionalctor отдельнойСубконто создаёт только новую memorycollection. В неё копируютсяactual2keys/values, заменаПартии→НоваяПартия85, удаление→одинWH, восстановлениеBT и Очистить→0. Оригинальная Record.Субконто НЕ заменяется и НЕ мутируется; full original/nativeSet и wholeDB source повторно сверяются. Это обучение работе с коллекцией, а не запись/очистка бухгалтерских данных.

  17. Граница строится по actualdate/ref/U, после полного подтверждения всех3строк; непосредственныйrefinedMoment НЕ передаётся в noncorrespondenceОстатки, rawparam55 допускаетГраница. ЯвныеИсключая/Включая проверяются чтениемГраница.Значение/ВидГраницы перед query. NativeтипrefinedMoment прямо разрешён в качествеЗначенияГраницы для бухгалтерского регистра с поддержкойуточнения. Expectedvirtualresults:0/650/650; независимый raw signed1000-250-100=650. СледующийU=actualU+1 — искусственная проверяемая граница ПОСЛЕ этих own строк, не утверждение, что вИБ есть такая новая запись.

  18. Вывод формируется реальным nativeTabDoc из РЕАЛЬНЫХ queryчисел; все6ячеек защищены, числаСодержитЗначение/ТипЗначения/Значение, actualvisibleControl.Value повторно проверяется. Статические тесты не являются proof1С/CFcompiler/DB/rendering. Close/Cancel программу записи не запускают. При любой ошибке — fail-stop; snapshots не атомарны и не доказывают отсутствие конкурентного изменения; partialUI не восстанавливается вслепую.

#Если ТолстыйКлиентОбычноеПриложение Тогда

Процедура ПроверитьСтенд85() Экспорт
    Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnSubcontoBoundaries85_e49c34a0-32a9-49b0-a880-414c01ff73c8\IB"";" Тогда
        ВызватьИсключение "Только собственная новая File ИБ по точной регистрации";
    КонецЕсли;
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Пользователи.Количество() <> 1 Или Пользователи[0].Имя <> "Субконто85Ученик" Или Текущий = Неопределено Или Текущий.УникальныйИдентификатор <> Пользователи[0].УникальныйИдентификатор Тогда
        ВызватьИсключение "Нужны точная платформа и один свой учебный администратор";
    КонецЕсли;
    Если Метаданные.Документы.Количество() <> 1 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 1
        Или Метаданные.ПланыСчетов.Количество() <> 1 Или Метаданные.РегистрыБухгалтерии.Количество() <> 1
        Или Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.Справочники.Количество() <> 0
        Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
        Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.Обработки.Количество() <> 0
        Или Метаданные.Отчеты.Количество() <> 0 Или Метаданные.ОбщиеФормы.Количество() <> 0
        Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0
        Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Состав своей минимальной схемы изменён";
    КонецЕсли;
    ДокМД = Метаданные.Документы.УчебныйРегистраторСубконто85;
    ВидыМД = Метаданные.ПланыВидовХарактеристик.УчебныеВидыСубконтоГраниц85;
    СчетаМД = Метаданные.ПланыСчетов.УчебныеСчетаСубконтоГраниц85;
    РегистрМД = Метаданные.РегистрыБухгалтерии.УчебныйУчетСубконтоГраниц85;
    Если ДокМД.Проведение <> Метаданные.СвойстваОбъектов.Проведение.Запретить
        Или ДокМД.Движения.Количество() <> 1 Или Не ДокМД.Движения.Содержит(РегистрМД)
        Или ДокМД.Реквизиты.Количество() <> 1 Или ДокМД.ТабличныеЧасти.Количество() <> 0
        Или ВидыМД.Иерархический Или ВидыМД.Реквизиты.Количество() <> 1 Или ВидыМД.ТабличныеЧасти.Количество() <> 0
        Или СчетаМД.ВидыСубконто <> ВидыМД Или СчетаМД.МаксКоличествоСубконто <> 2
        Или СчетаМД.ПризнакиУчета.Количество() <> 0 Или СчетаМД.ПризнакиУчетаСубконто.Количество() <> 0
        Или СчетаМД.Реквизиты.Количество() <> 1 Или СчетаМД.ТабличныеЧасти.Количество() <> 0
        Или РегистрМД.Корреспонденция Или РегистрМД.ПланСчетов <> СчетаМД Или РегистрМД.ДлинаУточненияПериода <> 3
        Или РегистрМД.Измерения.Количество() <> 1 Или РегистрМД.Ресурсы.Количество() <> 1
        Или РегистрМД.Реквизиты.Количество() <> 0 Или РегистрМД.Формы.Количество() <> 2 Тогда
        ВызватьИсключение "Нужен свой регистр БЕЗ корреспонденции, с субконто и уточнением периода";
    КонецЕсли;
    ПроверитьСтроковыйТип85(ВидыМД.Тип, 16);
    ПроверитьСтроковыйТип85(ДокМД.Реквизиты.Маркер85.Тип, 36);
    ПроверитьСтроковыйТип85(ВидыМД.Реквизиты.Маркер85.Тип, 36);
    ПроверитьСтроковыйТип85(СчетаМД.Реквизиты.Маркер85.Тип, 36);
    ПроверитьСтроковыйТип85(РегистрМД.Измерения.Маркер85.Тип, 36);
    Ресурс = РегистрМД.Ресурсы.Сумма85;
    Если Ресурс.Тип.Типы().Количество() <> 1 Или Не Ресурс.Тип.СодержитТип(Тип("Число"))
        Или Ресурс.Тип.КвалификаторыЧисла.Разрядность <> 15 Или Ресурс.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 2
        Или Не Ресурс.Балансовый Или Не РегистрМД.Измерения.Маркер85.Балансовый Тогда
        ВызватьИсключение "Ресурс/измерение должны участвовать в балансовых итогах";
    КонецЕсли;
    Если ТипЗнч(РегистрыБухгалтерии) <> Тип("РегистрыБухгалтерииМенеджер") Тогда
        ВызватьИсключение "Нужен настоящий глобальный менеджер регистров";
    КонецЕсли;
    ЧислоМенеджеров = 0;
    Для Каждого МенеджерРегистра Из РегистрыБухгалтерии Цикл
        Если ТипЗнч(МенеджерРегистра) <> Тип("РегистрБухгалтерииМенеджер.УчебныйУчетСубконтоГраниц85") Тогда
            ВызватьИсключение "В коллекции есть чужой менеджер";
        КонецЕсли;
        ЧислоМенеджеров = ЧислоМенеджеров + 1;
    КонецЦикла;
    Если ЧислоМенеджеров <> 1 Тогда
        ВызватьИсключение "Нужен ровно один реальный собственный менеджер";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСтроковыйТип85(Описание, Длина)
    Если Описание.Типы().Количество() <> 1 Или Не Описание.СодержитТип(Тип("Строка"))
        Или Описание.КвалификаторыСтроки.Длина <> Длина Тогда
        ВызватьИсключение "Не совпали собственные тип и длина строки";
    КонецЕсли;
КонецПроцедуры

Функция Таблица85(Текст)
    Запрос = Новый Запрос;
    Запрос.Текст = Текст;
    Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

Функция ПрочитатьИсточник85() Экспорт
    ПроверитьСтенд85();
    Документы85 = Таблица85("ВЫБРАТЬ Ссылка, Номер, Дата, Проведен, ПометкаУдаления, Маркер85
        |ИЗ Документ.УчебныйРегистраторСубконто85");
    Виды85 = Таблица85("ВЫБРАТЬ Ссылка, Код, Наименование, ПометкаУдаления, Предопределенный, Маркер85
        |ИЗ ПланВидовХарактеристик.УчебныеВидыСубконтоГраниц85");
    Счета85 = Таблица85("ВЫБРАТЬ Ссылка, Код, Наименование, Вид, Забалансовый, ПометкаУдаления, Предопределенный, Маркер85
        |ИЗ ПланСчетов.УчебныеСчетаСубконтоГраниц85");
    Строки85 = Таблица85("ВЫБРАТЬ Период, Регистратор, НомерСтроки, Активность, ВидДвижения, Счет, УточнениеПериода, Маркер85, Сумма85
        |ИЗ РегистрБухгалтерии.УчебныйУчетСубконтоГраниц85");
    Значения85 = Таблица85("ВЫБРАТЬ Период, Регистратор, НомерСтроки, УточнениеПериода, Вид, Значение
        |ИЗ РегистрБухгалтерии.УчебныйУчетСубконтоГраниц85.Субконто");
    Если Документы85.Количество() <> 1 Или Документы85.Колонки.Количество() <> 6
        Или Виды85.Количество() <> 2 Или Виды85.Колонки.Количество() <> 6
        Или Счета85.Количество() <> 1 Или Счета85.Колонки.Количество() <> 8
        Или Строки85.Количество() <> 3 Или Строки85.Колонки.Количество() <> 9
        Или Значения85.Количество() <> 6 Или Значения85.Колонки.Количество() <> 6 Тогда
        ВызватьИсключение "Полные источники без ГДЕ содержат неизвестные/недостающие строки";
    КонецЕсли;
    ДокСтрока = Документы85[0];
    Если ТипЗнч(ДокСтрока.Ссылка) <> Тип("ДокументСсылка.УчебныйРегистраторСубконто85") Или ДокСтрока.Ссылка.Пустая()
        Или ДокСтрока.Номер <> "SUB-85" Или ДокСтрока.Дата <> Дата(2026, 10, 10, 12, 0, 0)
        Или ДокСтрока.Проведен Или ДокСтрока.ПометкаУдаления Или ДокСтрока.Маркер85 <> "e49c34a0-32a9-49b0-a880-414c01ff73c8" Тогда
        ВызватьИсключение "Не найден единственный настоящий собственный регистратор";
    КонецЕсли;
    ДокОбъект = ДокСтрока.Ссылка.ПолучитьОбъект();
    Если ТипЗнч(ДокОбъект) <> Тип("ДокументОбъект.УчебныйРегистраторСубконто85") Или ДокОбъект.Ссылка <> ДокСтрока.Ссылка
        Или ДокОбъект.Дата <> ДокСтрока.Дата Или ДокОбъект.Номер <> ДокСтрока.Номер
        Или ДокОбъект.Проведен Или ДокОбъект.ПометкаУдаления Или ДокОбъект.Маркер85 <> ДокСтрока.Маркер85 Тогда
        ВызватьИсключение "Actual GetObject не подтвердил собственный документ";
    КонецЕсли;
    СкладВид = Неопределено;
    ПартияВид = Неопределено;
    Для Каждого ВидСтрока Из Виды85 Цикл
        Если ТипЗнч(ВидСтрока.Ссылка) <> Тип("ПланВидовХарактеристикСсылка.УчебныеВидыСубконтоГраниц85") Или ВидСтрока.Ссылка.Пустая()
            Или ВидСтрока.ПометкаУдаления Или ВидСтрока.Предопределенный Или ВидСтрока.Маркер85 <> ДокСтрока.Маркер85 Тогда
            ВызватьИсключение "Не подтверждены два собственных вида субконто";
        КонецЕсли;
        ВидОбъект = ВидСтрока.Ссылка.ПолучитьОбъект();
        Если ВидОбъект = Неопределено Или ВидОбъект.Ссылка <> ВидСтрока.Ссылка Или ВидОбъект.Код <> ВидСтрока.Код
            Или ВидОбъект.Наименование <> ВидСтрока.Наименование Или ВидОбъект.ПометкаУдаления Или ВидОбъект.Предопределенный
            Или ВидОбъект.Маркер85 <> ДокСтрока.Маркер85 Или ВидОбъект.ЭтоГруппа Тогда
            ВызватьИсключение "Native GetObject вида субконто отказал";
        КонецЕсли;
        ПроверитьСтроковыйТип85(ВидОбъект.ТипЗначения, 16);
        Если ВидСтрока.Код = "WH" И ВидСтрока.Наименование = "Склад85" И СкладВид = Неопределено Тогда
            СкладВид = ВидСтрока.Ссылка;
        ИначеЕсли ВидСтрока.Код = "BT" И ВидСтрока.Наименование = "Партия85" И ПартияВид = Неопределено Тогда
            ПартияВид = ВидСтрока.Ссылка;
        Иначе
            ВызватьИсключение "Дубликат/неизвестный вид субконто";
        КонецЕсли;
    КонецЦикла;
    СчетСтрока = Счета85[0];
    Если ТипЗнч(СчетСтрока.Ссылка) <> Тип("ПланСчетовСсылка.УчебныеСчетаСубконтоГраниц85") Или СчетСтрока.Ссылка.Пустая()
        Или СчетСтрока.Код <> "50" Или СчетСтрока.Наименование <> "Учебный запас85"
        Или СчетСтрока.Вид <> ВидСчета.Активный Или СчетСтрока.Забалансовый Или СчетСтрока.ПометкаУдаления
        Или СчетСтрока.Предопределенный Или СчетСтрока.Маркер85 <> ДокСтрока.Маркер85 Тогда
        ВызватьИсключение "Не найден единственный собственный балансовый активный счет";
    КонецЕсли;
    СчетОбъект = СчетСтрока.Ссылка.ПолучитьОбъект();
    Если СчетОбъект = Неопределено Или СчетОбъект.Ссылка <> СчетСтрока.Ссылка Или СчетОбъект.Код <> СчетСтрока.Код
        Или СчетОбъект.Наименование <> СчетСтрока.Наименование Или СчетОбъект.Вид <> ВидСчета.Активный
        Или СчетОбъект.Забалансовый Или СчетОбъект.ПометкаУдаления Или СчетОбъект.Предопределенный
        Или СчетОбъект.Маркер85 <> ДокСтрока.Маркер85 Или СчетОбъект.ВидыСубконто.Количество() <> 2 Тогда
        ВызватьИсключение "Объект счета/две native строки ВидыСубконто не подтверждены";
    КонецЕсли;
    Политика85 = Новый ТаблицаЗначений;
    Для Каждого Имя Из СтрРазделить("НомерСтроки,ВидСубконто,Предопределенное,ТолькоОбороты", ",") Цикл
        Политика85.Колонки.Добавить(Имя);
    КонецЦикла;
    ИспользуемыеВиды = Новый Массив;
    ВиденныеНомера = Новый Соответствие;
    Для Каждого СтрокаВида Из СчетОбъект.ВидыСубконто Цикл
        Если ТипЗнч(СтрокаВида) <> Тип("ПланСчетовВидыСубконтоСтрока.УчебныеСчетаСубконтоГраниц85")
            Или ТипЗнч(СтрокаВида.НомерСтроки) <> Тип("Число") Или ВиденныеНомера.Получить(СтрокаВида.НомерСтроки) <> Неопределено
            Или ТипЗнч(СтрокаВида.Предопределенное) <> Тип("Булево") Или СтрокаВида.Предопределенное
            Или ТипЗнч(СтрокаВида.ТолькоОбороты) <> Тип("Булево") Тогда
            ВызватьИсключение "Строка настройки счета не принадлежит своей ручной схеме";
        КонецЕсли;
        Если СтрокаВида.НомерСтроки = 1 И СтрокаВида.ВидСубконто = СкладВид И Не СтрокаВида.ТолькоОбороты Тогда
            ИспользуемыеВиды.Добавить(СтрокаВида.ВидСубконто);
        ИначеЕсли СтрокаВида.НомерСтроки <> 2 Или СтрокаВида.ВидСубконто <> ПартияВид Или Не СтрокаВида.ТолькоОбороты Тогда
            ВызватьИсключение "Склад должен давать остаток, партия — только обороты";
        КонецЕсли;
        ВиденныеНомера.Вставить(СтрокаВида.НомерСтроки, Истина);
        НоваяПолитика = Политика85.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяПолитика, СтрокаВида);
    КонецЦикла;
    Если ИспользуемыеВиды.Количество() <> 1 Или ИспользуемыеВиды[0] <> СкладВид Тогда
        ВызватьИсключение "Нельзя запрашивать остаток по оборотному субконто партии";
    КонецЕсли;
    Паспорт = Новый Структура("Документы,Виды,Счета,Строки,Значения,Политика,Документ,Счет,СкладВид,ПартияВид,БалансовыеВиды,Уточнение",
        Документы85, Виды85, Счета85, Строки85, Значения85, Политика85, ДокСтрока.Ссылка, СчетСтрока.Ссылка, СкладВид, ПартияВид, ИспользуемыеВиды, Неопределено);
    Номера = Новый Соответствие;
    Итог = 0;
    Для Каждого Запись85 Из Строки85 Цикл
        ПроверитьЗапись85(Запись85, Паспорт);
        Если Номера.Получить(Запись85.НомерСтроки) <> Неопределено Тогда
            ВызватьИсключение "Повтор номера настоящей записи";
        КонецЕсли;
        Номера.Вставить(Запись85.НомерСтроки, Истина);
        Если Паспорт.Уточнение = Неопределено Тогда
            Паспорт.Уточнение = Запись85.УточнениеПериода;
        ИначеЕсли Паспорт.Уточнение <> Запись85.УточнениеПериода Тогда
            ВызватьИсключение "Все три настоящие записи должны иметь один и тот же date/ref/U для демонстрации общей границы";
        КонецЕсли;
        ПроверитьСубконто85(ЗначенияЗаписи85(Значения85, Запись85, Паспорт), Паспорт);
        Итог = Итог + ?(Запись85.ВидДвижения = ВидДвиженияБухгалтерии.Дебет, Запись85.Сумма85, -Запись85.Сумма85);
    КонецЦикла;
    Если Итог <> 650 Тогда
        ВызватьИсключение "Независимый сырой итог должен быть 1000-250-100=650";
    КонецЕсли;
    Возврат Паспорт;
КонецФункции

Процедура ПроверитьЗапись85(Запись85, Паспорт) Экспорт
    Если Запись85.Период <> Дата(2026, 10, 10, 12, 0, 0) Или Запись85.Регистратор <> Паспорт.Документ
        Или Запись85.Счет <> Паспорт.Счет Или ТипЗнч(Запись85.Активность) <> Тип("Булево") Или Не Запись85.Активность
        Или Запись85.Маркер85 <> "e49c34a0-32a9-49b0-a880-414c01ff73c8" Или ТипЗнч(Запись85.Сумма85) <> Тип("Число")
        Или ТипЗнч(Запись85.УточнениеПериода) <> Тип("Число") Или Запись85.УточнениеПериода < 0
        Или Запись85.УточнениеПериода > 998 Или Запись85.УточнениеПериода <> Цел(Запись85.УточнениеПериода) Тогда
        ВызватьИсключение "Изменены собственные поле/счет/регистратор/ресурс/реальное уточнение периода";
    КонецЕсли;
    Если Запись85.НомерСтроки = 1 И Запись85.ВидДвижения = ВидДвиженияБухгалтерии.Дебет И Запись85.Сумма85 = 1000 Тогда
        Возврат;
    ИначеЕсли Запись85.НомерСтроки = 2 И Запись85.ВидДвижения = ВидДвиженияБухгалтерии.Кредит И Запись85.Сумма85 = 250 Тогда
        Возврат;
    ИначеЕсли Запись85.НомерСтроки = 3 И Запись85.ВидДвижения = ВидДвиженияБухгалтерии.Кредит И Запись85.Сумма85 = 100 Тогда
        Возврат;
    КонецЕсли;
    ВызватьИсключение "Неизвестная хозяйственная учебная запись";
КонецПроцедуры

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

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

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

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

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

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

Процедура РазобратьСвоюКопиюСубконто85(Набор, Паспорт) Экспорт
    ПроверитьНабор85(Набор, Паспорт);
    Оригинал = Набор[0].Субконто;
    ПроверитьСубконто85(Оригинал, Паспорт);
    Копия = Новый(Тип("РегистрБухгалтерииСубконто.УчебныйУчетСубконтоГраниц85"));
    Если Копия.Количество() <> 0 Или Копия = Оригинал Тогда
        ВызватьИсключение "Функциональный native ctor не дал отдельную пустую коллекцию";
    КонецЕсли;
    Для Каждого Пара Из Оригинал Цикл
        Копия.Вставить(Пара.Ключ, Пара.Значение);
    КонецЦикла;
    ПроверитьСубконто85(Копия, Паспорт);
    Копия.Вставить(Паспорт.ПартияВид, "НоваяПартия85");
    Если Копия.Количество() <> 2 Или Копия[Паспорт.ПартияВид] <> "НоваяПартия85" Или Копия[Паспорт.СкладВид] <> "Цех85" Тогда
        ВызватьИсключение "Замена в собственной копии не подтверждена";
    КонецЕсли;
    ПроверитьСубконто85(Оригинал, Паспорт);
    Копия.Удалить(Паспорт.ПартияВид);
    Если Копия.Количество() <> 1 Или Копия[Паспорт.СкладВид] <> "Цех85" Тогда
        ВызватьИсключение "Удаление только собственного ключа не подтверждено";
    КонецЕсли;
    Для Каждого Пара Из Копия Цикл
        Если Пара.Ключ <> Паспорт.СкладВид Или Пара.Значение <> "Цех85" Тогда
            ВызватьИсключение "После удаления появился чужой ключ";
        КонецЕсли;
    КонецЦикла;
    ПроверитьСубконто85(Оригинал, Паспорт);
    Копия.Вставить(Паспорт.ПартияВид, Оригинал[Паспорт.ПартияВид]);
    ПроверитьСубконто85(Копия, Паспорт);
    Копия.Очистить();
    Если Копия.Количество() <> 0 Тогда
        ВызватьИсключение "Очищена не только собственная копия";
    КонецЕсли;
    ПроверитьСубконто85(Оригинал, Паспорт);
    ПроверитьНабор85(Набор, Паспорт);
    ПроверитьИсточникНеизменным85(Паспорт);
КонецПроцедуры

Функция ОстатокПоГранице85(Граница85, Момент85, Вид85, Паспорт)
    ПроверитьИсточникНеизменным85(Паспорт);
    Если ТипЗнч(Граница85) <> Тип("Граница") Или Граница85.Значение <> Момент85 Или Граница85.ВидГраницы <> Вид85 Тогда
        ВызватьИсключение "В virtual table передаётся только проверенная явная native Граница";
    КонецЕсли;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ О.Счет, О.Субконто1 КАК Склад, О.Маркер85, О.Сумма85Остаток КАК Остаток
        |ИЗ РегистрБухгалтерии.УчебныйУчетСубконтоГраниц85.Остатки(&Граница85, Счет = &Счет85, &БалансовыеВиды85, Маркер85 = &Маркер85) КАК О";
    Запрос.УстановитьПараметр("Граница85", Граница85);
    Запрос.УстановитьПараметр("Счет85", Паспорт.Счет);
    Запрос.УстановитьПараметр("БалансовыеВиды85", Паспорт.БалансовыеВиды);
    Запрос.УстановитьПараметр("Маркер85", "e49c34a0-32a9-49b0-a880-414c01ff73c8");
    Результат = Запрос.Выполнить().Выгрузить();
    Если Результат.Колонки.Количество() <> 4 Или Результат.Количество() > 1 Тогда
        ВызватьИсключение "Native Остатки вернули неизвестный полный состав";
    КонецЕсли;
    Остаток = 0;
    Для Каждого СтрокаРезультата Из Результат Цикл
        Если СтрокаРезультата.Счет <> Паспорт.Счет Или СтрокаРезультата.Склад <> "Цех85"
            Или СтрокаРезультата.Маркер85 <> "e49c34a0-32a9-49b0-a880-414c01ff73c8" Или ТипЗнч(СтрокаРезультата.Остаток) <> Тип("Число") Тогда
            ВызватьИсключение "Не подтверждены реальные поля виртуального остатка";
        КонецЕсли;
        Остаток = Остаток + СтрокаРезультата.Остаток;
    КонецЦикла;
    ПроверитьИсточникНеизменным85(Паспорт);
    Возврат Остаток;
КонецФункции

Функция СформироватьСводку85(Паспорт) Экспорт
    ПроверитьИсточникНеизменным85(Паспорт);
    Момент85 = Новый МоментВремениСУточнениемПериода(Дата(2026, 10, 10, 12, 0, 0), Паспорт.Уточнение, Паспорт.Документ);
    Следующий85 = Новый МоментВремениСУточнениемПериода(Момент85.Дата, Момент85.УточнениеПериода + 1, Момент85.Ссылка);
    Дубль85 = Новый МоментВремениСУточнениемПериода(Момент85.Дата, Момент85.УточнениеПериода, Момент85.Ссылка);
    Если ТипЗнч(Момент85) <> Тип("МоментВремениСУточнениемПериода") Или Момент85.Дата <> Паспорт.Документы[0].Дата
        Или Момент85.Ссылка <> Паспорт.Документ Или Момент85.УточнениеПериода <> Паспорт.Уточнение
        Или Следующий85.Дата <> Момент85.Дата Или Следующий85.Ссылка <> Момент85.Ссылка
        Или Следующий85.УточнениеПериода <> Паспорт.Уточнение + 1 Или Момент85.Сравнить(Дубль85) <> 0
        Или Момент85.Сравнить(Следующий85) <> -1 Или Следующий85.Сравнить(Момент85) <> 1 Тогда
        ВызватьИсключение "Native factory/readonly scalar/Compare не подтвердили два собственных момента";
    КонецЕсли;
    До = ОстатокПоГранице85(Новый Граница(Момент85, ВидГраницы.Исключая), Момент85, ВидГраницы.Исключая, Паспорт);
    С = ОстатокПоГранице85(Новый Граница(Момент85, ВидГраницы.Включая), Момент85, ВидГраницы.Включая, Паспорт);
    После = ОстатокПоГранице85(Новый Граница(Следующий85, ВидГраницы.Включая), Следующий85, ВидГраницы.Включая, Паспорт);
    Если До <> 0 Или С <> 650 Или После <> 650 Тогда
        ВызватьИсключение "Реальные virtual Остатки не подтвердили raw650 и границы0/650/650";
    КонецЕсли;
    Вывод = Новый ТабличныйДокумент;
    Метки = СтрРазделить("Исключая собственный момент|Включая собственный момент|Включая следующий U", "|");
    Числа = Новый Массив;
    Числа.Добавить(До);
    Числа.Добавить(С);
    Числа.Добавить(После);
    Для Номер = 1 По 3 Цикл
        Вывод.Область(Номер, 1, Номер, 1).Текст = Метки[Номер - 1];
        Вывод.Область(Номер, 1, Номер, 1).Защита = Истина;
        Ячейка = Вывод.Область(Номер, 2, Номер, 2);
        Ячейка.СодержитЗначение = Истина;
        Ячейка.ТипЗначения = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
        Ячейка.Значение = Числа[Номер - 1];
        Ячейка.Защита = Истина;
    КонецЦикла;
    Вывод.ТолькоПросмотр = Истина;
    ПроверитьСводку85(Вывод);
    ПроверитьИсточникНеизменным85(Паспорт);
    Возврат Вывод;
КонецФункции

Процедура ПроверитьСводку85(Вывод) Экспорт
    Если ТипЗнч(Вывод) <> Тип("ТабличныйДокумент") Или Вывод.ВысотаТаблицы <> 3 Или Вывод.ШиринаТаблицы <> 2 Или Не Вывод.ТолькоПросмотр Тогда
        ВызватьИсключение "Нужен защищённый native numeric вывод3x2";
    КонецЕсли;
    Для Номер = 1 По 3 Цикл
        Ячейка = Вывод.Область(Номер, 2, Номер, 2);
        Если Не Вывод.Область(Номер, 1, Номер, 1).Защита Или Не Ячейка.Защита Или Не Ячейка.СодержитЗначение
            Или ТипЗнч(Ячейка.Значение) <> Тип("Число") Или Ячейка.Значение <> ?(Номер = 1, 0, 650) Тогда
            ВызватьИсключение "Actual защищённые numeric ячейки не подтвердили результат";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Функция СоздатьГлавнуюФорму85() Экспорт
    ПроверитьСтенд85();
    СвойКлюч = Новый УникальныйИдентификатор;
    Форма = РегистрыБухгалтерии.УчебныйУчетСубконтоГраниц85.ПолучитьФорму("Проверка85",, СвойКлюч);
    Если Форма = Неопределено Или ТипЗнч(Форма) <> Тип("Форма") Или Форма.Открыта() Или Форма.КлючУникальности <> СвойКлюч Тогда
        ВызватьИсключение "Native manager.GetForm не дал собственную закрытую форму";
    КонецЕсли;
    Форма.Инициализировать85(СвойКлюч);
    Возврат Форма;
КонецФункции

#КонецЕсли
Полная собственная обычная форма проверки

РегистрыБухгалтерии → УчебныйУчетСубконтоГраниц85 → Формы → Проверка85 → Модуль, целиком

Обычный толстый клиент; настоящий Listmain/BeforeOpen2/OnOpen0/Button1; actualSet.GetForm3.

#Если ТолстыйКлиентОбычноеПриложение Тогда

Перем Паспорт85, Инициализирована85, Остановка85;

Процедура Инициализировать85(СвойКлюч) Экспорт
    ГраницыСубконто85.ПроверитьСтенд85();
    Если Инициализирована85 = Истина Или Открыта() Или КлючУникальности <> СвойКлюч
        Или ТипЗнч(СвойКлюч) <> Тип("УникальныйИдентификатор") Или ТипЗнч(Список85) <> Тип("РегистрБухгалтерииСписок.УчебныйУчетСубконтоГраниц85") Тогда
        ВызватьИсключение "Только однократная подготовка своей закрытой native формы";
    КонецЕсли;
    Паспорт85 = ГраницыСубконто85.ПрочитатьИсточник85();
    Инициализирована85 = Истина;
    Остановка85 = Ложь;
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    Если Инициализирована85 <> Истина Или Остановка85 = Истина Тогда
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Процедура ПриОткрытии()
    Если Инициализирована85 <> Истина Или Остановка85 = Истина Тогда
        ВызватьИсключение "Форма не подготовлена";
    КонецЕсли;
    Попытка
        ГраницыСубконто85.ПроверитьИсточникНеизменным85(Паспорт85);
        Набор = ГраницыСубконто85.ПрочитатьСвойНабор85(Паспорт85);
        ГраницыСубконто85.РазобратьСвоюКопиюСубконто85(Набор, Паспорт85);
        Кандидат = ГраницыСубконто85.СформироватьСводку85(Паспорт85);
        Вывод85 = Кандидат;
        Если ЭлементыФормы.Вывод85.Значение <> Вывод85 Или Не ЭлементыФормы.Вывод85.ТолькоПросмотр Тогда
            ВызватьИсключение "Видимый собственный вывод не связан с результатом";
        КонецЕсли;
        ГраницыСубконто85.ПроверитьСводку85(ЭлементыФормы.Вывод85.Значение);
        ГраницыСубконто85.ПроверитьИсточникНеизменным85(Паспорт85);
        Статус85 = "Реальные строки: 1000-250-100=650. Native границы дали0/650/650; U=" + Строка(Паспорт85.Уточнение) + ". Оригиналы субконто и полные источники не изменились.";
    Исключение
        Остановка85 = Истина;
        Статус85 = "СТОП. Не повторять и не восстанавливать вслепую: " + ОписаниеОшибки();
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ОткрытьНабор85(Кнопка)
    Если Кнопка <> ЭлементыФормы.ОткрытьНабор85 Или Кнопка.Имя <> "ОткрытьНабор85" Или Остановка85 = Истина Или Инициализирована85 <> Истина Тогда
        ВызватьИсключение "Только настоящая своя кнопка и проверенная форма";
    КонецЕсли;
    Попытка
        ГраницыСубконто85.ПроверитьИсточникНеизменным85(Паспорт85);
        Набор = ГраницыСубконто85.ПрочитатьСвойНабор85(Паспорт85);
        СвойКлюч = Новый УникальныйИдентификатор;
        Форма = Набор.ПолучитьФорму("Набор85", ЭтаФорма, СвойКлюч);
        Если Форма = Неопределено Или ТипЗнч(Форма) <> Тип("Форма") Или Форма.Открыта()
            Или Форма.КлючУникальности <> СвойКлюч Или Форма.ВладелецФормы <> ЭтаФорма Тогда
            ВызватьИсключение "ActualSet.GetForm не подтвердил закрытую собственную форму";
        КонецЕсли;
        Форма.Инициализировать85(СвойКлюч, Набор);
        Форма.Открыть();
        ГраницыСубконто85.ПроверитьИсточникНеизменным85(Паспорт85);
    Исключение
        Остановка85 = Истина;
        Статус85 = "СТОП. Открытие не подтверждено: " + ОписаниеОшибки();
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

#КонецЕсли
Полная readonly обычная форма набора

РегистрыБухгалтерии → УчебныйУчетСубконтоГраниц85 → Формы → Набор85 → Модуль, целиком

Обычный толстый клиент; SAMEactualSet/BeforeOpen2/OnOpen0/BeforeWriteForm1.

#Если ТолстыйКлиентОбычноеПриложение Тогда

Перем Паспорт85, Инициализирована85;

Процедура Инициализировать85(СвойКлюч, СвойНабор) Экспорт
    ГраницыСубконто85.ПроверитьСтенд85();
    Если Инициализирована85 = Истина Или Открыта() Или КлючУникальности <> СвойКлюч
        Или ТипЗнч(СвойКлюч) <> Тип("УникальныйИдентификатор") Или Набор85 <> СвойНабор Тогда
        ВызватьИсключение "Только закрытая форма того же actual собственного набора";
    КонецЕсли;
    Паспорт85 = ГраницыСубконто85.ПрочитатьИсточник85();
    ГраницыСубконто85.ПроверитьНабор85(Набор85, Паспорт85);
    Если ТипЗнч(ЭлементыФормы.Строки85) <> Тип("ТабличноеПоле") Или ЭлементыФормы.Строки85.Значение <> Набор85 Тогда
        ВызватьИсключение "Табличное поле не связано с настоящим главным набором";
    КонецЕсли;
    ЭлементыФормы.Строки85.ТолькоПросмотр = Истина;
    ЭлементыФормы.Строки85.ИзменятьСоставСтрок = Ложь;
    Инициализирована85 = Истина;
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    Если Инициализирована85 <> Истина Тогда
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Процедура ПриОткрытии()
    Если Инициализирована85 <> Истина Или Не ЭлементыФормы.Строки85.ТолькоПросмотр Или ЭлементыФормы.Строки85.ИзменятьСоставСтрок Тогда
        ВызватьИсключение "Режим своей формы набора изменён";
    КонецЕсли;
    ГраницыСубконто85.ПроверитьНабор85(Набор85, Паспорт85);
    ГраницыСубконто85.ПроверитьИсточникНеизменным85(Паспорт85);
    Статус85 = "Настоящий набор содержит3 записи; программа не записывает их. Выберите строки для ручного осмотра полей и субконто. Форму нельзя использовать как редактор.";
КонецПроцедуры

Процедура ПередЗаписью(Отказ)
    Отказ = Истина;
КонецПроцедуры

#КонецЕсли
Полный запрет native записи после ручного fixture

РегистрыБухгалтерии → УчебныйУчетСубконтоГраниц85 → Модуль набора записей, целиком ПОСЛЕ fixture

BeforeWriteSet2 сервер/толстый/external, толькоОтказИстина, безUI/commoncallee.

Процедура ПередЗаписью(Отказ, Замещение)
    Отказ = Истина;
КонецПроцедуры
Полный native startup собственного урока

Конфигурация → Модуль обычного приложения, целиком ПОСЛЕ fixture

NativeOnStart0; обычный толстый клиент, realmanagerfactory/initializer/Open.

Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентОбычноеПриложение Тогда
    Форма = ГраницыСубконто85.СоздатьГлавнуюФорму85();
    Форма.Открыть();
#Иначе
    ВызватьИсключение "Урок только для своего толстого обычного клиента";
#КонецЕсли
КонецПроцедуры

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

  1. ExactownFile/version/currentUser/fullmetadata прежде любых чтений.

  2. Fullquery источники и actualtypedrefs/GetObject; реальная политика счета исключает оборотныйBT из балансовойаналитики.

  3. ActualSelectByRecorder/ReadSet подтверждают три настоящие записи и полныеСубконто.

  4. Отдельнаяfunctionalctor memorycollection2→replace2→delete1→restore2→clear0, source/nativeOriginalunchanged.

  5. Actualsame date/ref/U→nativeCompare+boundaryreadback→virtualqueries0/650/650, независимыйraw650.

  6. NumericnativeTabDoc иvisiblecontrolreadback; Manager.GetFormCommon отдельно отactualSet.GetFormHub.

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

  1. Будущий результатraw3/650, nativevirtual0/650/650, originalsubconto2unchanged иcopy0.

  2. Canonical/all5native иscopedarity/RO/context/factory/callback/alias/whitespace/case/mutationnegatives; здесьruntime0.

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

Ожидаемый ручной результат: защищённые реальные числа0/650/650 и собственный прочитанный набор3. Здесь только авторский код и статическая проверка; фактическая1С/БД/UI не запускались.

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

  1. РО свойства Record.Субконто/Record.УточнениеПериода никогда не записываются; старыйsetterexamplector157 не отменяет актуальныйRO контракт.

  2. GetTemplate1184 с противоречивым0params не применяется. FieldAnalysisпустойctor иHTMLCompareбезreturn не подменяются выдуманными контрактами.

  3. RefinedMoment применяется только к своему бухгалтерскому virtualqueryLength3 черезnativeГраница; не как произвольная дата для других систем.

  4. Граница всех3строк утверждается только после actualsame date/ref/U/fullsnapshot; U не выводится изНомерСтроки.

  5. Изменения только собственнойmemorycollection/ownUI; программаDBwrite0. Ручнойfixture — отдельные явно указанные будущие операции своей новойИБ.

  6. Readback не атомарен и не защищает от concurrency; один собственный сеанс, ошибка→остановка безretry/слепогоrollback.

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

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

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

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

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