Доступ к объекту осуществляется через свойство глобального контекста РегистрыБухгалтерии. Используется для доступа к объектам, управляющим регистрами бухгалтерии.
Примеры платформы
ОсновнойРегистр = РегистрыБухгалтерии.Основной;
Форма = ОсновнойРегистр.ПолучитьФорму("ФормаСписка");Полное описание, параметры и ограничения
РегистрыБухгалтерииМенеджер (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.
Подготовка
Только отдельный собственный учебный стенд 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С не создавались и не запускались.
Создайте новую CF УчебныеГраницыСубконто85, обычное приложение, обычные формы, совместимостьНеИспользовать. Один документ, один ПВР, один план счетов, один регистр бухгалтерии, один общий модуль и две обычные формы регистра. Все прочие рабочие объекты/подписки/общие реквизиты/задания/расширения/внешние источники отсутствуют. Один сеанс. Не переносите урок в УТ/КА/БП или производственнуюИБ.
Один собственный пользователь Субконто85Ученик и одна полная роль этой новойИБ, включая именно Администрирование: nativeПолучитьПользователей требует административные права. CurrentUser сопоставляется с actualUsers[0] по UUID, UUID не публикуется. До подготовки fixture оставьте application/common/form/recordset модули пустыми. Остальные модули урока вообще не добавляйте.
Документ УчебныйРегистраторСубконто85: ПроведениеЗапретить; НомерСтрока16/автонумерацияНет/контрольуникальностиДа; единственный реквизит Маркер85Строка36, табличных частей нет. В Движения включите только собственный регистр ниже. Document module пустой. Ручное сохранение регистратора не является проведением.
ПВР УчебныеВидыСубконтоГраниц85: ИерархическийНет, КодСтрока8, НаименованиеСтрока50; ТипЗначенияХарактеристик толькоСтрока16; один реквизитМаркер85Строка36, табличных частей/предопределённых видов нет. Подготовьте вручную ровно два своих вида: WH/Склад85 и BT/Партия85, каждому явноТипЗначенияСтрока16 и Маркер85=e49c34a0-32a9-49b0-a880-414c01ff73c8. Это настоящие сохранённые ссылки ПВР, не имена/UUID вместо ссылки.
ПланСчетов УчебныеСчетаСубконтоГраниц85: КодСтрока8, НаименованиеСтрока50, ВидыСубконто=свойПВР, МаксКоличествоСубконто2; один реквизитМаркер85Строка36. Без признаковучёта/признаковучётасубконто/пользовательскихтабличныхчастей/предопределённыхсчетов. Ручной единственный счет50/Учебный запас85/Активный/ЗабалансовыйНет/Маркер=e49c34a0-32a9-49b0-a880-414c01ff73c8. Его настоящая специальная табличная частьВидыСубконто: строка1 actualWH, ПредопределенноеЛожь, ТолькоОборотыЛожь; строка2 actualBT, ПредопределенноеЛожь, ТолькоОборотыИстина. НомерСтроки только читается, не задаётся кодом.
РегистрБухгалтерии УчебныйУчетСубконтоГраниц85: КорреспонденцияНет, ПланСчетов=свой, ДлинаУточненияПериода3, единственный регистраторсвойДокумент. Одно измерениеМаркер85Строка36/БалансовыйДа, один ресурсСумма85Число15,2/БалансовыйДа; реквизитов нет. Итоги вручную заранее включены в своём пустом стенде. Без корреспонденции используются Счет/ВидДвижения/Субконто, не СчетДт/Кт/СубконтоДт/Кт.
Создайте две обычные формы регистра: Проверка85 с главнымСписок85 типаРегистрБухгалтерииСписок.УчебныйУчетСубконтоГраниц85 и Набор85 с главнымНабор85 типаРегистрБухгалтерииНаборЗаписей.УчебныйУчетСубконтоГраниц85. Для ручной подготовки пока используйте штатные обычные формы и стандартные команды без модулей урока и запретов. Только в своейИБ руками сохраните документSUB-85/10.10.2026 12:00/Маркер=e49c34a0-32a9-49b0-a880-414c01ff73c8/ПроведенFalse/ПометкаУдаленияFalse.
Ручной 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. Сохраните штатной командой только этот свой новый набор. Программа ниже не Записывает/Проводит/Удаляет данные. Не включайтеОбменДанными.Загрузка и не отключайте проверки платформы.
УточнениеПериода записи только читается по raw11347. Не назначайте его поНомеруСтроки/черезsetter/черезSQL. Урок читает actualU у всех3реальных строк и отказывает, если они отличаются, нецелые или вне0..998. Здесь не утверждается, что платформа присвоила0/1/2 или вообще0: будущие реальные данные должны подтвердить общийdate/ref/U. Если ручной fixture так не подготовился, остановитесь, не подделывайте его.
После fixture в Конфигураторе: ОбщийМодульГраницыСубконто85, ГлобальныйНет, КлиентОбычноеПриложениеДа, КлиентУправляемоеНет, СерверНет, ВнешнееСоединениеНет. CODE целиком. В File/обычном приложении препроцессорный символТолстыйКлиентОбычноеПриложение бывает у обеих частей; это НЕ универсальный запрет server, поэтому commonmodule здесь именно client-only metadata.
HUB_FORM целиком в собственнуюПроверка85→Модуль. Добавьте Вывод85ТабличныйДокумент и Статус85Строка2000. ПолеТабличногоДокументаВывод85 Данные=Вывод85/ТолькоПросмотрИстина. КнопкаОткрытьНабор85 nativeНажатие→ОткрытьНабор85(Кнопка). FormПередОткрытием→ПередОткрытием(Отказ,СтандартнаяОбработка)2; ПриОткрытии→ПриОткрытии()0. Никакой ручной имитации события.
SET_FORM целиком вНабор85→Модуль. ТабличноеПолеСтроки85 Данные=Набор85; видимые колонкиПериод,Регистратор,НомерСтроки,Активность,ВидДвижения,Счет,УточнениеПериода,Маркер85,Сумма85 и nativeсубконто штатно. Статус85Строка2000 readonly. Удалите стандартные команды/контекстное меню записи, создания, удаления и редактирования. FormПередОткрытием2/ПриОткрытии0/ПередЗаписью(Отказ)1 строго привязаны к native событиям. Настройка readonly не означает отключение просмотра.
RECORDSET_MODULE целиком в Регистр→МодульНабораЗаписей ПОСЛЕ fixture. Это другое nativeПередЗаписью(Отказ,Замещение)2; всегдаОтказИстина, без client-onlycallee и UI, также в server/external контекстах. APPLICATION целиком вМодульОбычногоПриложения, nativeПриНачалеРаботыСистемы0. Вручную обновите только своюCF. Код не компилировался и не запускался здесь.
Будущий запуск читает ПОЛНЫЕ источники безГДЕ:1document/2kind/1account/3rawrows/6subconto/2accountpolicyrows. Из nativeТолькоОбороты выбирает именно actualWH для балансовой virtualtable; по оборотнойПартии остаток не обещается. Реальная выборка/набор подтверждают typedAccount/ВидДвижения/Субконто и тот же собственный состав.
Nativefunctionalctor отдельнойСубконто создаёт только новую memorycollection. В неё копируютсяactual2keys/values, заменаПартии→НоваяПартия85, удаление→одинWH, восстановлениеBT и Очистить→0. Оригинальная Record.Субконто НЕ заменяется и НЕ мутируется; full original/nativeSet и wholeDB source повторно сверяются. Это обучение работе с коллекцией, а не запись/очистка бухгалтерских данных.
Граница строится по actualdate/ref/U, после полного подтверждения всех3строк; непосредственныйrefinedMoment НЕ передаётся в noncorrespondenceОстатки, rawparam55 допускаетГраница. ЯвныеИсключая/Включая проверяются чтениемГраница.Значение/ВидГраницы перед query. NativeтипrefinedMoment прямо разрешён в качествеЗначенияГраницы для бухгалтерского регистра с поддержкойуточнения. Expectedvirtualresults:0/650/650; независимый raw signed1000-250-100=650. СледующийU=actualU+1 — искусственная проверяемая граница ПОСЛЕ этих own строк, не утверждение, что вИБ есть такая новая запись.
Вывод формируется реальным 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();
Форма.Открыть();
#Иначе
ВызватьИсключение "Урок только для своего толстого обычного клиента";
#КонецЕсли
КонецПроцедурыРазбор по шагам
ExactownFile/version/currentUser/fullmetadata прежде любых чтений.
Fullquery источники и actualtypedrefs/GetObject; реальная политика счета исключает оборотныйBT из балансовойаналитики.
ActualSelectByRecorder/ReadSet подтверждают три настоящие записи и полныеСубконто.
Отдельнаяfunctionalctor memorycollection2→replace2→delete1→restore2→clear0, source/nativeOriginalunchanged.
Actualsame date/ref/U→nativeCompare+boundaryreadback→virtualqueries0/650/650, независимыйraw650.
NumericnativeTabDoc иvisiblecontrolreadback; Manager.GetFormCommon отдельно отactualSet.GetFormHub.
Как проверить результат
Будущий результатraw3/650, nativevirtual0/650/650, originalsubconto2unchanged иcopy0.
Canonical/all5native иscopedarity/RO/context/factory/callback/alias/whitespace/case/mutationnegatives; здесьruntime0.
Ожидаемый результат
Ожидаемый ручной результат: защищённые реальные числа0/650/650 и собственный прочитанный набор3. Здесь только авторский код и статическая проверка; фактическая1С/БД/UI не запускались.
На что обратить внимание
РО свойства Record.Субконто/Record.УточнениеПериода никогда не записываются; старыйsetterexamplector157 не отменяет актуальныйRO контракт.
GetTemplate1184 с противоречивым0params не применяется. FieldAnalysisпустойctor иHTMLCompareбезreturn не подменяются выдуманными контрактами.
RefinedMoment применяется только к своему бухгалтерскому virtualqueryLength3 черезnativeГраница; не как произвольная дата для других систем.
Граница всех3строк утверждается только после actualsame date/ref/U/fullsnapshot; U не выводится изНомерСтроки.
Изменения только собственнойmemorycollection/ownUI; программаDBwrite0. Ручнойfixture — отдельные явно указанные будущие операции своей новойИБ.
Readback не атомарен и не защищает от concurrency; один собственный сеанс, ошибка→остановка безretry/слепогоrollback.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.