РегистрБухгалтерииМенеджер.<Имя регистра бухгалтерии>.ПолучитьФорму

Методы · GetForm

Получает форму регистра бухгалтерии.

Синтаксис

ПолучитьФорму(<Форма>, <Владелец>, <КлючУникальности>)
Полное описание, параметры и ограничения

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

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

ПолучитьФорму (GetForm)

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

Синтаксис:
ПолучитьФорму(<Форма>, <Владелец>, <КлючУникальности>)
Параметры:

<Форма> (обязательный)
Тип: Строка, ОбъектМетаданных: Форма.
Имя формы, как оно задано в конфигураторе, или объект описания метаданного требуемой формы.

<Владелец> (необязательный)
Тип: Форма; Элемент управления.
Объект, который будет являться владельцем открываемой формы.

<КлючУникальности> (необязательный)
Тип: Произвольный.
В данном параметре может быть задан некоторый ключ, значение которого будет использоваться для поиска уже открытых форм.
При поиске учитываются значения свойств открытых форм соответствующим значениям параметров метода. Если найдена открытая форма (по совпадению всех параметров), то она будет возвращена вместо новой формы.
Если из некой формы (один и тот же владелец) требуется открывать новые экземпляры другой формы, то при каждом вызове метода значение данного параметра должно быть уникально (в рамках соответствующих значений свойств открытых форм).
Значение параметра присваивается свойству открываемой формы КлючУникальности.
Следует учитывать, что при получении формы из "объекта" система получает форму для конкретного экземпляра объекта с учетом совокупности переданных параметров, в то время как для "ссылки" всегда существует только один объект в базе данных и форма получается одна (для одинаковой совокупности параметров).
Возвращаемое значение:
Тип: Форма, Неопределено.
Неопределено - если в обработчике ПриСозданииНаСервере установлен признак отказа от создания формы.
Описание:

Получает форму регистра бухгалтерии.

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

Толстый клиент.

Примечание:
Перед выполнением метода производится анализ параметров вызова и, при необходимости, происходит переадресация вызова глобальному контексту.
Использование в версии:

Доступен, начиная с версии 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С» и не аффилирован с ней.