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

Свойства · Value

Тип: Произвольный. Содержит значение ячеек области.

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

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

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

Значение (Value)

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

Использование:
Чтение и запись.
Описание:
Тип: Произвольный.
Содержит значение ячеек области.
Доступность:

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

Примечание:
Свойство доступно, только если ячейка содержит значение (свойство СодержитЗначение равно Истина). Свойство применимо только для прямоугольных областей.
Использование в версии:

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

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

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

Свой внешний .erf: две обычные формы, настоящий СКД и проверка трех итоговых строк1150/1035

Полный manually compiled own external-report workflow: actual native factory, объектный модуль, две реальные ordinary формы, СКД query без таблиц базы, скидка0/10 и numeric readback уже сформированного табличного документа. Нет неизвестного исходного объекта или фиктивного GetProperty-wrapper.

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

Основной OBJECT только реальный модуль объекта собственного manually compiled .erf УчебныеПродажиТриСтроки85. Runtime host исключительно собственный Windows thick ОбычноеПриложение/FileIB/actualuser. Две ordinary формы и compiled СКД-макет по точной metadata подготовке; loader/host application отдельно.

Подготовка

  1. Используйте только собственную отдельную Windows VM/платформу8.5.1.1343 и толстый клиент в режиме ОбычноеПриложение. Native ВнешнийОтчет.ПолучитьФорму доступен только толстому клиенту; в обычном режиме используются только обычные формы. Thin/web/managed-forms не подменяются этим примером.

  2. Вручную создайте canonical nonzero UUID-marker, свой каталог C:\1c-labs\Уч85ERF_<UUID>\ и новую пустую FileIB в подпапке ИБ. Конфигурация УчебныйВнешнийОтчет85; connection строго File="C:\1c-labs\Уч85ERF_<UUID>\ИБ\";. Marker пути не UUID базы и не UUID пользователя. Реальный UUID базы не измеряется; guard проверяет UUID настоящего текущего IBUser.

  3. В собственной CF нет справочников/документов/регистров/общих реквизитов/разделителей/ботов/констант/подписок/регламентных заданий/расширений. Создайте только одного actual IBUser Уч85ERF_<UUID> с правами своего учебного сеанса и чтения списка пользователей, без privileged mode. Не подключайте рабочую/типовую базу.

  4. Конфигуратор → Общие → Общие формы → ПускОтчета85: обычная форма. Реквизиты МеткаБазы Строка36 и Подтверждение Строка100; кнопка ЗагрузитьСвойОтчет с одноименным обработчиком. Вставьте LAUNCHER полностью. В обычный модуль приложения этой CF вставьте HOST_APPLICATION целиком: настоящее OnStart0 открывает только launcher, но не загружает внешние файлы.

  5. Отдельно Конфигуратор → Файл → Новый → Внешний отчет, имя УчебныеПродажиТриСтроки85. Создайте два реквизита: МеткаОпыта Строка36, Проверка заполнения=Показывать ошибку; Скидка Число(2,0), неотрицательное, начальное0. Для Скидка не ставьте Показывать ошибку: нулевая скидка допустима и является незаполненным числом для стандартного fillcheck.

  6. Во внешнем отчете создайте ровно один макет СКДТриСтроки типа СхемаКомпоновкиДанных и выберите его Основной схемой компоновки данных. Добавьте источник данных Локальный/набор данных Запрос с именем ТриСтроки. Вставьте QUERY из отдельного supporting блока целиком, без автопереформатирования: runtime сравнивает свой текст, нормализуя только CRLF/LF и внешние пробелы. В нем нет ИЗ/FROM, таблиц базы или произвольного SQL из формы.

  7. В параметрах схемы проверьте Скидка, тип Число(2,0), значение по умолчанию0. Обновите поля набора: Товар Строка, Количество/Цена Число, Сумма Число(15,2). В Настройки → создайте первый/default вариант: одна группировка Детальные записи, выбранные поля строго Товар,Количество,Цена,Сумма в этом порядке; без дополнительных группировок/вложенных таблиц/диаграмм/итоговых товарных строк. В параметрах данных включите Скидка=0. Числовые ячейки должны сохранять actual значения, не только произвольный текст.

  8. Для вывода ограничьте оформление: четыре колонки, не более30строк, без многострочных объединенных боковых подписей. Сумма/Цена выводятся числами, без преобразования к строке. Обычные заголовки допустимы: numeric verifier ищет три точных имени товара в колонке1 и читает числовые колонки2..4. Если СКД вывел только текст, проверка честно откажет вместо восстановления чисел из исходной таблицы.

  9. Откройте Модуль объекта именно своего внешнего отчета и вставьте OBJECT целиком. ЭтотОбъект в нем — фактический native внешний отчет. Схема загружается из его compiled макета, ставится только своему экземпляру и отдельно читается. КомпоновщикНастроек readonly получают как объект и инициализируют из actual схемы/default settings; readonly ссылки не присваиваются.

  10. Во внешнем отчете создайте обычную основную форму ФормаОтчета типа ФормаОтчета. Ее основной реквизит Отчет связан с этим actual экземпляром внешнего отчета; результат Результат имеет тип ТабличныйДокумент. Добавьте поле табличного документа, связанное с Результат, и кнопки Сформировать/Настройки. Вставьте REPORT_FORM целиком; события Нажатие обычных кнопок Сформировать и Настройки назначьте одноимённым процедурам. Единственный аргумент Команда означает native Элемент ordinary form extension, не управляемую команду. Native GetForm из созданного внешнего объекта получает форму для данного экземпляра.

  11. Создайте обычную форму ФормаНастроек для того же внешнего отчета с основным реквизитом Отчет этого же native объекта. Поля формы связаны с Отчет.МеткаОпыта/Отчет.Скидка, кнопки ПроверитьНастройки/ЗакрытьНастройки. Вставьте SETTINGS_FORM полностью; события Нажатие обычных кнопок ПроверитьНастройки и ЗакрытьНастройки назначьте одноимённым процедурам с одним native Элемент (в коде имя Команда). Затем назначьте эту форму основной формой настроек. GetSettingsForm вызывается именно на том же собственном объекте, не на стороннем отчете.

  12. Вручную сохраните/скомпилируйте свой .erf в точный путь C:\1c-labs\Уч85ERF_<UUID>\УчебныеПродажиТриСтроки85.erf и проверьте модули конфигуратором. Это ваш собственный known source, а не скачанный чужой внешний файл. Автор не создавал бинарный .erf/не запускал конфигуратор или этот файл; приведены полный исходный код и ручная metadata подготовка.

  13. Запустите только свою CF/actual пользователя толстым ordinary клиентом. В launcher введите свой marker и МОЙ СКОМПИЛИРОВАННЫЙ ERF85, нажмите загрузку один раз. До nativeCreate guard проверяет host/fileIB/currentuser. Затем ВнешниеОтчеты.Создать(ownPath,Истина) использует безопасный режим и сохраняет defaults защиты опасных действий; код их не отключает и не выбирает unknown security profile.

  14. Важно: код внешнего модуля может исполняться уже при Create, до Metadata/UsedFileName checks. Эти проверки подтверждают ожидаемый own artifact/structure, но НЕ сертификат/хеш доверия или безопасность файла. Поэтому сначала вручную компилируйте именно предоставленные свои модули в отдельной VM; не проверяйте этим способом неизвестный .erf.

  15. Основная форма открывается через native GetForm с реальным своим object и fresh uniqueness key. Первое формирование при скидке0 должно дать Книга750,Чашка300,Карандаш100; numeric readback трех actual generated rows=1150. Результат не считается правильным только по исходному массиву или возвращению ComposeResult.

  16. В Настройки откройте свою вторую форму и временно очистите МеткаОпыта: ПроверитьНастройки должен получить False от nativeCheckFilling и сообщение о своем реальном обязательном реквизите. Верните свой marker. Скидка5 должна отказать до компоновки; введите10, проверьте настройки, закройте только эту свою форму и снова сформируйте. Должны читаться actual output675/270/90 и итог1035.

  17. Скидка переносится в actual Компоновщик.Настройки.ПараметрыДанных через documented ПараметрКомпоновкиДанных("Скидка")/FindParameterValue. Параметр=Неопределено — отказ, а не создаваемый fake fallback. Использование=True и значение проверяются. СкомпоноватьРезультат получает настоящий новый ТабличныйДокумент и работает стандартным СКД путем.

  18. Этот урок использует стандартную компоновку СКД. Примеры обработчиков ПриКомпоновкеРезультата и ОбработкаПроверкиЗаполнения приведены в отдельных учебных задачах на страницах этих событий; вручную вызывать события не нужно.

  19. Ctrl+Break может прервать native компоновку исключением. Ошибки/частичный результат не заменяются1150/1035 из источника, не вызывают автоматического retry/закрытия чужих форм/загрузки другого файла. Все реальные1С/DB/UI/files/network/compiledERF действия выполняет только владелец позже на своем стенде; при авторстве0, backup0.

Функция ОткрытьСвойОтчет85() Экспорт
    ПроверитьСвойВнешнийОтчет85();
    ФормаОтчета = ЭтотОбъект.ПолучитьФорму("ФормаОтчета", , Строка(Новый УникальныйИдентификатор));
    Если ФормаОтчета = Неопределено Тогда
        ВызватьИсключение "Собственная форма отчета не создана: native Undefined не считается открытием";
    КонецЕсли;
    ФормаОтчета.Открыть();
    Возврат ФормаОтчета;
КонецФункции

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

Функция СформироватьСвоиТриСтроки85() Экспорт
    ПроверитьСвойВнешнийОтчет85();
    Если Не ЭтотОбъект.ПроверитьЗаполнение() Тогда
        ВызватьИсключение "Native проверка собственных реквизитов отказала; результат не компонуется";
    КонецЕсли;
    Если ЭтотОбъект.Скидка <> 0 И ЭтотОбъект.Скидка <> 10 Тогда
        ВызватьИсключение "Допускаются только собственные учебные скидки0/10";
    КонецЕсли;
    ИзМакета = ЭтотОбъект.ПолучитьМакет("СКДТриСтроки");
    Если ТипЗнч(ИзМакета) <> Тип("СхемаКомпоновкиДанных") Или ИзМакета.НаборыДанных.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен настоящий собственный compiled СКД-макет с одним набором";
    КонецЕсли;
    Набор = ИзМакета.НаборыДанных[0];
    Если Набор.Имя <> "ТриСтроки" Или ТипЗнч(Набор) <> Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")
        Или СокрЛП(СтрЗаменить(Набор.Запрос, Символы.ВК, "")) <> ПолучитьСвойLiteralЗапрос85() Тогда
        ВызватьИсключение "Own СКД-макет не содержит точный подготовленный literal-query. Это проверка структуры, не proof доверия внешнему модулю";
    КонецЕсли;
    ЭтотОбъект.СхемаКомпоновкиДанных = ИзМакета;
    Схема = ЭтотОбъект.СхемаКомпоновкиДанных;
    Если ТипЗнч(Схема) <> Тип("СхемаКомпоновкиДанных") Или Схема.НаборыДанных.Количество() <> 1
        Или СокрЛП(СтрЗаменить(Схема.НаборыДанных[0].Запрос, Символы.ВК, "")) <> ПолучитьСвойLiteralЗапрос85() Тогда
        ВызватьИсключение "Загруженная собственная схема не подтверждена отдельным readback";
    КонецЕсли;
    Компоновщик = ЭтотОбъект.КомпоновщикНастроек;
    Если ТипЗнч(Компоновщик) <> Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен реальный readonly report composer, не новый неизвестный wrapper";
    КонецЕсли;
    Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
    Компоновщик.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
    ПараметрСкидки = Компоновщик.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Скидка"));
    Если ПараметрСкидки = Неопределено Тогда
        ВызватьИсключение "В default settings собственного СКД-макета отсутствует параметр Скидка";
    КонецЕсли;
    ПараметрСкидки.Значение = ЭтотОбъект.Скидка;
    ПараметрСкидки.Использование = Истина;
    Если ПараметрСкидки.Значение <> ЭтотОбъект.Скидка Или Не ПараметрСкидки.Использование Тогда
        ВызватьИсключение "Own actual data parameter не задан";
    КонецЕсли;
    Результат = Новый ТабличныйДокумент;
    ЭтотОбъект.СкомпоноватьРезультат(Результат);
    СуммаИзРезультата = ПроверитьЧислаУжеСкомпонованногоОтчета85(Результат);
    Если (ЭтотОбъект.Скидка = 0 И СуммаИзРезультата <> 1150)
        Или (ЭтотОбъект.Скидка = 10 И СуммаИзРезультата <> 1035) Тогда
        ВызватьИсключение "Числовой readback actual generated result не дал1150/1035. Исходные строки вместо результата не суммируются";
    КонецЕсли;
    Сообщить("Три числовые строки actual СКД-результата отдельно проверены. Скидка=" + Строка(ЭтотОбъект.Скидка) + "; сумма=" + Строка(СуммаИзРезультата));
    Возврат Результат;
КонецФункции

Функция ПроверитьЧислаУжеСкомпонованногоОтчета85(Результат)
    Если Результат.ВысотаТаблицы < 3 Или Результат.ВысотаТаблицы > 30 Или Результат.ШиринаТаблицы <> 4 Тогда
        ВызватьИсключение "Own СКД должен выводить только четыре выбранных поля и не больше30строк оформления";
    КонецЕсли;
    Имена = Новый Массив;
    Имена.Добавить("Книга");
    Имена.Добавить("Чашка");
    Имена.Добавить("Карандаш");
    Найденные = Новый Массив;
    Сумма = 0;
    Для Номер = 1 По Результат.ВысотаТаблицы Цикл
        Имя = Результат.Область(Номер, 1).Текст;
        Если Имена.Найти(Имя) = Неопределено Тогда
            Продолжить;
        КонецЕсли;
        Если Найденные.Найти(Имя) <> Неопределено Тогда
            ВызватьИсключение "Actual generated row имени повторена";
        КонецЕсли;
        ЯчейкаКоличества = Результат.Область(Номер, 2);
        ЯчейкаЦены = Результат.Область(Номер, 3);
        ЯчейкаСуммы = Результат.Область(Номер, 4);
        Если Не ЯчейкаКоличества.СодержитЗначение Или Не ЯчейкаЦены.СодержитЗначение Или Не ЯчейкаСуммы.СодержитЗначение Тогда
            ВызватьИсключение "Actual СКД cells не содержат numeric values. Не подменяем их конвертацией текста или исходными данными";
        КонецЕсли;
        Количество = ЯчейкаКоличества.Значение;
        Цена = ЯчейкаЦены.Значение;
        ЗначениеСуммы = ЯчейкаСуммы.Значение;
        Если ТипЗнч(Количество) <> Тип("Число") Или ТипЗнч(Цена) <> Тип("Число") Или ТипЗнч(ЗначениеСуммы) <> Тип("Число") Тогда
            ВызватьИсключение "Из actual output должны читаться три числовые ячейки";
        КонецЕсли;
        Если (Имя = "Книга" И (Количество <> 3 Или Цена <> 250))
            Или (Имя = "Чашка" И (Количество <> 2 Или Цена <> 150))
            Или (Имя = "Карандаш" И (Количество <> 4 Или Цена <> 25))
            Или ЗначениеСуммы <> Количество * Цена * (100 - ЭтотОбъект.Скидка) / 100 Тогда
            ВызватьИсключение "Actual numeric row passport/скидка не совпал";
        КонецЕсли;
        Найденные.Добавить(Имя);
        Сумма = Сумма + ЗначениеСуммы;
    КонецЦикла;
    Если Найденные.Количество() <> 3 Тогда
        ВызватьИсключение "В actual report result нет ровно трех собственных data rows";
    КонецЕсли;
    Возврат Сумма;
КонецФункции

Процедура ПроверитьСвойВнешнийОтчет85()
    ПроверитьСвойOrdinaryСтендОтчета85(ЭтотОбъект.МеткаОпыта);
    МетаОтчета = ЭтотОбъект.Метаданные();
    Если МетаОтчета.Имя <> "УчебныеПродажиТриСтроки85" Или МетаОтчета.Реквизиты.Количество() <> 2
        Или МетаОтчета.Формы.Количество() <> 2 Или МетаОтчета.Макеты.Количество() <> 1
        Или Не МетаОтчета.Реквизиты.МеткаОпыта.Тип.СодержитТип(Тип("Строка"))
        Или Не МетаОтчета.Реквизиты.Скидка.Тип.СодержитТип(Тип("Число")) Тогда
        ВызватьИсключение "Own manually compiled report metadata/schema не совпал. Это не сертификат/доверие к файлу";
    КонецЕсли;
    ОжидаемыйФайл = "C:\1c-labs\Уч85ERF_" + ЭтотОбъект.МеткаОпыта + "\УчебныеПродажиТриСтроки85.erf";
    Если ЭтотОбъект.ИспользуемоеИмяФайла <> ОжидаемыйФайл Тогда
        ВызватьИсключение "ИспользуемоеИмяФайла не соответствует точному своему compiled-path. Не логируем чужие пути";
    КонецЕсли;
КонецПроцедуры

Функция ПолучитьСвойLiteralЗапрос85()
    Возврат "ВЫБРАТЬ
    |    ""Книга"" КАК Товар,
    |    3 КАК Количество,
    |    250 КАК Цена,
    |    ВЫРАЗИТЬ(750 * (100 - &Скидка) / 100 КАК ЧИСЛО(15, 2)) КАК Сумма
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ
    |    ""Чашка"",
    |    2,
    |    150,
    |    ВЫРАЗИТЬ(300 * (100 - &Скидка) / 100 КАК ЧИСЛО(15, 2))
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ
    |    ""Карандаш"",
    |    4,
    |    25,
    |    ВЫРАЗИТЬ(100 * (100 - &Скидка) / 100 КАК ЧИСЛО(15, 2))";
КонецФункции

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

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

Свой внешний отчет → Формы → ФормаОтчета → Модуль.

Обычная форма thick ordinary: основной реквизит Отчет связан native GetForm с own external instance, Результат=ТабличныйДокумент.

Процедура Сформировать(Команда)
    Результат = Отчет.СформироватьСвоиТриСтроки85();
КонецПроцедуры

Процедура Настройки(Команда)
    Отчет.ОткрытьСвоиНастройки85();
КонецПроцедуры
Полный модуль ordinary формы настроек собственного external instance

Свой внешний отчет → Формы → ФормаНастроек → Модуль.

Обычная settings форма thick ordinary, собственные typed attributes Отчет.МеткаОпыта/Скидка; без unknown report argument.

Процедура ПроверитьНастройки(Команда)
    Если Не Отчет.ПроверитьЗаполнение() Тогда
        Сообщить("Собственные реквизиты не заполнены. Укажите marker своего compiled-path; отчет не запускается");
        Возврат;
    КонецЕсли;
    Если Отчет.Скидка <> 0 И Отчет.Скидка <> 10 Тогда
        Сообщить("Для учебного отчета допустима только скидка0 либо10");
        Возврат;
    КонецЕсли;
    Сообщить("Own typed attributes заполнены. После закрытия этой формы сформируйте отчет: actual СКД parameter применится к этому же экземпляру");
КонецПроцедуры

Процедура ЗакрытьНастройки(Команда)
    Закрыть();
КонецПроцедуры
Полный host loader ordinary общей формы ПускОтчета85

Собственная CF → Общие → Общие формы → ПускОтчета85 → Модуль.

Обычная общая форма нового собственного host: guard до native Create, readonly filename/metadata checks после него неtrustproof.

Перем СвойВнешнийОтчет85;
Перем НачатаЗагрузка85;

Процедура ЗагрузитьСвойОтчет(Команда)
    ПроверитьСвойOrdinaryСтендОтчета85(МеткаБазы);
    Если НачатаЗагрузка85 = Истина Или Подтверждение <> "МОЙ СКОМПИЛИРОВАННЫЙ ERF85" Тогда
        ВызватьИсключение "Загрузка своего known-source файла одноразовая и требует подтверждения";
    КонецЕсли;
    Путь = "C:\1c-labs\Уч85ERF_" + МеткаБазы + "\УчебныеПродажиТриСтроки85.erf";
    НачатаЗагрузка85 = Истина;
    СвойВнешнийОтчет85 = ВнешниеОтчеты.Создать(Путь, Истина);
    Если СвойВнешнийОтчет85.ИспользуемоеИмяФайла <> Путь Или СвойВнешнийОтчет85.Метаданные().Имя <> "УчебныеПродажиТриСтроки85" Тогда
        ВызватьИсключение "Actual created own report metadata/filename не совпали. Проверка послеCreate не доказывает безопасность уже загруженного кода";
    КонецЕсли;
    СвойВнешнийОтчет85.МеткаОпыта = МеткаБазы;
    СвойВнешнийОтчет85.Скидка = 0;
    СвойВнешнийОтчет85.ОткрытьСвойОтчет85();
КонецПроцедуры

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

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

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

Обычный application module собственного host, native0arg OnStart; файл не загружается автоматически.

Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентОбычноеПриложение Тогда
    ФормаПуска = ПолучитьОбщуюФорму("ПускОтчета85");
    ФормаПуска.Открыть();
#Иначе
    ВызватьИсключение "Этот ownfixture запускайте только толстым клиентом в обычном приложении";
#КонецЕсли
КонецПроцедуры
QUERY: полный запрос1С для единственного своего СКД dataset ТриСтроки, не модуль BSL

Свой внешний отчет → Макеты → СКДТриСтроки → Набор ТриСтроки → Запрос.

Язык запросов1С, только собственные три literalrows и typed numeric discount0/10; не исполняемый модуль BSL.

ВЫБРАТЬ
    "Книга" КАК Товар,
    3 КАК Количество,
    250 КАК Цена,
    ВЫРАЗИТЬ(750 * (100 - &Скидка) / 100 КАК ЧИСЛО(15, 2)) КАК Сумма
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    "Чашка",
    2,
    150,
    ВЫРАЗИТЬ(300 * (100 - &Скидка) / 100 КАК ЧИСЛО(15, 2))
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    "Карандаш",
    4,
    25,
    ВЫРАЗИТЬ(100 * (100 - &Скидка) / 100 КАК ЧИСЛО(15, 2))

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

  1. Реальная подготовка задает host/oneactualuser/точный UUID-directory и собственный manually compiled .erf. Factory получает только вычисленный ownPath после hostguard, safeMode=True и protection defaults.

  2. Native Метаданные/ИспользуемоеИмяФайла сверяют actual экземпляр/compiled пути. Проверка после загрузки не является trust boundary: известный свой source/VM требуются доCreate.

  3. Основная форма и форма настроек создаются native методами того же external instance и fresh unique keys. Undefined не считается созданной формой; обе ordinary формы реально связывают главный реквизит Отчет с данным экземпляром.

  4. ПроверитьЗаполнение вызывает native проверку реального обязательного string attribute. Скидка0 не объявляется пустым запрещенным числом; бизнесguard отдельно разрешает0/10 и отклоняет5.

  5. ПолучитьМакет дает actual compiled СКД-схему/onequery. Своя RW СхемаКомпоновкиДанных осмысленно перезагружается из нее перед компоновкой, затем читается. Composer/ThisObject/UsedFileName readonly.

  6. Composer initialization/default-settings loading применяются к actual scheme. Найденный native data parameter принимает0/10 иUseTrue; неизвестные параметр/вариант не подменяются.

  7. Standard СкомпоноватьРезультат создает настоящий output document. Независимый numeric verifier читает ContainsValue/Number из его data cells, а не суммирует QUERY или исходные строки.

  8. Результат содержит ровно три recognized product rows и четыре колонки. Qty/price/sums проверены на actual ячейках; суммирование actual generated amounts дает1150 либо1035.

  9. Обычный/управляемый и толстый/тонкий контексты не смешиваются. Нет программного fakecomposition/fillcheck event, DBread таблиц или неизвестного caller-provided report object.

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

  1. Свой real экземпляр получен documented ВнешниеОтчеты.Создать(ownPath,Истина); основной и settings GetForm работают только в подготовленном ordinary thick context.

  2. Пустая МеткаОпыта дает native fillcheck False; неправильная скидка5 отвергается отдельно,0/10 допустимы.

  3. Actual generated numeric rows0%:750,300,100 и сумма1150;10%:675,270,90 и сумма1035. Если numeric values отсутствуют, код не фабрикует результат из query/text.

  4. Readonly report свойства не присваиваются, а actual schema read/assign/readback ограничен своим экземпляром перед его компоновкой.

  5. Foreign/unknown .erf не проверяются загрузкой: filename/metadata не являются trust proof. Default опасных действий/безопасный режим не отключены.

  6. Native/raw static проверки не заменяют ручную компиляцию собственного .erf и запуск/визуальную проверку владельца. Runtime authoring0.

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

При ручном успешном выполнении полной metadata подготовки и компиляции своего отчета на собственном ordinary thick стенде СКД выводит три реальных строки; readback числовых outputcells подтверждает1150/1035 для скидки0/10. Здесь только authored source/static/native verification: бинарный .erf, фактическая1С/формы/DB/файлы/сеть не создавались/не запускались.

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

  1. GetForm external-report native доступен только толстому клиенту. При ordinary запуске только обычные формы, при managed — только управляемые; общий тип отчета server availability не расширяет каждый метод.

  2. Реальный readonly ЭтотОбъект внутри object module не является неизвестным входным параметром. В формах реквизит Отчет привязывается native GetForm к конкретному созданному экземпляру.

  3. Metadata/GetTemplate/UsedFileName не доказывают доверие к коду, который мог исполниться приCreate. Свой manually compiled known source/VM обязателен, чужой файл не загружается для проверки.

  4. SafeMode=True и default dangerous protection не являются абсолютной песочницей или подтвержденным разрешением на unknown-file load. Не отключайте безопасность ради обхода ошибки своей среды.

  5. UsedFileName readonly возвращает полное имя в этом thick fixture. Web возвращает только имя без пути и требует другой route; здесь web context не используется.

  6. КомпоновщикНастроек readonly — ссылка на объект, а не property для присваивания новогоComposer. Schema RW можно перезагрузить только своему actual instance из его known compiled layout.

  7. Проверка заполнения обязательного numeric attribute отвергла бы допустимый0. Поэтому требуемый marker String проверяется native, скидка имеет отдельный тип/бизнесguard0/10.

  8. Schema default settings действительно должны иметь parameter Скидка и четыре поля DetailRecords. FindParameterValueUndefined/неправильное оформление честно отказывает; код не чинит произвольно чужую схему.

  9. ContainsValue обязателен для чтения cell.Value. Если output содержит текст вместо чисел, источник не превращается в fake numeric result; исправляйте только свой prepared СКД-layout по ручному протоколу.

  10. Actual detail rows отличаются от заголовков/оформления/totalfooter. Bounded scan распознает три exactproduct имена и отвергает duplicate output; он не заявляет анализ произвольного чужого отчета.

  11. Обработчик события добавляйте через список событий модуля объекта соответствующего отчёта. Этот урок показывает стандартный путь СКД без собственного обработчика компоновки.

  12. Компоновка может быть отменена Ctrl+Break. Exception/partial document не является готовым отчетом; никакого auto retry/DBwrite/чужих forms closing/backup/загрузки другого файла.

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

ВнешниеОтчеты: загрузить свой .erf и получить настоящий отчёт со скидкой

Практика глобального readonly менеджера: реальная кнопка собственной обычной формы создаёт один собственный заранее проверенный и вручную скомпилированный .erf. Его две формы и СКД действительно используют созданный экземпляр и проверяют числовые итоги1150/1035. Все модули и полная подготовка приведены ниже; запуск в1С здесь не выполнялся.

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

Полный модуль собственной обычной общей формы ПускОтчета85 в новой пустой файловой CF УчебныйВнешнийОтчет85; только толстый клиент обычного приложения8.5.1.1343. Внешний файл заранее вручную создан и проверен владельцем в своей отдельной VM.

Подготовка

  1. В этой карточке ОСНОВНОЙ блок — LAUNCHER формы ПускОтчета85. OBJECT внешнего отчёта дан отдельным полным вспомогательным блоком; остальные REPORT_FORM, SETTINGS_FORM, HOST_APPLICATION и QUERY также приведены целиком. Это один тот же собственный стенд, не неизвестный объект на входе и не выбор случайного скачанного .erf.

  2. Используйте только собственную отдельную Windows VM/платформу8.5.1.1343 и толстый клиент в режиме ОбычноеПриложение. Native ВнешнийОтчет.ПолучитьФорму доступен только толстому клиенту; в обычном режиме используются только обычные формы. Thin/web/managed-forms не подменяются этим примером.

  3. Вручную создайте canonical nonzero UUID-marker, свой каталог C:\1c-labs\Уч85ERF_<UUID>\ и новую пустую FileIB в подпапке ИБ. Конфигурация УчебныйВнешнийОтчет85; connection строго File="C:\1c-labs\Уч85ERF_<UUID>\ИБ\";. Marker пути не UUID базы и не UUID пользователя. Реальный UUID базы не измеряется; guard проверяет UUID настоящего текущего IBUser.

  4. В собственной CF нет справочников/документов/регистров/общих реквизитов/разделителей/ботов/констант/подписок/регламентных заданий/расширений. Создайте только одного actual IBUser Уч85ERF_<UUID> с правами своего учебного сеанса и чтения списка пользователей, без privileged mode. Не подключайте рабочую/типовую базу.

  5. Конфигуратор → Общие → Общие формы → ПускОтчета85: обычная форма. Реквизиты МеткаБазы Строка36 и Подтверждение Строка100; кнопка ЗагрузитьСвойОтчет с одноименным обработчиком. Вставьте LAUNCHER полностью. В обычный модуль приложения этой CF вставьте HOST_APPLICATION целиком: настоящее OnStart0 открывает только launcher, но не загружает внешние файлы.

  6. Отдельно Конфигуратор → Файл → Новый → Внешний отчет, имя УчебныеПродажиТриСтроки85. Создайте два реквизита: МеткаОпыта Строка36, Проверка заполнения=Показывать ошибку; Скидка Число(2,0), неотрицательное, начальное0. Для Скидка не ставьте Показывать ошибку: нулевая скидка допустима и является незаполненным числом для стандартного fillcheck.

  7. Во внешнем отчете создайте ровно один макет СКДТриСтроки типа СхемаКомпоновкиДанных и выберите его Основной схемой компоновки данных. Добавьте источник данных Локальный/набор данных Запрос с именем ТриСтроки. Вставьте QUERY из отдельного supporting блока целиком, без автопереформатирования: runtime сравнивает свой текст, нормализуя только CRLF/LF и внешние пробелы. В нем нет ИЗ/FROM, таблиц базы или произвольного SQL из формы.

  8. В параметрах схемы проверьте Скидка, тип Число(2,0), значение по умолчанию0. Обновите поля набора: Товар Строка, Количество/Цена Число, Сумма Число(15,2). В Настройки → создайте первый/default вариант: одна группировка Детальные записи, выбранные поля строго Товар,Количество,Цена,Сумма в этом порядке; без дополнительных группировок/вложенных таблиц/диаграмм/итоговых товарных строк. В параметрах данных включите Скидка=0. Числовые ячейки должны сохранять actual значения, не только произвольный текст.

  9. Для вывода ограничьте оформление: четыре колонки, не более30строк, без многострочных объединенных боковых подписей. Сумма/Цена выводятся числами, без преобразования к строке. Обычные заголовки допустимы: numeric verifier ищет три точных имени товара в колонке1 и читает числовые колонки2..4. Если СКД вывел только текст, проверка честно откажет вместо восстановления чисел из исходной таблицы.

  10. Откройте Модуль объекта именно своего внешнего отчета и вставьте OBJECT целиком. ЭтотОбъект в нем — фактический native внешний отчет. Схема загружается из его compiled макета, ставится только своему экземпляру и отдельно читается. КомпоновщикНастроек readonly получают как объект и инициализируют из actual схемы/default settings; readonly ссылки не присваиваются.

  11. Во внешнем отчете создайте обычную основную форму ФормаОтчета типа ФормаОтчета. Ее основной реквизит Отчет связан с этим actual экземпляром внешнего отчета; результат Результат имеет тип ТабличныйДокумент. Добавьте поле табличного документа, связанное с Результат, и кнопки Сформировать/Настройки. Вставьте REPORT_FORM целиком; события Нажатие обычных кнопок Сформировать и Настройки назначьте одноимённым процедурам. Единственный аргумент Команда означает native Элемент ordinary form extension, не управляемую команду. Native GetForm из созданного внешнего объекта получает форму для данного экземпляра.

  12. Создайте обычную форму ФормаНастроек для того же внешнего отчета с основным реквизитом Отчет этого же native объекта. Поля формы связаны с Отчет.МеткаОпыта/Отчет.Скидка, кнопки ПроверитьНастройки/ЗакрытьНастройки. Вставьте SETTINGS_FORM полностью; события Нажатие обычных кнопок ПроверитьНастройки и ЗакрытьНастройки назначьте одноимённым процедурам с одним native Элемент (в коде имя Команда). Затем назначьте эту форму основной формой настроек. GetSettingsForm вызывается именно на том же собственном объекте, не на стороннем отчете.

  13. Вручную сохраните/скомпилируйте свой .erf в точный путь C:\1c-labs\Уч85ERF_<UUID>\УчебныеПродажиТриСтроки85.erf и проверьте модули конфигуратором. Это ваш собственный known source, а не скачанный чужой внешний файл. Автор не создавал бинарный .erf/не запускал конфигуратор или этот файл; приведены полный исходный код и ручная metadata подготовка.

  14. Запустите только свою CF/actual пользователя толстым ordinary клиентом. В launcher введите свой marker и МОЙ СКОМПИЛИРОВАННЫЙ ERF85, нажмите загрузку один раз. До nativeCreate guard проверяет host/fileIB/currentuser. Затем ВнешниеОтчеты.Создать(ownPath,Истина) использует безопасный режим и сохраняет defaults защиты опасных действий; код их не отключает и не выбирает unknown security profile.

  15. Важно: код внешнего модуля может исполняться уже при Create, до Metadata/UsedFileName checks. Эти проверки подтверждают ожидаемый own artifact/structure, но НЕ сертификат/хеш доверия или безопасность файла. Поэтому сначала вручную компилируйте именно предоставленные свои модули в отдельной VM; не проверяйте этим способом неизвестный .erf.

  16. Основная форма открывается через native GetForm с реальным своим object и fresh uniqueness key. Первое формирование при скидке0 должно дать Книга750,Чашка300,Карандаш100; numeric readback трех actual generated rows=1150. Результат не считается правильным только по исходному массиву или возвращению ComposeResult.

  17. В Настройки откройте свою вторую форму и временно очистите МеткаОпыта: ПроверитьНастройки должен получить False от nativeCheckFilling и сообщение о своем реальном обязательном реквизите. Верните свой marker. Скидка5 должна отказать до компоновки; введите10, проверьте настройки, закройте только эту свою форму и снова сформируйте. Должны читаться actual output675/270/90 и итог1035.

  18. Скидка переносится в actual Компоновщик.Настройки.ПараметрыДанных через documented ПараметрКомпоновкиДанных("Скидка")/FindParameterValue. Параметр=Неопределено — отказ, а не создаваемый fake fallback. Использование=True и значение проверяются. СкомпоноватьРезультат получает настоящий новый ТабличныйДокумент и работает стандартным СКД путем.

  19. Этот урок использует стандартную компоновку СКД. Примеры обработчиков ПриКомпоновкеРезультата и ОбработкаПроверкиЗаполнения приведены в отдельных учебных задачах на страницах этих событий; вручную вызывать события не нужно.

  20. Ctrl+Break может прервать native компоновку исключением. Ошибки/частичный результат не заменяются1150/1035 из источника, не вызывают автоматического retry/закрытия чужих форм/загрузки другого файла. Все реальные1С/DB/UI/files/network/compiledERF действия выполняет только владелец позже на своем стенде; при авторстве0, backup0.

Перем СвойВнешнийОтчет85;
Перем НачатаЗагрузка85;

Процедура ЗагрузитьСвойОтчет(Команда)
    ПроверитьСвойOrdinaryСтендОтчета85(МеткаБазы);
    Если НачатаЗагрузка85 = Истина Или Подтверждение <> "МОЙ СКОМПИЛИРОВАННЫЙ ERF85" Тогда
        ВызватьИсключение "Загрузка своего known-source файла одноразовая и требует подтверждения";
    КонецЕсли;
    Путь = "C:\1c-labs\Уч85ERF_" + МеткаБазы + "\УчебныеПродажиТриСтроки85.erf";
    НачатаЗагрузка85 = Истина;
    СвойВнешнийОтчет85 = ВнешниеОтчеты.Создать(Путь, Истина);
    Если СвойВнешнийОтчет85.ИспользуемоеИмяФайла <> Путь Или СвойВнешнийОтчет85.Метаданные().Имя <> "УчебныеПродажиТриСтроки85" Тогда
        ВызватьИсключение "Actual created own report metadata/filename не совпали. Проверка послеCreate не доказывает безопасность уже загруженного кода";
    КонецЕсли;
    СвойВнешнийОтчет85.МеткаОпыта = МеткаБазы;
    СвойВнешнийОтчет85.Скидка = 0;
    СвойВнешнийОтчет85.ОткрытьСвойОтчет85();
КонецПроцедуры

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

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

Свой внешний отчёт → Модуль объекта, целиком.

Именно модуль объекта своего УчебныеПродажиТриСтроки85.erf; native ЭтотОбъект — тот instance, который основной loader создал и передал в реальные формы.

Функция ОткрытьСвойОтчет85() Экспорт
    ПроверитьСвойВнешнийОтчет85();
    ФормаОтчета = ЭтотОбъект.ПолучитьФорму("ФормаОтчета", , Строка(Новый УникальныйИдентификатор));
    Если ФормаОтчета = Неопределено Тогда
        ВызватьИсключение "Собственная форма отчета не создана: native Undefined не считается открытием";
    КонецЕсли;
    ФормаОтчета.Открыть();
    Возврат ФормаОтчета;
КонецФункции

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

Функция СформироватьСвоиТриСтроки85() Экспорт
    ПроверитьСвойВнешнийОтчет85();
    Если Не ЭтотОбъект.ПроверитьЗаполнение() Тогда
        ВызватьИсключение "Native проверка собственных реквизитов отказала; результат не компонуется";
    КонецЕсли;
    Если ЭтотОбъект.Скидка <> 0 И ЭтотОбъект.Скидка <> 10 Тогда
        ВызватьИсключение "Допускаются только собственные учебные скидки0/10";
    КонецЕсли;
    ИзМакета = ЭтотОбъект.ПолучитьМакет("СКДТриСтроки");
    Если ТипЗнч(ИзМакета) <> Тип("СхемаКомпоновкиДанных") Или ИзМакета.НаборыДанных.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен настоящий собственный compiled СКД-макет с одним набором";
    КонецЕсли;
    Набор = ИзМакета.НаборыДанных[0];
    Если Набор.Имя <> "ТриСтроки" Или ТипЗнч(Набор) <> Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")
        Или СокрЛП(СтрЗаменить(Набор.Запрос, Символы.ВК, "")) <> ПолучитьСвойLiteralЗапрос85() Тогда
        ВызватьИсключение "Own СКД-макет не содержит точный подготовленный literal-query. Это проверка структуры, не proof доверия внешнему модулю";
    КонецЕсли;
    ЭтотОбъект.СхемаКомпоновкиДанных = ИзМакета;
    Схема = ЭтотОбъект.СхемаКомпоновкиДанных;
    Если ТипЗнч(Схема) <> Тип("СхемаКомпоновкиДанных") Или Схема.НаборыДанных.Количество() <> 1
        Или СокрЛП(СтрЗаменить(Схема.НаборыДанных[0].Запрос, Символы.ВК, "")) <> ПолучитьСвойLiteralЗапрос85() Тогда
        ВызватьИсключение "Загруженная собственная схема не подтверждена отдельным readback";
    КонецЕсли;
    Компоновщик = ЭтотОбъект.КомпоновщикНастроек;
    Если ТипЗнч(Компоновщик) <> Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен реальный readonly report composer, не новый неизвестный wrapper";
    КонецЕсли;
    Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
    Компоновщик.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
    ПараметрСкидки = Компоновщик.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Скидка"));
    Если ПараметрСкидки = Неопределено Тогда
        ВызватьИсключение "В default settings собственного СКД-макета отсутствует параметр Скидка";
    КонецЕсли;
    ПараметрСкидки.Значение = ЭтотОбъект.Скидка;
    ПараметрСкидки.Использование = Истина;
    Если ПараметрСкидки.Значение <> ЭтотОбъект.Скидка Или Не ПараметрСкидки.Использование Тогда
        ВызватьИсключение "Own actual data parameter не задан";
    КонецЕсли;
    Результат = Новый ТабличныйДокумент;
    ЭтотОбъект.СкомпоноватьРезультат(Результат);
    СуммаИзРезультата = ПроверитьЧислаУжеСкомпонованногоОтчета85(Результат);
    Если (ЭтотОбъект.Скидка = 0 И СуммаИзРезультата <> 1150)
        Или (ЭтотОбъект.Скидка = 10 И СуммаИзРезультата <> 1035) Тогда
        ВызватьИсключение "Числовой readback actual generated result не дал1150/1035. Исходные строки вместо результата не суммируются";
    КонецЕсли;
    Сообщить("Три числовые строки actual СКД-результата отдельно проверены. Скидка=" + Строка(ЭтотОбъект.Скидка) + "; сумма=" + Строка(СуммаИзРезультата));
    Возврат Результат;
КонецФункции

Функция ПроверитьЧислаУжеСкомпонованногоОтчета85(Результат)
    Если Результат.ВысотаТаблицы < 3 Или Результат.ВысотаТаблицы > 30 Или Результат.ШиринаТаблицы <> 4 Тогда
        ВызватьИсключение "Own СКД должен выводить только четыре выбранных поля и не больше30строк оформления";
    КонецЕсли;
    Имена = Новый Массив;
    Имена.Добавить("Книга");
    Имена.Добавить("Чашка");
    Имена.Добавить("Карандаш");
    Найденные = Новый Массив;
    Сумма = 0;
    Для Номер = 1 По Результат.ВысотаТаблицы Цикл
        Имя = Результат.Область(Номер, 1).Текст;
        Если Имена.Найти(Имя) = Неопределено Тогда
            Продолжить;
        КонецЕсли;
        Если Найденные.Найти(Имя) <> Неопределено Тогда
            ВызватьИсключение "Actual generated row имени повторена";
        КонецЕсли;
        ЯчейкаКоличества = Результат.Область(Номер, 2);
        ЯчейкаЦены = Результат.Область(Номер, 3);
        ЯчейкаСуммы = Результат.Область(Номер, 4);
        Если Не ЯчейкаКоличества.СодержитЗначение Или Не ЯчейкаЦены.СодержитЗначение Или Не ЯчейкаСуммы.СодержитЗначение Тогда
            ВызватьИсключение "Actual СКД cells не содержат numeric values. Не подменяем их конвертацией текста или исходными данными";
        КонецЕсли;
        Количество = ЯчейкаКоличества.Значение;
        Цена = ЯчейкаЦены.Значение;
        ЗначениеСуммы = ЯчейкаСуммы.Значение;
        Если ТипЗнч(Количество) <> Тип("Число") Или ТипЗнч(Цена) <> Тип("Число") Или ТипЗнч(ЗначениеСуммы) <> Тип("Число") Тогда
            ВызватьИсключение "Из actual output должны читаться три числовые ячейки";
        КонецЕсли;
        Если (Имя = "Книга" И (Количество <> 3 Или Цена <> 250))
            Или (Имя = "Чашка" И (Количество <> 2 Или Цена <> 150))
            Или (Имя = "Карандаш" И (Количество <> 4 Или Цена <> 25))
            Или ЗначениеСуммы <> Количество * Цена * (100 - ЭтотОбъект.Скидка) / 100 Тогда
            ВызватьИсключение "Actual numeric row passport/скидка не совпал";
        КонецЕсли;
        Найденные.Добавить(Имя);
        Сумма = Сумма + ЗначениеСуммы;
    КонецЦикла;
    Если Найденные.Количество() <> 3 Тогда
        ВызватьИсключение "В actual report result нет ровно трех собственных data rows";
    КонецЕсли;
    Возврат Сумма;
КонецФункции

Процедура ПроверитьСвойВнешнийОтчет85()
    ПроверитьСвойOrdinaryСтендОтчета85(ЭтотОбъект.МеткаОпыта);
    МетаОтчета = ЭтотОбъект.Метаданные();
    Если МетаОтчета.Имя <> "УчебныеПродажиТриСтроки85" Или МетаОтчета.Реквизиты.Количество() <> 2
        Или МетаОтчета.Формы.Количество() <> 2 Или МетаОтчета.Макеты.Количество() <> 1
        Или Не МетаОтчета.Реквизиты.МеткаОпыта.Тип.СодержитТип(Тип("Строка"))
        Или Не МетаОтчета.Реквизиты.Скидка.Тип.СодержитТип(Тип("Число")) Тогда
        ВызватьИсключение "Own manually compiled report metadata/schema не совпал. Это не сертификат/доверие к файлу";
    КонецЕсли;
    ОжидаемыйФайл = "C:\1c-labs\Уч85ERF_" + ЭтотОбъект.МеткаОпыта + "\УчебныеПродажиТриСтроки85.erf";
    Если ЭтотОбъект.ИспользуемоеИмяФайла <> ОжидаемыйФайл Тогда
        ВызватьИсключение "ИспользуемоеИмяФайла не соответствует точному своему compiled-path. Не логируем чужие пути";
    КонецЕсли;
КонецПроцедуры

Функция ПолучитьСвойLiteralЗапрос85()
    Возврат "ВЫБРАТЬ
    |    ""Книга"" КАК Товар,
    |    3 КАК Количество,
    |    250 КАК Цена,
    |    ВЫРАЗИТЬ(750 * (100 - &Скидка) / 100 КАК ЧИСЛО(15, 2)) КАК Сумма
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ
    |    ""Чашка"",
    |    2,
    |    150,
    |    ВЫРАЗИТЬ(300 * (100 - &Скидка) / 100 КАК ЧИСЛО(15, 2))
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ
    |    ""Карандаш"",
    |    4,
    |    25,
    |    ВЫРАЗИТЬ(100 * (100 - &Скидка) / 100 КАК ЧИСЛО(15, 2))";
КонецФункции

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

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

Свой внешний отчет → Формы → ФормаОтчета → Модуль.

Обычная форма thick ordinary: основной реквизит Отчет связан native GetForm с own external instance, Результат=ТабличныйДокумент.

Процедура Сформировать(Команда)
    Результат = Отчет.СформироватьСвоиТриСтроки85();
КонецПроцедуры

Процедура Настройки(Команда)
    Отчет.ОткрытьСвоиНастройки85();
КонецПроцедуры
Полный модуль ordinary формы настроек собственного external instance

Свой внешний отчет → Формы → ФормаНастроек → Модуль.

Обычная settings форма thick ordinary, собственные typed attributes Отчет.МеткаОпыта/Скидка; без unknown report argument.

Процедура ПроверитьНастройки(Команда)
    Если Не Отчет.ПроверитьЗаполнение() Тогда
        Сообщить("Собственные реквизиты не заполнены. Укажите marker своего compiled-path; отчет не запускается");
        Возврат;
    КонецЕсли;
    Если Отчет.Скидка <> 0 И Отчет.Скидка <> 10 Тогда
        Сообщить("Для учебного отчета допустима только скидка0 либо10");
        Возврат;
    КонецЕсли;
    Сообщить("Own typed attributes заполнены. После закрытия этой формы сформируйте отчет: actual СКД parameter применится к этому же экземпляру");
КонецПроцедуры

Процедура ЗакрытьНастройки(Команда)
    Закрыть();
КонецПроцедуры
Полный обычный модуль приложения host: native OnStart открывает только свою launcher форму

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

Обычный application module собственного host, native0arg OnStart; файл не загружается автоматически.

Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентОбычноеПриложение Тогда
    ФормаПуска = ПолучитьОбщуюФорму("ПускОтчета85");
    ФормаПуска.Открыть();
#Иначе
    ВызватьИсключение "Этот ownfixture запускайте только толстым клиентом в обычном приложении";
#КонецЕсли
КонецПроцедуры
QUERY: полный запрос1С для единственного своего СКД dataset ТриСтроки, не модуль BSL

Свой внешний отчет → Макеты → СКДТриСтроки → Набор ТриСтроки → Запрос.

Язык запросов1С, только собственные три literalrows и typed numeric discount0/10; не исполняемый модуль BSL.

ВЫБРАТЬ
    "Книга" КАК Товар,
    3 КАК Количество,
    250 КАК Цена,
    ВЫРАЗИТЬ(750 * (100 - &Скидка) / 100 КАК ЧИСЛО(15, 2)) КАК Сумма
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    "Чашка",
    2,
    150,
    ВЫРАЗИТЬ(300 * (100 - &Скидка) / 100 КАК ЧИСЛО(15, 2))
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    "Карандаш",
    4,
    25,
    ВЫРАЗИТЬ(100 * (100 - &Скидка) / 100 КАК ЧИСЛО(15, 2))

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

  1. Настоящая кнопка вызывает основной обработчик. Guard требует подготовленную пустую FileIB, свою конфигурацию, текущего единственного пользователя и canonical UUID своего каталога. Ручное подтверждение МОЙ СКОМПИЛИРОВАННЫЙ ERF85 разрешает загрузку; НачатаЗагрузка85 устанавливается до Create и запрещает повтор даже после частичной неудачи.

  2. Глобальное ВнешниеОтчеты только читается как настоящий ВнешниеОтчетыМенеджер. У него нет выдуманного конструктора и ему не присваивается чужой менеджер. Непосредственно ВнешниеОтчеты.Создать(Путь,Истина) потребляет заранее подготовленный путь собственного .erf и возвращает реальный ВнешнийОтчет.

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

  4. После Create читаются actual ИспользуемоеИмяФайла и Метаданные().Имя. Они сверяют ожидаемый артефакт упражнения, но не доказывают безопасность уже загруженного файла. Затем именно созданному экземпляру задаются собственный marker и скидка0.

  5. Вызванная собственная экспортная функция ОткрытьСвойОтчет85 из object-модуля действительно использует ЭтотОбъект: проверяет стенд/compiled путь, получает native обычную ФормаОтчета и открывает её. Native GetForm связывает основной реквизит Отчет с этим конкретным экземпляром; неизвестный ИсходныйОбъект не требуется.

  6. В основной форме настоящая кнопка Сформировать запускает полный OBJECT-потребитель: actual compiled СКД-макет, реальный компоновщик настроек и параметр Скидка. Native СкомпоноватьРезультат выводит настоящий ТабличныйДокумент; полный verifier читает числовые значения уже выведенных ячеек.

  7. При скидке0 actual строки Книга750/Чашка300/Карандаш100 должны дать1150. Настройки открывают вторую форму того же экземпляра; после собственной смены скидки на10 повторное формирование должно дать675/270/90 и1035. Источник запроса или текст ячеек не подменяют actual числовой вывод.

  8. Неверные marker, заполнение, скидка, схема, numeric ячейки или частичный результат не дают фиктивного успеха. Автоматической повторной загрузки, снятия защиты, удаления файлов и закрытия чужих форм нет. Закрытие/новая форма не разрешают обойти одноразовый опыт.

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

  1. В своём будущем отладчике подтвердить реальный переход: глобальное ВнешниеОтчеты → native Создать(Путь,Истина) → СвойВнешнийОтчет85 → экспортная ОткрытьСвойОтчет85 → ordinary ФормаОтчета → actual numeric1150/1035. Этот менеджер не просто прочитан/возвращён без потребителя.

  2. Свой real экземпляр получен documented ВнешниеОтчеты.Создать(ownPath,Истина); основной и settings GetForm работают только в подготовленном ordinary thick context.

  3. Пустая МеткаОпыта дает native fillcheck False; неправильная скидка5 отвергается отдельно,0/10 допустимы.

  4. Actual generated numeric rows0%:750,300,100 и сумма1150;10%:675,270,90 и сумма1035. Если numeric values отсутствуют, код не фабрикует результат из query/text.

  5. Readonly report свойства не присваиваются, а actual schema read/assign/readback ограничен своим экземпляром перед его компоновкой.

  6. Foreign/unknown .erf не проверяются загрузкой: filename/metadata не являются trust proof. Default опасных действий/безопасный режим не отключены.

  7. Native/raw static проверки не заменяют ручную компиляцию собственного .erf и запуск/визуальную проверку владельца. Runtime authoring0.

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

При ручном успешном выполнении полной metadata подготовки и компиляции своего отчета на собственном ordinary thick стенде СКД выводит три реальных строки; readback числовых outputcells подтверждает1150/1035 для скидки0/10. Здесь только authored source/static/native verification: бинарный .erf, фактическая1С/формы/DB/файлы/сеть не создавались/не запускались.

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

  1. ВнешниеОтчеты — глобальное свойство только для чтения, тип ВнешниеОтчетыМенеджер, доступно серверу/толстому клиенту/внешнему соединению. Но этот конкретный маршрут открывает ordinary формы: здесь исключительно толстый клиент обычного приложения. Общая доступность менеджера не разрешает UI на сервере или в тонком клиенте.

  2. GetForm external-report native доступен только толстому клиенту. При ordinary запуске только обычные формы, при managed — только управляемые; общий тип отчета server availability не расширяет каждый метод.

  3. Реальный readonly ЭтотОбъект внутри object module не является неизвестным входным параметром. В формах реквизит Отчет привязывается native GetForm к конкретному созданному экземпляру.

  4. Metadata/GetTemplate/UsedFileName не доказывают доверие к коду, который мог исполниться приCreate. Свой manually compiled known source/VM обязателен, чужой файл не загружается для проверки.

  5. SafeMode=True и default dangerous protection не являются абсолютной песочницей или подтвержденным разрешением на unknown-file load. Не отключайте безопасность ради обхода ошибки своей среды.

  6. UsedFileName readonly возвращает полное имя в этом thick fixture. Web возвращает только имя без пути и требует другой route; здесь web context не используется.

  7. КомпоновщикНастроек readonly — ссылка на объект, а не property для присваивания новогоComposer. Schema RW можно перезагрузить только своему actual instance из его known compiled layout.

  8. Проверка заполнения обязательного numeric attribute отвергла бы допустимый0. Поэтому требуемый marker String проверяется native, скидка имеет отдельный тип/бизнесguard0/10.

  9. Schema default settings действительно должны иметь parameter Скидка и четыре поля DetailRecords. FindParameterValueUndefined/неправильное оформление честно отказывает; код не чинит произвольно чужую схему.

  10. ContainsValue обязателен для чтения cell.Value. Если output содержит текст вместо чисел, источник не превращается в fake numeric result; исправляйте только свой prepared СКД-layout по ручному протоколу.

  11. Actual detail rows отличаются от заголовков/оформления/totalfooter. Bounded scan распознает три exactproduct имена и отвергает duplicate output; он не заявляет анализ произвольного чужого отчета.

  12. Обработчик события добавляйте через список событий модуля объекта соответствующего отчёта. Этот урок показывает стандартный путь СКД без собственного обработчика компоновки.

  13. Компоновка может быть отменена Ctrl+Break. Exception/partial document не является готовым отчетом; никакого auto retry/DBwrite/чужих forms closing/backup/загрузки другого файла.

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

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

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

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

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