Тип: Строка. Имя параметра, используемого при выводе области.
Полное описание, параметры и ограничения
ОбластьЯчеекТабличногоДокумента.Параметр (SpreadsheetDocumentRange.Parameter)
ОбластьЯчеекТабличногоДокумента (SpreadsheetDocumentRange)
Параметр (Parameter)
Доступен, начиная с версии 8.2.
Использование:
Чтение и запись.
Описание:
Тип: Строка.
Имя параметра, используемого при выводе области.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Печатная карточка Книги: параметры, картинка и проверенная расшифровка
Самостоятельная карточкаBOOK:3×250=750 из своего макета в памяти. Сначала подтверждаем единственный текстовый параметр и используем индекс0; затем добавляем параметры картинки и расшифровки по известным именам. Вывести должен подставить синюю картинку вместо зеленой, сохранив исходный макет.
Где и как запускать
Полный серверный общий модульУчебнаяПечать85. Отдельная собственная пустаяCF, managed thin client8.5.1.1343; ниже полный модуль общей формы и полный модуль управляемого приложения.
Подготовка
Вручную создайте отдельную новую пустую файловую информационную базу на платформе8.5.1.1343, не из копии УНФ/КА/УТ/БП и не на рабочем сервере. Все операции ниже предназначены исключительно для нее. Здесь выполнено только авторство и статические проверки; созданиеИБ, запуск, запись конфигурации и печать нами не выполнялись.
В Конфигураторе: Конфигурация → Открыть конфигурацию. Корень → Имя=УчебнаяПечатнаяКарточка85, Основной режим запуска=Управляемое приложение, Режим совместимости=Не использовать. Учебный запуск именно тонким клиентом; не обычные формы, не внешнее соединение.
Оставьте пустыми все справочники, документы, перечисления, планы, регистры, отчеты, обработки, константы, параметры сеанса, хранилища настроек, общие реквизиты, подписки и регламентные задания. Никаких расширений, BSP, рабочих макетов и чужих модулей. Имя конфигурации само по себе не доказывает изоляцию; новаяИБ и отсутствие чужого кода обеспечиваются ручной подготовкой.
Общие → Общие модули → Добавить → УчебнаяПечать85. Сервер=Да, Клиент(управляемое приложение)=Нет, Клиент(обычное приложение)=Нет, Внешнее соединение=Нет, Глобальный=Нет, Привилегированный=Нет, Вызов сервера=Нет, Повторное использование возвращаемых значений=Не использовать. Основной блок кода вставьте целиком в модуль, не внутрь существующей процедуры.
Общие → Общие формы → Добавить → УчебнаяКарточка85, Тип формы=Управляемая. Это единственная общая форма. В ее модуль вставьте целиком вспомогательный блок «Полный модуль общей управляемой формы УчебнаяКарточка85». Никакого обработчика объекта/документа в этом примере нет.
На вкладке Реквизиты формы добавьте Карточка85 типаТабличныйДокумент, УчебныйUUID85 типаСтрока длиной36, Статус85 типаСтрока неограниченной длины. UUID хранится только в памяти формы и не является ссылкой на объектИБ.
Перенесите Карточка85 в элементы формы: тип=Поле табличного документа, имя=ПолеКарточки85, ПутьКДанным=Карточка85. Дайте полю основную площадь формы. УчебныйUUID85 и Статус85 выведите отдельными полями только для просмотра. Не включайте команды печати или сохранения файла и не назначайте чужой макет.
У элементаПолеКарточки85 в свойствах событияОбработкаРасшифровки выберите ПолеКарточки85ОбработкаРасшифровки. В режиме без совместимости платформа передает Элемент и три native параметра: Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры. Не вызывайте этот обработчик вручную.
На вкладке Команды создайте Собрать85 и ПроверитьОтказы85. Для каждой задайте Действие одноименной процедуры модуля формы и перенесите команды в кнопки формы. Аргумент Команда предоставляет платформа; имена команд проверяются кодом.
Корень конфигурации → Открыть модуль управляемого приложения. Он должен быть пустым. Вставьте целиком вспомогательный блок «Полный модуль управляемого приложения: открыть только свою форму»; ПриНачалеРаботыСистемы является событием приложения, а не процедурой формы. Он открывает только собственную общую форму и не собирает карточку автоматически.
Для своей новойИБ создайте только собственного учебного пользователя с доступом к клиентскому запуску и этой общей форме; при необходимости собственную учебную роль. Никаких обработчиков авторизации/фоновых процессов. Это не образец разграничения прав для production.
Проверьте все три модуля синтаксически и вручную обновите конфигурацию своейИБ. После этого запустите собственнуюИБ тонким клиентом8.5.1.1343. Сначала ничего не печатайте и не сохраняйте на диск.
Нажмите Собрать85. Команда создает реальный новыйUUID, сервер собирает свой пакетBOOK/3/250/750, полный макет и результат в памяти. На клиент возвращается только проверенный итоговыйТабличныйДокумент, а не макет для повторного вывода.
Проверьте зеленую/синюю разницу: в коде исходная статическаяSVG зеленая, а параметр содержит синюю книжку. В результате должна быть синяя картинка слева от текстаBOOK:Книга. Свойства native readback проверяются автоматически; конкретную отрисовку проверяете глазами, статические тесты пиксели не проверяют.
В строке чисел должны быть3,250,750; внизуUUID собственной карточки. Двойной щелчок/Enter на ячейке с синей картинкой запускает настоящий обработчик расшифровки и показываетBOOK:3×250=750 вСтатус85, не открывает справочник и не вызывает стандартную обработку.
Нажмите ПроверитьОтказы85. Код в памяти проверяет6 конкретных ошибок и принимает только ожидаемые собственные маркеры исключений. Уже показанныеКарточка85 иУчебныйUUID85 не присваиваются этой командой; меняется толькоСтатус85 после полного успешного завершения проверок.
Любое неожиданное исключение прекращает команду. Не повторяйте ее до выяснения причины и не считайте частичный результат успехом. Здесь нет обещания транзакционности/rollback интерфейса; данныеИБ не записываются, а присваивание результата форме происходит после всех серверных проверок.
Для очистки просто закройте свою форму/сеанс: все карточки и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");
КонецПроцедурыРазбор по шагам
Проверка версии/пустой схемы и пяти полей своегоUUID-пакета выполняется до построения макета. Никаких неизвестных объектов или ссылок из рабочейИБ нет.
В первом макете толькоНазваниеКарточки. ПроверяемКоличество()=1, записываем и читаемУстановить(0)/Получить(0), сверяем доступ по имени. После появления трех параметров порядок индексов не используется.
Две различимыеSVG создаются изUTF8-строк безBOM настоящим конструкторомКартинка на сервере. Картинка задает статический зеленый образец, ПараметрКартинки выбирает синюю картинку из собственной коллекции параметров.
Вертикальный центр/горизонтальное лево, пропорциональный размер и текст справа задают осмысленную компоновку ячейки высотой64пункта; ширина колонок задается в средних символах, не пикселях.
ПараметрРасшифровки переносит реальный неизменяемый пакет из памяти вРасшифровка. Числа записываются как значения ячеек; результат проверяется как числа3/250/750, не по форматированному тексту.
ПолучитьОбласть возвращает новыйТабличныйДокумент, Вывести возвращает область ячеек итогового документа. Полный путь от собственного макета до результата остается на сервере.
Сравниваем формат и двоичные данные фактической картинки параметра с картинкой результата. Исходные байтыSVG не используются как эталон преобразованнойКартинка; отдельно доказываем отличие от статики и неизменность макета.
Вспомогательные модули открывают форму и показывают результат после серверных проверок. Настоящий обработчик поля отменяет стандартную расшифровку и проверяетUUID именно показанной карточки. Отдельная команда проверяет6 отказов без замены карточки.
Как проверить результат
Ожидаемый ручной результат: заголовокКарточкаBOOK:Книга, синяя книжка и текст справа, native числовые значения3/250/750, собственныйUUID. Все readback-проверки должны пройти до присваивания форме.
В отладчике после первой проверкиКоличество()=1 просмотритеПолучить(0) иНазваниеКарточки: обе проверки должны пройти. При трех параметрах код больше не использует индексы.
Двойной щелчок/Enter на синей ячейке должен показатьBOOK:3×250=750. ДополнительныеПараметры пусты для данного поля без встроенной диаграммыГанта; стандартная обработка отключена.
ПроверитьОтказы85 должна подтвердить6 отказов и оставить прежнюю показанную карточку/UUID. Неожиданная ошибка не принимается как ожидаемый отказ; это не runtime-проверено здесь.
Ожидаемый результат
Ожидаемый при ручном запуске результат: читаемая собственная карточка750 с синей параметризованной картинкой, данными расшифровки и проверенным неизменным макетом; запуск и отрисовка в1С не проверялись.
На что обратить внимание
Получить/Установить принимают числовой индекс, не имя. Индекс0 здесь безопасен только после доказательства одного параметра; имена трех параметров затем используются напрямую и черезЗаполнить.
Заполнить заполняет лишь совпадающие имена и не сообщает об опечатке. Поэтому передВывести проверяются фактические значения всех трех параметров; ошибкаОпечаткаЛоготипа разобрана отдельной отрицательной проверкой.
ТабличныйДокумент.Параметры только для чтения как свойство, но его собственная коллекция изменяется. СодержитЗначение проверяется до чтенияЗначение; текст записывается только в обычные текстовые ячейки.
ДляРастянуть иЧерепица native игнорируетПоложениеТекстаОтносительноКартинки и считает егоПоверх. Этот урок сознательно используетПропорционально/Справа; пиксельная/печатная геометрия не доказывается readback свойств.
ПолучитьДвоичныеДанные может вернутьНеопределено для отсутствующего варианта картинки. Собственные одиночныеSVG проверяются на типДвоичныеДанные; Base64 сравнивает фактические native представления, не исходный XML.
Неизменность исходного макета проверяется по его контрольным полям: признак Макет, текст/имя заголовка, значение текстового параметра и native байты статической картинки. Это не побайтовый снимок всего табличного документа и не обещание восстановления после вмешательства.
Все операции макета/параметров/Вывести серверные: коллекция параметров иВывести недоступны тонкому клиенту. РезультатТабличныйДокумент сериализуется в реквизит управляемой формы; макет туда-сюда не передается.
Расшифровка здесь неизменяемая структура данных, а не ссылка наКнигу в конфигурации. Обработчик поля имеетЭлемент+3native аргумента в режиме без совместимости. Его не вызывают как обычную процедуру.
ТолькоПросмотр работает совместно сЗащита ячеек и позволяет события расшифровки. Это не защита данныхИБ, не абсолютная безопасность интерфейса и не обещание отсутствия стандартных действий платформы.
Печатная карточка означает подготовку документа для просмотра; реальная печать, экспорт, файлы, настройки принтера, хранилища, сеть и любые записи вИБ не используются. Статические тесты не заменяют ручной запуск1С.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.