Создает новую настройку периода. По умолчанию у созданного объекта свойства определены следующим образом: РедактироватьКакИнтервал - Истина; РедактироватьКакПериод - Истина; ВариантНачала- БезОграничения; ВариантОкончания - БезОграничения; ВариантНастройки - Интервал. Также может быть создан с использованием функциональной формы оператора Новый.
Синтаксис
Новый НастройкаПериода()Примеры платформы
Период = Новый (Тип("НастройкаПериода"));
Период.ВариантНастройки = ВариантНастройкиПериода.Интервал;
Период.УстановитьПериод(НачалоДня(ДатаНач), КонецДня(ДатаКон)));Полное описание, параметры и ограничения
НастройкаПериода.По умолчанию
НастройкаПериода (PeriodSettings)
По умолчанию
Доступен, начиная с версии 8.0.
Синтаксис:
Новый НастройкаПериода()
Описание:
Создает новую настройку периода. По умолчанию у созданного объекта свойства определены следующим образом:
РедактироватьКакИнтервал - Истина;
РедактироватьКакПериод - Истина;
ВариантНачала- БезОграничения;
ВариантОкончания - БезОграничения;
ВариантНастройки - Интервал.
Также может быть создан с использованием функциональной формы оператора Новый.
Пример:
Период = Новый (Тип("НастройкаПериода"));
Период.ВариантНастройки = ВариантНастройкиПериода.Интервал;
Период.УстановитьПериод(НачалоДня(ДатаНач), КонецДня(ДатаКон)));
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Колонки источника и видимые колонки обычного списка: свой профиль и реальные выбранные строки
Полный отдельный ordinary стенд с тремя своими документами2/200,3/300,5/500. Native factory создаёт собственную форму списка; урок объясняет Source.Columns≠GUI.Columns, AutoDeleteFalse/True, строковый source.Delete и плановую перестройку только собственного layout. Native событие доставляет настоящие currentrow/currentdata; SQL-паспорт не подменяет UI-проверку.
Где и как запускать
Windows8.5.1.1343, толстый клиент, обычное приложение/обычные формы, новая собственная файловая ИБ. MAIN — полная собственная ordinary форма-контроллер; actual child metadata Документ.Уч85Профиль.Форма.ФормаСписка с основным реквизитом ДокументСписок.Уч85Профиль и обычным ТабличноеПоле. Не managed DynamicList. Здесь только исходники/статические проверки, actual1C/DB/UI/files/network0.
Подготовка
В собственной Windows VM вручную подготовьте НОВУЮ пустую файловую ИБ C:\1c-labs\OwnList85_8d18bc25-d53c-45eb-a8f8-4b14b9c6c682\IB, CF Уч85ПрофилиСписка, Основной режим запуска Обычное приложение. Платформа8.5.1.1343, толстый клиент. Не используйте УТ/КА/УНФ/БП/рабочие базы/старую CF предыдущего урока. Здесь ничего не создаётся и не запускается.
Ровно один собственный пользователь Уч85Список_8d18bc25. В новой CF создайте роль Уч85Стенд с Администрирование для native чтения массива пользователей, чтением/добавлением/изменением своего Уч85Профиль; назначьте её только этому собственному пользователю. Не выдавайте права в рабочих ИБ. COMMON сверяет настоящий native current user и Users[0] при Count1, включая typed UUID; никаких UUID placeholders/ручной подстановки нет.
Метка8d18bc25-d53c-45eb-a8f8-4b14b9c6c682 — не native UUID ИБ. Сценарий получает новый native UUID при запуске, пользователь — реальный UUID текущей авторизации. UUID самой ИБ не измеряется. Guard адреса требует exact File строки; если она иная, остановитесь и проверьте фактический адрес, не ослабляйте сравнение подстрокой.
В CF только один документ Уч85Профиль, проведение Запретить, автонумерация строкового номера. Реквизиты Метка85/Пользователь85/Сценарий85 Строка36, Количество Число3,0, Сумма Число15,2, Описание85 Строка100. Дата стандартная включает время. Модуль объекта оставьте пустым: нет собственных обработчиков, движений и реальных регистров. Не добавляйте другие документы/справочники/регистры/задания/обмены/расширения/разделители.
В Общих модулях создайте Уч85СписокСтенд: КлиентОбычноеПриложение=True, Сервер=False, Глобальный=False, Привилегированный=False, повторное использование Не использовать. Вставьте целиком COMMON. Native UserManager доступен здесь именно в толстом клиенте; не переносите его вызовы в тонкий клиент. Код читает только known собственный стенд и проверяет реальные saved ссылки/UUID/данные.
В Документ.Уч85Профиль → Формы мастером создайте ОБЫЧНУЮ ФормаСписка; назначьте основной формой списка. Основной реквизит Список имеет тип ДокументСписок.Уч85Профиль. Это реальный metadata source native расширения формы списка документов, не общая форма с переименованной переменной и не managed ДинамическийСписок.
В ordinary ФормаСписка подготовьте один ТабличноеПоле с именем Список и Данные=Список, ТолькоПросмотр=True. Перед сохранением metadata удалите ВСЕ его GUI-колонки в Конфигураторе: первоначальный GUI Count0 — явная подготовка этого известного собственного layout. Список-source и таблица имеют одинаковое имя, но код проверяет native metadata type плюс actual value identity/data-binding/control identity, а не только имена.
Форму списка сделайте только для просмотра: не добавляйте команды создания/редактирования/удаления/проведения/пометки удаления и автонаполняемые командные панели. Свои saved данные изменяет только явная команда контроллера до открытия списка. Readonly-control не абсолютная защита от произвольного административного кода; одна собственная сессия и известная CF обязательны.
В модуль этой ФормаСписка вставьте LIST_FORM. Назначьте форме native ПередОткрытием(Отказ,СтандартнаяОбработка)2. Для ТабличноеПоле.Список событие ПриАктивизацииСтроки назначьте СписокПриАктивизацииСтроки(Элемент): base native event имеет0 параметров, ordinary extension добавляет первый Элемент, поэтому handler1. Не вызывайте этот обработчик вручную. ПодготовитьСвойПоказ85 — собственная обычная Export процедура инициализации, не native событие.
Создайте обычную общую форму Уч85ПрофилиСписка, без основного прикладного реквизита, с реквизитами СогласиеНаСвоиТриЗаписи85 Булево и Статус85 Строка1000. Флажок согласия доступен, поле Статус85 только для просмотра. Вставьте MAIN/CONTROLLER целиком. Он хранит actual свежий child-instance из manager.GetListForm, не ищет чужие формы и не конструирует абстрактные КолонкиСписка.
В этой общей форме создайте4 обычные кнопки: СоздатьСвоиТри85, ПоказатьСемантикуУдаления85, ПерестроитьСвойМакет85, ПроверитьИтог85. Native Нажатие у Кнопка имеет0 параметров; ordinary extension добавляет первый Элемент, значит свяжите их Нажатие с одноимённой процедурой(Элемент). Это не managed command handler и не ручной callback.
В Модуль обычного приложения вставьте APPLICATION с native ПриНачалеРаботыСистемы0. Оно проверяет пустоту и открывает именно свою общую форму через native ПолучитьОбщуюФорму. CF и формы сохраните/проверьте/запустите сами; actual compile/UI здесь0.
Убедитесь вручную: пустая таблица документов, одна сессия, один actual пользователь, нужная роль, точный File адрес, только свой документ/CF, GUI metadata initially0. Первое действие создаст ровно3 собственных записи с явным согласием. Частичная запись оставляет unknown flag и сохранённые свои данные для проверки человеком; автоматических очисток/повторов/отмены транзакции/backup нет.
GUI КолонкаТабличногоПоля.Данные — StringRW, имя source column. Source КолонкаСписка.Имя readonly. Не копируйте legacy пример с GUI.Значение на объект колонки: актуальная native TableBoxColumn использует Данные. Поле ТабличноеПоле.Данные связывает переменную основного реквизита через ordinary control-extension, .Значение возвращает actual native список; этот field никогда не используется владельцем окна.
Явный свой source whitelist8: Ссылка,Дата,Номер,Количество,Сумма,Метка85,Пользователь85,Сценарий85. GUI4: Дата,Номер,Количество,Сумма. Ссылку и UUID держим в source для проверки delivered currentdata, но не показываем пользователю как редактируемые поля. Список.Колонки readonly factory→collection; нельзя присвоить новый абстрактный объект списку.
Настройка времени own list — именно НастройкаПериода, не СтандартныйПериод из managed/СКД. Его native ctor0 даёт обе границы БезОграничения; код проверяет фактические пустые GetDateFrom/GetDateTo и назначает field.СтандартныйПериод ДО Открыть. Это гарантируемое raw contract ожидание, actual список ещё не запускался; не оставляйте default текущий месяц, скрывающий январские учебные документы.
Native ПараметрТекущаяСтрока получает свою сохранённую ссылку3/300 до открытия. Raw позиционирование происходит только при open/reopen, не при любом последующем присваивании. После открытия сами щёлкните все свои2,3,5; SQL-count3 не считается доказательством того, что GUI их отобразил или native event доставил.
В текущие3 записи входят даты02/03/04.01.2026 с00:00, количества2/3/5, суммы200/300/500 и свои описания. COMMON читает реальную таблицу по typed refs и UUID и сверяет Qty10/Sum1000. Отбор.Add/Delete/GetAvailableFields для DocumentList.Filter нативно НЕ доступны; их намеренно нет в PRIMARY/коде и они не подменяются похожим standalone Отбор.
AutoDeleteFalse означает: удаление видимой GUI-колонки сохраняет её source-column. AutoDeleteTrue на том же actual source-column означает: native удаление собственной связанной GUI-колонки удаляет source-column тоже. Это не удаление реквизита metadata или записей документа. Source.Columns.Удалить принимает String name; GUI.Columns.Удалить принимает index либо actualGUIColumn, не наоборот.
Reset разрешён лишь этому созданному целиком собственному child-instance/knownwhitelist/order/bindings и независимым данным3/10/1000. Вначале phase flag, все8 source.AutoDelete=False, потом ownGUI.Clear0, проверка GUI0/source8, ownSource.Clear0, проверка source0, только затем плановый Set8/Add4. После ошибки не выполняется blindrestore/retry/cleanup; ноль — явное проверенное промежуточное собственное состояние, не произвольная пустота.
Данные native текущей строки не кэшируйте между профилями. LIST_FORM берёт свежие .ТекущаяСтрока/.ТекущиеДанные в настоящем событии; MAIN сравнивает actual form/control/data identities, concrete types, ownDocRef/UUID/values с отдельным DB-readback. Во время layout перехода событие не засчитывается; после каждого профиля нужны три реальных ручных выбора заново.
Статические tests моделируют ошибки и сверяют source/API/raw8.5, но не заменяют BSL compiler/GUI-протокол. Ожидаемые результаты source9→8/native AutoDelete/currentrow/currentdata/0→8/4 должны быть подтверждены вручную в этом собственном стенде. Здесь actual writes/UI/1C/OS/network/files provisioning0; authored файлы урока не являются готовой CF.
Перем СвояФорма85;
Перем СвойСписок85;
Перем СвоеПоле85;
Перем СвоиСсылки85;
Перем Сценарий85;
Перем ЗапускНачат85;
Перем НеизвестныйИсход85;
Перем МеняемМакет85;
Перем Этап85;
Перем ДоставленныеСтроки85;
Процедура СоздатьСвоиТри85(Элемент)
Если Не СогласиеНаСвоиТриЗаписи85 Или ЗапускНачат85 = Истина Тогда
ВызватьИсключение "Нужно явное согласие на три собственные записи; повторное создание запрещено.";
КонецЕсли;
Уч85СписокСтенд.ПроверитьПустоту85();
Паспорт = Уч85СписокСтенд.ПаспортСтенда85();
ЗапускНачат85 = Истина;
НеизвестныйИсход85 = Истина;
МеняемМакет85 = Истина;
Идентификатор = Новый УникальныйИдентификатор;
Сценарий85 = Строка(Идентификатор);
СвоиСсылки85 = Новый Массив;
ДоставленныеСтроки85 = Новый Массив;
Для Индекс = 0 По 2 Цикл
Уч85СписокСтенд.ПрочитатьСвоиДанные85(Сценарий85, СвоиСсылки85);
Количество = ?(Индекс = 0, 2, ?(Индекс = 1, 3, 5));
Документ = Документы.Уч85Профиль.СоздатьДокумент();
Документ.Дата = Дата(2026, 1, 2 + Индекс);
Документ.Метка85 = Паспорт.Метка;
Документ.Пользователь85 = Паспорт.Пользователь;
Документ.Сценарий85 = Сценарий85;
Документ.Количество = Количество;
Документ.Сумма = Количество * 100;
Документ.Описание85 = "Своя строка " + Строка(Количество);
Документ.Записать(РежимЗаписиДокумента.Запись);
Если Документ.ЭтоНовый() Или Документ.Ссылка.Пустая() Тогда
ВызватьИсключение "Не получена реальная сохранённая ссылка, исход нельзя подменять ожидаемым.";
КонецЕсли;
СвоиСсылки85.Добавить(Документ.Ссылка);
Уч85СписокСтенд.ПрочитатьСвоиДанные85(Сценарий85, СвоиСсылки85);
КонецЦикла;
КлючФормы = Новый УникальныйИдентификатор;
СвояФорма85 = Документы.Уч85Профиль.ПолучитьФормуСписка("ФормаСписка", ЭтаФорма, КлючФормы);
Если СвояФорма85 = Неопределено Или ТипЗнч(СвояФорма85) <> Тип("Форма")
Или СвояФорма85.ВладелецФормы <> ЭтаФорма Тогда
ВызватьИсключение "Нет собственного свежего ordinary list-instance из native manager factory.";
КонецЕсли;
СвойСписок85 = СвояФорма85.Список;
СвоеПоле85 = СвояФорма85.ЭлементыФормы.Список;
ПроверитьИсточник85();
Если СвоеПоле85.Колонки.Количество() <> 0 Тогда
ВызватьИсключение "В подготовленной своей форме GUI-колонки первоначально пустые; чужой layout не заменяем.";
КонецЕсли;
СвояФорма85.ПодготовитьСвойПоказ85(Сценарий85, СвоиСсылки85);
СвойСписок85.Колонки.Установить("Ссылка,Дата,Номер,Количество,Сумма,Метка85,Пользователь85,Сценарий85");
ПроверитьКолонкиИсточника85(Ложь);
ДобавитьЧетыреВидимые85();
Период = Новый НастройкаПериода;
Если Период.ПолучитьДатуНачала() <> Дата(1, 1, 1) Или Период.ПолучитьДатуОкончания() <> Дата(1, 1, 1) Тогда
ВызватьИсключение "Native новый период должен быть без ограничений, иначе учебные январские строки могут скрыться.";
КонецЕсли;
СвоеПоле85.СтандартныйПериод = Период;
СвоеПоле85.РазрешитьНастройкуПериода = Ложь;
СвояФорма85.ПараметрТекущаяСтрока = СвоиСсылки85[1];
Если СвояФорма85.ПараметрТекущаяСтрока <> СвоиСсылки85[1] Тогда
ВызватьИсключение "Не назначена собственная начальная ссылка3/300 до открытия формы.";
КонецЕсли;
Этап85 = 0;
НеизвестныйИсход85 = Ложь;
МеняемМакет85 = Ложь;
СвояФорма85.Открыть();
Статус85 = "В ИБ реально три свои строки10/1000. В отдельном native списке вручную выберите2,3,5 для проверки доставки.";
КонецПроцедуры
Процедура ПроверитьИсточник85()
Уч85СписокСтенд.ПрочитатьСвоиДанные85(Сценарий85, СвоиСсылки85);
Если ТипЗнч(СвойСписок85) <> Тип("ДокументСписок.Уч85Профиль")
Или СвояФорма85.Список <> СвойСписок85 Или СвоеПоле85 <> СвояФорма85.ЭлементыФормы.Список
Или ТипЗнч(СвоеПоле85) <> Тип("ТабличноеПоле") Или СвоеПоле85.Данные <> "Список"
Или СвоеПоле85.Значение <> СвойСписок85 Или Не СвоеПоле85.ТолькоПросмотр Тогда
ВызватьИсключение "Не совпал реальный metadata-source/own table/value-binding, не alias по имени переменной.";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьКолонкиИсточника85(СОписанием)
Имена = СтрРазделить("Ссылка,Дата,Номер,Количество,Сумма,Метка85,Пользователь85,Сценарий85", ",");
Если СвойСписок85.Колонки.Количество() <> Имена.Количество() + ?(СОписанием, 1, 0) Тогда
ВызватьИсключение "Изменён полный собственный набор колонок источника, лишние колонки не удаляем.";
КонецЕсли;
Для Индекс = 0 По Имена.Количество() - 1 Цикл
Колонка = СвойСписок85.Колонки.Получить(Индекс);
Если ТипЗнч(Колонка) <> Тип("КолонкаСписка") Или Колонка.Имя <> Имена[Индекс]
Или СвойСписок85.Колонки.Найти(Имена[Индекс]) <> Колонка Тогда
ВызватьИсключение "Индекс/readonly Name/Find actual source-column не совпали с своим полным whitelist.";
КонецЕсли;
КонецЦикла;
Если СОписанием Тогда
КолонкаОписания = СвойСписок85.Колонки.Получить(8);
Если КолонкаОписания.Имя <> "Описание85" Или СвойСписок85.Колонки.Найти("Описание85") <> КолонкаОписания Тогда
ВызватьИсключение "Девятая source-колонка не собственное Описание85.";
КонецЕсли;
Иначе
Если СвойСписок85.Колонки.Найти("Описание85") <> Неопределено Тогда
ВызватьИсключение "Описание85 неожиданно осталось в источнике.";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьЧетыреВидимые85()
Если СвоеПоле85.Колонки.Количество() <> 0 Тогда
ВызватьИсключение "Создание своих GUI-колонок допустимо только после проверенного пустого собственного layout.";
КонецЕсли;
Имена = СтрРазделить("Дата,Номер,Количество,Сумма", ",");
Для Каждого Имя Из Имена Цикл
Колонка = СвоеПоле85.Колонки.Добавить(Имя, Имя);
Колонка.Данные = Имя;
Колонка.ТолькоПросмотр = Истина;
Если Колонка.Данные <> Имя Тогда
ВызватьИсключение "GUI.Данные не связан с реальной собственной source-column.";
КонецЕсли;
КонецЦикла;
ПроверитьВидимые85(Ложь);
КонецПроцедуры
Процедура ПроверитьВидимые85(СОписанием)
Имена = СтрРазделить("Дата,Номер,Количество,Сумма", ",");
Если СвоеПоле85.Колонки.Количество() <> 4 + ?(СОписанием, 1, 0) Тогда
ВызватьИсключение "Чужая или неожиданная GUI-колонка: весь layout не чистим.";
КонецЕсли;
Для Индекс = 0 По 3 Цикл
Колонка = СвоеПоле85.Колонки.Получить(Индекс);
Если Колонка.Имя <> Имена[Индекс] Или Колонка.Данные <> Имена[Индекс]
Или Не Колонка.ТолькоПросмотр Или СвоеПоле85.Колонки.Найти(Имена[Индекс]) <> Колонка Тогда
ВызватьИсключение "Собственная GUI-позиция/data binding/readonly-control изменены.";
КонецЕсли;
КонецЦикла;
Если СОписанием Тогда
Описание = СвоеПоле85.Колонки.Получить(4);
Если Описание.Имя <> "Описание85" Или Описание.Данные <> "Описание85" Тогда
ВызватьИсключение "Дополнительная GUI-колонка не своё Описание85.";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПринятьСвоюСтроку85(ФормаИсточник, ЭлементИсточник, Ссылка, Данные) Экспорт
Если МеняемМакет85 = Истина Или НеизвестныйИсход85 = Истина Тогда
Возврат;
КонецЕсли;
Если ФормаИсточник <> СвояФорма85 Или ЭлементИсточник <> СвоеПоле85
Или ТипЗнч(Ссылка) <> Тип("ДокументСсылка.Уч85Профиль")
Или ТипЗнч(Данные) <> Тип("ТекущиеДанныеСписка")
Или Ссылка <> СвоеПоле85.ТекущаяСтрока Тогда
ВызватьИсключение "Native delivery не от своих actual form/control/row/currentdata.";
КонецЕсли;
ПроверитьИсточник85();
СвежиеДанные = СвоеПоле85.ТекущиеДанные;
Если ТипЗнч(СвежиеДанные) <> Тип("ТекущиеДанныеСписка")
Или СвежиеДанные.Ссылка <> Данные.Ссылка Или СвежиеДанные.Количество <> Данные.Количество
Или СвежиеДанные.Сумма <> Данные.Сумма Или СвежиеДанные.Сценарий85 <> Данные.Сценарий85 Тогда
ВызватьИсключение "Native текущие значения изменились между доставкой и чтением; стабильную identity wrapper не предполагаем.";
КонецЕсли;
Таблица = Уч85СписокСтенд.ПрочитатьСвоиДанные85(Сценарий85, СвоиСсылки85);
Индекс = СвоиСсылки85.Найти(Ссылка);
Если Индекс = Неопределено Тогда
ВызватьИсключение "Ссылка не принадлежит своим реальным трём документам.";
КонецЕсли;
Сохранено = Таблица[Индекс];
Если Данные.Ссылка <> Сохранено.Ссылка Или Данные.Количество <> Сохранено.Количество
Или Данные.Сумма <> Сохранено.Сумма Или Данные.Дата <> Сохранено.Дата
Или Данные.Номер <> Сохранено.Номер Или Данные.Метка85 <> Сохранено.Метка85
Или Данные.Пользователь85 <> Сохранено.Пользователь85 Или Данные.Сценарий85 <> Сохранено.Сценарий85 Тогда
ВызватьИсключение "Actual native currentdata, а не DB-расчёт, отличается от независимой собственной строки.";
КонецЕсли;
Если СвойСписок85.Колонки.Найти("Описание85") <> Неопределено И Данные.Описание85 <> Сохранено.Описание85 Тогда
ВызватьИсключение "Source-only hidden Описание85 не прочиталось как реальное значение своего документа.";
КонецЕсли;
Если ДоставленныеСтроки85.Найти(Ссылка) = Неопределено Тогда
ДоставленныеСтроки85.Добавить(Ссылка);
КонецЕсли;
Статус85 = "Native строка " + Строка(Данные.Количество) + "/" + Строка(Данные.Сумма)
+ "; доставлено разных своих ссылок " + Строка(ДоставленныеСтроки85.Количество()) + ". DB10/1000 проверяется отдельно.";
КонецПроцедуры
Процедура ПоказатьСемантикуУдаления85(Элемент)
Если Этап85 <> 0 Или НеизвестныйИсход85 = Истина Или МеняемМакет85 = Истина
Или ДоставленныеСтроки85.Количество() <> 3 Тогда
ВызватьИсключение "Сначала native событие должно реально доставить все свои2,3,5; повтор/partial layout запрещён.";
КонецЕсли;
ПроверитьИсточник85();
ПроверитьКолонкиИсточника85(Ложь);
ПроверитьВидимые85(Ложь);
НеизвестныйИсход85 = Истина;
МеняемМакет85 = Истина;
КолонкаИсточника = СвойСписок85.Колонки.Добавить("Описание85", Ложь);
Если КолонкаИсточника.АвтоУдаление Или КолонкаИсточника.Имя <> "Описание85" Тогда
ВызватьИсключение "Native source.Add не вернул своё имя/AutoDeleteFalse.";
КонецЕсли;
GUIКолонка = СвоеПоле85.Колонки.Добавить("Описание85", "Своё описание");
GUIКолонка.Данные = "Описание85";
GUIКолонка.ТолькоПросмотр = Истина;
ПроверитьКолонкиИсточника85(Истина);
ПроверитьВидимые85(Истина);
Если КолонкаИсточника.АвтоУдаление Или СвойСписок85.Колонки.Найти("Описание85") <> КолонкаИсточника Тогда
ВызватьИсключение "Перед первым GUI-delete своё source identity/AutoDeleteFalse неожиданно изменено.";
КонецЕсли;
СвоеПоле85.Колонки.Удалить(GUIКолонка);
ПроверитьВидимые85(Ложь);
ПроверитьКолонкиИсточника85(Истина);
Если СвойСписок85.Колонки.Найти("Описание85") <> КолонкаИсточника Тогда
ВызватьИсключение "При AutoDeleteFalse источник должен сохранить своё описание после GUI-delete.";
КонецЕсли;
КолонкаИсточника.АвтоУдаление = Истина;
Если Не КолонкаИсточника.АвтоУдаление Тогда
ВызватьИсключение "AutoDeleteTrue не установлен на actual own source-column.";
КонецЕсли;
GUIКолонка = СвоеПоле85.Колонки.Добавить("Описание85", "Своё описание");
GUIКолонка.Данные = "Описание85";
GUIКолонка.ТолькоПросмотр = Истина;
ПроверитьВидимые85(Истина);
Если Не КолонкаИсточника.АвтоУдаление Или СвойСписок85.Колонки.Найти("Описание85") <> КолонкаИсточника Тогда
ВызватьИсключение "Перед вторым GUI-delete своё source identity/AutoDeleteTrue неожиданно изменено.";
КонецЕсли;
СвоеПоле85.Колонки.Удалить(GUIКолонка);
ПроверитьВидимые85(Ложь);
ПроверитьКолонкиИсточника85(Ложь);
СвойСписок85.Колонки.Добавить("Описание85", Ложь);
ПроверитьКолонкиИсточника85(Истина);
СвойСписок85.Колонки.Удалить("Описание85");
ПроверитьКолонкиИсточника85(Ложь);
ПроверитьИсточник85();
СвойСписок85.Обновить();
Этап85 = 1;
НеизвестныйИсход85 = Ложь;
МеняемМакет85 = Ложь;
ДоставленныеСтроки85.Очистить();
Статус85 = "AutoDeleteFalse сохранил source-column, True удалил её вместе с GUI; source.Delete принимает имя. Вручную опять выберите свои2,3,5.";
КонецПроцедуры
Процедура ПерестроитьСвойМакет85(Элемент)
Если Этап85 <> 1 Или НеизвестныйИсход85 = Истина Или МеняемМакет85 = Истина
Или ДоставленныеСтроки85.Количество() <> 3 Тогда
ВызватьИсключение "Нужна реальная доставка своих строк после предыдущего профиля; повтор и partial запрещены.";
КонецЕсли;
ПроверитьИсточник85();
ПроверитьКолонкиИсточника85(Ложь);
ПроверитьВидимые85(Ложь);
НеизвестныйИсход85 = Истина;
МеняемМакет85 = Истина;
Для Индекс = 0 По 7 Цикл
Колонка = СвойСписок85.Колонки.Получить(Индекс);
Колонка.АвтоУдаление = Ложь;
Если Колонка.АвтоУдаление Тогда
ВызватьИсключение "Перед сбросом GUI своё source-column сохранение не подтверждено.";
КонецЕсли;
КонецЦикла;
СвоеПоле85.Колонки.Очистить();
Если СвоеПоле85.Колонки.Количество() <> 0 Тогда
ВызватьИсключение "Свои GUI-колонки не стали пустыми, source.clear не разрешён.";
КонецЕсли;
ПроверитьКолонкиИсточника85(Ложь);
СвойСписок85.Колонки.Очистить();
Если СвойСписок85.Колонки.Количество() <> 0 Тогда
ВызватьИсключение "Собственный source.Clear не дал пустой набор; перестройку не продолжаем.";
КонецЕсли;
ПроверитьИсточник85();
СвойСписок85.Колонки.Установить("Ссылка,Дата,Номер,Количество,Сумма,Метка85,Пользователь85,Сценарий85");
ПроверитьКолонкиИсточника85(Ложь);
ДобавитьЧетыреВидимые85();
СвойСписок85.Обновить();
ПроверитьИсточник85();
Этап85 = 2;
НеизвестныйИсход85 = Ложь;
МеняемМакет85 = Ложь;
ДоставленныеСтроки85.Очистить();
Статус85 = "Планово перестроен только полностью свой layout0→8source/4GUI, не очищены документы. Вручную ещё раз выберите2,3,5.";
КонецПроцедуры
Процедура ПроверитьИтог85(Элемент)
Если Этап85 <> 2 Или НеизвестныйИсход85 = Истина Или МеняемМакет85 = Истина
Или ДоставленныеСтроки85.Количество() <> 3 Тогда
ВызватьИсключение "Нет полной реальной доставки собственных строк после перестройки.";
КонецЕсли;
ПроверитьИсточник85();
ПроверитьКолонкиИсточника85(Ложь);
ПроверитьВидимые85(Ложь);
Статус85 = "Полный own protocol: actual native delivery2/200,3/300,5/500; DB3records/qty10/sum1000; source8/GUI4.";
КонецПроцедурыCOMMON — полный паспорт собственных реальных saved данных
Своя CF Уч85ПрофилиСписка → Общие → Общие модули → Уч85СписокСтенд → Модуль.
КлиентОбычноеПриложение=True/Сервер=False; thick-only currentUsers factory/readQuery, никакого actual запуска.
Функция ПаспортСтенда85() Экспорт
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnList85_8d18bc25-d53c-45eb-a8f8-4b14b9c6c682\IB"";" Или Метаданные.Документы.Количество() <> 1 Или Метаданные.Документы.Найти("Уч85Профиль") = Неопределено Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.Справочники.Количество() <> 0 Тогда
ВызватьИсключение "Допустим только собственный новый файловый стенд с одним своим документом без регистров.";
КонецЕсли;
Если Метаданные.Документы.Уч85Профиль.Проведение <> Метаданные.СвойстваОбъектов.Проведение.Запретить Тогда
ВызватьИсключение "Учебные документы этого отдельного стенда не проводятся.";
КонецЕсли;
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если Текущий = Неопределено Или Пользователи.Количество() <> 1 Тогда
ВызватьИсключение "Нужен один подготовленный собственный пользователь с административным правом чтения списка пользователей.";
КонецЕсли;
Если Текущий.Имя <> "Уч85Список_8d18bc25"
Или Пользователи[0].Имя <> Текущий.Имя
Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Current native user не совпал с единственным фактическим пользователем своей ИБ.";
КонецЕсли;
Возврат Новый Структура("Метка,Пользователь", "8d18bc25-d53c-45eb-a8f8-4b14b9c6c682", Строка(Текущий.УникальныйИдентификатор));
КонецФункции
Процедура ПроверитьПустоту85() Экспорт
ПаспортСтенда85();
Запрос = Новый Запрос("ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Число ИЗ Документ.Уч85Профиль");
Строки = Запрос.Выполнить().Выбрать();
Если Не Строки.Следующий() Или Строки.Число <> 0 Тогда
ВызватьИсключение "ИБ не пуста. Не создаём повторно, не удаляем и не перезаписываем существующие документы.";
КонецЕсли;
КонецПроцедуры
Функция ПрочитатьСвоиДанные85(Сценарий, Ссылки) Экспорт
Паспорт = ПаспортСтенда85();
Если ТипЗнч(Ссылки) <> Тип("Массив") Или Ссылки.Количество() > 3
Или ТипЗнч(Сценарий) <> Тип("Строка") Или СтрДлина(Сценарий) <> 36 Тогда
ВызватьИсключение "Нужны собственные реальные ссылки и UUID текущего запуска.";
КонецЕсли;
Идентификатор = Новый УникальныйИдентификатор(Сценарий);
Если НРег(Строка(Идентификатор)) <> НРег(Сценарий) Тогда
ВызватьИсключение "UUID сценария повреждён.";
КонецЕсли;
Счетчик = Новый Запрос("ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Число ИЗ Документ.Уч85Профиль");
Проверка = Счетчик.Выполнить().Выбрать();
Если Не Проверка.Следующий() Или Проверка.Число <> Ссылки.Количество() Тогда
ВызватьИсключение "Количество реальных документов изменено, частичная запись не исправляется автоматически.";
КонецЕсли;
Запрос = Новый Запрос(
"ВЫБРАТЬ П.Ссылка, П.Дата, П.Номер, П.Количество, П.Сумма, П.Описание85,
| П.Метка85, П.Пользователь85, П.Сценарий85, П.Проведен, П.ПометкаУдаления
|ИЗ Документ.Уч85Профиль КАК П
|ГДЕ П.Метка85 = &Метка И П.Пользователь85 = &Пользователь И П.Сценарий85 = &Сценарий
|УПОРЯДОЧИТЬ ПО П.Количество");
Запрос.УстановитьПараметр("Метка", Паспорт.Метка);
Запрос.УстановитьПараметр("Пользователь", Паспорт.Пользователь);
Запрос.УстановитьПараметр("Сценарий", Сценарий);
Данные = Запрос.Выполнить().Выгрузить();
Если Данные.Количество() <> Ссылки.Количество() Тогда
ВызватьИсключение "Не совпали фактические собственные UUID в сохранённых документах.";
КонецЕсли;
ИтогКоличество = 0;
ИтогСумма = 0;
Для Индекс = 0 По Данные.Количество() - 1 Цикл
СтрокаДанных = Данные[Индекс];
Количество = ?(Индекс = 0, 2, ?(Индекс = 1, 3, 5));
Если ТипЗнч(Ссылки[Индекс]) <> Тип("ДокументСсылка.Уч85Профиль")
Или Ссылки[Индекс].Пустая() Или СтрокаДанных.Ссылка <> Ссылки[Индекс]
Или СтрокаДанных.Дата <> Дата(2026, 1, 2 + Индекс)
Или СтрокаДанных.Количество <> Количество Или СтрокаДанных.Сумма <> Количество * 100
Или ПустаяСтрока(СтрокаДанных.Номер) Или СтрокаДанных.Описание85 <> "Своя строка " + Строка(Количество)
Или СтрокаДанных.Проведен Или СтрокаДанных.ПометкаУдаления Тогда
ВызватьИсключение "Независимый паспорт реальной строки отличается от своей подготовки.";
КонецЕсли;
ИтогКоличество = ИтогКоличество + СтрокаДанных.Количество;
ИтогСумма = ИтогСумма + СтрокаДанных.Сумма;
КонецЦикла;
Если Данные.Количество() = 3 И (ИтогКоличество <> 10 Или ИтогСумма <> 1000) Тогда
ВызватьИсключение "Суммы собственных трёх документов не10/1000.";
КонецЕсли;
Возврат Данные;
КонецФункцииLIST_FORM — actual native ordinary document list и настоящее rowevent1
Своя CF → Документы → Уч85Профиль → Формы → ordinary ФормаСписка → Модуль.
Main Список:ДокументСписок.Уч85Профиль actual ordinary metadata; BeforeOpen2/rowActivate1 на толстом клиенте, не managed aliases.
Перем СвойСценарий85;
Перем СвоиСсылки85;
Перем Подготовлено85;
Процедура ПодготовитьСвойПоказ85(Сценарий, Ссылки) Экспорт
Если Подготовлено85 = Истина Или ТипЗнч(Список) <> Тип("ДокументСписок.Уч85Профиль")
Или ТипЗнч(Ссылки) <> Тип("Массив") Или Ссылки.Количество() <> 3 Тогда
ВызватьИсключение "Инициализация допустима только один раз для actual собственного metadata document list.";
КонецЕсли;
Уч85СписокСтенд.ПрочитатьСвоиДанные85(Сценарий, Ссылки);
СвойСценарий85 = Сценарий;
СвоиСсылки85 = Ссылки;
Подготовлено85 = Истина;
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Если Подготовлено85 <> Истина Или ЭтаФорма.ВладелецФормы = Неопределено
Или ТипЗнч(ЭтаФорма.ВладелецФормы) <> Тип("Форма")
Или ТипЗнч(Список) <> Тип("ДокументСписок.Уч85Профиль")
Или ЭлементыФормы.Список.Данные <> "Список"
Или ЭлементыФормы.Список.Значение <> Список
Или Не ЭлементыФормы.Список.ТолькоПросмотр
Или ЭтаФорма.ПараметрТекущаяСтрока <> СвоиСсылки85[1] Тогда
Отказ = Истина;
ВызватьИсключение "Форму открывает только свой подготовленный owner; default metadata positioning ещё не исполнено.";
КонецЕсли;
Уч85СписокСтенд.ПрочитатьСвоиДанные85(СвойСценарий85, СвоиСсылки85);
КонецПроцедуры
Процедура СписокПриАктивизацииСтроки(Элемент)
Если Подготовлено85 <> Истина Или Элемент <> ЭлементыФормы.Список Тогда
ВызватьИсключение "Native row event пришёл не от своего подготовленного TableBox.";
КонецЕсли;
Данные = Элемент.ТекущиеДанные;
Если Данные = Неопределено Тогда
Возврат;
КонецЕсли;
ЭтаФорма.ВладелецФормы.ПринятьСвоюСтроку85(ЭтаФорма, Элемент, Элемент.ТекущаяСтрока, Данные);
КонецПроцедурыAPPLICATION — полный собственный ordinary старт
Своя CF → Модуль обычного приложения.
Native ordinary ПриНачалеРаботыСистемы0/ПолучитьОбщуюФорму/Форма.Открыть after own empty scope.
Процедура ПриНачалеРаботыСистемы()
Уч85СписокСтенд.ПроверитьПустоту85();
Форма = ПолучитьОбщуюФорму("Уч85ПрофилиСписка");
Форма.Открыть();
КонецПроцедурыРазбор по шагам
В новой собственной пустой ИБ запустите свой толстый ordinary клиент. Launcher появился только после exact File/CF/единственный current+UsersUUID/pustota guards. Отметьте СогласиеНаСвоиТриЗаписи85, затем СоздатьСвоиТри85 один раз.
MAIN перед каждым native document.Write сверяет собственные ранее сохранённые0/1/2 записи и ссылки; native СоздатьДокумент создаёт именно свой непроводимый объект. После каждого write новая фактическая ссылка добавляется только при ЭтоНовый=False/nonempty и независимом saved readback. После третьего — real count3, Qty10/Sum1000. При partial ошибка прекращает урок без автоудаления.
Native manager.GetListForm3 создаёт свежую собственную ordinary списочную форму с owner=этот launcher и freshUUIDkey. MAIN проверяет actual source type, child/source/table binding identities, preparedGUI0, заменяет целиком known собственные source columns на8 и создаёт отдельно4 GUI columns с native Данные binding.
До Open назначены native НастройкаПериода без ограничений и ПараметрТекущаяСтрока=своя сохранённая3/300. Native BeforeOpen2 support подтвердит реальный main DocList и independent own rows. Ожидаемое первоначальное выделение3/300 проверьте вручную; это не выполненный здесь результат.
В списке вручную выберите2/200,3/300,5/500. Настоящий rowevent handler1 берёт delivered currentdata; MAIN не вычисляет эти значения вместо UI, а сравнивает их с независимыми saved rows/refs/date/number/UUID. Пока все3 different actual refs не доставлены, следующая команда запрещена.
В launcher ПоказатьСемантикуУдаления85: source.Add Описание85 withFalse →source9 и GUI5. Native GUI.Delete(actual own column) →GUI4/source9. Same source.AutoDelete=True +проверенная новая ownGUI association+GUIdelete →GUI4/source8. Отдельный source.AddFalse/Delete("Описание85") подтверждает именно строковую сигнатуру source.Delete; DB3/10/1000 всё время прежний.
После профиля опять щёлкните2/3/5, реально повторно доставьте currentdata. Исчезновение source Description проверяется FindUndefined/Count8; не считайте изменение одного SQL count доказательством GUI association.
ПерестроитьСвойМакет85: snapshot guards before any setters, unknown/layout flags. После отключенияAutoDelete своих8, GUI.Clear→0/source8, Source.Clear→0 при прежних DB3/10/1000. Только доказанный own intermediate0 позволяет planned Set8/Add4; любая ошибка оставляет процесс остановленным без blindrollback.
После rebuild снова реально выберите2/3/5 и нажмите ПроверитьИтог85. Expected source8/GUI4, три настоящие события собственных ссылок и прежний независимый DB3/10/1000. Задача не меняла saved документы после первоначальных3 writes, не печатала/экспортировала/удаляла данные.
Зафиксируйте ручной протокол либо точный отказ; сохранённые собственные3 записи оставьте для человека. Следующий запуск в непустой ИБ намеренно откажет, не создаст дубликаты и не выполнит cleanup. Actual protocol здесь ещё отсутствует: только static source.
Как проверить результат
Статически:15 unique PRIMARY/main uses, source factory+ordinary metadata binding, five native checkers0 mismatches, exactraw8.5 source/columns/readonly/event1/period/ManagerUsers contracts. Старые frozen workspace sources SHA неизменны.
Вручную: wrong path/config/user/usersUUID/count/preexisting data/source/control/layout/deliveredref/UUID →отказ до очередной допустимой own операции, никакого foreign write/перезапуска/очистки. Admin/read-only поля не объявляются абсолютной security.
Вручную: real DB3 records own typed refs, marker/realUserUUID/freshScenarioUUID, dates0:00, qty2+3+5=10, amount200+300+500=1000 до и после каждого layout. Unknown partial не превращается в ожидаемые данные.
Вручную: source8/GUI4 действительно разные collections; AutoDeleteFalse GUIdelete keeps source9, True deletes sourceDescription→8; sourceDelete("Описание85")String не GUIobject/index. Column.Name readonly, actual column.Data binding подтверждён.
Вручную: native callback1 реально доставляет concrete currentDataList values иactualDocRef всех3ownrows; сравнениеQuery не выдаётся за факт отображения. InitialCurrentRow только приopen/reopen, period actualownНастройкаПериодаNoBounds.
Вручную: clear only fullyowned layout, snapshot/whitelist/flags до изменений; GUI0/source8→source0→source8/GUI4 при прежнемDB3/10/1000. Native callbacks вручную не запускаются; после каждого профиля требуется свежая реальная delivery всех3 строк.
Публикационные tests различают authored source и published exact own id/keys/code; root не переписывается из этого урока. Все реальные1C/DB/UI/OS/network/provisioning/backup действия здесь0.
Ожидаемый результат
Ожидаемый ручной результат:3 своих документов10/1000, один whollyowned ordinary список source8/GUI4, доказанные native различия AutoDelete и три реально доставленные выбранные строки после каждого профиля. В этой работе этот runtime результат не выполнялся: authoredsource/static only.
На что обратить внимание
ДокументСписок.<Имя> — ordinary native список, не managed ДинамическийСписок. Native manager.GetListForm3 — реальный источник формы; type/name совпадение переменных без factory/metadata/value identity доказательством не считается.
Source.Columns readonly property даёт изменяемую collection; Column.Name readonly. GUI.Column.Данные связывает source-column, а не native GUI.Значение из legacy примера.
Source.Set(String CSV) replaces whole source columns; GUI layout автоматически не создаётся. Source.Delete(StringName) отличается от GUI.Delete(IndexOrActualColumn).
AutoDeleteFalse/True относится к source-column при удалении соответствующей GUI-column, не к удалению metadata/документов. Не присваивайте ожидаемый Count вместо фактического native readback.
ПараметрТекущаяСтрока делает positioning приopen/reopen; currentdata читается после реальной активации, не сразу из обещанного parameter assignment. Rowevent base0+ordinaryfirstElement1; manual callback запрещён.
Native ТекущиеДанные readonly и зависят от SOURCE columns. Не путайте скрытое source поле с видимой GUI колонкой и не кэшируйте старую selection между source changes.
Native поле.СтандартныйПериод ordinary принимает НастройкаПериода, НЕ одноимённый managed СтандартныйПериод. Fresh ctor0 даётNoBounds; GetDateFrom/GetDateTo actualemptydate, startup historical rows не спрятаны текущим месяцем.
Отбор.Add/Delete/GetAvailableFields rawnative запрещены для DocumentList.Filter. Не применяйте standalone API к похожему owner ради покрытия; в уроке этих calls нет.
Whole Clear только whollyowned freshinstance сownknownstate. Порядок GUI.Clear before source.Clear и exact0 before planned restore нужен; arbitrary чужой source/reset/автоматический rollback после partial недопустим.
Три real native writes выполняет только вручную запущенный authored сценарий с согласия в новой собственной ИБ. После partial/exception unknown flag и реальные saved данные остаются для проверки, без retries/delete/backups.
Native CurrentUser UUID — UUID пользователя, не базы/маркер пути. СписокUsers1 и matching currentUUID устраняют placeholders, но дают administrative read contract только собственному подготовленному толстому клиенту.
Readonly control и guards не защита от произвольного административного кода/других сессий/unknown CF. Только собственная known пустая CF/oneuser/onesession без регистров/расширений/jobs.
СуммаQuery1000 не доказывает GUI отображение илиcallbackdelivery. Delivered data сравниваются отдельно с native actual table/currentrow identity иindependent saved data; без3 разных реальных событий следующая фаза не запускается.
Python synthetic tests/native static checks не BSLcompiler/работающая1C. Field-value identity/AutoDelete/repaint/currentdata delivery/period и GUIzero transitions нужно подтвердить вручную; в этой работе runtime0.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Список250, отбор строк500, сохранено750: собственная сверка регистра расчета
Реальный собственный ordinary список и прочитанный native набор показывают отличие равенства от вхождения. Периоды и настоящая доставка строк проверяются отдельно от полного сохраненного объема.
Где и как запускать
Полный модуль собственной обычной формы списка УчебнаяСверка85.Сверка85, только толстый обычный клиент FileIB8.5.1.1343. Настоящий список/набор, реальные nativecallbacks; не выполнялся.
Подготовка
Только ручной будущий опыт в новой собственной VM и новой пустой файловой ИБ платформы8.5.1.1343: C:\1C85_OwnViewsLab\63439b19-e013-4137-a338-43bd7de9115f\Base. Ничего здесь не создавалось и не выполнялось. Метка каталога не является UUID ИБ; UUID пакета и пользователя проверяются отдельно. Рабочие базы, копии с рабочими данными и сетевые ИБ запрещены.
CF с нуля назовите УчебнаяСверкаНачислений85. В Конфигураторе откройте Сервис → Параметры → Общие → Редактирование конфигурации для режима запуска, выберите Управляемое приложение и обычное приложение и нажмите Применить. Это режим редактора, а не свойство метаданных. Убедитесь, что доступны флаг Клиент(обычное приложение) и создание обычной формы; если нет, остановитесь: формулировки справки о видимости противоречивы. Отдельно задайте свойство конфигурации ОсновнойРежимЗапуска=ОбычноеПриложение; только толстый обычный клиент. Создайте ровно объекты, перечисленные далее. Нет БСП, расширений, регламентных заданий, подписок, истории данных, дополнительных форм и автоматических обработчиков. Конфигуратор закройте перед единственным сеансом Предприятия.
План видов расчета УчебныеВидыСверки85: КодСтрока12, Наименование80, Использование периода действияНет, Зависимость от видов расчетаНеИспользовать, базовые планы пусты. Без предопределенных видов/реквизитов/табличных частей. ВытесняющиеВидыРасчета и БазовыеВидыРасчета в этой схеме не определены: native разрешает их только при использовании действия/базы; нельзя даже читать их ради проверки пустоты. ВедущиеВидыРасчета доступны и должны быть пусты. Данные WORK85 создает полный модуль только после отдельного согласия; не вводите неизвестный готовый вид.
Регистр расчета УчебнаяСверка85: периодичностьМесяц, планУчебныеВидыСверки85, ПериодДействияНет, БазовыйПериодНет, без графика и перерасчетов. Измерение Сотрудник85 толькоСтрока12 переменная; ресурсСумма85 толькоЧисло9.2; реквизитов0. Единственный регистратор УчебныйРегистраторСверки85.
Документ УчебныйРегистраторСверки85: НомерСтрока3, автонумерацияНет, без табличных частей; Маркер85 и Пользователь85 толькоСтрока36 переменные. ПроведениеРазрешить, движения толькоУчебнаяСверка85, модуль объекта пустой, не проводите документ. Подготовка сохраняет документ режимомЗапись и отдельно свой native набор; скрытого ОбработкаПроведения нет.
Одна роль АдминистраторСверки85: Администрирование, Активные пользователи и права чтения/добавления/изменения только собственных документа/вида/регистра, использования собственной обработки. Один пользователь УченикСверки85 с этой ролью. Без иных пользователей и сеансов. Код сравнивает реальный currentUUID с soleUserUUID, не записывает их в журнал и не выводит чувствительные сведения.
Общий модуль УчебнаяСверкаСтенд85: Клиент(обычное приложение)Да, СерверНет, ГлобальныйНет, ПривилегированныйНет. Поместите полный supporting COMMON целиком. В этой партии нет обработчика набора, вызывающего клиентский модуль из серверного контекста. Не переносите модуль в thin/web/server.
В регистреУчебнаяСверка85 создайте обычную форму спискаСверка85 стандартным мастером, назначьте основной. Это настоящая ordinary форма, не управляемая. Главный реквизит Список:РегистрРасчетаСписок.УчебнаяСверка85, полеСписок:ТабличноеПоле с Данные=Список. Нельзя конструировать НовыйРегистрРасчетаСписок или вызывать отсутствующийСоздатьСписок.
В той же форме добавьте реквизит СвойНабор85:РегистрРасчетаНаборЗаписей.УчебнаяСверка85 и второе полеНабор85:ТабличноеПоле с Данные=СвойНабор85. Источник создает реальный CreateRecordSet и читает по своему фактическому регистратору. Колонки обоих полей изначально пусты: полный модуль создает их после установки реальных источников; не добавляйте своих вычисляемых колонок.
ФормаСверка85: Статус85Строка неограниченная, поле статусаТолькоПросмотр. КнопкиЯнварь85/Февраль85/Точный85/Вхождение85/Все85/ПроверитьДоставку85. В свойствах событий назначьте одноименные nativeНажатие. ПолюСписок назначьте ПриПолученииДанных→СписокПриПолученииДанных85; формеПриОткрытии. Полный основной BSL целиком заменяет модуль этой формы.
ОбработкаУчебнаяСверкаПульт85: обычная формаПульт85, основной реквизит обработки; ПодтверждаюСозданиеСвоихДанных85Булево, флажок; кнопкаСоздатьИОткрыть85. NativeНажатие иПриОткрытии назначьте указанным handlers. Полный supportingCONTROLLER в этот модуль. Его событие не вызывают вручную, никакого кода в ПриОткрытии, создающего строки, нет.
Перед ручным запуском F7 всей собственнойCF, проверка конфигурации и обновление своей пустойИБ. Фактическую строку регистрации ИБ сверить с literalFile в Паспорт85. NativeСтрокаСоединенияИнформационнойБазы возвращает как зарегистрировано, не гарантирует нормализацию. Если отличается, остановитесь, не ослабляйте guard до совпадения имениCF и не подставляйте рабочий адрес.
Откройте собственныйПульт. Прочитайте согласие, отметьте свой флажок и один раз нажмитеСоздатьИОткрыть85. Сохраняются только WORK85, документ001 от10.02.2026 с actualUUID/currentuser и его3 движения EMP1/01.01/250, EMP10/01.01/250, EMP2/01.02/250. Общая750. Сумма задается авторским кодом; движок регистра не вычисляет денежное начисление.
Подготовка проверяет пустоту всего стенда и полный объем после каждой записи, native набор сверяет с independently constructed own expected всеми колонками/строками/типами/значениями. Нумерация native с1. Write(Истина,Ложь,Ложь,Ложь): новый набор, замещение только своего регистратора, без ФПД/автоперерасчетов (они отключены в metadata). Никакой atomicity/rollback/retry не обещается; ошибка или частичная запись означает остановку. Не удалять и не «дозаполнять» неизвестный результат.
Открытая форма имеет два собственных readonly поля. СтандартныйПериод явно настроен, но не принимается за доказательство backend-отбора: одновременно задан и полностью прочитан actualСписок.Отбор.ПериодРегистрации с nativeИнтервалВключаяГраницы/ЗначениеС/ЗначениеПо. На полном периоде в списке3/750; послеЯнварь85 ожидаются2/500, послеФевраль85 1/250. ОтдельноТочный85 на полном периоде: nativeРавноEMP1 в списке1/250. Вхождение85: список снова3/750, а ручной вид набора поEMP1 показываетEMP1+EMP10, 2/500.
Доставка списка проверяется только настоящим nativeПриПолученииДанных. После фактического показа/при необходимости прокрутки нажмитеПроверитьДоставку85. Коллекции/оформления внеcallback не хранятся, только scalar snapshots реальных строк. Нельзя обещать все строки за один callback, считать countвидимогоокна полным объемомИБ, имитировать событие или циклически ждать его. Пока строк нет, проверка сообщает это честно.
Набор.Обновить здесь — метод расширения поляНабор85, native перечитываниеИБ, не просто перерисовка. До него текущий actualнабор должен быть чистым, полный состав/реальныйрегистратор/единственный ownfilter проверены; фильтрстрок предварительно снят и автоОбновлятьПриИзмененииОтбораЛожь. После него freshfullreadback. Не применять к набору с несохраненными изменениями.
ОтборСтрок имеет nativeсемантику вхождения несмотря на childВидСравненияРавно: EMP1 подходит иEMP10. Проверяем лишь документированный ownfixture. Истинаобновлять может перечитывать набор, поэтому не обещаем универсальной сохранности любых режимов/несохраненных строк. Видимыйprefix500 дополнительно вручную сверить; истинная сохраненная сумма независимо750.
Настройки отбора/порядка/отборастрок иОтборСтрок — readonly контейнеры, их не заменяют. Меняются actual собственные childДоступность/Использование. Не вызывайтеДобавить/Очистить у настройки динамического списка: native запрещает такие операции. Это ограничения интерфейса, не замена прав/безопасности данных.
ПроверкаОтображенияНовойСтроки у обоих полей осмысленно входит в собственный безопасный профиль: nativeСообщатьОНесоответствииОтбору сохранено и прочитано, ноOnlyRead/ChangeRowSetfalse не дают вводить новую строку. Возникновение warning не заявляется и ради демонстрации не выполняется запись. Автообновление отключено; интервал5 валиден, но таймер не запускается. Запуска1С/UI/runtime и фактических записей здесь не было.
Перем Пакет85;
Перем Снимок85;
Перем Доставлены85;
Перем Режим85;
Перем Настройка85;
Перем Ошибка85;
Процедура ПодготовитьПоказ85(Пакет) Экспорт
Если Пакет85 <> Неопределено Или ЭтаФорма.Открыта() Тогда
ВызватьИсключение "OWN-VIEWS-FORM: допускается только свой новый закрытый экземпляр";
КонецЕсли;
УчебнаяСверкаСтенд85.ПроверитьДанные85(Пакет, 3);
Если ТипЗнч(Список) <> Тип("РегистрРасчетаСписок.УчебнаяСверка85") Или ЭлементыФормы.Список.Данные <> "Список" Или ЭлементыФормы.Список.Значение <> Список Тогда
ВызватьИсключение "OWN-VIEWS-SOURCE: нужен настоящий созданный мастером собственный список";
КонецЕсли;
Настройка85 = Истина;
Ошибка85 = Ложь;
Пакет85 = Пакет;
Список.Колонки.Установить("Регистратор,НомерСтроки,ПериодРегистрации,Активность,ВидРасчета,Сотрудник85,Сумма85");
СвойНабор85 = УчебнаяСверкаСтенд85.НовыйНабор85(Пакет85);
СвойНабор85.Прочитать();
Снимок85 = СвойНабор85.Выгрузить();
ПолеСписка = ЭлементыФормы.Список;
ПолеНабора = ЭлементыФормы.Набор85;
Если ПолеСписка.Колонки.Количество() <> 0 Или ПолеНабора.Колонки.Количество() <> 0 Тогда
ВызватьИсключение "OWN-VIEWS-LAYOUT: собственные подготовленные колонки должны быть пустыми; чужой макет не заменяем";
КонецЕсли;
ПолеСписка.СоздатьКолонки();
ПолеНабора.СоздатьКолонки();
ПолеСписка.ТолькоПросмотр = Истина;
ПолеНабора.ТолькоПросмотр = Истина;
ПолеСписка.ИзменятьСоставСтрок = Ложь;
ПолеНабора.ИзменятьСоставСтрок = Ложь;
ПолеСписка.ВосстанавливатьТекущуюСтроку = Ложь;
ПолеСписка.АвтоОбновление = Ложь;
ПолеСписка.ПериодАвтоОбновления = 5;
ПолеСписка.ИзменятьАвтоОбновление = Ложь;
ПолеСписка.РазрешитьНастройкуПериода = Ложь;
ПолеСписка.ПроверкаОтображенияНовойСтроки = ВариантПроверкиОтображенияНовойСтроки.СообщатьОНесоответствииОтбору;
ПолеНабора.ПроверкаОтображенияНовойСтроки = ВариантПроверкиОтображенияНовойСтроки.СообщатьОНесоответствииОтбору;
ПолеНабора.ИзменятьПорядокСтрок = Ложь;
ПолеНабора.ОбновлятьПриИзмененииОтбора = Ложь;
ОграничитьРедакторы85(ПолеСписка.НастройкаОтбора);
ОграничитьРедакторы85(ПолеСписка.НастройкаПорядка);
ОграничитьРедакторы85(ПолеНабора.НастройкаОтбораСтрок);
Для Каждого Элемент Из Список.Отбор Цикл
Если Снимок85.Колонки.Найти(Элемент.Имя) = Неопределено Тогда
ВызватьИсключение "OWN-VIEWS-FILTER: неизвестное поле фильтра свежего собственного списка";
КонецЕсли;
Элемент.Использование = Ложь;
КонецЦикла;
Для Каждого Элемент Из ПолеНабора.ОтборСтрок Цикл
Если Снимок85.Колонки.Найти(Элемент.Имя) = Неопределено Тогда
ВызватьИсключение "OWN-VIEWS-FILTER: неизвестное поле фильтра свежего собственного набора";
КонецЕсли;
Элемент.Использование = Ложь;
КонецЦикла;
УстановитьПериод85(0);
Режим85 = 0;
Доставлены85 = Новый Соответствие;
Настройка85 = Ложь;
ПроверитьПоказ85();
Статус85 = "В базе750. Показ списка нужно подтвердить настоящей доставкой строк. Новые строки запрещены: настройка предупреждения не означает, что предупреждение возникло.";
КонецПроцедуры
Процедура УстановитьПериод85(Режим)
Начало = Дата(2026, ?(Режим = 2, 2, 1), 1);
Окончание = КонецМесяца(Дата(2026, ?(Режим = 1, 1, 2), 1));
Период = Новый НастройкаПериода;
Период.УстановитьПериод(Начало, Окончание, Ложь);
ЭлементыФормы.Список.СтандартныйПериод = Период;
Список.Отбор.ПериодРегистрации.ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы;
Список.Отбор.ПериодРегистрации.ЗначениеС = Начало;
Список.Отбор.ПериодРегистрации.ЗначениеПо = Окончание;
Список.Отбор.ПериодРегистрации.Использование = Истина;
КонецПроцедуры
Процедура ОграничитьРедакторы85(Редакторы)
Для Каждого Редактор Из Редакторы Цикл
Если Снимок85.Колонки.Найти(Редактор.Имя) = Неопределено Тогда
ВызватьИсключение "OWN-VIEWS-POLICY: неизвестное поле настройки";
КонецЕсли;
Редактор.Доступность = Ложь;
Если Редактор.Доступность Тогда
ВызватьИсключение "OWN-VIEWS-POLICY: запрет интерактивного изменения не установлен";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьПоказ85()
Если Ошибка85 Тогда
ВызватьИсключение "OWN-VIEWS-STOP: предыдущая ошибка требует остановки, не повтора";
КонецЕсли;
УчебнаяСверкаСтенд85.ПроверитьЧистый85(Пакет85, СвойНабор85);
УчебнаяСверкаСтенд85.Сравнить85(СвойНабор85.Выгрузить(), Снимок85);
ПолеСписка = ЭлементыФормы.Список;
ПолеНабора = ЭлементыФормы.Набор85;
Если ТипЗнч(ПолеСписка) <> Тип("ТабличноеПоле") Или ТипЗнч(ПолеНабора) <> Тип("ТабличноеПоле")
Или ПолеСписка.Данные <> "Список" Или ПолеСписка.Значение <> Список Или ПолеНабора.Данные <> "СвойНабор85" Или ПолеНабора.Значение <> СвойНабор85
Или Не ПолеСписка.ТолькоПросмотр Или Не ПолеНабора.ТолькоПросмотр Или ПолеСписка.ИзменятьСоставСтрок Или ПолеНабора.ИзменятьСоставСтрок
Или ПолеСписка.АвтоОбновление Или ПолеСписка.ПериодАвтоОбновления <> 5 Или ПолеСписка.ИзменятьАвтоОбновление
Или ПолеСписка.ВосстанавливатьТекущуюСтроку Или ПолеСписка.РазрешитьНастройкуПериода Или ПолеНабора.ИзменятьПорядокСтрок Или ПолеНабора.ОбновлятьПриИзмененииОтбора Тогда
ВызватьИсключение "OWN-VIEWS-PROFILE: изменена собственная связь или политика показа";
КонецЕсли;
Если ПолеСписка.ПроверкаОтображенияНовойСтроки <> ВариантПроверкиОтображенияНовойСтроки.СообщатьОНесоответствииОтбору
Или ПолеНабора.ПроверкаОтображенияНовойСтроки <> ВариантПроверкиОтображенияНовойСтроки.СообщатьОНесоответствииОтбору Тогда
ВызватьИсключение "OWN-VIEWS-PROFILE: изменена сохраненная в памяти политика новых строк";
КонецЕсли;
Для Каждого Редактор Из ПолеСписка.НастройкаОтбора Цикл
Если Редактор.Доступность Тогда
ВызватьИсключение "OWN-VIEWS-PROFILE: интерактивный отбор разблокирован";
КонецЕсли;
КонецЦикла;
Для Каждого Редактор Из ПолеСписка.НастройкаПорядка Цикл
Если Редактор.Доступность Тогда
ВызватьИсключение "OWN-VIEWS-PROFILE: интерактивный порядок разблокирован";
КонецЕсли;
КонецЦикла;
Для Каждого Редактор Из ПолеНабора.НастройкаОтбораСтрок Цикл
Если Редактор.Доступность Тогда
ВызватьИсключение "OWN-VIEWS-PROFILE: интерактивный отбор строк разблокирован";
КонецЕсли;
КонецЦикла;
ОжидаемыйНачальныйМесяц = ?(Режим85 = 2, 2, 1);
ОжидаемыйКонечныйМесяц = ?(Режим85 = 1, 1, 2);
Если ПолеСписка.СтандартныйПериод.ПолучитьДатуНачала() <> Дата(2026, ОжидаемыйНачальныйМесяц, 1)
Или ПолеСписка.СтандартныйПериод.ПолучитьДатуОкончания() <> КонецМесяца(Дата(2026, ОжидаемыйКонечныйМесяц, 1)) Тогда
ВызватьИсключение "OWN-VIEWS-PERIOD: неверный собственный период регистрации";
КонецЕсли;
ПроверитьФильтры85();
КонецПроцедуры
Процедура ПроверитьФильтры85()
Для Каждого Элемент Из Список.Отбор Цикл
Если Элемент.Использование Тогда
Если Элемент.Имя = "ПериодРегистрации" Тогда
Если Элемент.ВидСравнения <> ВидСравнения.ИнтервалВключаяГраницы
Или Элемент.ЗначениеС <> Дата(2026, ?(Режим85 = 2, 2, 1), 1)
Или Элемент.ЗначениеПо <> КонецМесяца(Дата(2026, ?(Режим85 = 1, 1, 2), 1)) Тогда
ВызватьИсключение "OWN-VIEWS-FILTER: неверные границы реального фильтра регистрации";
КонецЕсли;
ИначеЕсли Режим85 <> 3 Или Элемент.Имя <> "Сотрудник85" Или Элемент.ВидСравнения <> ВидСравнения.Равно Или Элемент.Значение <> "EMP1" Тогда
ВызватьИсключение "OWN-VIEWS-FILTER: лишний активный фильтр списка";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Не Список.Отбор.ПериодРегистрации.Использование Или Список.Отбор.Сотрудник85.Использование <> (Режим85 = 3) Тогда
ВызватьИсключение "OWN-VIEWS-FILTER: фильтр списка не совпал с этапом";
КонецЕсли;
Для Каждого Элемент Из ЭлементыФормы.Набор85.ОтборСтрок Цикл
Если Элемент.Использование Тогда
Если Режим85 <> 4 Или Элемент.Имя <> "Сотрудник85" Или Элемент.Значение <> "EMP1" Или Элемент.ВидСравнения <> ВидСравнения.Равно Тогда
ВызватьИсключение "OWN-VIEWS-FILTER: лишний активный фильтр строк";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ЭлементыФормы.Набор85.ОтборСтрок.Сотрудник85.Использование <> (Режим85 = 4) Тогда
ВызватьИсключение "OWN-VIEWS-FILTER: фильтр строк не совпал с этапом";
КонецЕсли;
КонецПроцедуры
Процедура ПриОткрытии()
ПроверитьПоказ85();
Список.Обновить();
ЭлементыФормы.Список.ОбновитьСтроки();
КонецПроцедуры
Процедура Январь85(Кнопка)
СменитьПоказ85(Кнопка, "Январь85", 1);
КонецПроцедуры
Процедура Февраль85(Кнопка)
СменитьПоказ85(Кнопка, "Февраль85", 2);
КонецПроцедуры
Процедура Точный85(Кнопка)
СменитьПоказ85(Кнопка, "Точный85", 3);
КонецПроцедуры
Процедура Вхождение85(Кнопка)
СменитьПоказ85(Кнопка, "Вхождение85", 4);
КонецПроцедуры
Процедура Все85(Кнопка)
СменитьПоказ85(Кнопка, "Все85", 0);
КонецПроцедуры
Процедура СменитьПоказ85(Кнопка, Имя, НовыйРежим)
Если ТипЗнч(Кнопка) <> Тип("Кнопка") Или Кнопка.Имя <> Имя Или Кнопка <> ЭлементыФормы[Имя] Тогда
ВызватьИсключение "OWN-VIEWS-BUTTON: неизвестный источник";
КонецЕсли;
ПроверитьПоказ85();
Настройка85 = Истина;
Попытка
Список.Отбор.Сотрудник85.Использование = Ложь;
ЭлементыФормы.Набор85.ОтборСтрок.Сотрудник85.Использование = Ложь;
УчебнаяСверкаСтенд85.ПроверитьЧистый85(Пакет85, СвойНабор85);
ЭлементыФормы.Набор85.Обновить();
УчебнаяСверкаСтенд85.ПроверитьЧистый85(Пакет85, СвойНабор85);
УчебнаяСверкаСтенд85.Сравнить85(СвойНабор85.Выгрузить(), Снимок85);
УстановитьПериод85(НовыйРежим);
Если НовыйРежим = 3 Тогда
Список.Отбор.Сотрудник85.Установить("EMP1", Истина);
ИначеЕсли НовыйРежим = 4 Тогда
ЭлементыФормы.Набор85.ОтборСтрок.Сотрудник85.Установить("EMP1", Истина);
КонецЕсли;
Режим85 = НовыйРежим;
Доставлены85 = Новый Соответствие;
ПроверитьПоказ85();
Настройка85 = Ложь;
Список.Обновить();
ЭлементыФормы.Список.ОбновитьСтроки();
ЭлементыФормы.Набор85.ОбновитьСтроки();
Статус85 = "Перечитывание завершено без обещания атомарности. Нажмите ПроверитьДоставку85 после фактического показа строк. Отбор набора EMP1: вручную должны быть EMP1 и EMP10, сумма500; полный набор по-прежнему750.";
Исключение
Ошибка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Функция РазрешенКлюч85(Номер)
Возврат (Режим85 = 0 Или Режим85 = 4) Или (Режим85 = 1 И Номер <= 2) Или (Режим85 = 2 И Номер = 3) Или (Режим85 = 3 И Номер = 1);
КонецФункции
Процедура СписокПриПолученииДанных85(Элемент, ОформленияСтрок)
Если Настройка85 = Истина Тогда
Возврат;
КонецЕсли;
Если Элемент <> ЭлементыФормы.Список Или ТипЗнч(ОформленияСтрок) <> Тип("ОформленияСтрок") Тогда
ВызватьИсключение "OWN-VIEWS-EVENT: неизвестный источник или native коллекция";
КонецЕсли;
Попытка
ПроверитьПоказ85();
Для Индекс = 0 По ОформленияСтрок.Количество() - 1 Цикл
Оформление = ОформленияСтрок.Получить(Индекс);
Если ТипЗнч(Оформление) <> Тип("ОформлениеСтроки") Тогда
ВызватьИсключение "OWN-VIEWS-EVENT: неожиданный элемент";
КонецЕсли;
Данные = Оформление.ДанныеСтроки;
Если Данные = Неопределено Или ТипЗнч(Данные) <> Тип("ТекущиеДанныеСписка") Или Данные.Регистратор <> Пакет85.Регистратор Тогда
ВызватьИсключение "OWN-VIEWS-EVENT: нет настоящих данных собственной строки";
КонецЕсли;
Если ТипЗнч(Данные.НомерСтроки) <> Тип("Число") Или Данные.НомерСтроки < 1 Или Данные.НомерСтроки > 3 Или Данные.НомерСтроки <> Цел(Данные.НомерСтроки) Или Не РазрешенКлюч85(Данные.НомерСтроки) Тогда
ВызватьИсключение "OWN-VIEWS-EVENT: неизвестный или скрываемый ключ";
КонецЕсли;
Найден = Снимок85.Найти(Данные.НомерСтроки, "НомерСтроки");
Для Каждого Имя Из СтрРазделить("Регистратор,НомерСтроки,ПериодРегистрации,Активность,ВидРасчета,Сотрудник85,Сумма85", ",") Цикл
Если ТипЗнч(Данные[Имя]) <> ТипЗнч(Найден[Имя]) Или Данные[Имя] <> Найден[Имя] Тогда
ВызватьИсключение "OWN-VIEWS-EVENT: фактическое поле не совпало с сохраненными собственными данными";
КонецЕсли;
КонецЦикла;
Доставлены85.Вставить(Данные.НомерСтроки, Новый Структура("Регистратор,НомерСтроки,Сотрудник85,Сумма85", Данные.Регистратор, Данные.НомерСтроки, Данные.Сотрудник85, Данные.Сумма85));
КонецЦикла;
Исключение
Ошибка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьДоставку85(Кнопка)
Если ТипЗнч(Кнопка) <> Тип("Кнопка") Или Кнопка <> ЭлементыФормы.ПроверитьДоставку85 Или Кнопка.Имя <> "ПроверитьДоставку85" Тогда
ВызватьИсключение "OWN-VIEWS-BUTTON: неверная кнопка проверки";
КонецЕсли;
ПроверитьПоказ85();
ОжидаемоеКоличество = ?(Режим85 = 1, 2, ?(Режим85 = 2 Или Режим85 = 3, 1, 3));
Сумма = 0;
Для Каждого Доставка Из Доставлены85 Цикл
Если Не РазрешенКлюч85(Доставка.Ключ) Или Доставка.Значение.Регистратор <> Пакет85.Регистратор Или Доставка.Значение.НомерСтроки <> Доставка.Ключ Тогда
ВызватьИсключение "OWN-VIEWS-EVENT: поврежден собственный скалярный снимок";
КонецЕсли;
Сумма = Сумма + Доставка.Значение.Сумма85;
КонецЦикла;
Если Доставлены85.Количество() <> ОжидаемоеКоличество Или Сумма <> ОжидаемоеКоличество * 250 Тогда
ВызватьИсключение "OWN-VIEWS-DELIVERY: ещё нет всех ожидаемых реально доставленных строк. Осмотрите/прокрутите только собственный список и проверьте снова, не имитируйте callback.";
КонецЕсли;
Статус85 = "Реально доставленные строки списка: " + Строка(ОжидаемоеКоличество) + "; сумма: " + Строка(Сумма) + ". Вся собственная база750. При отборе строк EMP1 отдельно вручную сверить две строки EMP1/EMP10 и500.";
КонецПроцедурыПолный own подготовительный и читающий общий модуль
Общие модули → УчебнаяСверкаСтенд85
Только Клиент(обычное приложение), Server/Global/PrivilegedНет.
Функция Читать85(Текст)
Запрос = Новый Запрос(Текст);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Процедура Сравнить85(Факт, Ожидание) Экспорт
Если ТипЗнч(Факт) <> Тип("ТаблицаЗначений") Или ТипЗнч(Ожидание) <> Тип("ТаблицаЗначений")
Или Факт.Количество() <> Ожидание.Количество() Или Факт.Колонки.Количество() <> Ожидание.Колонки.Количество() Тогда
ВызватьИсключение "OWN-VIEWS-TABLE: изменился полный состав";
КонецЕсли;
Для Каждого Колонка Из Ожидание.Колонки Цикл
Если Факт.Колонки.Найти(Колонка.Имя) = Неопределено Тогда
ВызватьИсключение "OWN-VIEWS-TABLE: неизвестный состав полей";
КонецЕсли;
КонецЦикла;
Использованы = Новый Массив;
Для Каждого Ожидаемая Из Ожидание Цикл
Найден = -1;
Для Индекс = 0 По Факт.Количество() - 1 Цикл
Если Использованы.Найти(Индекс) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Совпало = Истина;
Для Каждого Колонка Из Ожидание.Колонки Цикл
Если ТипЗнч(Факт[Индекс][Колонка.Имя]) <> ТипЗнч(Ожидаемая[Колонка.Имя]) Или Факт[Индекс][Колонка.Имя] <> Ожидаемая[Колонка.Имя] Тогда
Совпало = Ложь;
КонецЕсли;
КонецЦикла;
Если Совпало Тогда
Найден = Индекс;
Прервать;
КонецЕсли;
КонецЦикла;
Если Найден < 0 Тогда
ВызватьИсключение "OWN-VIEWS-TABLE: чужая строка, дубль, тип или значение";
КонецЕсли;
Использованы.Добавить(Найден);
КонецЦикла;
КонецПроцедуры
Процедура ТипПоля85(Поле, ТипДанных, Длина, Дробь)
Если Поле = Неопределено Или Поле.Тип.Типы().Количество() <> 1 Или Не Поле.Тип.СодержитТип(Тип(ТипДанных)) Тогда
ВызватьИсключение "OWN-VIEWS-SCHEMA: неверный тип";
КонецЕсли;
Если ТипДанных = "Строка" Тогда
Если Поле.Тип.КвалификаторыСтроки.Длина <> Длина Тогда
ВызватьИсключение "OWN-VIEWS-SCHEMA: неверная длина строки";
КонецЕсли;
ИначеЕсли Поле.Тип.КвалификаторыЧисла.Разрядность <> Длина Или Поле.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> Дробь Тогда
ВызватьИсключение "OWN-VIEWS-SCHEMA: неверная точность суммы";
КонецЕсли;
КонецПроцедуры
Функция Паспорт85() Экспорт
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1C85_OwnViewsLab\63439b19-e013-4137-a338-43bd7de9115f\Base"";" Тогда
ВызватьИсключение "OWN-VIEWS-PATH: разрешена только точная новая собственная файловая ИБ";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "OWN-VIEWS-SCHEMA: неверный стенд или активная транзакция";
КонецЕсли;
Если Метаданные.Документы.Количество() <> 1 Или Метаданные.ПланыВидовРасчета.Количество() <> 1 Или Метаданные.РегистрыРасчета.Количество() <> 1
Или Метаданные.Обработки.Количество() <> 1 Или Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.Роли.Количество() <> 1
Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0
Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0
Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.Константы.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0
Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПараметрыСеанса.Количество() <> 0 Или Метаданные.ОбщиеФормы.Количество() <> 0
Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0
Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Или Метаданные.ХранилищаНастроек.Количество() <> 0 Тогда
ВызватьИсключение "OWN-VIEWS-SCHEMA: посторонние метаданные";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "OWN-VIEWS-SCHEMA: расширения запрещены";
КонецЕсли;
ДокМД = Метаданные.Документы.Найти("УчебныйРегистраторСверки85");
ПланМД = Метаданные.ПланыВидовРасчета.Найти("УчебныеВидыСверки85");
РегистрМД = Метаданные.РегистрыРасчета.Найти("УчебнаяСверка85");
Если ДокМД = Неопределено Или ПланМД = Неопределено Или РегистрМД = Неопределено
Или Метаданные.Обработки.Найти("УчебнаяСверкаПульт85") = Неопределено Или Метаданные.ОбщиеМодули.Найти("УчебнаяСверкаСтенд85") = Неопределено
Или Метаданные.Роли.Найти("АдминистраторСверки85") = Неопределено Тогда
ВызватьИсключение "OWN-VIEWS-SCHEMA: отсутствуют собственные объекты";
КонецЕсли;
Если ДокМД.Реквизиты.Количество() <> 2 Или ДокМД.ТабличныеЧасти.Количество() <> 0 Или ДокМД.Движения.Количество() <> 1
Или Не ДокМД.Движения.Содержит(РегистрМД) Или ДокМД.Проведение <> Метаданные.СвойстваОбъектов.Проведение.Разрешить Тогда
ВызватьИсключение "OWN-VIEWS-SCHEMA: неверный регистратор";
КонецЕсли;
ТипПоля85(ДокМД.Реквизиты.Найти("Маркер85"), "Строка", 36, 0);
ТипПоля85(ДокМД.Реквизиты.Найти("Пользователь85"), "Строка", 36, 0);
Если ПланМД.ИспользованиеПериодаДействия Или ПланМД.ЗависимостьОтВидовРасчета <> Метаданные.СвойстваОбъектов.ИспользованиеБазыПланаВидовРасчета.НеИспользовать
Или ПланМД.БазовыеВидыРасчета.Количество() <> 0 Или ПланМД.Реквизиты.Количество() <> 0 Или ПланМД.ТабличныеЧасти.Количество() <> 0
Или ПланМД.ДлинаКода <> 12 Или ПланМД.ДлинаНаименования <> 80 Тогда
ВызватьИсключение "OWN-VIEWS-SCHEMA: план без базы и действия";
КонецЕсли;
Если РегистрМД.ПланВидовРасчета <> ПланМД Или РегистрМД.ПериодичностьРегистраРасчета <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраРасчета.Месяц
Или РегистрМД.ПериодДействия Или РегистрМД.БазовыйПериод Или РегистрМД.Перерасчеты.Количество() <> 0
Или РегистрМД.Регистраторы.Количество() <> 1 Или Не РегистрМД.Регистраторы.Содержит(ДокМД)
Или РегистрМД.Измерения.Количество() <> 1 Или РегистрМД.Ресурсы.Количество() <> 1 Или РегистрМД.Реквизиты.Количество() <> 0 Тогда
ВызватьИсключение "OWN-VIEWS-SCHEMA: неверный месячный регистр";
КонецЕсли;
ТипПоля85(РегистрМД.Измерения.Найти("Сотрудник85"), "Строка", 12, 0);
ТипПоля85(РегистрМД.Ресурсы.Найти("Сумма85"), "Число", 9, 2);
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Если ТипЗнч(Пользователи) <> Тип("Массив") Или Пользователи.Количество() <> 1 Или Текущий = Неопределено Тогда
ВызватьИсключение "OWN-VIEWS-USER: нужен один свой пользователь";
КонецЕсли;
Если Пользователи[0].Имя <> "УченикСверки85" Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Или Не РольДоступна("АдминистраторСверки85") Тогда
ВызватьИсключение "OWN-VIEWS-USER: чужой пользователь или роль";
КонецЕсли;
Соединения = ПолучитьСоединенияИнформационнойБазы();
Если ТипЗнч(Соединения) <> Тип("Массив") Или Соединения.Количество() <> 1 Или Соединения[0].НомерСоединения <> НомерСоединенияИнформационнойБазы()
Или Соединения[0].Пользователь.УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "OWN-VIEWS-USER: нужны только текущий собственный сеанс и пользователь";
КонецЕсли;
Возврат Текущий.УникальныйИдентификатор;
КонецФункции
Функция ЧислоДвижений85()
Таблица = Читать85("ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Число ИЗ РегистрРасчета.УчебнаяСверка85");
Если Таблица.Количество() <> 1 Или ТипЗнч(Таблица[0].Число) <> Тип("Число") Тогда
ВызватьИсключение "OWN-VIEWS-COUNT: неверный реальный результат";
КонецЕсли;
Возврат Таблица[0].Число;
КонецФункции
Функция НовыйНабор85(Пакет) Экспорт
Набор = РегистрыРасчета.УчебнаяСверка85.СоздатьНаборЗаписей();
Если ТипЗнч(Набор) <> Тип("РегистрРасчетаНаборЗаписей.УчебнаяСверка85") Или Набор.Количество() <> 0 Тогда
ВызватьИсключение "OWN-VIEWS-SET: нужна настоящая пустая фабрика";
КонецЕсли;
Набор.Отбор.Регистратор.Установить(Пакет.Регистратор, Истина);
ПроверитьОтбор85(Набор.Отбор, "Регистратор", Пакет.Регистратор);
Возврат Набор;
КонецФункции
Процедура ПроверитьОтбор85(ОтборДанных, Имя, Значение) Экспорт
Используемых = 0;
Для Индекс = 0 По ОтборДанных.Количество() - 1 Цикл
Элемент = ОтборДанных.Получить(Индекс);
Если Элемент.Использование Тогда
Если Элемент.Имя <> Имя Или Элемент.ВидСравнения <> ВидСравнения.Равно Или Элемент.Значение <> Значение Тогда
ВызватьИсключение "OWN-VIEWS-FILTER: неожиданный активный отбор";
КонецЕсли;
Используемых = Используемых + 1;
КонецЕсли;
КонецЦикла;
Если Используемых <> 1 Тогда
ВызватьИсключение "OWN-VIEWS-FILTER: нужен ровно свой отбор";
КонецЕсли;
КонецПроцедуры
Функция ЭталонНабора85(Пакет)
Набор = НовыйНабор85(Пакет);
Для Индекс = 0 По 2 Цикл
Запись = Набор.Добавить();
Запись.ПериодРегистрации = Дата(2026, ?(Индекс = 2, 2, 1), 1);
Запись.ВидРасчета = Пакет.Вид;
Запись.Активность = Истина;
Запись.Сотрудник85 = ?(Индекс = 0, "EMP1", ?(Индекс = 1, "EMP10", "EMP2"));
Запись.Сумма85 = 250;
Если Запись.НомерСтроки <> Индекс + 1 Тогда
ВызватьИсключение "OWN-VIEWS-LINE: неожиданная native нумерация";
КонецЕсли;
КонецЦикла;
Возврат Набор;
КонецФункции
Процедура ПроверитьДанные85(Пакет, Этап) Экспорт
Пользователь = Паспорт85();
Если ТипЗнч(Пакет) <> Тип("Структура") Или Пакет.Пользователь <> Пользователь Или ТипЗнч(Пакет.UUID) <> Тип("УникальныйИдентификатор") Тогда
ВызватьИсключение "OWN-VIEWS-PACKET: чужой пакет";
КонецЕсли;
ДокументыВсе = Читать85("ВЫБРАТЬ Ссылка,Дата,Номер,Проведен,ПометкаУдаления,Маркер85,Пользователь85 ИЗ Документ.УчебныйРегистраторСверки85");
ВидыВсе = Читать85("ВЫБРАТЬ Ссылка,Код,Наименование,ПометкаУдаления,Предопределенный ИЗ ПланВидовРасчета.УчебныеВидыСверки85");
Если ДокументыВсе.Количество() <> ?(Этап >= 2, 1, 0) Или ВидыВсе.Количество() <> ?(Этап >= 1, 1, 0) Или ЧислоДвижений85() <> ?(Этап = 3, 3, 0) Тогда
ВызватьИсключение "OWN-VIEWS-STATE: изменился весь объём, продолжать нельзя";
КонецЕсли;
Если Этап >= 1 Тогда
Вид = ВидыВсе[0];
Если ТипЗнч(Пакет.Вид) <> Тип("ПланВидовРасчетаСсылка.УчебныеВидыСверки85") Или Пакет.Вид.Пустая() Или Вид.Ссылка <> Пакет.Вид
Или Вид.Код <> "WORK85" Или Вид.Наименование <> "Своя учебная строка" Или Вид.ПометкаУдаления Или Вид.Предопределенный Тогда
ВызватьИсключение "OWN-VIEWS-KIND: неизвестный вид";
КонецЕсли;
ОбъектВида = Вид.Ссылка.ПолучитьОбъект();
Если ОбъектВида.ВедущиеВидыРасчета.Количество() <> 0 Тогда
ВызватьИсключение "OWN-VIEWS-KIND: неизвестные зависимости";
КонецЕсли;
КонецЕсли;
Если Этап >= 2 Тогда
Док = ДокументыВсе[0];
Если ТипЗнч(Пакет.Регистратор) <> Тип("ДокументСсылка.УчебныйРегистраторСверки85") Или Пакет.Регистратор.Пустая() Или Док.Ссылка <> Пакет.Регистратор
Или Док.Дата <> Дата(2026, 2, 10) Или Док.Номер <> "001" Или Док.Проведен Или Док.ПометкаУдаления
Или Док.Маркер85 <> Строка(Пакет.UUID) Или Док.Пользователь85 <> Строка(Пользователь) Тогда
ВызватьИсключение "OWN-VIEWS-DOC: чужой регистратор или маркер";
КонецЕсли;
КонецЕсли;
Если Этап = 3 Тогда
Свежий = НовыйНабор85(Пакет);
Свежий.Прочитать();
Если Свежий.Модифицированность() Тогда
ВызватьИсключение "OWN-VIEWS-SET: свежий набор изменен";
КонецЕсли;
Ожидание = ЭталонНабора85(Пакет).Выгрузить();
Сравнить85(Свежий.Выгрузить(), Ожидание);
Если Свежий.Выгрузить().Итог("Сумма85") <> 750 Тогда
ВызватьИсключение "OWN-VIEWS-MATH: сохранено не750";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция Подготовить85() Экспорт
Пакет = Новый Структура("UUID,Пользователь,Вид,Регистратор", Новый УникальныйИдентификатор, Паспорт85(), Неопределено, Неопределено);
ПроверитьДанные85(Пакет, 0);
Вид = ПланыВидовРасчета.УчебныеВидыСверки85.СоздатьВидРасчета();
Вид.Код = "WORK85";
Вид.Наименование = "Своя учебная строка";
ПроверитьДанные85(Пакет, 0);
Вид.Записать();
Пакет.Вид = Вид.Ссылка;
ПроверитьДанные85(Пакет, 1);
Док = Документы.УчебныйРегистраторСверки85.СоздатьДокумент();
Док.Дата = Дата(2026, 2, 10);
Док.Номер = "001";
Док.Маркер85 = Строка(Пакет.UUID);
Док.Пользователь85 = Строка(Пакет.Пользователь);
ПроверитьДанные85(Пакет, 1);
Док.Записать(РежимЗаписиДокумента.Запись);
Пакет.Регистратор = Док.Ссылка;
ПроверитьДанные85(Пакет, 2);
Набор = ЭталонНабора85(Пакет);
Если Набор.Количество() <> 3 Или Набор.Выгрузить().Итог("Сумма85") <> 750 Тогда
ВызватьИсключение "OWN-VIEWS-SET: неверная собственная подготовка";
КонецЕсли;
ПроверитьДанные85(Пакет, 2);
ПроверитьОтбор85(Набор.Отбор, "Регистратор", Пакет.Регистратор);
Набор.Записать(Истина, Ложь, Ложь, Ложь);
ПроверитьДанные85(Пакет, 3);
Возврат Пакет;
КонецФункции
Процедура ПроверитьЧистый85(Пакет, Набор) Экспорт
ПроверитьДанные85(Пакет, 3);
Если ТипЗнч(Набор) <> Тип("РегистрРасчетаНаборЗаписей.УчебнаяСверка85") Или Набор.Модифицированность() Тогда
ВызватьИсключение "OWN-VIEWS-DIRTY: перечитывание изменённого набора запрещено";
КонецЕсли;
ПроверитьОтбор85(Набор.Отбор, "Регистратор", Пакет.Регистратор);
Сравнить85(Набор.Выгрузить(), ЭталонНабора85(Пакет).Выгрузить());
КонецПроцедурыПолная собственная форма отдельного согласия и native получения окна
Обработки → УчебнаяСверкаПульт85 → Формы → Пульт85 → Модуль
Толстый обычный клиент; actual native button handler, не ручная имитация события.
Перем Запуск85;
Перем ОшибкаПодготовки85;
Процедура ПриОткрытии()
УчебнаяСверкаСтенд85.Паспорт85();
Запуск85 = Ложь;
ОшибкаПодготовки85 = Ложь;
ПодтверждаюСозданиеСвоихДанных85 = Ложь;
КонецПроцедуры
Процедура СоздатьИОткрыть85(Кнопка)
Если ТипЗнч(Кнопка) <> Тип("Кнопка") Или Кнопка <> ЭлементыФормы.СоздатьИОткрыть85 Или Кнопка.Имя <> "СоздатьИОткрыть85"
Или Запуск85 Или ОшибкаПодготовки85 Или Не ПодтверждаюСозданиеСвоихДанных85 Тогда
ВызватьИсключение "OWN-VIEWS-CONFIRM: нужна настоящая кнопка и отдельное согласие на новые собственные данные; повтор запрещен";
КонецЕсли;
ПодтверждаюСозданиеСвоихДанных85 = Ложь;
Запуск85 = Истина;
Попытка
Пакет = УчебнаяСверкаСтенд85.Подготовить85();
Ключ = Новый УникальныйИдентификатор;
Окно = РегистрыРасчета.УчебнаяСверка85.ПолучитьФормуСписка("Сверка85", ЭтаФорма, Ключ);
Если Окно = Неопределено Или ТипЗнч(Окно) <> Тип("Форма") Или Окно.Открыта() Или Окно.ВладелецФормы <> ЭтаФорма Или Окно.КлючУникальности <> Ключ Тогда
ВызватьИсключение "OWN-VIEWS-FORM: нет своей новой закрытой обычной формы";
КонецЕсли;
Окно.ПодготовитьПоказ85(Пакет);
Окно.Открыть();
Исключение
ОшибкаПодготовки85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыРазбор по шагам
Подготовить только свой новый File стенд и три движения. Форма создается native GetListForm с actual nullable guards и отдельным UUID экземпляра; набор — CreateRecordSet и чтение по собственной реальной ссылке.
Показать полный период, январь и февраль. Профиль обеих полей запрещает редактирование. Настройки чтения/прав не смешивать с UI-доступностью; не присваивать readonly коллекциям.
Сравнить точный EMP1 в динамическом списке с вхождением EMP1 в строках набора. Исходный набор и база остаются3/750; неизвестный результат останавливает маршрут.
Перед перечитыванием снять только свой фильтрстрок, проверить чистоту и весь фактический набор/ссылку/отбор/стенд. После перечитывания сравнить все строки и колонки, без обещания атомарности.
Native доставка видимого списка читает Count/Get внутри callback, сверяет каждое фактическое поле, хранит только scalar snapshots по реальным ключам. Подсчет результата использует доставленные суммы, не ожидаемые вместо них.
Проверить собственную warning-policy, но не создавать новую строку и не выдавать настройку за возникшее предупреждение.
Как проверить результат
Полная сохраненная native выгрузка всегда3строки750. Январь показывает2/500, февраль1/250, точноеEMP1 1/250. Реально доставленные строки списка сверяются кнопкой после настоящего показа.
ВхождениеEMP1 в readonly наборе вручную показываетEMP1 иEMP10, 2/500; EMP2не виден. Все85 снимает только свой фильтр, вновь3/750. Повторное чтение полнообъемно проверяется, не заменяется ожидаемыми данными.
Для изменённого actual набора, чужой FileИБ, UUID, пользователя, лишней строки/колонки/фильтра или неправильно доставленного callback опыт прекращается. Сценарий не был исполнен в1С.
Ожидаемый результат
Будущий проверяемый результат: собственные250/500/750, правильные period/equality/inclusion и actualvisible delivery без изменения сохраненных движений после отдельной подготовки. Не выполнялся.
На что обратить внимание
Количество в callback относится только к его видимым строкам; коллекция устаревает за пределами обработчика. Не сохраняйте её и не вызывайте handler вручную.
Метод поляОбновить перечитывает набор; nativeМодифицированность не доказывает отсутствие конкурентных изменений. Полные fresh guards/readback тоже не дают универсальной атомарности.
СтандартныйПериод — НастройкаПериода, не enum. РазрешитьНастройкуПериодаЛожь блокирует команду интерфейса, но не создает отбор сам.
Новая строка здесь запрещена. СообщатьОНесоответствииОтбору изучено как предустановленная проверенная политика, а не доказанный runtimewarning. Любая ошибка не означает автоматического восстановления/безопасного повтора.
Форма/модули только собственной CF, обычный толстый клиент. Браузер BSL не выполняет; фактические UI/1С/БД проверки предстоят вручную.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.