Тип: ЖурналыДокументовМенеджер. Используется для доступа к определенным в конфигурации журналам документов.
Полное описание, параметры и ограничения
Глобальный контекст.ЖурналыДокументов (Global context.DocumentJournals)
Глобальный контекст (Global context)
ЖурналыДокументов (DocumentJournals)
Доступен, начиная с версии 8.0.
Использование:
Только чтение.
Описание:
Тип: ЖурналыДокументовМенеджер.
Используется для доступа к определенным в конфигурации журналам документов.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
См. также:
ЖурналыДокументовМенеджер
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Свой журнал: два документа, реальные позиции, объекты и сумма
В новой собственной пустой лаборатории сохранить две заявки, получить реальную ограниченную выборку своего журнала и проверить её позиции/объекты/ссылки с суммой351.00.
Где и как запускать
Неглобальный серверный модуль своей NEW File CF8.5.1.1343 в отдельной VM; одна толстая управляемая форма. Будущие записи двух специально созданных документов, не только память.
Подготовка
В отдельной НОВОЙ одноразовой Windows VM вручную создайте НОВУЮ пустую File ИБ C:\1c-labs\OwnDocumentJournal8_70a19d61-55b8-43ea-803f-17ba5c5f22b9\IB. Не импортируйте чужую CF, не берите копию рабочей базы. Маркеры пути/имён/версии не защищают от злонамеренной подмены или junction.
Конфигуратор → Конфигурация → свойства: Имя=СтендЖурналаДокументов85; Версия=OwnDocumentJournal8-540758cb-9df2-4c79-b59b-0a4f9a9d4aef; ОсновнойРежимЗапуска=УправляемоеПриложение; РежимСовместимости=НеИспользовать; язык Русский. Здесь будет только ОДИН тип документа и ДВА специально создаваемых экземпляра, не два разных типа документов.
Документы → УчебнаяЗаявка85: ТипНомера=Строка, ДлинаНомера=20, ДопустимаяДлинаНомера=Переменная, Автонумерация=Нет, Проведение=Запретить. Реквизиты ровно Задача85/Строка80 и Сумма85/Число10.2. Нет табличных частей, движений, собственных обработчиков или чужих модулей. Нельзя добавлять справочники, регистры, общие реквизиты, задания, подписки или расширения. Все исходные экземпляры этого документа должны отсутствовать.
Журналы документов → УчебныйЖурнал85: РегистрируемыеДокументы содержит только УчебнаяЗаявка85; дополнительных граф нет. Код проверяет реальную коллекцию РегистрируемыеДокументы через Количество и Содержит собственного объекта метаданных, не массива и не произвольной переданной выборки.
Общие → Роли → Журнал85Администратор: Администрирование/АктивныеПользователи для проверки своего пользователя и единственного подключения, Чтение/Добавление/Изменение собственной заявки, чтение своего журнала и доступ к своей форме. Удаление/проведение не требуются. Администрирование → Пользователи: создайте только собственного Журнал85Ученик с этой ролью. Код не создаёт пользователей и не меняет права.
Общие → Общие модули → ЖурналДокументов85: Сервер=Да; Глобальный, ВызовСервера, Привилегированный, КлиентУправляемоеПриложение, КлиентОбычноеПриложение, ВнешнееСоединение=Нет; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать. Вставьте весь CODE. Общий модуль вызывается сервером своей формы; прямой клиентский ВызовСервера ему не нужен.
Общие → Общие формы → УрокЖурналаДокументов85: управляемая форма. Реквизиты Остановка85 и Завершено85 Булево, исходно Ложь, скрыты. Количество85 Число1.0; Сумма85 Число15.2; ПерваяДата85/ВтораяДата85 Дата с составом ДатаИВремя; ПервыйНомер85/ВторойНомер85 Строка20; ПерваяЗадача85/ВтораяЗадача85 Строка80; ПервыйПроведен85/ВторойПроведен85/ПерваяПометка85/ВтораяПометка85 Булево; ПервыйUUID85/ВторойUUID85 неограниченная Строка; Код85 Строка100; Протокол85 неограниченная Строка. Все результаты и многострочный протокол только для просмотра; состояние и код скрыты.
В своей форме добавьте команду Выполнить85, Действие=Выполнить85. Привяжите кнопку именно к этой собственной команде, вставьте весь FORM. Настоящий обработчик принимает Команда, проверяет её тип КомандаФормы и идентичность своей команды; вручную callback не вызывайте. Его один серверный обработчик выполняет весь сценарий и передаёт клиенту только проверенные скаляры, не выборку/ссылки/объекты документов.
Конфигурация → Открыть модуль управляемого приложения: вставьте APPLICATION целиком. Штатное ПриНачалеРаботыСистемы() открывает собственную форму. Обновите только эту новую пустую CF, закройте Конфигуратор и все другие соединения и запустите один толстый управляемый клиент8.5.1.1343. Нажмите свою кнопку ровно один раз.
Native справка противоречива: страница ЖурналДокументовВыборка366 утверждает получение этого типа от менеджера журнала, но строка возвращаемого типа Select318 называет ДокументВыборка. Здесь сохранены оба контракта. Фактический ТипЗнч проверяется именно на конкретную ЖурналДокументовВыборка.УчебныйЖурнал85 ДО первой записи и перед обходом. Если этот тип не существует либо другой — будет честный отказ/STOP, а не обещанный полезный успех. Запуск в1С не подтверждён.
Сначала проверяются собственная конфигурация/метаданные/пользователь/единственное соединение, пустая ограниченная выборка своего журнала и отдельно отсутствие любых экземпляров собственной заявки даже вне выбранных дат. Только после этого будут созданы и сохранены два своих объекта: OWN-J8-001/01.01.2026 10:00/Заявка A/250.75 и OWN-J8-002/02.01.2026 10:00/Заявка B/100.25. Native Write вызывается явно в режиме Запись; проведение и удаление не выполняются.
Далее реальный producer ЖурналыДокументов.УчебныйЖурнал85.Выбрать получает явные границы01–03.01.2026 и порядок Дата Возр, без произвольного отбора/несуществующего индекса. Next возвращает фактическое Булево и позиционирует выборку ДО чтения полей. Число строк должно быть ровно2, конечный Next=False; это динамическая порционная выборка, не неизменяемый снимок.
Дата, Номер, Проведен, ПометкаУдаления и Ссылка выборки только читаются. Номер native допускает Число или Строка; здесь только фактическая Строка по своей точной подготовке. Для каждой строки проверяются даты/порядок, свой номер, обе ложные отметки и точное равенство сохранённой собственной ссылке. GetObject допускает Неопределено: это отказ. Настоящий объект проверяется по своему конкретному типу, ссылке, полям позиции и собственным реквизитам.
Сумма берётся из двух реально прочитанных объектов, проверяется по каждому250.75/100.25 и в итоге351.00. UUID берутся из настоящих сохранённых ссылок, не выдумываются. Полностью проверенный пакет15 со скалярными типами создаётся только после обхода; сервер формы снова проверяет его до присваивания реквизитов, клиент проверяет все15 типов/значений до показа. Ожидаемый будущий протокол:2 строки, сумма351.00, настоящие даты/номера/задачи/флаги/разные UUID.
После любой ошибки остаётся STOP текущей формы и исходная ошибка повторно поднимается. Catch не записывает/удаляет/восстанавливает документы и не повторяет сценарий; могли остаться лишь часть своих записей. Не переоткрывайте форму для обхода остановки. Отдельное ручное восстановление либо новый пустой стенд требует отдельного решения. Это будущие реальные записи собственной ИБ, не урок только в памяти; здесь VM/CF/ИБ/документы не создавались и1С не запускалась.
Процедура ПроверитьСтенд85()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnDocumentJournal8_70a19d61-55b8-43ea-803f-17ba5c5f22b9\IB"";" Тогда
ВызватьИсключение "Разрешена только собственная новая File ИБ в отдельной учебной VM";
КонецЕсли;
Если Метаданные.Документы.Количество() <> 1 Или Метаданные.Документы.Найти("УчебнаяЗаявка85") = Неопределено
Или Метаданные.ЖурналыДокументов.Количество() <> 1 Или Метаданные.ЖурналыДокументов.Найти("УчебныйЖурнал85") = Неопределено
Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0
Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0
Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0
Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0
Или Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.ОбщиеМодули.Найти("ЖурналДокументов85") = Неопределено
Или Метаданные.ОбщиеФормы.Количество() <> 1 Или Метаданные.ОбщиеФормы.Найти("УрокЖурналаДокументов85") = Неопределено Тогда
ВызватьИсключение "Нужен ровно свой документ, журнал, модуль и форма без чужих данных и обработчиков";
КонецЕсли;
МодульМД = Метаданные.ОбщиеМодули.Найти("ЖурналДокументов85");
Если Не МодульМД.Сервер Или МодульМД.Глобальный Или МодульМД.ВызовСервера Или МодульМД.Привилегированный
Или МодульМД.КлиентУправляемоеПриложение Или МодульМД.КлиентОбычноеПриложение Или МодульМД.ВнешнееСоединение
Или МодульМД.ПовторноеИспользованиеВозвращаемыхЗначений <> Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НеИспользовать Тогда
ВызватьИсключение "Нужен свой неглобальный серверный модуль без прямого RPC, привилегий и кеширования";
КонецЕсли;
ДокументМД = Метаданные.Документы.Найти("УчебнаяЗаявка85");
ЖурналМД = Метаданные.ЖурналыДокументов.Найти("УчебныйЖурнал85");
Если ДокументМД.ТипНомера <> Метаданные.СвойстваОбъектов.ТипНомераДокумента.Строка
Или ДокументМД.ДлинаНомера <> 20 Или ДокументМД.ДопустимаяДлинаНомера <> ДопустимаяДлина.Переменная
Или ДокументМД.Автонумерация Или ДокументМД.Проведение <> Метаданные.СвойстваОбъектов.Проведение.Запретить
Или ДокументМД.ТабличныеЧасти.Количество() <> 0 Или ДокументМД.Движения.Количество() <> 0
Или ДокументМД.Реквизиты.Количество() <> 2 Или ДокументМД.Реквизиты.Найти("Задача85") = Неопределено
Или ДокументМД.Реквизиты.Найти("Сумма85") = Неопределено
Или ЖурналМД.Графы.Количество() <> 0 Или ЖурналМД.РегистрируемыеДокументы.Количество() <> 1
Или Не ЖурналМД.РегистрируемыеДокументы.Содержит(ДокументМД) Тогда
ВызватьИсключение "Не совпала точная подготовка собственного документа и его журнала";
КонецЕсли;
Для Каждого Имя Из СтрРазделить("Задача85,Сумма85", ",") Цикл
Описание = ДокументМД.Реквизиты.Найти(Имя).Тип;
Если Описание.Типы().Количество() <> 1 Или Не Описание.СодержитТип(?(Имя = "Задача85", Тип("Строка"), Тип("Число"))) Тогда
ВызватьИсключение "Нужны собственные реквизиты только Строка и только Число";
КонецЕсли;
КонецЦикла;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Расширения в своей лаборатории запрещены";
КонецЕсли;
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если ТипЗнч(Текущий) <> Тип("ПользовательИнформационнойБазы") Или Пользователи.Количество() <> 1 Тогда
ВызватьИсключение "Нужен единственный настоящий собственный пользователь";
КонецЕсли;
Если Текущий.Имя <> "Журнал85Ученик" Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Не совпала фактическая собственная идентичность пользователя";
КонецЕсли;
Соединения = ПолучитьСоединенияИнформационнойБазы();
Если Соединения.Количество() <> 1 Тогда ВызватьИсключение "Закройте все другие соединения своей базы"; КонецЕсли;
Соединение = Соединения[0];
Если Соединение.НомерСоединения <> НомерСоединенияИнформационнойБазы()
Или Соединение.Пользователь.УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Единственное соединение должно быть своим текущим";
КонецЕсли;
КонецПроцедуры
Функция ВыбратьСвойЖурнал85()
Выборка = ЖурналыДокументов.УчебныйЖурнал85.Выбрать(Дата(2026, 1, 1), Дата(2026, 1, 3), , "Дата Возр");
Если ТипЗнч(Выборка) <> Тип("ЖурналДокументовВыборка.УчебныйЖурнал85") Тогда
ВызватьИсключение "Фактический тип не подтвердил страницу типа журнала; native Select318 противоречив, это отказ";
КонецЕсли;
Возврат Выборка;
КонецФункции
Функция Следующий85(Выборка)
Если ТипЗнч(Выборка) <> Тип("ЖурналДокументовВыборка.УчебныйЖурнал85") Тогда ВызватьИсключение "Нужна собственная выборка журнала"; КонецЕсли;
ЕстьСтрока = Выборка.Следующий();
Если ТипЗнч(ЕстьСтрока) <> Тип("Булево") Тогда ВызватьИсключение "Native Следующий должен вернуть Булево"; КонецЕсли;
Возврат ЕстьСтрока;
КонецФункции
Функция ПолучитьОписание85(Индекс)
Если ТипЗнч(Индекс) <> Тип("Число") Или (Индекс <> 0 И Индекс <> 1) Тогда ВызватьИсключение "Разрешены только две свои заявки"; КонецЕсли;
Если Индекс = 0 Тогда
Возврат Новый ФиксированнаяСтруктура(Новый Структура("Дата,Номер,Задача,Сумма", Дата(2026, 1, 1, 10, 0, 0), "OWN-J8-001", "Заявка A", 250.75));
КонецЕсли;
Возврат Новый ФиксированнаяСтруктура(Новый Структура("Дата,Номер,Задача,Сумма", Дата(2026, 1, 2, 10, 0, 0), "OWN-J8-002", "Заявка B", 100.25));
КонецФункции
Процедура ПроверитьПоля85(Пакет, Схема)
Если ТипЗнч(Пакет) <> Тип("ФиксированнаяСтруктура") Тогда ВызватьИсключение "Нужен свой фиксированный пакет"; КонецЕсли;
Если Пакет.Количество() <> Схема.Количество() Тогда ВызватьИсключение "Неверное число полей пакета"; КонецЕсли;
Для Каждого Поле Из Схема Цикл
Если Не Пакет.Свойство(Поле.Ключ, ЗначениеПоля) Или ТипЗнч(ЗначениеПоля) <> Поле.Значение Тогда
ВызватьИсключение "Неверное имя или фактический тип обязательного поля";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьОписание85(Описание)
Схема = Новый Структура("Дата,Номер,Задача,Сумма", Тип("Дата"), Тип("Строка"), Тип("Строка"), Тип("Число"));
ПроверитьПоля85(Описание, Схема);
КонецПроцедуры
Процедура ПроверитьСсылку85(Ссылка)
Если ТипЗнч(Ссылка) <> Тип("ДокументСсылка.УчебнаяЗаявка85") Тогда ВызватьИсключение "Нужна своя настоящая ссылка"; КонецЕсли;
Если Ссылка.Пустая() Тогда ВызватьИсключение "Ссылка должна принадлежать сохранённой собственной заявке"; КонецЕсли;
КонецПроцедуры
Функция СоздатьСвоюЗаявку85(Индекс)
Описание = ПолучитьОписание85(Индекс);
ПроверитьОписание85(Описание);
Документ = Документы.УчебнаяЗаявка85.СоздатьДокумент();
Если ТипЗнч(Документ) <> Тип("ДокументОбъект.УчебнаяЗаявка85") Тогда ВызватьИсключение "Нужен свой новый объект заявки"; КонецЕсли;
Документ.Дата = Описание.Дата;
Документ.Номер = Описание.Номер;
Документ.Задача85 = Описание.Задача;
Документ.Сумма85 = Описание.Сумма;
Документ.Проведен = Ложь;
Документ.ПометкаУдаления = Ложь;
Документ.Записать(РежимЗаписиДокумента.Запись);
ПроверитьСсылку85(Документ.Ссылка);
Возврат Документ.Ссылка;
КонецФункции
Функция ПрочитатьСвоюСтроку85(Выборка, Индекс, Ссылка)
ПроверитьСсылку85(Ссылка);
Описание = ПолучитьОписание85(Индекс);
ПроверитьОписание85(Описание);
Если ТипЗнч(Выборка.Дата) <> Тип("Дата") Или ТипЗнч(Выборка.Номер) <> Тип("Строка")
Или ТипЗнч(Выборка.Проведен) <> Тип("Булево") Или ТипЗнч(Выборка.ПометкаУдаления) <> Тип("Булево")
Или ТипЗнч(Выборка.Ссылка) <> Тип("ДокументСсылка.УчебнаяЗаявка85") Тогда
ВызватьИсключение "Не совпали все настоящие типы текущей позиции журнала";
КонецЕсли;
Если Выборка.Дата < Дата(2026, 1, 1) Или Выборка.Дата > Дата(2026, 1, 3)
Или Выборка.Дата <> Описание.Дата Или Выборка.Номер <> Описание.Номер
Или Выборка.Проведен Или Выборка.ПометкаУдаления Или Выборка.Ссылка <> Ссылка Тогда
ВызватьИсключение "Позиция должна точно соответствовать своей сохранённой заявке";
КонецЕсли;
Объект = Выборка.ПолучитьОбъект();
Если Объект = Неопределено Тогда ВызватьИсключение "Native GetObject допускает отсутствие объекта: это отказ, не успех"; КонецЕсли;
Если ТипЗнч(Объект) <> Тип("ДокументОбъект.УчебнаяЗаявка85") Тогда ВызватьИсключение "Нужен фактический собственный объект"; КонецЕсли;
Если ТипЗнч(Объект.Дата) <> Тип("Дата") Или ТипЗнч(Объект.Номер) <> Тип("Строка")
Или ТипЗнч(Объект.Проведен) <> Тип("Булево") Или ТипЗнч(Объект.ПометкаУдаления) <> Тип("Булево")
Или ТипЗнч(Объект.Ссылка) <> Тип("ДокументСсылка.УчебнаяЗаявка85")
Или ТипЗнч(Объект.Задача85) <> Тип("Строка") Или ТипЗнч(Объект.Сумма85) <> Тип("Число") Тогда
ВызватьИсключение "Неверные фактические типы прочитанного собственного объекта";
КонецЕсли;
Если Объект.Ссылка <> Ссылка Или Объект.Ссылка <> Выборка.Ссылка
Или Объект.Дата <> Выборка.Дата Или Объект.Номер <> Выборка.Номер
Или Объект.Проведен <> Выборка.Проведен Или Объект.ПометкаУдаления <> Выборка.ПометкаУдаления
Или Объект.Задача85 <> Описание.Задача Или Объект.Сумма85 <> Описание.Сумма Тогда
ВызватьИсключение "Все поля объекта, ссылки и позиции должны фактически совпасть";
КонецЕсли;
UUID = Ссылка.УникальныйИдентификатор();
Если ТипЗнч(UUID) <> Тип("УникальныйИдентификатор") Тогда ВызватьИсключение "Нужен настоящий UUID своей ссылки"; КонецЕсли;
Возврат Новый ФиксированнаяСтруктура(Новый Структура("Дата,Номер,Задача,Сумма,Проведен,Пометка,UUID", Выборка.Дата, Выборка.Номер, Объект.Задача85, Объект.Сумма85, Выборка.Проведен, Выборка.ПометкаУдаления, Строка(UUID)));
КонецФункции
Процедура ПроверитьИтог85(Итог) Экспорт
Схема = Новый Структура("Количество,Сумма,ПерваяДата,ПервыйНомер,ПерваяЗадача,ПервыйПроведен,ПерваяПометка,ПервыйUUID,ВтораяДата,ВторойНомер,ВтораяЗадача,ВторойПроведен,ВтораяПометка,ВторойUUID,Код", Тип("Число"), Тип("Число"), Тип("Дата"), Тип("Строка"), Тип("Строка"), Тип("Булево"), Тип("Булево"), Тип("Строка"), Тип("Дата"), Тип("Строка"), Тип("Строка"), Тип("Булево"), Тип("Булево"), Тип("Строка"), Тип("Строка"));
ПроверитьПоля85(Итог, Схема);
Если Итог.Количество <> 2 Или Итог.Сумма <> 351
Или Итог.ПерваяДата <> Дата(2026, 1, 1, 10, 0, 0) Или Итог.ВтораяДата <> Дата(2026, 1, 2, 10, 0, 0)
Или Итог.ПервыйНомер <> "OWN-J8-001" Или Итог.ВторойНомер <> "OWN-J8-002"
Или Итог.ПерваяЗадача <> "Заявка A" Или Итог.ВтораяЗадача <> "Заявка B"
Или Итог.ПервыйПроведен Или Итог.ВторойПроведен Или Итог.ПерваяПометка Или Итог.ВтораяПометка
Или Итог.ПервыйUUID = "" Или Итог.ВторойUUID = "" Или Итог.ПервыйUUID = Итог.ВторойUUID
Или Итог.Код <> "OwnDocumentJournal8-540758cb-9df2-4c79-b59b-0a4f9a9d4aef" Тогда
ВызватьИсключение "Не подтверждён весь фактический итог двух собственных заявок";
КонецЕсли;
КонецПроцедуры
Функция Выполнить85() Экспорт
ПроверитьСтенд85();
Начальная = ВыбратьСвойЖурнал85();
Если Следующий85(Начальная) Тогда ВызватьИсключение "Свой журнал должен быть пуст до первой записи"; КонецЕсли;
ПустыеДокументы = Документы.УчебнаяЗаявка85.Выбрать();
Если ТипЗнч(ПустыеДокументы) <> Тип("ДокументВыборка.УчебнаяЗаявка85") Тогда ВызватьИсключение "Не совпал фактический тип собственной проверки пустоты"; КонецЕсли;
ЕстьДокументы = ПустыеДокументы.Следующий();
Если ТипЗнч(ЕстьДокументы) <> Тип("Булево") Тогда ВызватьИсключение "Нужен native Boolean проверки пустоты"; КонецЕсли;
Если ЕстьДокументы Тогда ВызватьИсключение "Даже вне выбранных дат собственная база должна быть новой и пустой"; КонецЕсли;
Ссылки = Новый Массив;
Ссылки.Добавить(СоздатьСвоюЗаявку85(0));
Ссылки.Добавить(СоздатьСвоюЗаявку85(1));
Если Ссылки.Количество() <> 2 Или Ссылки[0] = Ссылки[1] Тогда ВызватьИсключение "Нужны две разные фактические ссылки"; КонецЕсли;
Выборка = ВыбратьСвойЖурнал85();
Строки = Новый Массив;
Количество = 0;
Сумма = 0;
ЕстьСтрока = Следующий85(Выборка);
Пока ЕстьСтрока Цикл
Количество = Количество + 1;
Если Количество > 2 Тогда ВызватьИсключение "В собственном журнале обнаружена лишняя строка"; КонецЕсли;
СтрокаЖурнала = ПрочитатьСвоюСтроку85(Выборка, Количество - 1, Ссылки[Количество - 1]);
Схема = Новый Структура("Дата,Номер,Задача,Сумма,Проведен,Пометка,UUID", Тип("Дата"), Тип("Строка"), Тип("Строка"), Тип("Число"), Тип("Булево"), Тип("Булево"), Тип("Строка"));
ПроверитьПоля85(СтрокаЖурнала, Схема);
Строки.Добавить(СтрокаЖурнала);
Сумма = Сумма + СтрокаЖурнала.Сумма;
ЕстьСтрока = Следующий85(Выборка);
КонецЦикла;
Если Количество <> 2 Или Строки.Количество() <> 2 Или Сумма <> 351 Тогда ВызватьИсключение "Две реальные строки и их сумма не подтверждены"; КонецЕсли;
Первая = Строки[0];
Вторая = Строки[1];
Итог = Новый ФиксированнаяСтруктура(Новый Структура("Количество,Сумма,ПерваяДата,ПервыйНомер,ПерваяЗадача,ПервыйПроведен,ПерваяПометка,ПервыйUUID,ВтораяДата,ВторойНомер,ВтораяЗадача,ВторойПроведен,ВтораяПометка,ВторойUUID,Код", Количество, Сумма, Первая.Дата, Первая.Номер, Первая.Задача, Первая.Проведен, Первая.Пометка, Первая.UUID, Вторая.Дата, Вторая.Номер, Вторая.Задача, Вторая.Проведен, Вторая.Пометка, Вторая.UUID, "OwnDocumentJournal8-540758cb-9df2-4c79-b59b-0a4f9a9d4aef"));
ПроверитьИтог85(Итог);
Возврат Итог;
КонецФункцииНастоящая команда, серверный сценарий и проверка всех клиентских скаляров
Общие → Общие формы → УрокЖурналаДокументов85 → Модуль
Толстый управляемый клиент / &НаСервере
&НаКлиенте
Процедура Выполнить85(Команда)
Попытка
Если Остановка85 Или Завершено85 Или ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда <> Команды.Выполнить85 Тогда
ВызватьИсключение "Разрешена одна настоящая своя команда новой лаборатории";
КонецЕсли;
ВыполнитьНаСервере85();
ПроверитьКлиентскийИтог85();
Протокол85 = "Количество: " + Строка(Количество85) + "; сумма из реальных объектов: " + Строка(Сумма85)
+ Символы.ПС + Строка(ПерваяДата85) + "; " + ПервыйНомер85 + "; " + ПерваяЗадача85 + "; проведен=" + Строка(ПервыйПроведен85) + "; пометка=" + Строка(ПерваяПометка85) + "; UUID=" + ПервыйUUID85
+ Символы.ПС + Строка(ВтораяДата85) + "; " + ВторойНомер85 + "; " + ВтораяЗадача85 + "; проведен=" + Строка(ВторойПроведен85) + "; пометка=" + Строка(ВтораяПометка85) + "; UUID=" + ВторойUUID85;
Исключение
Остановка85 = Истина;
Протокол85 = "ОТКАЗ, не успех. Повторение запрещено; могли сохраниться только часть собственных документов. Нет автоматического удаления или отката. Не переоткрывайте форму для обхода STOP, сохраните исходную ошибку и остановите свою учебную VM.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьКлиентскийИтог85()
Если Остановка85 Или Не Завершено85 Или ТипЗнч(Количество85) <> Тип("Число") Или ТипЗнч(Сумма85) <> Тип("Число")
Или ТипЗнч(ПерваяДата85) <> Тип("Дата") Или ТипЗнч(ВтораяДата85) <> Тип("Дата")
Или ТипЗнч(ПервыйНомер85) <> Тип("Строка") Или ТипЗнч(ВторойНомер85) <> Тип("Строка")
Или ТипЗнч(ПерваяЗадача85) <> Тип("Строка") Или ТипЗнч(ВтораяЗадача85) <> Тип("Строка")
Или ТипЗнч(ПервыйПроведен85) <> Тип("Булево") Или ТипЗнч(ВторойПроведен85) <> Тип("Булево")
Или ТипЗнч(ПерваяПометка85) <> Тип("Булево") Или ТипЗнч(ВтораяПометка85) <> Тип("Булево")
Или ТипЗнч(ПервыйUUID85) <> Тип("Строка") Или ТипЗнч(ВторойUUID85) <> Тип("Строка") Или ТипЗнч(Код85) <> Тип("Строка") Тогда
ВызватьИсключение "Неверные фактические клиентские типы всех пятнадцати полей";
КонецЕсли;
Если Количество85 <> 2 Или Сумма85 <> 351
Или ПерваяДата85 <> Дата(2026, 1, 1, 10, 0, 0) Или ВтораяДата85 <> Дата(2026, 1, 2, 10, 0, 0)
Или ПервыйНомер85 <> "OWN-J8-001" Или ВторойНомер85 <> "OWN-J8-002" Или ПерваяЗадача85 <> "Заявка A" Или ВтораяЗадача85 <> "Заявка B"
Или ПервыйПроведен85 Или ВторойПроведен85 Или ПерваяПометка85 Или ВтораяПометка85
Или ПервыйUUID85 = "" Или ВторойUUID85 = "" Или ПервыйUUID85 = ВторойUUID85
Или Код85 <> "OwnDocumentJournal8-540758cb-9df2-4c79-b59b-0a4f9a9d4aef" Тогда
ВызватьИсключение "Не подтвердились все реальные клиентские значения";
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ВыполнитьНаСервере85()
Попытка
Если Остановка85 Или Завершено85 Тогда ВызватьИсключение "Повторная серверная запись запрещена"; КонецЕсли;
Итог = ЖурналДокументов85.Выполнить85();
ЖурналДокументов85.ПроверитьИтог85(Итог);
Количество85 = Итог.Количество;
Сумма85 = Итог.Сумма;
ПерваяДата85 = Итог.ПерваяДата;
ПервыйНомер85 = Итог.ПервыйНомер;
ПерваяЗадача85 = Итог.ПерваяЗадача;
ПервыйПроведен85 = Итог.ПервыйПроведен;
ПерваяПометка85 = Итог.ПерваяПометка;
ПервыйUUID85 = Итог.ПервыйUUID;
ВтораяДата85 = Итог.ВтораяДата;
ВторойНомер85 = Итог.ВторойНомер;
ВтораяЗадача85 = Итог.ВтораяЗадача;
ВторойПроведен85 = Итог.ВторойПроведен;
ВтораяПометка85 = Итог.ВтораяПометка;
ВторойUUID85 = Итог.ВторойUUID;
Код85 = Итог.Код;
Завершено85 = Истина;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыШтатный запуск только собственной учебной формы
Конфигурация → Открыть модуль управляемого приложения
Толстый управляемый клиент
Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnDocumentJournal8_70a19d61-55b8-43ea-803f-17ba5c5f22b9\IB"";" Тогда
ВызватьИсключение "Разрешена только собственная новая учебная лаборатория";
КонецЕсли;
ОткрытьФорму("ОбщаяФорма.УрокЖурналаДокументов85");
#Иначе
ВызватьИсключение "Нужен один толстый управляемый клиент 8.5.1.1343";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Подготовить собственную новую пустую VM/File CF, один тип документа/два собственных реквизита, один журнал, одного пользователя и точные модуль/форму/startup. Проверить весь стенд и actual journal type ДО записи.
Подтвердить отсутствие любых старых собственных заявок, сохранить ровно две новые и получить их настоящие разные ссылки. Без posting/delete/переданных чужих объектов.
Получить ограниченную own journal selection, проверить actual type, обходить только после native Next=True. Сверить все readonly поля, GetObject или отказ, настоящие own refs и все значения объектов.
Подтвердить ровно2 позиции, конечный Next=False и сумму реально прочитанных объектов351.00. Передать и проверить15 скалярных полей; вывести настоящие значения и разные UUID.
Как проверить результат
Actual type guard before first seed Write and before Next. Native366/318 contradiction preserved; mismatch/Undefined is refusal, not a positive useful example.
Каждое поле позиции имеет проверенный native тип; строковые номера только по своей metadata. Все даты/номера/флаги/refs/объекты и суммы проверены, selection RO не присваиваются.
Ровно2 actual rows с250.75/100.25→351.00; проверен пакет15 и все клиентские поля. После ошибки никаких записей/повторов/автоматического удаления.
Ожидаемый результат
Ожидаемый будущий ручной результат: две реальные строки OWN-J8-001/002, сумма351.00 и разные фактические UUID, после полного серверного и клиентского контроля. Native producer/type несогласованность может дать честный отказ; здесь runtime не проверялся.
На что обратить внимание
Не используйте рабочую/чужую ИБ: создаются реальные собственные записи в новой изолированной лаборатории. Маркеры не защита от намеренной подмены.
Native тип в Select318 противоречит странице366: не подменять проверку фактического типа обещанием успешного получения JournalSelection.
Номер зависит от собственной конфигурации. Next нужен до чтения полей; выборка динамическая, не immutable snapshot. Все пять полей выборки RO.
GetObject может вернуть Неопределено. Он проверяется и реально читается, не заменяется заранее созданным объектом. UUID и ссылки фактические, не фиксированные литералы.
STOP ограничен текущей формой; не переоткрывайте её для повторения. Частичные собственные записи после ошибки возможны, автоматического отката/удаления нет.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Объединить заявки и оплаты в своём журнале без путаницы одинаковых номеров
Журнал включает два вида документов. Проверяем сентябрь, фильтруем по объекту метаданных вида и собственной графе, различаем программный порядок и единственную интерактивную настройку Дата.
Где и как запускать
Полный модуль обычной формы Список самого журнала УчебныйЖурнал. Только толстый клиент; Пульт и серверная проверка отдельными модулями ниже. Не выполнялся.
Подготовка
Создайте НОВУЮ отдельную файловую базу 8.5.1.1343: имя конфигурации УчебныйОбщийЖурнал85, совместимость НеИспользовать, обычное приложение, толстый клиент. Не рабочая база и не её копия. Здесь код и UI не запускались: runtimeVerifiedScenarios=0.
Два документа УчебнаяЗаявка и УчебнаяОплата: Номер Строка(10), автонумерация выключена, контроль уникальности включён, проведение запрещено, единственный Комментарий Строка(100), Индексировать. Модули объекта/менеджера пусты, табличных частей нет. Остальные бизнес-объекты, разделители, расширения, задания и подписки отсутствуют.
Создайте единственный журнал документов УчебныйЖурнал, включите в него оба документа. Добавьте графу Сценарий: она отображает реквизит Комментарий ОБОИХ документов, тип Строка(100), индексирование включено. Это реальная графа журнала, не автоматически доступный реквизит любого документа.
ВРУЧНУЮ только в своём стенде запишите четыре документа без проведения/пометок: Заявка 0001/01.09.2026 00:00:00/Заявка; Оплата 0001/15.09.2026 12:00:00/Оплата; Заявка 0002/30.09.2026 23:59:59/Заявка; Оплата 0002/01.10.2026 00:00:00/Оплата. В дате показывайте секунды. Два совпадающих номера разных видов намеренны; код не создаёт и не удаляет записи.
УчебныйЖурнал → Формы: обычная форма Список, назначьте её основной. Реквизит Журнал типа ЖурналДокументовСписок.УчебныйЖурнал, табличное поле СписокЖурнала с данными именно Журнал. Колонки Дата, Номер, ВидДокумента и Сценарий связаны с колонками источника. ТолькоПросмотр=Да; команд записи, удаления, создания и проведения нет.
В Список добавьте ТолькоОплаты, ТолькоСценарийОплаты, СнятьДополнительныеОтборы, СортироватьПоСценарию, ВернутьХронологию, РазрешитьИнтервал, ЗапретитьИнтервал, ПроверитьВозвратДоступностей, Обновить, ЗакрытьСписок. Назначьте действия, ПриОткрытии и полный отдельный модуль списка. Оставьте стандартный диалог настройки списка в контекстном меню поля.
Создайте обработку УчебныйЖурналПульт85 с обычной основной формой Пульт. Кнопки ОткрытьЖурнал, СводкаИзМакета, ПовторитьСвоеОкно, ЗакрытьСвойЖурнал; назначьте одноимённые действия и события ПриОткрытии/ПередЗакрытием. Полный модуль Пульта вставьте отдельно.
УчебныйЖурнал → Макеты: текстовый макет Сводка, одна строка Документов сентября: %1 без кавычек. Общий модуль УчебныйЖурнал85: неглобальный, Сервер=Да, Вызов сервера=Да, клиентские флаги=Нет, привилегированный=Нет; вставьте полный общий модуль проверки ниже.
Обновите конфигурацию базы, проверьте F7, включение обоих видов в журнал, соответствие графы каждому реквизиту и привязку данных поля. ТолькоПросмотр — настройка UI, не права доступа; неизвестные модули и рабочие базы недопустимы.
Перем СвоиДокументы;
Перем Подготовлено;
Перем РазрешалисьИзмененияИнтервала;
Функция ПодготовитьДоОткрытия() Экспорт
СвоиДокументы = УчебныйЖурнал85.ПрочитатьСвойНабор();
Если ЭтаФорма.Открыта() Или ТипЗнч(Журнал) <> Тип("ЖурналДокументовСписок.УчебныйЖурнал") Тогда
ВызватьИсключение "Нужна своя закрытая обычная форма с реквизитом журнала";
КонецЕсли;
Колонки = Журнал.Колонки;
Для Каждого Имя Из СтрРазделить("Дата,Номер,ВидДокумента,Сценарий", ",") Цикл
Если Колонки.Найти(Имя) = Неопределено Тогда
Колонки.Добавить(Имя);
КонецЕсли;
КонецЦикла;
Журнал.Отбор.Сбросить();
Журнал.Порядок.Установить("Дата Возр");
Поле = ЭлементыФормы.СписокЖурнала;
Поле.ТолькоПросмотр = Истина;
Поле.ПроверкаОтображенияНовойСтроки = ВариантПроверкиОтображенияНовойСтроки.СообщатьОНесоответствииОтбору;
Настройка = Новый НастройкаПериода;
Настройка.РедактироватьКакИнтервал = Истина;
Настройка.РедактироватьКакПериод = Ложь;
Настройка.УстановитьПериод(Дата(2026, 9, 1, 0, 0, 0), Дата(2026, 9, 30, 23, 59, 59), Ложь);
Настройка.ВариантНастройки = ВариантНастройкиПериода.Интервал;
Если Настройка.ПолучитьДатуНачала() <> Дата(2026, 9, 1, 0, 0, 0)
Или Настройка.ПолучитьДатуОкончания() <> Дата(2026, 9, 30, 23, 59, 59) Тогда
ВызватьИсключение "Не подтверждены точные границы своего сентября";
КонецЕсли;
Поле.СтандартныйПериод = Настройка;
Если ТипЗнч(Поле.СтандартныйПериод) <> Тип("НастройкаПериода") Тогда
ВызватьИсключение "Нужна НастройкаПериода, не одноименный тип СтандартныйПериод";
КонецЕсли;
РазрешалисьИзмененияИнтервала = Ложь;
УстановитьДоступности(Ложь);
Менеджер = ЖурналыДокументов.УчебныйЖурнал;
Выборка = Менеджер.Выбрать(Дата(2026, 9, 1, 0, 0, 0), Дата(2026, 9, 30, 23, 59, 59), , "Дата Возр");
Ключи = Новый Массив;
Пока Выборка.Следующий() Цикл
Ключ = Выборка.Ссылка.Метаданные().Имя + "." + Выборка.Номер;
Если СвоиДокументы.Получить(Ключ) <> Выборка.Ссылка Тогда
ВызватьИсключение "В выборке журнала посторонняя ссылка";
КонецЕсли;
Ключи.Добавить(Ключ);
КонецЦикла;
Если СтрСоединить(Ключи, ",") <> "УчебнаяЗаявка.0001,УчебнаяОплата.0001,УчебнаяЗаявка.0002" Тогда
ВызватьИсключение "Журнал не включил оба своих вида или граничные документы";
КонецЕсли;
Подготовлено = Истина;
Возврат Ключи.Количество();
КонецФункции
Процедура ПриОткрытии()
Если Подготовлено <> Истина Тогда
ВызватьИсключение "Открывайте этот журнал только своим Пультом после подготовки";
КонецЕсли;
КонецПроцедуры
Процедура УстановитьДоступности(Разрешено)
Поле = ЭлементыФормы.СписокЖурнала;
ДатаОтбора = Поле.НастройкаОтбора.Найти("Дата");
ДатаПорядка = Поле.НастройкаПорядка.Найти("Дата");
Если ДатаОтбора = Неопределено Или ДатаПорядка = Неопределено Или Поле.НастройкаПорядка.Количество() <> 1 Тогда
ВызватьИсключение "У журнала интерактивный порядок должен содержать только Дата";
КонецЕсли;
ДатаОтбора.Доступность = Ложь;
ДатаПорядка.Доступность = Разрешено;
Поле.РазрешитьНастройкуПериода = Разрешено;
Если ДатаОтбора.Доступность Или ДатаПорядка.Доступность <> Разрешено
Или Поле.РазрешитьНастройкуПериода <> Разрешено Тогда
ВызватьИсключение "Собственные доступности журнала не подтверждены";
КонецЕсли;
Если Разрешено Тогда
РазрешалисьИзмененияИнтервала = Истина;
КонецЕсли;
КонецПроцедуры
Процедура РазрешитьИнтервал(Кнопка)
УстановитьДоступности(Истина);
КонецПроцедуры
Процедура ЗапретитьИнтервал(Кнопка)
УстановитьДоступности(Ложь);
КонецПроцедуры
Процедура ПроверитьФиксированныйОпыт()
Если РазрешалисьИзмененияИнтервала = Истина Тогда
ВызватьИсключение "После разрешения ручного интервала откройте новый собственный опыт";
КонецЕсли;
КонецПроцедуры
Процедура ТолькоОплаты(Кнопка)
ПроверитьФиксированныйОпыт();
СнятьДополнительныеОтборы(Неопределено);
ОтборВида = Журнал.Отбор.Найти("ВидДокумента");
Если ОтборВида = Неопределено Тогда
ВызватьИсключение "Не найден системный отбор ВидДокумента собственного журнала";
КонецЕсли;
ОтборВида.Установить(Метаданные.Документы.УчебнаяОплата, Истина);
Обновить(Неопределено);
СвояОплата = СвоиДокументы.Получить("УчебнаяОплата.0001");
ЭлементыФормы.СписокЖурнала.ТекущаяСтрока = СвояОплата;
Если ЭлементыФормы.СписокЖурнала.ТекущаяСтрока <> СвояОплата Тогда
ВызватьИсключение "Текущей строкой должна быть собственная оплата, не заявка с тем же номером";
КонецЕсли;
Сообщить("Ожидается только Оплата 0001, не Заявка с тем же номером");
КонецПроцедуры
Процедура ТолькоСценарийОплаты(Кнопка)
ПроверитьФиксированныйОпыт();
СнятьДополнительныеОтборы(Неопределено);
ОтборСценария = Журнал.Отбор.Найти("Сценарий");
Если ОтборСценария = Неопределено Тогда
ВызватьИсключение "Графа Сценарий не включена в отбор своего журнала";
КонецЕсли;
ОтборСценария.Установить("Оплата", Истина);
Обновить(Неопределено);
Сообщить("В собственном сентябре графе Оплата соответствует один документ");
КонецПроцедуры
Процедура СнятьДополнительныеОтборы(Кнопка)
Для Каждого Имя Из СтрРазделить("ВидДокумента,Сценарий", ",") Цикл
Элемент = Журнал.Отбор.Найти(Имя);
Если Элемент = Неопределено Тогда
ВызватьИсключение "Нет собственного элемента отбора " + Имя;
КонецЕсли;
Элемент.Использование = Ложь;
КонецЦикла;
Обновить(Неопределено);
КонецПроцедуры
Процедура СортироватьПоСценарию(Кнопка)
Журнал.Порядок.Установить("Сценарий Возр, Дата Возр");
Обновить(Неопределено);
КонецПроцедуры
Процедура ВернутьХронологию(Кнопка)
Журнал.Порядок.Установить("Дата Возр");
Обновить(Неопределено);
КонецПроцедуры
Процедура ПроверитьВозвратДоступностей(Кнопка)
Поле = ЭлементыФормы.СписокЖурнала;
ОтборДаты = Поле.НастройкаОтбора.Найти("Дата");
ПорядокДаты = Поле.НастройкаПорядка.Найти("Дата");
Если ОтборДаты = Неопределено Или ПорядокДаты = Неопределено Тогда
ВызватьИсключение "Нет собственных элементов управления Дата";
КонецЕсли;
Снимок = Новый Структура("Отбор,Порядок,Интервал,Проверка",
ОтборДаты.Доступность, ПорядокДаты.Доступность, Поле.РазрешитьНастройкуПериода, Поле.ПроверкаОтображенияНовойСтроки);
Попытка
ОтборДаты.Доступность = Не Снимок.Отбор;
ПорядокДаты.Доступность = Не Снимок.Порядок;
Поле.РазрешитьНастройкуПериода = Не Снимок.Интервал;
Поле.ПроверкаОтображенияНовойСтроки = ВариантПроверкиОтображенияНовойСтроки.НеПроверять;
Исключение
ВосстановитьДоступности(Поле, ОтборДаты, ПорядокДаты, Снимок);
ВызватьИсключение;
КонецПопытки;
ВосстановитьДоступности(Поле, ОтборДаты, ПорядокДаты, Снимок);
Сообщить("Две доступности, разрешение интервала и режим проверки возвращены");
КонецПроцедуры
Процедура ВосстановитьДоступности(Поле, ОтборДаты, ПорядокДаты, Снимок)
ОтборДаты.Доступность = Снимок.Отбор;
ПорядокДаты.Доступность = Снимок.Порядок;
Поле.РазрешитьНастройкуПериода = Снимок.Интервал;
Поле.ПроверкаОтображенияНовойСтроки = Снимок.Проверка;
Если ОтборДаты.Доступность <> Снимок.Отбор Или ПорядокДаты.Доступность <> Снимок.Порядок
Или Поле.РазрешитьНастройкуПериода <> Снимок.Интервал Или Поле.ПроверкаОтображенияНовойСтроки <> Снимок.Проверка Тогда
ВызватьИсключение "Возврат собственных доступностей не подтвержден";
КонецЕсли;
КонецПроцедуры
Процедура Обновить(Кнопка)
Журнал.Обновить();
ЭлементыФормы.СписокЖурнала.ОбновитьСтроки();
КонецПроцедуры
Процедура ЗакрытьСписок(Кнопка)
ЭтаФорма.Закрыть();
КонецПроцедурыУчебныйЖурналПульт85.Пульт
УчебныйОбщийЖурнал85 → Обработки → УчебныйЖурналПульт85 → Формы → Пульт → Модуль
Полный отдельный модуль другой собственной обычной формы; не выполнялся.
Перем СвоеОкно;
Перем СвоеКоличество;
Процедура ПриОткрытии()
УчебныйЖурнал85.ПроверитьСвойСтенд();
СвоеОкно = Неопределено;
СвоеКоличество = Неопределено;
КонецПроцедуры
Процедура ОткрытьЖурнал(Кнопка)
Если СвоеОкно <> Неопределено Тогда
Если СвоеОкно.Открыта() Тогда
ВызватьИсключение "Сначала закройте только свой прежний журнал";
КонецЕсли;
КонецЕсли;
УчебныйЖурнал85.ПроверитьСвойСтенд();
Ключ = Новый УникальныйИдентификатор;
Окно = ЖурналыДокументов.УчебныйЖурнал.ПолучитьФорму("Список", ЭтаФорма, Ключ);
Если Окно = Неопределено Тогда
ВызватьИсключение "Своя основная форма журнала не создана";
КонецЕсли;
Если ТипЗнч(Окно) <> Тип("Форма") Тогда
ВызватьИсключение "Нужна обычная форма толстого клиента";
КонецЕсли;
Если Окно.Открыта() Или Окно.КлючУникальности <> Ключ Или Окно.ВладелецФормы <> ЭтаФорма.ЭтаФорма Тогда
ВызватьИсключение "Не изменяем чужое или открытое окно";
КонецЕсли;
Окно.КлючСохраненияПоложенияОкна = "УчебныйЖурнал85.МойОпыт." + Строка(Ключ);
Окно.ЗакрыватьПриЗакрытииВладельца = Истина;
Количество = Окно.ПодготовитьДоОткрытия();
Если Количество <> 3 Тогда
ВызватьИсключение "В своем сентябре должны быть три документа двух видов";
КонецЕсли;
СвоеОкно = Окно;
СвоеКоличество = Количество;
Окно.Открыть();
КонецПроцедуры
Процедура СводкаИзМакета(Кнопка)
Если СвоеОкно = Неопределено Или СвоеКоличество = Неопределено Тогда
ВызватьИсключение "Сначала подготовьте свой журнал";
КонецЕсли;
Макет = ЖурналыДокументов.УчебныйЖурнал.ПолучитьМакет("Сводка");
Если ТипЗнч(Макет) <> Тип("ТекстовыйДокумент") Тогда
ВызватьИсключение "Нужен собственный текстовый макет Сводка";
КонецЕсли;
Шаблон = СокрЛП(Макет.ПолучитьТекст());
Если Шаблон <> "Документов сентября: %1" Тогда
ВызватьИсключение "Не совпал текст собственного макета";
КонецЕсли;
Сообщить(СтрШаблон(Шаблон, СвоеКоличество));
КонецПроцедуры
Процедура ПовторитьСвоеОкно(Кнопка)
Если СвоеОкно = Неопределено Тогда
Возврат;
КонецЕсли;
Если Не СвоеОкно.Открыта() Тогда
Сообщить("Свое окно уже закрыто; откройте новый опыт");
Возврат;
КонецЕсли;
Повторное = ЖурналыДокументов.УчебныйЖурнал.ПолучитьФорму("Список", ЭтаФорма, СвоеОкно.КлючУникальности);
Если Повторное <> СвоеОкно Тогда
ВызватьИсключение "Не подтвержден возврат именно своего открытого окна";
КонецЕсли;
Сообщить("Вернулось свое открытое окно с тем же владельцем и ключом");
КонецПроцедуры
Процедура ЗакрытьСвойЖурнал(Кнопка)
ЗакрытьСвоеОкно();
КонецПроцедуры
Процедура ЗакрытьСвоеОкно()
Если СвоеОкно <> Неопределено Тогда
Если СвоеОкно.Открыта() Тогда
СвоеОкно.Закрыть();
Если СвоеОкно.Открыта() Тогда
ВызватьИсключение "Свое окно отказалось закрываться";
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
ЗакрытьСвоеОкно();
КонецПроцедурыУчебныйЖурнал85.ПроверкаИЧтение
УчебныйОбщийЖурнал85 → Общие → Общие модули → УчебныйЖурнал85
Полный серверный модуль проверки стенда и чтения четырех своих документов; не выполнялся.
Процедура ПроверитьСвойСтенд() Экспорт
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 2 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЖурналыДокументов.Количество() <> 1 Или Метаданные.ЖурналыДокументов[0].Имя <> "УчебныйЖурнал"
Или Метаданные.Документы.Найти("УчебнаяЗаявка") = Неопределено
Или Метаданные.Документы.Найти("УчебнаяОплата") = Неопределено Тогда
ВызватьИсключение "Нужны только два собственных документа и УчебныйЖурнал";
КонецЕсли;
Для Каждого Документ Из Метаданные.Документы Цикл
Если Документ.Реквизиты.Количество() <> 1 Или Документ.Реквизиты.Найти("Комментарий") = Неопределено Тогда
ВызватьИсключение "У каждого своего документа только Комментарий";
КонецЕсли;
КонецЦикла;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Функция ПрочитатьСвойНабор() Экспорт
ПроверитьСвойСтенд();
Ожидания = Новый Соответствие;
Ожидания.Вставить("УчебнаяЗаявка.0001", Новый Структура("Дата,Комментарий", Дата(2026, 9, 1, 0, 0, 0), "Заявка"));
Ожидания.Вставить("УчебнаяОплата.0001", Новый Структура("Дата,Комментарий", Дата(2026, 9, 15, 12, 0, 0), "Оплата"));
Ожидания.Вставить("УчебнаяЗаявка.0002", Новый Структура("Дата,Комментарий", Дата(2026, 9, 30, 23, 59, 59), "Заявка"));
Ожидания.Вставить("УчебнаяОплата.0002", Новый Структура("Дата,Комментарий", Дата(2026, 10, 1, 0, 0, 0), "Оплата"));
Данные = Новый Соответствие;
Для Каждого ИмяДокумента Из СтрРазделить("УчебнаяЗаявка,УчебнаяОплата", ",") Цикл
Менеджер = Документы[ИмяДокумента];
Выборка = Менеджер.Выбрать();
Пока Выборка.Следующий() Цикл
Ключ = Выборка.Ссылка.Метаданные().Имя + "." + Выборка.Номер;
Ожидание = Ожидания.Получить(Ключ);
Если Ожидание = Неопределено Или Данные.Получить(Ключ) <> Неопределено Тогда
ВызватьИсключение "В своей базе неизвестный или повторный документ";
КонецЕсли;
Если Выборка.Дата <> Ожидание.Дата Или Выборка.Комментарий <> Ожидание.Комментарий
Или Выборка.Проведен Или Выборка.ПометкаУдаления Тогда
ВызватьИсключение "Свой документ отличается от подготовки";
КонецЕсли;
Данные.Вставить(Ключ, Выборка.Ссылка);
КонецЦикла;
КонецЦикла;
Если Данные.Количество() <> 4 Тогда
ВызватьИсключение "Нужны ровно четыре собственных непроведенных документа";
КонецЕсли;
Возврат Данные;
КонецФункцииРазбор по шагам
Две заявки и две оплаты имеют повторяющиеся номера между видами. Ключ проверки состоит из имени метаданных и номера; реальная идентичность текущей строки — ссылка, не номер документа.
Менеджер журнала Выбрать возвращает выборку документов разных включённых видов. Сверяем собственные ссылки и хронологию: Заявка.0001, Оплата.0001, Заявка.0002; октябрьская оплата не входит в сентябрь.
СтандартныйПериод содержит НастройкаПериода и задаётся до открытия формы. Проверяются точные начало и конец сентября. Сообщение выборки ещё не доказывает применение периода видимым списком.
Колонки списка подготавливаются по именам. Графа Сценарий отображает Комментарий каждого включённого документа; индекс и одинаковый базовый тип заданы при создании метаданных.
Отбор ВидДокумента получает Метаданные.Документы.УчебнаяОплата, не строку УчебнаяОплата и не имя типа. Дополнительно выбираем собственную ссылку Оплата.0001 как текущую строку, несмотря на совпадающий номер заявки.
Отбор Сценарий=Оплата — отдельная фильтрация по реальной графе. Снятие дополнительных отборов выключает только ВидДокумента/Сценарий, не сбрасывает текущий интервал по дате.
Программный Порядок допускает Сценарий Возр, Дата Возр. Но НастройкаПорядка у журнала состоит только из Дата: искать там Номер или Сценарий и добавлять их нельзя.
НастройкаОтбора и НастройкаПорядка readonly как свойства, элементы позволяют менять Доступность. РазрешитьНастройкуПериода делает команду интервала доступной даже при недоступном отборе Дата.
После разрешения ручного интервала фиксированные месячные примеры блокируются до нового окна. Исходная настройка не считается текущим произвольным фильтром пользователя.
Цикл возвращает две доступности, разрешение интервала и режим проверки новой строки. Он не меняет и не клонирует сам период, источник данных, порядок и текущую строку. На readonly-поле новая строка не вводится.
Как проверить результат
Будущий ручной тест: сентябрьский журнал показывает три своих документа двух видов. Оплата.0002 от 01.10.2026 отсутствует; записи на 01.09 00:00 и 30.09 23:59:59 входят.
ТолькоОплаты и ТолькоСценарийОплаты дают собственную Оплата.0001. Текущая строка после отбора вида именно ссылка оплаты, не заявки с тем же номером.
СнятьДополнительныеОтборы возвращает три документа текущего сентября. СортироватьПоСценарию меняет программный порядок; в диалоге настройки доступен только порядок Дата.
После РазрешитьИнтервал команда интервала доступна при запрещённом отборе Дата. Перед повторением фиксированного отбора получите новое окно; повторный запрет не стирает факт разрешения изменения.
ПроверитьВозвратДоступностей должно подтвердить возврат четырёх значений. В копии кода нарушьте одно присваивание в восстановлении: успешное сообщение появляться не должно. Все четыре записи базы остаются без проведения/пометок.
Ожидаемый результат
Подготовлен собственный общий журнал двух видов с месячным контролем, отбором метаданных вида, графой и отдельными доступностями. runtimeVerifiedScenarios=0.
На что обратить внимание
Журнал не является новым документом и не записывает все виды одним объектом. Ошибка выбора по одному номеру приводит к путанице видов.
Визуальный порядок журнала ограничен Дата; программные поля сортировки — другой механизм. Для ссылочных граф группировка не гарантирует алфавит по представлению.
У менеджера Выбрать программная сортировка по графе требует индексирования, одного базового типа и покрытия всех видов. Здесь используется Дата, а собственная строковая графа подготовлена явно.
ТолькоПросмотр не права доступа. Проверка отображения новой строки назначена, но её эффект на ввод здесь не проверяется.
Это обычная форма толстого клиента, не управляемый ДинамическийСписок. Код и UI не запускались; служебное сохранение настроек платформой не исключается.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.