ЖурналДокументовВыборка.<Имя журнала>.ПолучитьОбъект

Методы · GetObject

Получает объект для чтения, изменения, добавления и удаления документа, на котором в данный момент спозиционирована выборка.

Синтаксис

ПолучитьОбъект()
Полное описание, параметры и ограничения

ЖурналДокументовВыборка.<Имя журнала>.ПолучитьОбъект (DocumentJournalSelection.<Document journal name>.GetObject)

ЖурналДокументовВыборка.<Имя журнала> (DocumentJournalSelection.<Document journal name>)

ПолучитьОбъект (GetObject)

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

Синтаксис:
ПолучитьОбъект()
Возвращаемое значение:
Тип: ДокументОбъект.<Имя документа>, Неопределено.
Неопределено - объекта в базе нет (например, при обмене данными или после непосредственного удаления объекта, на который есть ссылки).
Описание:

Получает объект для чтения, изменения, добавления и удаления документа, на котором в данный момент спозиционирована выборка.

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

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.

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

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

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

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

Свой журнал: два документа, реальные позиции, объекты и сумма

В новой собственной пустой лаборатории сохранить две заявки, получить реальную ограниченную выборку своего журнала и проверить её позиции/объекты/ссылки с суммой351.00.

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

Неглобальный серверный модуль своей NEW File CF8.5.1.1343 в отдельной VM; одна толстая управляемая форма. Будущие записи двух специально созданных документов, не только память.

Подготовка

  1. В отдельной НОВОЙ одноразовой Windows VM вручную создайте НОВУЮ пустую File ИБ C:\1c-labs\OwnDocumentJournal8_70a19d61-55b8-43ea-803f-17ba5c5f22b9\IB. Не импортируйте чужую CF, не берите копию рабочей базы. Маркеры пути/имён/версии не защищают от злонамеренной подмены или junction.

  2. Конфигуратор → Конфигурация → свойства: Имя=СтендЖурналаДокументов85; Версия=OwnDocumentJournal8-540758cb-9df2-4c79-b59b-0a4f9a9d4aef; ОсновнойРежимЗапуска=УправляемоеПриложение; РежимСовместимости=НеИспользовать; язык Русский. Здесь будет только ОДИН тип документа и ДВА специально создаваемых экземпляра, не два разных типа документов.

  3. Документы → УчебнаяЗаявка85: ТипНомера=Строка, ДлинаНомера=20, ДопустимаяДлинаНомера=Переменная, Автонумерация=Нет, Проведение=Запретить. Реквизиты ровно Задача85/Строка80 и Сумма85/Число10.2. Нет табличных частей, движений, собственных обработчиков или чужих модулей. Нельзя добавлять справочники, регистры, общие реквизиты, задания, подписки или расширения. Все исходные экземпляры этого документа должны отсутствовать.

  4. Журналы документов → УчебныйЖурнал85: РегистрируемыеДокументы содержит только УчебнаяЗаявка85; дополнительных граф нет. Код проверяет реальную коллекцию РегистрируемыеДокументы через Количество и Содержит собственного объекта метаданных, не массива и не произвольной переданной выборки.

  5. Общие → Роли → Журнал85Администратор: Администрирование/АктивныеПользователи для проверки своего пользователя и единственного подключения, Чтение/Добавление/Изменение собственной заявки, чтение своего журнала и доступ к своей форме. Удаление/проведение не требуются. Администрирование → Пользователи: создайте только собственного Журнал85Ученик с этой ролью. Код не создаёт пользователей и не меняет права.

  6. Общие → Общие модули → ЖурналДокументов85: Сервер=Да; Глобальный, ВызовСервера, Привилегированный, КлиентУправляемоеПриложение, КлиентОбычноеПриложение, ВнешнееСоединение=Нет; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать. Вставьте весь CODE. Общий модуль вызывается сервером своей формы; прямой клиентский ВызовСервера ему не нужен.

  7. Общие → Общие формы → УрокЖурналаДокументов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 неограниченная Строка. Все результаты и многострочный протокол только для просмотра; состояние и код скрыты.

  8. В своей форме добавьте команду Выполнить85, Действие=Выполнить85. Привяжите кнопку именно к этой собственной команде, вставьте весь FORM. Настоящий обработчик принимает Команда, проверяет её тип КомандаФормы и идентичность своей команды; вручную callback не вызывайте. Его один серверный обработчик выполняет весь сценарий и передаёт клиенту только проверенные скаляры, не выборку/ссылки/объекты документов.

  9. Конфигурация → Открыть модуль управляемого приложения: вставьте APPLICATION целиком. Штатное ПриНачалеРаботыСистемы() открывает собственную форму. Обновите только эту новую пустую CF, закройте Конфигуратор и все другие соединения и запустите один толстый управляемый клиент8.5.1.1343. Нажмите свою кнопку ровно один раз.

  10. Native справка противоречива: страница ЖурналДокументовВыборка366 утверждает получение этого типа от менеджера журнала, но строка возвращаемого типа Select318 называет ДокументВыборка. Здесь сохранены оба контракта. Фактический ТипЗнч проверяется именно на конкретную ЖурналДокументовВыборка.УчебныйЖурнал85 ДО первой записи и перед обходом. Если этот тип не существует либо другой — будет честный отказ/STOP, а не обещанный полезный успех. Запуск в1С не подтверждён.

  11. Сначала проверяются собственная конфигурация/метаданные/пользователь/единственное соединение, пустая ограниченная выборка своего журнала и отдельно отсутствие любых экземпляров собственной заявки даже вне выбранных дат. Только после этого будут созданы и сохранены два своих объекта: OWN-J8-001/01.01.2026 10:00/Заявка A/250.75 и OWN-J8-002/02.01.2026 10:00/Заявка B/100.25. Native Write вызывается явно в режиме Запись; проведение и удаление не выполняются.

  12. Далее реальный producer ЖурналыДокументов.УчебныйЖурнал85.Выбрать получает явные границы01–03.01.2026 и порядок Дата Возр, без произвольного отбора/несуществующего индекса. Next возвращает фактическое Булево и позиционирует выборку ДО чтения полей. Число строк должно быть ровно2, конечный Next=False; это динамическая порционная выборка, не неизменяемый снимок.

  13. Дата, Номер, Проведен, ПометкаУдаления и Ссылка выборки только читаются. Номер native допускает Число или Строка; здесь только фактическая Строка по своей точной подготовке. Для каждой строки проверяются даты/порядок, свой номер, обе ложные отметки и точное равенство сохранённой собственной ссылке. GetObject допускает Неопределено: это отказ. Настоящий объект проверяется по своему конкретному типу, ссылке, полям позиции и собственным реквизитам.

  14. Сумма берётся из двух реально прочитанных объектов, проверяется по каждому250.75/100.25 и в итоге351.00. UUID берутся из настоящих сохранённых ссылок, не выдумываются. Полностью проверенный пакет15 со скалярными типами создаётся только после обхода; сервер формы снова проверяет его до присваивания реквизитов, клиент проверяет все15 типов/значений до показа. Ожидаемый будущий протокол:2 строки, сумма351.00, настоящие даты/номера/задачи/флаги/разные UUID.

  15. После любой ошибки остаётся 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";
#КонецЕсли
КонецПроцедуры

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

  1. Подготовить собственную новую пустую VM/File CF, один тип документа/два собственных реквизита, один журнал, одного пользователя и точные модуль/форму/startup. Проверить весь стенд и actual journal type ДО записи.

  2. Подтвердить отсутствие любых старых собственных заявок, сохранить ровно две новые и получить их настоящие разные ссылки. Без posting/delete/переданных чужих объектов.

  3. Получить ограниченную own journal selection, проверить actual type, обходить только после native Next=True. Сверить все readonly поля, GetObject или отказ, настоящие own refs и все значения объектов.

  4. Подтвердить ровно2 позиции, конечный Next=False и сумму реально прочитанных объектов351.00. Передать и проверить15 скалярных полей; вывести настоящие значения и разные UUID.

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

  1. Actual type guard before first seed Write and before Next. Native366/318 contradiction preserved; mismatch/Undefined is refusal, not a positive useful example.

  2. Каждое поле позиции имеет проверенный native тип; строковые номера только по своей metadata. Все даты/номера/флаги/refs/объекты и суммы проверены, selection RO не присваиваются.

  3. Ровно2 actual rows с250.75/100.25→351.00; проверен пакет15 и все клиентские поля. После ошибки никаких записей/повторов/автоматического удаления.

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

Ожидаемый будущий ручной результат: две реальные строки OWN-J8-001/002, сумма351.00 и разные фактические UUID, после полного серверного и клиентского контроля. Native producer/type несогласованность может дать честный отказ; здесь runtime не проверялся.

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

  1. Не используйте рабочую/чужую ИБ: создаются реальные собственные записи в новой изолированной лаборатории. Маркеры не защита от намеренной подмены.

  2. Native тип в Select318 противоречит странице366: не подменять проверку фактического типа обещанием успешного получения JournalSelection.

  3. Номер зависит от собственной конфигурации. Next нужен до чтения полей; выборка динамическая, не immutable snapshot. Все пять полей выборки RO.

  4. GetObject может вернуть Неопределено. Он проверяется и реально читается, не заменяется заранее созданным объектом. UUID и ссылки фактические, не фиксированные литералы.

  5. STOP ограничен текущей формой; не переоткрывайте её для повторения. Частичные собственные записи после ошибки возможны, автоматического отката/удаления нет.

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

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

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

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

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