СериализаторXDTO.ПрочитатьXML

Методы · ReadXML

Производит чтение значения в формате XML. Прочитаны могут значения тех типов, которые могут быть записаны методом ЗаписатьXML.

Синтаксис

ПрочитатьXML(<ЧтениеXML>, <ТипЗначения>)
Полное описание, параметры и ограничения

СериализаторXDTO.ПрочитатьXML (XDTOSerializer.ReadXML)

СериализаторXDTO (XDTOSerializer)

ПрочитатьXML (ReadXML)

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

Синтаксис:
ПрочитатьXML(<ЧтениеXML>, <ТипЗначения>)
Параметры:

<ЧтениеXML> (обязательный)
Тип: ЧтениеУзловDOM, ЧтениеFastInfoset, ЧтениеXML.
Объект, через который происходит чтение XML.

<ТипЗначения> (необязательный)
Тип: Тип.
Тип значения, которое должно быть прочитано из XML.
Если тип не указан, то будет произведена попытка определения типа значения непосредственно из представления XML.
Если тип не указан и установить его не представляется возможным, или считываемые данные не соответствуют значению типа, то будет вызвано исключение.
Возвращаемое значение:
Тип: Значение считанного типа, Неопределено.
Неопределено - в процессе чтения читаемый XML интерпретируется как Неопределено.
Описание:

Производит чтение значения в формате XML. Прочитаны могут значения тех типов, которые могут быть записаны методом ЗаписатьXML.

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

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

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

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

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

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

Свой ordinary просмотрщик120×8: прокрутка, защищенные960 чисел, выбор ячейки, блокировка и точное восстановление оформления

Реальный own spreadsheet-field из подготовленной ordinary формы, а не getter wrapper/managed alias. Самостоятельная рассчитанная матрица читается и проверяется целиком; восемь actual исходных свойств сохраняются typed copies, режимы меняются только при exact expected-own-state и восстанавливаются без blind rollback после ошибок.

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

MAIN FORM только модуль own ordinary общей формы Просмотр85 новой пустой CF УчебныйПросмотрТабДок85. Windows thick ОбычноеПриложение/FileIB/currentownuser. Native actual ПолеТабличногоДокумента catalog56 from Form.Controls, не managedalias. APPLICATION отдельно ordinary application module.

Подготовка

  1. Только отдельная собственная Windows VM, платформа8.5.1.1343, толстый клиент в режиме ОбычноеПриложение. Native ПолеТабличногоДокумента catalog56 является visual ТабличныйДокумент со свойствами/методами последнего. Managed ПолеФормы/форма клиента не подменяют этот native type.

  2. Вручную создайте canonical nonzero UUID-marker и новую пустую FileIB C:\1c-labs\Уч85Просмотр_<UUID>\ИБ\; connection строго File="C:\1c-labs\Уч85Просмотр_<UUID>\ИБ\";. Конфигурация УчебныйПросмотрТабДок85, один actual IBUser Уч85Просмотр_<UUID> с собственными правами/чтением списка пользователей, без privileged mode.

  3. Marker каталога/actualuser имени не UUID ИБ или UUID реального пользователя. Native currentuser UUID сверяется с единственным actual пользователем; реальный UUID самой базы не измеряется. Не рабочая/типовая база, другой пользователь или чужой просмотрщик.

  4. Собственная CF пуста: нет справочников/документов/регистров/общих реквизитов/разделителей/ботов/констант/подписок/заданий/внешних данных/расширений. Создайте только ordinary общую форму Просмотр85. Runtime работает только с новым собственным TabDoc в памяти, без DBread/write.

  5. Конфигуратор → Общие → Общие формы → Просмотр85: Обычная форма. Реквизиты: МеткаОпыта Строка36; Согласен85 Булево; Результат85 ТабличныйДокумент; Состояние85 Строка500. Флажок связан с Согласен85, readonly текстовое поле/надпись статуса — с Состояние85. Marker/False consent назначаются own app перед открытием.

  6. Разместите собственное ПолеТабличногоДокумента Уч85Просмотр, Данные=Результат85. Окно/поле должно быть меньше полного содержимого121строка×8колонок для ручной проверки вертикальной/горизонтальной прокрутки; остальные кнопки/согласие/статус размещайте ВНЕ этого поля, чтобы блокировка не отключила их.

  7. Три ordinary кнопки: Подготовить85, Блокировка85, Восстановить85. В свойствах → События → Нажатие явно назначьте соответственно ПодготовитьПросмотр85, ПереключитьДоступность85, ВосстановитьОформление85. Native Button.Нажатие() плюс ordinary form extension firstЭлемент дают handler(Элемент), не managed Команда и не zeroarg handler.

  8. У Уч85Просмотр в свойствах → События → Выбор назначьте Уч85ПросмотрВыбор. Base native Выбор(Область,СтандартнаяОбработка) плюс ordinary form extension firstЭлемент дают ровно3args. Событие вызывается двойным щелчком/Enter; не вручную для имитации UI proof. Область от native события связана с actual initiating своим field.

  9. Вставьте FORM целиком исключительно в модуль этой own ordinary общей формы. Readonly ЭтаФорма.ЭлементыФормы.Найти дает actual own field; проверяется native type/точный Data. Нет Новый ПолеТабличногоДокумента/неизвестного входного объекта или присваивания readonly коллекции.

  10. В обычный модуль приложения своей CF вставьте APPLICATION полностью: real native OnStart0 получает marker из имени настоящего currentuser, выполняет полный guard и native GetCommonForm fresh UUIDkey, назначает own marker/False consent и открывает. Button/Selection события вручную не вызываются.

  11. Вручную проверьте исходники конфигуратором и запустите только эту собственную ИБ actual пользователем. Автор не создавал/компилировал CF/формы и не запускал1С/UI/файлы/БД/сеть/печать. Подтвердите Согласен85 и нажмите Подготовить85 один раз. После ошибки закрывайте только этот свой экземпляр вручную, не делайте blind recovery.

  12. Своя numeric матрица содержит header row1 и data rows2..121, колонки1..8, значения(row-1)*column. Есть960 числовых cells. Все header/data области защищены Защита=True и ТабДок.ТолькоПросмотр=True. OnlyView само по себе не абсолютный запрет: native документация ограничивает редактирование именно защищенных cells/рисунков. Это UI protection, не security boundary.

  13. Перед каждым viewer setter процесс заново проверяет same actual field/data binding, обе shape121×8 и OnlyView, все8header/protection и все960actual field/object numeric/protected cells. Сумма читается из фактических cells:261360=120*121/2 *8*9/2. Формула проверяет, но не подставляет источник вместо испорченного cell.

  14. Baseline восьми native getter values снимается после своего создания/проверки данных, но ДО изменения viewer props. Scrollbars/Enabled/DND — Boolean, ShowSelection — ТипОтображенияВыделенияТабличногоДокумента, Border/Color — реальные типы Рамка/Цвет. Значения по умолчанию/стиля не угадываются.

  15. Frame/Color baseline копируются native XDTO через string-only writer/reader с explicit type, exact typed roundtrip и signature сравнение. Это только свои два допустимых UI value types из getter/own constructor; не user XML/файл/schema/объект данных. Style/auto сохранены, не превращены в guessed RGB. Deprecated ValueToStringInternal не используется.

  16. Подготовленный desired plan строится ДО setters: обе scrollbar=True, enabled=True, selection Всегда, оба DND=False, double рамка толщиной2logicalunits и абсолютный RGB30/72/102. Цвет рамки native игнорируется у Выпуклая/Вдавленная, поэтому здесь Двойная. Border thickness logical units не миллиметры previous overlay урока.

  17. State gating сравнивает все8current props с последним exact ожидаемым своим состоянием. НеЗавершено=True ставится до первого setter; только full desired readback и повторная data проверка позволяют записать новый expected state/снять флаг. Если setter/roundtrip/readback неудачен, flag остается, дальнейшие команды/rollback запрещены; нельзя объявить любой current afterstate своим.

  18. Прокрутите только свой бланк по обеим осям. Двойной щелчок одной numeric cell, например row121/col8, должен показать actual960 в Состояние85; row2/col1 —1. Header/multi-cell/вне диапазона не считают numeric selection; проверки firstElement/area bounds/ContainsValue/Number/ownfield readback не заменяются подписью.

  19. Блокировка85 переключает только own desired Enabled, при fullsamefield/fullgrid/currentstate guard. False запрещает доступ к полю и его controls по native контракту, а buttons вне поля остаются доступны. Повторная команда вернетTrue. Данные/checksum/Frame/Color/scroll/selection/DND сохраняются exact desired state.

  20. Восстановить85 возвращает именно реальные baseline8props, включая исходные style/auto/Boolean/enum, только после exact expected-own-state. Не reset-to-known-defaults и не автоматический rollback по Exception. Если свой current state изменен извне, данные испорчены или flagfailed — отказ, никакого blind overwrite.

  21. После successful restoration новые setters этого экземпляра запрещены; закрывайте свою форму вручную. Baseline DND/Enabled могут иметь другие значения: они возвращены как параметры, но protected свой data остаются. DND flags/UI protection не абсолютная sandbox/data security и не подтвержденная печать/экспорт/визуальная pixel correctness.

  22. Ручные negative проверки только на отдельном новом собственном экземпляре: без согласия — отказ; повторная подготовка — отказ; изменение header/numeric cell/protection или viewer prop вне известного состояния — отказ до новых setters. Partialfailure не чинится принудительным restore, неизвестные поля/формы/состояния не используются.

Перем НачатаПодготовка85;
Перем Подготовлено85;
Перем НеЗавершено85;
Перем Восстановлено85;
Перем СвоеПоле85;
Перем ИсходноеСостояние85;
Перем ОжидаемоеСостояние85;

Процедура ПодготовитьПросмотр85(Элемент)
    ПроверитьСвоюКнопку85(Элемент, "Подготовить85");
    Если НачатаПодготовка85 = Истина Тогда
        ВызватьИсключение "Подготовка одноразовая. Ошибка/частичный setter не разрешают повторную подготовку или автоматический rollback";
    КонецЕсли;
    СвоеПоле85 = ЭтаФорма.ЭлементыФормы.Найти("Уч85Просмотр");
    Если СвоеПоле85 = Неопределено Или ТипЗнч(СвоеПоле85) <> Тип("ПолеТабличногоДокумента") Или СвоеПоле85.Данные <> "Результат85" Тогда
        ВызватьИсключение "Нужно actual own prepared spreadsheet field с Data=Результат85, не managed alias";
    КонецЕсли;
    НачатаПодготовка85 = Истина;
    НеЗавершено85 = Истина;
    Результат85 = Новый ТабличныйДокумент;
    Для Колонка = 1 По 8 Цикл
        Результат85.Область(1, Колонка).Текст = "Колонка" + Строка(Колонка);
        Для СтрокаДанных = 1 По 120 Цикл
            Ячейка = Результат85.Область(СтрокаДанных + 1, Колонка);
            Ячейка.СодержитЗначение = Истина;
            Ячейка.ТипЗначения = Новый ОписаниеТипов("Число");
            Ячейка.Значение = СтрокаДанных * Колонка;
        КонецЦикла;
    КонецЦикла;
    Результат85.Область(1, 1, 121, 8).Защита = Истина;
    Результат85.ТолькоПросмотр = Истина;
    ПроверитьСвоеПолеИВсюМатрицу85();
    ИсходноеСостояние85 = СнятьActualПаспортСвоегоПоля85();
    ОжидаемоеСостояние85 = ИсходноеСостояние85;
    План = Новый Структура(ИсходноеСостояние85);
    План.ВертикальнаяПолосаПрокрутки = Истина;
    План.ГоризонтальнаяПолосаПрокрутки = Истина;
    План.Доступность = Истина;
    План.ОтображатьВыделение = ТипОтображенияВыделенияТабличногоДокумента.Всегда;
    План.РазрешитьНачалоПеретаскивания = Ложь;
    План.РазрешитьПеретаскивание = Ложь;
    КопияРамки = КопияСвоегоОформления85(Новый Рамка(ТипРамкиЭлементаУправления.Двойная, 2));
    КопияЦвета = КопияСвоегоОформления85(Новый Цвет(30, 72, 102));
    План.Рамка = КопияРамки.Значение;
    План.XMLРамки = КопияРамки.XML;
    План.ЦветРамки = КопияЦвета.Значение;
    План.XMLЦвета = КопияЦвета.XML;
    Если План.Рамка.ТипРамки <> ТипРамкиЭлементаУправления.Двойная Или План.Рамка.Толщина <> 2
        Или План.ЦветРамки.Красный <> 30 Или План.ЦветРамки.Зеленый <> 72 Или План.ЦветРамки.Синий <> 102 Тогда
        ВызватьИсключение "Typed own absolute рамка/RGB план не подтвердился до setters";
    КонецЕсли;
    ПрименитьТочныйСвойПлан85(Новый ФиксированнаяСтруктура(План));
    Подготовлено85 = Истина;
    Восстановлено85 = Ложь;
    Состояние85 = "Матрица120×8 проверена:960 чисел, сумма261360. Прокрутите, затем дважды щелкните одну числовую ячейку.";
КонецПроцедуры

Процедура ПереключитьДоступность85(Элемент)
    ПроверитьСвоюКнопку85(Элемент, "Блокировка85");
    ПроверитьГотовностьСвоегоПросмотра85();
    План = Новый Структура(ОжидаемоеСостояние85);
    План.Доступность = Не План.Доступность;
    ПрименитьТочныйСвойПлан85(Новый ФиксированнаяСтруктура(План));
    Состояние85 = "Доступность actual поля=" + Строка(ОжидаемоеСостояние85.Доступность) + "; own960cells/сумма сохранены. Кнопки вне поля доступны.";
КонецПроцедуры

Процедура ВосстановитьОформление85(Элемент)
    ПроверитьСвоюКнопку85(Элемент, "Восстановить85");
    ПроверитьГотовностьСвоегоПросмотра85();
    ПрименитьТочныйСвойПлан85(ИсходноеСостояние85);
    Восстановлено85 = Истина;
    Состояние85 = "Все8 actual исходных свойств возвращены своей форме после expected-own-state проверки. Матрица осталась собственной/защищенной. Закройте этот учебный экземпляр вручную.";
КонецПроцедуры

Процедура Уч85ПросмотрВыбор(Элемент, Область, СтандартнаяОбработка)
    ПроверитьСвойOrdinaryПросмотр85(МеткаОпыта);
    СтандартнаяОбработка = Ложь;
    Если Подготовлено85 <> Истина Или НеЗавершено85 = Истина Тогда
        ВызватьИсключение "Частичный/неподготовленный viewer не подтверждает UI выбор";
    КонецЕсли;
    Если Элемент <> СвоеПоле85 Или ЭтаФорма.ЭлементыФормы.Найти("Уч85Просмотр") <> Элемент
        Или ТипЗнч(Элемент) <> Тип("ПолеТабличногоДокумента") Тогда
        ВызватьИсключение "Нужно actual native Selection своего field, не foreign инициатор/вручную вызванное событие";
    КонецЕсли;
    ПроверитьСвоеПолеИВсюМатрицу85();
    ПроверитьСовпадениеСвоихСостояний85(СнятьActualПаспортСвоегоПоля85(), ОжидаемоеСостояние85);
    Если ТипЗнч(Область) <> Тип("ОбластьЯчеекТабличногоДокумента") Тогда
        ВызватьИсключение "Native Selection должна передать actual область, связанную с собственным событием";
    КонецЕсли;
    Если Область.Верх <> Область.Низ Или Область.Лево <> Область.Право
        Или Область.Верх < 2 Или Область.Верх > 121 Или Область.Лево < 1 Или Область.Лево > 8 Тогда
        Состояние85 = "Выберите двойным щелчком одну свою числовую ячейку: строки2..121, колонки1..8, не заголовок/область.";
        Возврат;
    КонецЕсли;
    СвояЯчейка = СвоеПоле85.Область(Область.Верх, Область.Лево);
    Если Не Область.СодержитЗначение Или Не СвояЯчейка.СодержитЗначение
        Или ТипЗнч(Область.Значение) <> Тип("Число") Или ТипЗнч(СвояЯчейка.Значение) <> Тип("Число")
        Или Область.Значение <> СвояЯчейка.Значение
        Или СвояЯчейка.Значение <> (Область.Верх - 1) * Область.Лево Тогда
        ВызватьИсключение "Actual native event area/current ownfield cell numeric readback не совпал";
    КонецЕсли;
    Состояние85 = "Собственный actual Selection: строка=" + Строка(Область.Верх) + "; колонка=" + Строка(Область.Лево) + "; число=" + Строка(СвояЯчейка.Значение);
КонецПроцедуры

Процедура ПрименитьТочныйСвойПлан85(План)
    ПроверитьСвоеПолеИВсюМатрицу85();
    ПроверитьСовпадениеСвоихСостояний85(СнятьActualПаспортСвоегоПоля85(), ОжидаемоеСостояние85);
    НеЗавершено85 = Истина;
    СвоеПоле85.ВертикальнаяПолосаПрокрутки = План.ВертикальнаяПолосаПрокрутки;
    СвоеПоле85.ГоризонтальнаяПолосаПрокрутки = План.ГоризонтальнаяПолосаПрокрутки;
    СвоеПоле85.Доступность = План.Доступность;
    СвоеПоле85.ОтображатьВыделение = План.ОтображатьВыделение;
    СвоеПоле85.РазрешитьНачалоПеретаскивания = План.РазрешитьНачалоПеретаскивания;
    СвоеПоле85.РазрешитьПеретаскивание = План.РазрешитьПеретаскивание;
    СвоеПоле85.Рамка = План.Рамка;
    СвоеПоле85.ЦветРамки = План.ЦветРамки;
    ПроверитьСовпадениеСвоихСостояний85(СнятьActualПаспортСвоегоПоля85(), План);
    ПроверитьСвоеПолеИВсюМатрицу85();
    ОжидаемоеСостояние85 = План;
    НеЗавершено85 = Ложь;
КонецПроцедуры

Функция СнятьActualПаспортСвоегоПоля85()
    Паспорт = Новый Структура;
    Паспорт.Вставить("ВертикальнаяПолосаПрокрутки", СвоеПоле85.ВертикальнаяПолосаПрокрутки);
    Паспорт.Вставить("ГоризонтальнаяПолосаПрокрутки", СвоеПоле85.ГоризонтальнаяПолосаПрокрутки);
    Паспорт.Вставить("Доступность", СвоеПоле85.Доступность);
    Паспорт.Вставить("ОтображатьВыделение", СвоеПоле85.ОтображатьВыделение);
    Паспорт.Вставить("РазрешитьНачалоПеретаскивания", СвоеПоле85.РазрешитьНачалоПеретаскивания);
    Паспорт.Вставить("РазрешитьПеретаскивание", СвоеПоле85.РазрешитьПеретаскивание);
    КопияРамки = КопияСвоегоОформления85(СвоеПоле85.Рамка);
    КопияЦвета = КопияСвоегоОформления85(СвоеПоле85.ЦветРамки);
    Паспорт.Вставить("Рамка", КопияРамки.Значение);
    Паспорт.Вставить("ЦветРамки", КопияЦвета.Значение);
    Паспорт.Вставить("XMLРамки", КопияРамки.XML);
    Паспорт.Вставить("XMLЦвета", КопияЦвета.XML);
    Если ТипЗнч(Паспорт.ВертикальнаяПолосаПрокрутки) <> Тип("Булево") Или ТипЗнч(Паспорт.ГоризонтальнаяПолосаПрокрутки) <> Тип("Булево")
        Или ТипЗнч(Паспорт.Доступность) <> Тип("Булево") Или ТипЗнч(Паспорт.РазрешитьНачалоПеретаскивания) <> Тип("Булево")
        Или ТипЗнч(Паспорт.РазрешитьПеретаскивание) <> Тип("Булево")
        Или ТипЗнч(Паспорт.ОтображатьВыделение) <> Тип("ТипОтображенияВыделенияТабличногоДокумента") Тогда
        ВызватьИсключение "Actual8 typed getter values не соответствуют native field контрактам";
    КонецЕсли;
    Возврат Новый ФиксированнаяСтруктура(Паспорт);
КонецФункции

Процедура ПроверитьСовпадениеСвоихСостояний85(Actual, Ожидаемое)
    Если Actual.ВертикальнаяПолосаПрокрутки <> Ожидаемое.ВертикальнаяПолосаПрокрутки
        Или Actual.ГоризонтальнаяПолосаПрокрутки <> Ожидаемое.ГоризонтальнаяПолосаПрокрутки
        Или Actual.Доступность <> Ожидаемое.Доступность Или Actual.ОтображатьВыделение <> Ожидаемое.ОтображатьВыделение
        Или Actual.РазрешитьНачалоПеретаскивания <> Ожидаемое.РазрешитьНачалоПеретаскивания
        Или Actual.РазрешитьПеретаскивание <> Ожидаемое.РазрешитьПеретаскивание
        Или Actual.XMLРамки <> Ожидаемое.XMLРамки Или Actual.XMLЦвета <> Ожидаемое.XMLЦвета Тогда
        ВызватьИсключение "Current exact8 ownstate не совпал с подготовленным планом. Нет blind restore/легализации partial/foreign state";
    КонецЕсли;
КонецПроцедуры

Функция КопияСвоегоОформления85(Значение)
    ТребуемыйТип = ТипЗнч(Значение);
    Если ТребуемыйТип <> Тип("Рамка") И ТребуемыйТип <> Тип("Цвет") Тогда
        ВызватьИсключение "In-memory XDTO копирование разрешено только своему actual native Frame/Color value, не объектам данных/клиентскому XML";
    КонецЕсли;
    XML = ЗаписатьСвойТипОформленияВСтроку85(Значение);
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(XML);
    Если Не Чтение.Прочитать() Или Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
        Чтение.Закрыть();
        ВызватьИсключение "Own generated XDTO root element отсутствует";
    КонецЕсли;
    Копия = СериализаторXDTO.ПрочитатьXML(Чтение, ТребуемыйТип);
    Чтение.Закрыть();
    Если ТипЗнч(Копия) <> ТребуемыйТип Или ЗаписатьСвойТипОформленияВСтроку85(Копия) <> XML Тогда
        ВызватьИсключение "Typed own Frame/Color XDTO roundtrip не сохранил exact value/style/default. UI setters не продолжаются";
    КонецЕсли;
    Возврат Новый ФиксированнаяСтруктура("Значение,XML", Копия, XML);
КонецФункции

Функция ЗаписатьСвойТипОформленияВСтроку85(Значение)
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(Запись, Значение, НазначениеТипаXML.Явное);
    Возврат Запись.Закрыть();
КонецФункции

Процедура ПроверитьСвоеПолеИВсюМатрицу85()
    ПроверитьСвойOrdinaryПросмотр85(МеткаОпыта);
    Если СвоеПоле85 = Неопределено Или ЭтаФорма.ЭлементыФормы.Найти("Уч85Просмотр") <> СвоеПоле85
        Или ТипЗнч(СвоеПоле85) <> Тип("ПолеТабличногоДокумента") Или СвоеПоле85.Данные <> "Результат85"
        Или ТипЗнч(Результат85) <> Тип("ТабличныйДокумент") Тогда
        ВызватьИсключение "Source identity собственного real field/bound document изменена";
    КонецЕсли;
    Если Результат85.ВысотаТаблицы <> 121 Или Результат85.ШиринаТаблицы <> 8 Или Не Результат85.ТолькоПросмотр
        Или СвоеПоле85.ВысотаТаблицы <> 121 Или СвоеПоле85.ШиринаТаблицы <> 8 Или Не СвоеПоле85.ТолькоПросмотр Тогда
        ВызватьИсключение "Own bound native field/document shape/viewmode не совпали";
    КонецЕсли;
    Сумма = 0;
    Для Колонка = 1 По 8 Цикл
        Заголовок = СвоеПоле85.Область(1, Колонка);
        Если Заголовок.Текст <> "Колонка" + Строка(Колонка) Или Не Заголовок.Защита Тогда
            ВызватьИсключение "Own bound header/protection изменены";
        КонецЕсли;
        Для СтрокаДанных = 1 По 120 Цикл
            Ячейка = СвоеПоле85.Область(СтрокаДанных + 1, Колонка);
            ЯчейкаОбъекта = Результат85.Область(СтрокаДанных + 1, Колонка);
            Если Не Ячейка.СодержитЗначение Или Не ЯчейкаОбъекта.СодержитЗначение Или Не Ячейка.Защита Или Не ЯчейкаОбъекта.Защита
                Или ТипЗнч(Ячейка.Значение) <> Тип("Число") Или ТипЗнч(ЯчейкаОбъекта.Значение) <> Тип("Число")
                Или Ячейка.Значение <> СтрокаДанных * Колонка Или ЯчейкаОбъекта.Значение <> Ячейка.Значение Тогда
                ВызватьИсключение "Одна из own960 actual field/object numeric/protected cells изменена. Формула не используется как fallback";
            КонецЕсли;
            Сумма = Сумма + Ячейка.Значение;
        КонецЦикла;
    КонецЦикла;
    Если Сумма <> 261360 Или Сумма <> 120 * 121 / 2 * 8 * 9 / 2 Тогда
        ВызватьИсключение "Actual960 numeric cell checksum не равна261360";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьГотовностьСвоегоПросмотра85()
    Если Подготовлено85 <> Истина Или НеЗавершено85 = Истина Или Восстановлено85 = Истина Тогда
        ВызватьИсключение "Не подготовлено/failedsetter/уже восстановлено: новые setters/rollback не разрешены. Закройте только свой экземпляр вручную";
    КонецЕсли;
    ПроверитьСвоеПолеИВсюМатрицу85();
    ПроверитьСовпадениеСвоихСостояний85(СнятьActualПаспортСвоегоПоля85(), ОжидаемоеСостояние85);
КонецПроцедуры

Процедура ПроверитьСвоюКнопку85(Элемент, Имя)
    ПроверитьСвойOrdinaryПросмотр85(МеткаОпыта);
    Если Согласен85 <> Истина Или ТипЗнч(Элемент) <> Тип("Кнопка") Или ЭтаФорма.ЭлементыФормы.Найти(Имя) <> Элемент Тогда
        ВызватьИсключение "Нужны согласие и actual инициатор собственной ordinary кнопки, не ручной вызов/foreign event";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСвойOrdinaryПросмотр85(МеткаОпыта)
#Если ТолстыйКлиентОбычноеПриложение Тогда
    ПроверитьСвойПустойСтенд();
    UUIDМетки = Новый УникальныйИдентификатор(МеткаОпыта);
    Если МеткаОпыта <> Строка(UUIDМетки) Или UUIDМетки = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
        ВызватьИсключение "Нужен canonical nonzero marker собственного каталога, не UUID базы/настоящего пользователя ИБ";
    КонецЕсли;
    Соединение = "File=""C:\1c-labs\Уч85Просмотр_" + МеткаОпыта + "\ИБ\"";";
    Если СтрокаСоединенияИнформационнойБазы() <> Соединение Или ПривилегированныйРежим() Тогда
        ВызватьИсключение "Только собственная новая FileIB и свой непривилегированный сеанс; connection не печатается";
    КонецЕсли;
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Пользователи.Количество() <> 1 Или Текущий = Неопределено Тогда
        ВызватьИсключение "Нужен один настоящий собственный пользователь ИБ";
    КонецЕсли;
    Если Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор
        Или Текущий.Имя <> "Уч85Просмотр_" + МеткаОпыта Или Метаданные.ОбщиеФормы.Количество() <> 1
        Или Метаданные.ОбщиеФормы.Просмотр85.Имя <> "Просмотр85" Или Метаданные.Боты.Количество() <> 0
        Или Метаданные.Константы.Количество() <> 0 Тогда
        ВызватьИсключение "Паспорт своей ordinary формы/реального пользователя не совпал";
    КонецЕсли;
#Иначе
    ВызватьИсключение "Только thick ordinary ПолеТабличногоДокумента, не одноименный managed element";
#КонецЕсли
КонецПроцедуры

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры
Полный обычный модуль приложения: actual ownuser marker/guard/native fresh common form

Собственная CF → Открыть обычный модуль приложения.

Обычный модуль приложения своей CF, native OnStart0; только guarded WindowsThickOrdinary ownform factory, no fake UIevents.

Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентОбычноеПриложение Тогда
    Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Пользователь = Неопределено Или Не СтрНачинаетсяС(Пользователь.Имя, "Уч85Просмотр_") Тогда
        ВызватьИсключение "Запустите только собственную новую FileIB настоящим единственным учебным пользователем";
    КонецЕсли;
    Метка = Сред(Пользователь.Имя, СтрДлина("Уч85Просмотр_") + 1);
    ПроверитьСвойOrdinaryПросмотр85(Метка);
    СвояФорма = ПолучитьОбщуюФорму("Просмотр85", , Строка(Новый УникальныйИдентификатор));
    Если ТипЗнч(СвояФорма) <> Тип("Форма") Тогда
        ВызватьИсключение "Native GetCommonForm не создал собственную ordinary форму";
    КонецЕсли;
    СвояФорма.МеткаОпыта = Метка;
    СвояФорма.Согласен85 = Ложь;
    СвояФорма.Открыть();
    Если Не СвояФорма.Открыта() Тогда
        ВызватьИсключение "Открытие только своей формы не подтверждено native IsOpen";
    КонецЕсли;
#Иначе
    ВызватьИсключение "Источник field только Windows thick ordinary, не managed form element";
#КонецЕсли
КонецПроцедуры

Процедура ПроверитьСвойOrdinaryПросмотр85(МеткаОпыта)
#Если ТолстыйКлиентОбычноеПриложение Тогда
    ПроверитьСвойПустойСтенд();
    UUIDМетки = Новый УникальныйИдентификатор(МеткаОпыта);
    Если МеткаОпыта <> Строка(UUIDМетки) Или UUIDМетки = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
        ВызватьИсключение "Нужен canonical nonzero marker собственного каталога, не UUID базы/настоящего пользователя ИБ";
    КонецЕсли;
    Соединение = "File=""C:\1c-labs\Уч85Просмотр_" + МеткаОпыта + "\ИБ\"";";
    Если СтрокаСоединенияИнформационнойБазы() <> Соединение Или ПривилегированныйРежим() Тогда
        ВызватьИсключение "Только собственная новая FileIB и свой непривилегированный сеанс; connection не печатается";
    КонецЕсли;
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Пользователи.Количество() <> 1 Или Текущий = Неопределено Тогда
        ВызватьИсключение "Нужен один настоящий собственный пользователь ИБ";
    КонецЕсли;
    Если Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор
        Или Текущий.Имя <> "Уч85Просмотр_" + МеткаОпыта Или Метаданные.ОбщиеФормы.Количество() <> 1
        Или Метаданные.ОбщиеФормы.Просмотр85.Имя <> "Просмотр85" Или Метаданные.Боты.Количество() <> 0
        Или Метаданные.Константы.Количество() <> 0 Тогда
        ВызватьИсключение "Паспорт своей ordinary формы/реального пользователя не совпал";
    КонецЕсли;
#Иначе
    ВызватьИсключение "Только thick ordinary ПолеТабличногоДокумента, не одноименный managed element";
#КонецЕсли
КонецПроцедуры

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

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

  1. Own Windows thick ordinary/FileIB/actual user/empty CF guard выполняется перед native fresh common form и событиями. Source field получен из readonly own Form.Controls и real Data=Результат85.

  2. Generate121×8 own memory TabDoc, protect headers/data and use OnlyView. Fullboundfield/object numeric960cells checksum261360 проверен, не DBsource или getter wrapper.

  3. Восемь реальных исходных getter values сохранены typed immutable snapshot; Frame/Color copies имеют собственный in-memory XDTO exact roundtrip без файлов/user XML и сохраняют style/default semantics.

  4. Planned viewer state строится до изменения: Bool scrollbars/Enabled/DND, ShowSelection enum, actual Double2/RGB. Current state должен совпасть со своим last expected, а не arbitrary afterstate.

  5. Setter transaction здесь не симулируется: failflag до первого setter, запись expected только после fullplan readback и wholegrid. Ошибка означает stop this instance, никакого automatic rollback.

  6. Manualscroll/native Selection3args показывают actual own numeric cell через first-control/bounds/ContainsValue/Number/source equality. UI события не вызываются программно.

  7. Отключение/включение поля выполняет новый полный план на том же known ownfield, сохраняет матрицу и остальные настройки. Внешние buttons сохраняют доступность.

  8. Restoration применяет только original8 actual values при exact-own-state guard. По успешному readback экземпляр больше не меняет viewer props; закрывается вручную владельцем.

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

  1. Native field type/catalog56 source proof, связь Data и whole121×8actualfield/object matrix совпали. Все960numbers/protection/header checked, checksum261360 из actual values.

  2. Bool scrollbars не ScrollBarUse enum; ShowSelection genuine enum; Frame/Color native constructors/typed copy. RGB не объявлен работающим на ignored convex/concave frame.

  3. Baseline capturedbeforemode, style/auto preserved via own in-memory XDTO. All8current fieldprops match exact expected state before/after setters; foreign/partial state не легализуется.

  4. Native Selection firstЭлемент+2baseparams wired explicitly; actualrow121/col8=960, row2/col1=1. Нет прямого вызова события или неизвестного input object.

  5. Enabled toggle не меняет own960cells; successful restore вернул actualbaseline8, failed setters не инициируют blindrollback.

  6. Authoredsource/static/rawnative проверки — не actual1С/UI/компиляция/печать/DB/files/network. Runtime verified0.

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

При ручной успешной компиляции/подготовке своего ordinary стенда protected viewer показывает120×8actualnumeric values/checksum261360, дает ownscroll/native selectedcell, guardedEnabled toggle и возврат actual baseline8. Здесь только authoredsource/native/static verification: actual1С/UI/DB/files/network/COM/print/compile0.

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

  1. ПолеТабличногоДокумента ordinary/catalog56 не managed ПолеФормы. Native visual ТабДок наследует его свойства/методы, но source/type/Data проверяется реальным own form, не именем переменной.

  2. Обе scrollbar свойства native Boolean. ТипОтображенияВыделенияТабличногоДокумента имеет Всегда/ПриАктивности, не guessed cell/row selection mode.

  3. ТолькоПросмотр блокирует редактирование защищенных cells, не всей произвольной таблицы и не безопасность внешних действий. Поэтому own headers/data protected и проверяются повторно.

  4. У convex/concave BorderColor ignored; double absolute frame дает осмысленный цвет. Толщина рамки logical units, не mm spreadsheet overlay coordinates.

  5. Native Frame/Color maystyle/auto; baseline не заменяется current RGB/newDouble defaults. XDTO copies source только own values и их типы, не userprovided XML/objectdata.

  6. Copy XML signatures сравнивают same-version own serialized parameter values, не физическое rendering/pixels/cryptographic integrity. Roundtrip mismatch честно останавливает работу до setters.

  7. Failflag/expected snapshot не создают atomic UI transaction. После partialfailed setters нет blindrollback/auto retry/захвата any currentstate как нового correctexpected.

  8. Selection callback parameters связаны с native initiating field. FirstЭлемент добавлен ordinary extension; base событие2params. Manualcalls/bounds alone не являются доказательством UI event.

  9. Numeric selection читает ownactualfield/callbackrange; header/многоклеточная/внешняя область отклоняется. Источник/формула не превращаются в fake actual result.

  10. Data gate проверяет все960cells +8headers/protection и обе shapes перед каждымsetter. Один corrupted cell не скрывается coincidentally correct total.

  11. Enabled=False отключает весь spreadsheet field и его contained controls, поэтому buttons находятся вне него. Hidden/readonly/disabled не взаимозаменяемые API.

  12. Restoration только ownbaseline при known expectedstate. После успеха новые изменения запрещены; при ошибке владелец вручную закрывает только свое окно без force/foreign cleanup.

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

Передать учебный контакт через XML в памяти

Тип ДанныеКонтакта поддерживает XML-сериализацию. Проверяем имя и собственный почтовый элемент; мобильная синхронизация при этом не выполняется.

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

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Учебная база, серверный контекст. ДанныеКонтакта и связанные типы доступны на сервере: для этих задач не нужен мобильный телефон, разрешение на контакты или настоящая адресная книга.

  2. Вся персона вымышлена: Учебный Ученик Тестович, организация Учебный магазин. Телефоны 000-000-01/02 — демонстрационные строки, адрес student@example.invalid учебный. Ничего не отправляйте и не звоните.

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

Контакт = Новый ДанныеКонтакта;
Контакт.Имя = "Учебный";
Контакт.Фамилия = "Ученик";
Контакт.Отчество = "Тестович";
Контакт.АдресаЭлектроннойПочты = Новый Массив;
Контакт.АдресаЭлектроннойПочты.Добавить(Новый ЭлементДанныхКонтакта(ТипАдресаЭлектроннойПочтыДанныхКонтакта.Рабочий, "student@example.invalid"));
Сообщить(XMLСтрока(Контакт.Имя) = "Учебный");
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
Попытка
    Сериализатор.ЗаписатьXML(Запись, Контакт, НазначениеТипаXML.Явное);
    СтрокаXML = Запись.Закрыть();
Исключение
    Запись.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(СтрокаXML);
Попытка
    Чтение.ПерейтиКСодержимому();
    Копия = Сериализатор.ПрочитатьXML(Чтение, Тип("ДанныеКонтакта"));
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Сообщить(ТипЗнч(Копия) = Тип("ДанныеКонтакта"));
Сообщить(Копия.Имя = "Учебный");
Сообщить(Копия.Фамилия = "Ученик");
Сообщить(Копия.Отчество = "Тестович");
Сообщить(Копия.АдресаЭлектроннойПочты.Количество() = 1);
Сообщить(Копия.АдресаЭлектроннойПочты[0].Значение = "student@example.invalid");

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

  1. Новый контакт имеет собственные имя и почтовый элемент с системным типом Рабочий.

  2. XMLСтрока используется только для простого строкового поля имени: это не сериализация составного контакта.

  3. Для всей карточки создаём СериализаторXDTO со стандартной ФабрикаXDTO, пишем с явным типом и читаем в ДанныеКонтакта. Чтение и запись закрываем также при ошибке.

  4. В копии проверяем тип, три части имени, количество и содержимое почты. Устройство и менеджер синхронизации не вызываются.

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

  1. Семь сообщений Истина.

  2. XML остаётся в строке памяти: ни файл, ни внешний сервис не нужны.

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

Получена отдельная XML-копия собственного учебного контакта.

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

  1. Это собственные учебные объекты, не контакт, уже полученный от операционной системы или сохранённый на устройстве.

  2. XML-сериализация платформы не является универсальным vCard или JSON-контрактом сторонней CRM.

  3. Для входного неизвестного XML необходимы отдельные ограничения размера и согласованный контракт; этот пример читает только свой источник.

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

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

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

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

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