ОбластьЯчеекТабличногоДокумента.Параметр

Свойства · Parameter

Тип: Строка. Имя параметра, используемого при выводе области.

Полное описание, параметры и ограничения

ОбластьЯчеекТабличногоДокумента.Параметр (SpreadsheetDocumentRange.Parameter)

ОбластьЯчеекТабличногоДокумента (SpreadsheetDocumentRange)

Параметр (Parameter)

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

Использование:
Чтение и запись.
Описание:
Тип: Строка.
Имя параметра, используемого при выводе области.
Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.

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

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

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

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

Печатная карточка Книги: параметры, картинка и проверенная расшифровка

Самостоятельная карточкаBOOK:3×250=750 из своего макета в памяти. Сначала подтверждаем единственный текстовый параметр и используем индекс0; затем добавляем параметры картинки и расшифровки по известным именам. Вывести должен подставить синюю картинку вместо зеленой, сохранив исходный макет.

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

Полный серверный общий модульУчебнаяПечать85. Отдельная собственная пустаяCF, managed thin client8.5.1.1343; ниже полный модуль общей формы и полный модуль управляемого приложения.

Подготовка

  1. Вручную создайте отдельную новую пустую файловую информационную базу на платформе8.5.1.1343, не из копии УНФ/КА/УТ/БП и не на рабочем сервере. Все операции ниже предназначены исключительно для нее. Здесь выполнено только авторство и статические проверки; созданиеИБ, запуск, запись конфигурации и печать нами не выполнялись.

  2. В Конфигураторе: Конфигурация → Открыть конфигурацию. Корень → Имя=УчебнаяПечатнаяКарточка85, Основной режим запуска=Управляемое приложение, Режим совместимости=Не использовать. Учебный запуск именно тонким клиентом; не обычные формы, не внешнее соединение.

  3. Оставьте пустыми все справочники, документы, перечисления, планы, регистры, отчеты, обработки, константы, параметры сеанса, хранилища настроек, общие реквизиты, подписки и регламентные задания. Никаких расширений, BSP, рабочих макетов и чужих модулей. Имя конфигурации само по себе не доказывает изоляцию; новаяИБ и отсутствие чужого кода обеспечиваются ручной подготовкой.

  4. Общие → Общие модули → Добавить → УчебнаяПечать85. Сервер=Да, Клиент(управляемое приложение)=Нет, Клиент(обычное приложение)=Нет, Внешнее соединение=Нет, Глобальный=Нет, Привилегированный=Нет, Вызов сервера=Нет, Повторное использование возвращаемых значений=Не использовать. Основной блок кода вставьте целиком в модуль, не внутрь существующей процедуры.

  5. Общие → Общие формы → Добавить → УчебнаяКарточка85, Тип формы=Управляемая. Это единственная общая форма. В ее модуль вставьте целиком вспомогательный блок «Полный модуль общей управляемой формы УчебнаяКарточка85». Никакого обработчика объекта/документа в этом примере нет.

  6. На вкладке Реквизиты формы добавьте Карточка85 типаТабличныйДокумент, УчебныйUUID85 типаСтрока длиной36, Статус85 типаСтрока неограниченной длины. UUID хранится только в памяти формы и не является ссылкой на объектИБ.

  7. Перенесите Карточка85 в элементы формы: тип=Поле табличного документа, имя=ПолеКарточки85, ПутьКДанным=Карточка85. Дайте полю основную площадь формы. УчебныйUUID85 и Статус85 выведите отдельными полями только для просмотра. Не включайте команды печати или сохранения файла и не назначайте чужой макет.

  8. У элементаПолеКарточки85 в свойствах событияОбработкаРасшифровки выберите ПолеКарточки85ОбработкаРасшифровки. В режиме без совместимости платформа передает Элемент и три native параметра: Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры. Не вызывайте этот обработчик вручную.

  9. На вкладке Команды создайте Собрать85 и ПроверитьОтказы85. Для каждой задайте Действие одноименной процедуры модуля формы и перенесите команды в кнопки формы. Аргумент Команда предоставляет платформа; имена команд проверяются кодом.

  10. Корень конфигурации → Открыть модуль управляемого приложения. Он должен быть пустым. Вставьте целиком вспомогательный блок «Полный модуль управляемого приложения: открыть только свою форму»; ПриНачалеРаботыСистемы является событием приложения, а не процедурой формы. Он открывает только собственную общую форму и не собирает карточку автоматически.

  11. Для своей новойИБ создайте только собственного учебного пользователя с доступом к клиентскому запуску и этой общей форме; при необходимости собственную учебную роль. Никаких обработчиков авторизации/фоновых процессов. Это не образец разграничения прав для production.

  12. Проверьте все три модуля синтаксически и вручную обновите конфигурацию своейИБ. После этого запустите собственнуюИБ тонким клиентом8.5.1.1343. Сначала ничего не печатайте и не сохраняйте на диск.

  13. Нажмите Собрать85. Команда создает реальный новыйUUID, сервер собирает свой пакетBOOK/3/250/750, полный макет и результат в памяти. На клиент возвращается только проверенный итоговыйТабличныйДокумент, а не макет для повторного вывода.

  14. Проверьте зеленую/синюю разницу: в коде исходная статическаяSVG зеленая, а параметр содержит синюю книжку. В результате должна быть синяя картинка слева от текстаBOOK:Книга. Свойства native readback проверяются автоматически; конкретную отрисовку проверяете глазами, статические тесты пиксели не проверяют.

  15. В строке чисел должны быть3,250,750; внизуUUID собственной карточки. Двойной щелчок/Enter на ячейке с синей картинкой запускает настоящий обработчик расшифровки и показываетBOOK:3×250=750 вСтатус85, не открывает справочник и не вызывает стандартную обработку.

  16. Нажмите ПроверитьОтказы85. Код в памяти проверяет6 конкретных ошибок и принимает только ожидаемые собственные маркеры исключений. Уже показанныеКарточка85 иУчебныйUUID85 не присваиваются этой командой; меняется толькоСтатус85 после полного успешного завершения проверок.

  17. Любое неожиданное исключение прекращает команду. Не повторяйте ее до выяснения причины и не считайте частичный результат успехом. Здесь нет обещания транзакционности/rollback интерфейса; данныеИБ не записываются, а присваивание результата форме происходит после всех серверных проверок.

  18. Для очистки просто закройте свою форму/сеанс: все карточки иSVG находились только в памяти. Код не вызываетНапечатать/Записать/Прочитать/файловые диалоги, не изменяет стандартные настройки, не открывает URLs и не обращается к рабочим конфигурациям. Возможные обычные действия платформы при запуске не объявляются отсутствующими.

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

Процедура ПроверитьСвоюСхему()
    ПроверитьСвойПустойСтенд();
    Если Метаданные.ОбщиеМодули.Количество() <> 1
        Или Метаданные.ОбщиеМодули.Найти("УчебнаяПечать85") = Неопределено
        Или Метаданные.ОбщиеФормы.Количество() <> 1
        Или Метаданные.ОбщиеФормы.Найти("УчебнаяКарточка85") = Неопределено
        Или Метаданные.Обработки.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0
        Или Метаданные.Константы.Количество() <> 0 Или Метаданные.ПараметрыСеанса.Количество() <> 0
        Или Метаданные.ХранилищаНастроек.Количество() <> 0 Тогда
        ВызватьИсключение "Нужна собственная схема: один общий модуль, одна общая форма и никаких прикладных объектов";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьПакет(Пакет, ОжидаемыйUUID)
    Если ТипЗнч(ОжидаемыйUUID) <> Тип("УникальныйИдентификатор") Тогда
        ВызватьИсключение "OWN-CARD-UUID-TYPE";
    КонецЕсли;
    Если ТипЗнч(Пакет) <> Тип("ФиксированнаяСтруктура") Тогда
        ВызватьИсключение "OWN-CARD-PACKAGE-TYPE";
    КонецЕсли;
    Если Пакет.Количество() <> 5 Или Не Пакет.Свойство("UUID", UUID)
        Или Не Пакет.Свойство("Код", Код) Или Не Пакет.Свойство("Количество", Количество)
        Или Не Пакет.Свойство("Цена", Цена) Или Не Пакет.Свойство("Сумма", Сумма) Тогда
        ВызватьИсключение "OWN-CARD-FIELDS";
    КонецЕсли;
    Если ТипЗнч(UUID) <> Тип("УникальныйИдентификатор") Или UUID <> ОжидаемыйUUID Тогда
        ВызватьИсключение "OWN-CARD-OWNER";
    КонецЕсли;
    Если ТипЗнч(Код) <> Тип("Строка") Или Код <> "BOOK"
        Или ТипЗнч(Количество) <> Тип("Число") Или Количество <> 3
        Или ТипЗнч(Цена) <> Тип("Число") Или Цена <> 250
        Или ТипЗнч(Сумма) <> Тип("Число") Или Сумма <> 750 Тогда
        ВызватьИсключение "OWN-CARD-DATA";
    КонецЕсли;
    Если Количество * Цена <> Сумма Тогда
        ВызватьИсключение "OWN-CARD-ARITHMETIC";
    КонецЕсли;
КонецПроцедуры

Функция СоздатьПакет(СвойUUID)
    Данные = Новый Структура("UUID,Код,Количество,Цена,Сумма", СвойUUID, "BOOK", 3, 250, 750);
    Возврат Новый ФиксированнаяСтруктура(Данные);
КонецФункции

Процедура ПроверитьПараметрыКартинки(Макет, СвойUUID)
    Если ТипЗнч(Макет) <> Тип("ТабличныйДокумент") Тогда
        ВызватьИсключение "OWN-CARD-LAYOUT-TYPE";
    КонецЕсли;
    Если Не Макет.Макет Или Макет.Параметры.Количество() <> 3 Тогда
        ВызватьИсключение "OWN-CARD-LAYOUT-PARAMETERS";
    КонецЕсли;
    Если ТипЗнч(Макет.Параметры.НазваниеКарточки) <> Тип("Строка")
        Или Макет.Параметры.НазваниеКарточки <> "Карточка BOOK: Книга" Тогда
        ВызватьИсключение "OWN-CARD-TITLE";
    КонецЕсли;
    Если ТипЗнч(Макет.Параметры.ЛоготипКарточки) <> Тип("Картинка") Тогда
        ВызватьИсключение "OWN-CARD-PICTURE-MISSING";
    КонецЕсли;
    ПроверитьПакет(Макет.Параметры.ДанныеКарточки, СвойUUID);
КонецПроцедуры

Функция СобратьКарточку(СвойUUID) Экспорт
    ПроверитьСвоюСхему();
    Пакет = СоздатьПакет(СвойUUID);
    ПроверитьПакет(Пакет, СвойUUID);
    Макет = Новый ТабличныйДокумент;
    Макет.Макет = Истина;
    Заголовок = Макет.Область(1, 1);
    Заголовок.Текст = "НазваниеКарточки";
    Заголовок.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
    Заголовок.Параметр = "НазваниеКарточки";
    Если Макет.Параметры.Количество() <> 1 Или Заголовок.Параметр <> "НазваниеКарточки" Тогда
        ВызватьИсключение "Индекс0 допустим только для подтвержденного единственного параметра";
    КонецЕсли;
    Макет.Параметры.Установить(0, "Черновая карточка BOOK");
    Если Макет.Параметры.Получить(0) <> "Черновая карточка BOOK"
        Или Макет.Параметры.НазваниеКарточки <> "Черновая карточка BOOK" Тогда
        ВызватьИсключение "Запись и чтение одного параметра по индексу и имени не совпали";
    КонецЕсли;
    Макет.Параметры.Установить(0, "Карточка BOOK: Книга");
    Если Макет.Параметры.Получить(0) <> "Карточка BOOK: Книга" Тогда
        ВызватьИсключение "Единственный текстовый параметр не обновлен";
    КонецЕсли;
    SVGСтатика = "<svg xmlns=""http://www.w3.org/2000/svg"" width=""32"" height=""32"" viewBox=""0 0 32 32""><rect width=""32"" height=""32"" rx=""4"" fill=""#16a34a""/><path d=""M8 16l5 5 11-12"" fill=""none"" stroke=""#ffffff"" stroke-width=""3""/></svg>";
    SVGПараметр = "<svg xmlns=""http://www.w3.org/2000/svg"" width=""32"" height=""32"" viewBox=""0 0 32 32""><rect width=""32"" height=""32"" rx=""4"" fill=""#2563eb""/><path d=""M8 8h16v16H8zM16 8v16"" fill=""none"" stroke=""#ffffff"" stroke-width=""2""/></svg>";
    СтатическаяКартинка = Новый Картинка(ПолучитьДвоичныеДанныеИзСтроки(SVGСтатика, КодировкаТекста.UTF8, Ложь));
    ПодставляемаяКартинка = Новый Картинка(ПолучитьДвоичныеДанныеИзСтроки(SVGПараметр, КодировкаТекста.UTF8, Ложь));
    Если СтатическаяКартинка.Формат() <> ФорматКартинки.SVG
        Или ПодставляемаяКартинка.Формат() <> ФорматКартинки.SVG Тогда
        ВызватьИсключение "Обе собственные картинки должны иметь native форматSVG";
    КонецЕсли;
    ЯчейкаЛоготипа = Макет.Область(2, 1);
    ЯчейкаЛоготипа.Текст = "BOOK: Книга";
    ЯчейкаЛоготипа.Картинка = СтатическаяКартинка;
    ЯчейкаЛоготипа.ПараметрКартинки = "ЛоготипКарточки";
    ЯчейкаЛоготипа.ПараметрРасшифровки = "ДанныеКарточки";
    ЯчейкаЛоготипа.ВертикальноеПоложениеКартинки = ВертикальноеПоложение.Центр;
    ЯчейкаЛоготипа.ГоризонтальноеПоложениеКартинки = ГоризонтальноеПоложение.Лево;
    ЯчейкаЛоготипа.РазмерКартинки = РазмерКартинки.Пропорционально;
    ЯчейкаЛоготипа.ПоложениеТекстаОтносительноКартинки = ПоложениеТекстаОтносительноКартинки.Справа;
    ЯчейкаЛоготипа.ВысотаСтроки = 64;
    Макет.Область(1, 1, 5, 1).ШиринаКолонки = 45;
    Макет.Область(1, 2, 5, 3).ШиринаКолонки = 18;
    Макет.Область(3, 1).Текст = "Количество, шт.";
    Макет.Область(3, 2).Текст = "Цена";
    Макет.Область(3, 3).Текст = "Сумма";
    ЯчейкаКоличество = Макет.Область(4, 1);
    ЯчейкаКоличество.СодержитЗначение = Истина;
    ЯчейкаКоличество.Значение = Пакет.Количество;
    ЯчейкаЦена = Макет.Область(4, 2);
    ЯчейкаЦена.СодержитЗначение = Истина;
    ЯчейкаЦена.Значение = Пакет.Цена;
    ЯчейкаСумма = Макет.Область(4, 3);
    ЯчейкаСумма.СодержитЗначение = Истина;
    ЯчейкаСумма.Значение = Пакет.Сумма;
    Макет.Область(5, 1).Текст = "UUID: " + Строка(Пакет.UUID);
    ЗначенияПараметров = Новый Структура("НазваниеКарточки,ЛоготипКарточки,ДанныеКарточки",
        "Карточка BOOK: Книга", ПодставляемаяКартинка, Пакет);
    Макет.Параметры.Заполнить(ЗначенияПараметров);
    ПроверитьПараметрыКартинки(Макет, СвойUUID);
    Если ЯчейкаЛоготипа.ПараметрКартинки <> "ЛоготипКарточки"
        Или ЯчейкаЛоготипа.ПараметрРасшифровки <> "ДанныеКарточки"
        Или ЯчейкаЛоготипа.ВертикальноеПоложениеКартинки <> ВертикальноеПоложение.Центр
        Или ЯчейкаЛоготипа.ГоризонтальноеПоложениеКартинки <> ГоризонтальноеПоложение.Лево
        Или ЯчейкаЛоготипа.РазмерКартинки <> РазмерКартинки.Пропорционально
        Или ЯчейкаЛоготипа.ПоложениеТекстаОтносительноКартинки <> ПоложениеТекстаОтносительноКартинки.Справа Тогда
        ВызватьИсключение "Собственные имена параметров и оформление ячейки не совпали";
    КонецЕсли;
    ФактическийПараметрКартинки = Макет.Параметры.ЛоготипКарточки;
    БайтыПараметра = ФактическийПараметрКартинки.ПолучитьДвоичныеДанные();
    БайтыСтатики = ЯчейкаЛоготипа.Картинка.ПолучитьДвоичныеДанные();
    Если ТипЗнч(БайтыПараметра) <> Тип("ДвоичныеДанные")
        Или ТипЗнч(БайтыСтатики) <> Тип("ДвоичныеДанные") Тогда
        ВызватьИсключение "Native метод может вернутьНеопределено: для своих одиночныхSVG нужны данные";
    КонецЕсли;
    Base64Параметра = Base64Строка(БайтыПараметра);
    Base64Статики = Base64Строка(БайтыСтатики);
    Если Base64Параметра = "" Или Base64Статики = "" Или Base64Параметра = Base64Статики Тогда
        ВызватьИсключение "Две фактически созданные картинки должны различаться";
    КонецЕсли;
    ОбластьМакета = Макет.ПолучитьОбласть(1, 1, 5, 3);
    Если ТипЗнч(ОбластьМакета) <> Тип("ТабличныйДокумент") Тогда
        ВызватьИсключение "ПолучитьОбласть должен вернуть отдельный табличный документ";
    КонецЕсли;
    ОбластьМакета.Параметры.Заполнить(ЗначенияПараметров);
    ПроверитьПараметрыКартинки(ОбластьМакета, СвойUUID);
    Результат = Новый ТабличныйДокумент;
    ВыведеннаяОбласть = Результат.Вывести(ОбластьМакета);
    Если ТипЗнч(ВыведеннаяОбласть) <> Тип("ОбластьЯчеекТабличногоДокумента") Или Результат.Макет Тогда
        ВызватьИсключение "Вывести возвращает диапазон результата, а не макет или документ";
    КонецЕсли;
    Если Результат.Область(1, 1).Текст <> "Карточка BOOK: Книга"
        Или Результат.Область(2, 1).Текст <> "BOOK: Книга"
        Или Результат.Область(5, 1).Текст <> "UUID: " + Строка(СвойUUID) Тогда
        ВызватьИсключение "Выведенный текст не соответствует своему пакету";
    КонецЕсли;
    ИтогКоличество = Результат.Область(4, 1);
    ИтогЦена = Результат.Область(4, 2);
    ИтогСумма = Результат.Область(4, 3);
    Если Не ИтогКоличество.СодержитЗначение Или Не ИтогЦена.СодержитЗначение Или Не ИтогСумма.СодержитЗначение Тогда
        ВызватьИсключение "Числовые ячейки результата должны содержать значения до обращения кЗначение";
    КонецЕсли;
    Если ТипЗнч(ИтогКоличество.Значение) <> Тип("Число") Или ИтогКоличество.Значение <> 3
        Или ТипЗнч(ИтогЦена.Значение) <> Тип("Число") Или ИтогЦена.Значение <> 250
        Или ТипЗнч(ИтогСумма.Значение) <> Тип("Число") Или ИтогСумма.Значение <> 750
        Или ИтогКоличество.Значение * ИтогЦена.Значение <> ИтогСумма.Значение Тогда
        ВызватьИсключение "Native числовой результат не равен3×250=750";
    КонецЕсли;
    ИтогЛоготип = Результат.Область(2, 1);
    Если ТипЗнч(ИтогЛоготип.Картинка) <> Тип("Картинка") Тогда
        ВызватьИсключение "В выведенной ячейке нет настоящей картинки";
    КонецЕсли;
    БайтыРезультата = ИтогЛоготип.Картинка.ПолучитьДвоичныеДанные();
    Если ТипЗнч(БайтыРезультата) <> Тип("ДвоичныеДанные") Тогда
        ВызватьИсключение "В выведенной картинке нет доступных двоичных данных";
    КонецЕсли;
    Если ИтогЛоготип.Картинка.Формат() <> ФактическийПараметрКартинки.Формат()
        Или Base64Строка(БайтыРезультата) <> Base64Параметра
        Или Base64Строка(БайтыРезультата) = Base64Статики Тогда
        ВызватьИсключение "Вывести не подтвердил подмену статики фактической картинкой параметра";
    КонецЕсли;
    ПроверитьПакет(ИтогЛоготип.Расшифровка, СвойUUID);
    Если ИтогЛоготип.ВертикальноеПоложениеКартинки <> ВертикальноеПоложение.Центр
        Или ИтогЛоготип.ГоризонтальноеПоложениеКартинки <> ГоризонтальноеПоложение.Лево
        Или ИтогЛоготип.РазмерКартинки <> РазмерКартинки.Пропорционально
        Или ИтогЛоготип.ПоложениеТекстаОтносительноКартинки <> ПоложениеТекстаОтносительноКартинки.Справа Тогда
        ВызватьИсключение "Оформление картинки не перенесено в результат";
    КонецЕсли;
    Если Не Макет.Макет Или Заголовок.Текст <> "НазваниеКарточки"
        Или Заголовок.Параметр <> "НазваниеКарточки"
        Или Макет.Параметры.НазваниеКарточки <> "Карточка BOOK: Книга"
        Или Base64Строка(ЯчейкаЛоготипа.Картинка.ПолучитьДвоичныеДанные()) <> Base64Статики Тогда
        ВызватьИсключение "Исходный макет или его статическая картинка изменились при выводе";
    КонецЕсли;
    Результат.Область(1, 1, 5, 3).Защита = Истина;
    Результат.ТолькоПросмотр = Истина;
    Возврат Результат;
КонецФункции

Процедура ПроверитьОжидаемыйОтказ(Пакет, СвойUUID, Маркер)
    ОтказПолучен = Ложь;
    Попытка
        ПроверитьПакет(Пакет, СвойUUID);
    Исключение
        Если СтрНайти(ОписаниеОшибки(), Маркер) = 0 Тогда
            ВызватьИсключение;
        КонецЕсли;
        ОтказПолучен = Истина;
    КонецПопытки;
    Если Не ОтказПолучен Тогда
        ВызватьИсключение "Не получен ожидаемый отказ " + Маркер;
    КонецЕсли;
КонецПроцедуры

Функция ПроверитьОтказы(СвойUUID) Экспорт
    ПроверитьСвоюСхему();
    Пакет = СоздатьПакет(СвойUUID);
    ПроверитьПакет(Пакет, СвойUUID);
    ПроверитьОжидаемыйОтказ(Новый Структура, СвойUUID, "OWN-CARD-PACKAGE-TYPE");
    ПроверитьОжидаемыйОтказ(Пакет, Строка(СвойUUID), "OWN-CARD-UUID-TYPE");
    ПроверитьОжидаемыйОтказ(Пакет, Новый УникальныйИдентификатор, "OWN-CARD-OWNER");
    НеполныеДанные = Новый Структура("UUID,Код,Количество,Цена", СвойUUID, "BOOK", 3, 250);
    ПроверитьОжидаемыйОтказ(Новый ФиксированнаяСтруктура(НеполныеДанные), СвойUUID, "OWN-CARD-FIELDS");
    НевернаяСумма = Новый Структура("UUID,Код,Количество,Цена,Сумма", СвойUUID, "BOOK", 3, 250, 749);
    ПроверитьОжидаемыйОтказ(Новый ФиксированнаяСтруктура(НевернаяСумма), СвойUUID, "OWN-CARD-DATA");
    Макет = Новый ТабличныйДокумент;
    Макет.Макет = Истина;
    Макет.Область(1, 1).Текст = "НазваниеКарточки";
    Макет.Область(1, 1).Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
    Макет.Область(1, 1).Параметр = "НазваниеКарточки";
    Макет.Область(2, 1).ПараметрКартинки = "ЛоготипКарточки";
    Макет.Область(2, 1).ПараметрРасшифровки = "ДанныеКарточки";
    НеполныеПараметры = Новый Структура("НазваниеКарточки,ДанныеКарточки,ОпечаткаЛоготипа", "Карточка BOOK: Книга", Пакет, "не картинка");
    Макет.Параметры.Заполнить(НеполныеПараметры);
    ОтказПолучен = Ложь;
    Попытка
        ПроверитьПараметрыКартинки(Макет, СвойUUID);
    Исключение
        Если СтрНайти(ОписаниеОшибки(), "OWN-CARD-PICTURE-MISSING") = 0 Тогда
            ВызватьИсключение;
        КонецЕсли;
        ОтказПолучен = Истина;
    КонецПопытки;
    Если Не ОтказПолучен Тогда
        ВызватьИсключение "Опечатка имени не должна считаться заполненным параметром картинки";
    КонецЕсли;
    Возврат "Проверены6 отказов: тип пакета, типUUID, чужойUUID, неполные поля, сумма749, опечатка картинки";
КонецФункции
Полный модуль общей управляемой формы УчебнаяКарточка85

Общие → Общие формы → УчебнаяКарточка85 → Модуль

Managed thin client; две &НаСервереБезКонтекста функции вызывают собственный server common module.

&НаКлиенте
Процедура Собрать85(Команда)
    Если Команда.Имя <> "Собрать85" Тогда
        ВызватьИсключение "Нужна собственная командаСобрать85";
    КонецЕсли;
    СвойUUID = Новый УникальныйИдентификатор;
    НовыйРезультат = СобратьНаСервере(СвойUUID);
    Если ТипЗнч(НовыйРезультат) <> Тип("ТабличныйДокумент") Тогда
        ВызватьИсключение "Сервер не вернул проверенную карточку";
    КонецЕсли;
    Карточка85 = НовыйРезультат;
    УчебныйUUID85 = Строка(СвойUUID);
    Статус85 = "Проверены3×250=750, картинка параметра, расшифровка и неизменность макета";
КонецПроцедуры

&НаСервереБезКонтекста
Функция СобратьНаСервере(СвойUUID)
    Возврат УчебнаяПечать85.СобратьКарточку(СвойUUID);
КонецФункции

&НаКлиенте
Процедура ПроверитьОтказы85(Команда)
    Если Команда.Имя <> "ПроверитьОтказы85" Тогда
        ВызватьИсключение "Нужна собственная командаПроверитьОтказы85";
    КонецЕсли;
    Проверка = ПроверитьОтказыНаСервере(Новый УникальныйИдентификатор);
    Если ТипЗнч(Проверка) <> Тип("Строка") Тогда
        ВызватьИсключение "Сервер не подтвердил проверки отказов";
    КонецЕсли;
    Статус85 = Проверка;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПроверитьОтказыНаСервере(СвойUUID)
    Возврат УчебнаяПечать85.ПроверитьОтказы(СвойUUID);
КонецФункции

&НаКлиенте
Процедура ПолеКарточки85ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
    СтандартнаяОбработка = Ложь;
    Если Элемент.Имя <> "ПолеКарточки85" Тогда
        ВызватьИсключение "Обрабатывается только собственное поле карточки";
    КонецЕсли;
    Если ТипЗнч(ДополнительныеПараметры) <> Тип("Структура") Тогда
        ВызватьИсключение "Ожидается native структура дополнительных параметров";
    КонецЕсли;
    Если ДополнительныеПараметры.Количество() <> 0 Тогда
        ВызватьИсключение "В этом примере нет встроенной диаграммыГанта и даты ее выбора";
    КонецЕсли;
    Если ТипЗнч(Расшифровка) <> Тип("ФиксированнаяСтруктура") Тогда
        ВызватьИсключение "Нужен собственный пакет расшифровки";
    КонецЕсли;
    Если Расшифровка.Количество() <> 5 Или Не Расшифровка.Свойство("UUID", UUID)
        Или Не Расшифровка.Свойство("Код", Код) Или Не Расшифровка.Свойство("Количество", Количество)
        Или Не Расшифровка.Свойство("Цена", Цена) Или Не Расшифровка.Свойство("Сумма", Сумма) Тогда
        ВызватьИсключение "Расшифровка не соответствует собственным пяти полям";
    КонецЕсли;
    Если ТипЗнч(UUID) <> Тип("УникальныйИдентификатор") Или Строка(UUID) <> УчебныйUUID85
        Или ТипЗнч(Код) <> Тип("Строка") Или Код <> "BOOK"
        Или ТипЗнч(Количество) <> Тип("Число") Или Количество <> 3
        Или ТипЗнч(Цена) <> Тип("Число") Или Цена <> 250
        Или ТипЗнч(Сумма) <> Тип("Число") Или Сумма <> 750 Тогда
        ВызватьИсключение "Расшифровка не принадлежит показанной собственной карточке";
    КонецЕсли;
    Статус85 = "BOOK: " + Строка(Количество) + " × " + Строка(Цена) + " = " + Строка(Сумма);
КонецПроцедуры
Полный модуль управляемого приложения: открыть только свою форму

Корень конфигурации → Модуль управляемого приложения

Client application startup event, managed thin client; не модуль формы и не серверный общий модуль.

Процедура ПриНачалеРаботыСистемы()
    ОткрытьФорму("ОбщаяФорма.УчебнаяКарточка85");
КонецПроцедуры

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

  1. Проверка версии/пустой схемы и пяти полей своегоUUID-пакета выполняется до построения макета. Никаких неизвестных объектов или ссылок из рабочейИБ нет.

  2. В первом макете толькоНазваниеКарточки. ПроверяемКоличество()=1, записываем и читаемУстановить(0)/Получить(0), сверяем доступ по имени. После появления трех параметров порядок индексов не используется.

  3. Две различимыеSVG создаются изUTF8-строк безBOM настоящим конструкторомКартинка на сервере. Картинка задает статический зеленый образец, ПараметрКартинки выбирает синюю картинку из собственной коллекции параметров.

  4. Вертикальный центр/горизонтальное лево, пропорциональный размер и текст справа задают осмысленную компоновку ячейки высотой64пункта; ширина колонок задается в средних символах, не пикселях.

  5. ПараметрРасшифровки переносит реальный неизменяемый пакет из памяти вРасшифровка. Числа записываются как значения ячеек; результат проверяется как числа3/250/750, не по форматированному тексту.

  6. ПолучитьОбласть возвращает новыйТабличныйДокумент, Вывести возвращает область ячеек итогового документа. Полный путь от собственного макета до результата остается на сервере.

  7. Сравниваем формат и двоичные данные фактической картинки параметра с картинкой результата. Исходные байтыSVG не используются как эталон преобразованнойКартинка; отдельно доказываем отличие от статики и неизменность макета.

  8. Вспомогательные модули открывают форму и показывают результат после серверных проверок. Настоящий обработчик поля отменяет стандартную расшифровку и проверяетUUID именно показанной карточки. Отдельная команда проверяет6 отказов без замены карточки.

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

  1. Ожидаемый ручной результат: заголовокКарточкаBOOK:Книга, синяя книжка и текст справа, native числовые значения3/250/750, собственныйUUID. Все readback-проверки должны пройти до присваивания форме.

  2. В отладчике после первой проверкиКоличество()=1 просмотритеПолучить(0) иНазваниеКарточки: обе проверки должны пройти. При трех параметрах код больше не использует индексы.

  3. Двойной щелчок/Enter на синей ячейке должен показатьBOOK:3×250=750. ДополнительныеПараметры пусты для данного поля без встроенной диаграммыГанта; стандартная обработка отключена.

  4. ПроверитьОтказы85 должна подтвердить6 отказов и оставить прежнюю показанную карточку/UUID. Неожиданная ошибка не принимается как ожидаемый отказ; это не runtime-проверено здесь.

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

Ожидаемый при ручном запуске результат: читаемая собственная карточка750 с синей параметризованной картинкой, данными расшифровки и проверенным неизменным макетом; запуск и отрисовка в1С не проверялись.

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

  1. Получить/Установить принимают числовой индекс, не имя. Индекс0 здесь безопасен только после доказательства одного параметра; имена трех параметров затем используются напрямую и черезЗаполнить.

  2. Заполнить заполняет лишь совпадающие имена и не сообщает об опечатке. Поэтому передВывести проверяются фактические значения всех трех параметров; ошибкаОпечаткаЛоготипа разобрана отдельной отрицательной проверкой.

  3. ТабличныйДокумент.Параметры только для чтения как свойство, но его собственная коллекция изменяется. СодержитЗначение проверяется до чтенияЗначение; текст записывается только в обычные текстовые ячейки.

  4. ДляРастянуть иЧерепица native игнорируетПоложениеТекстаОтносительноКартинки и считает егоПоверх. Этот урок сознательно используетПропорционально/Справа; пиксельная/печатная геометрия не доказывается readback свойств.

  5. ПолучитьДвоичныеДанные может вернутьНеопределено для отсутствующего варианта картинки. Собственные одиночныеSVG проверяются на типДвоичныеДанные; Base64 сравнивает фактические native представления, не исходный XML.

  6. Неизменность исходного макета проверяется по его контрольным полям: признак Макет, текст/имя заголовка, значение текстового параметра и native байты статической картинки. Это не побайтовый снимок всего табличного документа и не обещание восстановления после вмешательства.

  7. Все операции макета/параметров/Вывести серверные: коллекция параметров иВывести недоступны тонкому клиенту. РезультатТабличныйДокумент сериализуется в реквизит управляемой формы; макет туда-сюда не передается.

  8. Расшифровка здесь неизменяемая структура данных, а не ссылка наКнигу в конфигурации. Обработчик поля имеетЭлемент+3native аргумента в режиме без совместимости. Его не вызывают как обычную процедуру.

  9. ТолькоПросмотр работает совместно сЗащита ячеек и позволяет события расшифровки. Это не защита данныхИБ, не абсолютная безопасность интерфейса и не обещание отсутствия стандартных действий платформы.

  10. Печатная карточка означает подготовку документа для просмотра; реальная печать, экспорт, файлы, настройки принтера, хранилища, сеть и любые записи вИБ не используются. Статические тесты не заменяют ручной запуск1С.

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

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

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

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

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