Тип: Булево. Определяет использование параметра при компоновке данных. Истина - используется.
Полное описание, параметры и ограничения
ЗначениеПараметраНастроекКомпоновкиДанных.Использование (DataCompositionSettingsParameterValue.Use)
ЗначениеПараметраНастроекКомпоновкиДанных (DataCompositionSettingsParameterValue)
Использование (Use)
Доступен, начиная с версии 8.2.
Использование:
Чтение и запись.
Описание:
Тип: Булево.
Определяет использование параметра при компоновке данных.
Истина - используется.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Январь и март: настоящий календарный пробел февраля и устойчивые цвета по date-ключам
Полный memory процесс: свой typed источник → настройки/доступные поля → compiled period addition → фактические native ячейки и диаграммы. Февраль — пробел источника, не сгенерированная продажа.
Где и как запускать
Полный серверный общий модуль УчебныеМесяцы85, вызываемый собственной управляемой формой в новой файловой ИБ .1343. Только WindowsThickManaged; ValueAppearance не исполняется в thin/web/external context.
Подготовка
Задача: две настоящие продажи в январе и марте. В феврале продаж нет. СКД должна показать календарный пробел, не добавляя нулевую запись в исходник, а одинаковые date-ключи диаграмм должны сохранить native цвета при перестановке серий.
Вручную создайте НОВУЮ пустую файловую ИБ платформы 8.5.1.1343 только по пути C:\1C85_OwnMonthGap\e9b935fa-64d8-4d5f-a190-01726ddc40ac\Base. Если путь/регистрация уже заняты, остановитесь. Здесь ИБ, каталог, роль, пользователь и модули фактически не создавались. UUID каталога — собственная метка стенда, не UUID ИБ.
Конфигуратор: новая конфигурация УчебныеМесяцыЦвета85, режим совместимости НеИспользовать, основной режим запуска УправляемоеПриложение. Запуск вручную только толстым клиентом с управляемым приложением. Никаких прикладных справочников, документов, регистров, отчётов, хранилищ, расширений и импортов из рабочих конфигураций.
Создайте одну свою роль УчебныйАдминистратор85: Администрирование и права запуска толстого управляемого клиента/просмотра своей формы. Создайте ровно одного собственного реального пользователя УчебныйАдминистратор85 с этой ролью, войдите им в один сеанс. GetUsers требует административного права. Код сверяет настоящий UUID пользователя с единственным элементом native массива; placeholder UUID не нужен.
Создайте один общий модуль УчебныеМесяцы85: Глобальный Нет; Сервер Да; Клиент управляемое приложение Нет; Клиент обычное приложение Нет; Внешнее соединение Нет; Вызов сервера Нет; Привилегированный Нет; повторное использование возвращаемых значений НеИспользовать. Вставьте целиком CODE. Его экспорт вызывается только серверной частью собственной формы.
Создайте управляемую общую форму МесяцыЦвета85 без основного реквизита. Реквизиты До85/После85 — ТабличныйДокумент; Прямая85/Переставленная85 — Диаграмма; Статус85 — Строка неограниченной длины; Остановка85 — Булево, начальное значение Ложь. Два поля табличного документа/два поля диаграммы связаны с одноимёнными реквизитами, readonly для пользователя. Статус многострочный readonly. Никаких других форм.
Одна команда формы Сформировать85: Действие → Сформировать85(Команда), одна кнопка с Команда=Сформировать85. Вставьте целиком FORM. В корне собственной конфигурации → Открыть модуль управляемого приложения вставьте целиком APPLICATION: native ПриНачалеРаботыСистемы() без аргументов открывает только эту общую форму. Событие вручную не вызывайте. После будущего ручного обновления своей ИБ запустите толстый управляемый клиент и нажмите настоящую кнопку один раз. Это авторская инструкция, реального открытия здесь нет.
Сам источник создаётся в памяти: три typed колонки UUID85/Период85/Сумма85, две строки 2026-01-01/1000 и 2026-03-01/2000 с одним новым UUID пакета. В исходнике НЕТ февральской строки. До/после каждого native вывода сверяется вся схема и каждая из 2×3 ячеек, итог 3000.
Схема создаёт objectdataset СвоиМесяцы85. Два schema date-параметра Начало85=2026-01-01, Конец85=2026-03-31 включаются в доступные поля. Add/смена Parameter делаются ТОЛЬКО в новых unbound Настройках до LoadSettings, не в связанной native коллекции.
ИсточникДоступныхНастроекКомпоновкиДанных(Схема) → Initialize → LoadSettings → actual Composer.Settings. ДоступныеПоляПолейГруппировок реально проверяют date Период85, ДоступныеПоляДополненияПериода — date-поля ПараметрыДанных.Начало85/Конец85. Нет самодельных available collections и зависимости от совпадения имени переменной.
Компилятор выдаёт реальный связанный макет; рекурсивный обход actual Тело/Группировка находит единственный Период85. Только его readonly ДополнениеПериода даёт внутренний тип. Начало/Конец читаются из actual compiled объектa; режим Месяц и exact dates должны совпасть. ГруппировкаРесурса False, ТипГруппировки Элементы, НаборДанныхИерархии пустой проверяются, а не бессмысленно присваиваются для покрытия.
ОформлениеЗначений НЕ имеет документированного конструктора. Маршрут: свой Новый native OutputProcessor → его typed ОформлениеЗначений. Native не гарантирует начальную пустоту: Type и GetAll.Count=0 обоих свежих собственных процессоров обязательны. После первой своей записи контрольный map должен остаться пустым; это проверка этих двух экземпляров, не универсальное доказательство глобального устройства. При Undefined/nonempty/shared эффекте — отказ, без чужого Clear и слепого отката.
Для января/марта задаются explicit RGB, февраль Set(date) получает настоящий свободный numeric индекс. Его номер не считается равным 0. Повторный Set без значения не меняет ключ. Full GetAll и typed Date/String GetAll проверяют весь whitelist: три date-ключа и свой строковый marker.
УстановитьВсе получает полный собственный payload, затем readback. Clear(Type(Date),True) удаляет только numeric февраль, сохраняет nonnumeric RGB января/марта и другой key-type. Это не clear всего объекта и не удаление исходных продаж. После проверки февраль явно серый.
Native output действительно формирует 2→3 месяца. Reader находит реальные заголовки, typed Date/числа либо явно форматированный ISO/text, исключает лишние итоги/дубликаты и суммирует actual суммы 3000. Пустой февральский ресурс отмечается Пробел=True и сохраняется отдельно; 0 используется только для суммы и диаграммы пробела, не как выдуманная запись источника.
Две собственные native диаграммы используют actual месячный результат: январь/февраль/март и март/январь/февраль. Native FillSeriesColors не возвращает ОформлениеЗначений. Проверяются все real Series.Value/Series.Color и Chart.GetValue; не пиксели, качество отрисовки, палитра ОС или сохранность произвольного промышленного отчёта.
При будущей ручной ошибке форма sticky fail-stop на client и server границах. Не обещается атомарность memory/UI присваиваний; автоматического retry/restore/clear нет. Закройте собственную форму и исследуйте причину. Здесь только авторство и статические проверки; actual 1С/compile/DB/UI/файлы/сеть/печать/экспорт/настройки/backup0.
Процедура ПроверитьСвойСтенд85() Экспорт
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1C85_OwnMonthGap\e9b935fa-64d8-4d5f-a190-01726ddc40ac\Base"";" Тогда
ВызватьИсключение "Только собственная новая файловая учебная ИБ";
КонецЕсли;
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Не совпали версия платформы или собственная конфигурация";
КонецЕсли;
Если Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.ОбщиеМодули.Найти("УчебныеМесяцы85") = Неопределено
Или Метаданные.ОбщиеФормы.Количество() <> 1 Или Метаданные.ОбщиеФормы.Найти("МесяцыЦвета85") = Неопределено
Или Метаданные.Роли.Количество() <> 1 Или Метаданные.Роли.Найти("УчебныйАдминистратор85") = Неопределено Тогда
ВызватьИсключение "Нужны ровно свои общий модуль, управляемая общая форма и роль";
КонецЕсли;
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0
Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0
Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0
Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0
Или Метаданные.Обработки.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0
Или Метаданные.Константы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0
Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Или Метаданные.ХранилищаНастроек.Количество() <> 0
Или Метаданные.ОбщиеМакеты.Количество() <> 0 Или Метаданные.ПараметрыСеанса.Количество() <> 0 Тогда
ВызватьИсключение "Своя пустая прикладная схема без чужих данных и хранилищ";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Стенд только без расширений";
КонецЕсли;
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если Текущий = Неопределено Или Пользователи.Количество() <> 1 Тогда
ВызватьИсключение "Нужен единственный собственный реальный пользователь ИБ";
КонецЕсли;
Если Текущий.Имя <> "УчебныйАдминистратор85"
Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Не совпал реальный UUID собственного пользователя ИБ";
КонецЕсли;
КонецПроцедуры
Функция СоздатьИсточник85(UUIDПакета)
Источник = Новый ТаблицаЗначений;
Источник.Колонки.Добавить("UUID85", Новый ОписаниеТипов("УникальныйИдентификатор"));
Источник.Колонки.Добавить("Период85", Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата)));
Источник.Колонки.Добавить("Сумма85", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный)));
Для Номер = 0 По 1 Цикл
Запись = Источник.Добавить();
Запись.UUID85 = UUIDПакета;
Запись.Период85 = Дата(2026, ?(Номер = 0, 1, 3), 1);
Запись.Сумма85 = ?(Номер = 0, 1000, 2000);
КонецЦикла;
Возврат Источник;
КонецФункции
Процедура ПроверитьИсточник85(Источник, UUIDПакета)
Если ТипЗнч(Источник) <> Тип("ТаблицаЗначений") Или ТипЗнч(UUIDПакета) <> Тип("УникальныйИдентификатор")
Или Источник.Количество() <> 2 Или Источник.Колонки.Количество() <> 3 Тогда
ВызватьИсключение "Нужны ровно собственные две исходные строки и три типизированные колонки";
КонецЕсли;
Эталон = СоздатьИсточник85(UUIDПакета);
Для Индекс = 0 По 2 Цикл
Колонка = Источник.Колонки.Получить(Индекс);
ОжидаемаяКолонка = Эталон.Колонки.Получить(Индекс);
Если Колонка.Имя <> ОжидаемаяКолонка.Имя Или Колонка.ТипЗначения <> ОжидаемаяКолонка.ТипЗначения Тогда
ВызватьИсключение "Изменилась полная схема собственного источника";
КонецЕсли;
КонецЦикла;
Для Индекс = 0 По 1 Цикл
Запись = Источник.Получить(Индекс);
Если Запись.UUID85 <> UUIDПакета Или Запись.Период85 <> Дата(2026, ?(Индекс = 0, 1, 3), 1)
Или Запись.Сумма85 <> ?(Индекс = 0, 1000, 2000) Тогда
ВызватьИсключение "Изменились свои UUID, даты или суммы; февральскую запись не добавляем";
КонецЕсли;
КонецЦикла;
Если Источник.Итог("Сумма85") <> 3000 Тогда
ВызватьИсключение "Сумма двух настоящих исходных записей должна быть 3000";
КонецЕсли;
КонецПроцедуры
Функция СоздатьСхему85(Источник)
Схема = Новый СхемаКомпоновкиДанных;
Локальный = Схема.ИсточникиДанных.Добавить();
Локальный.Имя = "СвойИсточник85";
Локальный.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
Набор.Имя = "СвоиМесяцы85";
Набор.ИмяОбъекта = "СвоиМесяцы85";
Набор.ИсточникДанных = Локальный.Имя;
Для Каждого Колонка Из Источник.Колонки Цикл
Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
Поле.Поле = Колонка.Имя;
Поле.ПутьКДанным = Колонка.Имя;
Поле.Заголовок = Колонка.Имя;
Поле.ТипЗначения = Колонка.ТипЗначения;
Если Колонка.Имя = "Период85" Тогда
Поле.Оформление.УстановитьЗначениеПараметра("Формат", "ДФ=yyyy-MM-dd");
ИначеЕсли Колонка.Имя = "Сумма85" Тогда
Поле.Оформление.УстановитьЗначениеПараметра("Формат", "ЧДЦ=0;ЧГ=0");
Итог = Схема.ПоляИтога.Добавить();
Итог.ПутьКДанным = Колонка.Имя;
Итог.Выражение = "Сумма(Сумма85)";
КонецЕсли;
КонецЦикла;
Для Номер = 0 По 1 Цикл
Параметр = Схема.Параметры.Добавить();
Параметр.Имя = ?(Номер = 0, "Начало85", "Конец85");
Параметр.ТипЗначения = Источник.Колонки.Найти("Период85").ТипЗначения;
Параметр.Значение = ?(Номер = 0, Дата(2026, 1, 1), Дата(2026, 3, 31));
Параметр.Использование = ИспользованиеПараметраКомпоновкиДанных.Всегда;
Параметр.ВключатьВДоступныеПоля = Истина;
КонецЦикла;
Возврат Схема;
КонецФункции
Функция ПодготовитьНастройки85(Схема, Дополнять)
Настройки = Новый НастройкиКомпоновкиДанных;
Если Настройки.ПараметрыДанных.ДоступныеПараметры <> Неопределено Тогда
ВызватьИсключение "Добавление параметров разрешено только в собственной новой несвязанной коллекции";
КонецЕсли;
Для Номер = 0 По 1 Цикл
ЗначениеПараметра = Настройки.ПараметрыДанных.Элементы.Добавить();
ЗначениеПараметра.Параметр = Новый ПараметрКомпоновкиДанных(?(Номер = 0, "Начало85", "Конец85"));
ЗначениеПараметра.Значение = ?(Номер = 0, Дата(2026, 1, 1), Дата(2026, 3, 31));
ЗначениеПараметра.Использование = Истина;
КонецЦикла;
Группа = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Группа.Имя = "СвоиМесяцы85";
Группа.Использование = Истина;
Для Каждого Имя Из СтрРазделить("Период85,Сумма85", ",") Цикл
Выбор = Группа.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбор.Поле = Новый ПолеКомпоновкиДанных(Имя);
Выбор.Использование = Истина;
КонецЦикла;
ПолеГруппы = Группа.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппы.Поле = Новый ПолеКомпоновкиДанных("Период85");
ПолеГруппы.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
ПолеГруппы.Использование = Истина;
ПолеГруппы.ТипДополнения = ?(Дополнять, ТипДополненияПериодаКомпоновкиДанных.Месяц, ТипДополненияПериодаКомпоновкиДанных.БезДополнения);
ПолеГруппы.НачалоПериода = Новый ПолеКомпоновкиДанных("ПараметрыДанных.Начало85");
ПолеГруппы.КонецПериода = Новый ПолеКомпоновкиДанных("ПараметрыДанных.Конец85");
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("РасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);
Группа.ПараметрыВывода.УстановитьЗначениеПараметра("РасположениеИтогов", РасположениеИтоговКомпоновкиДанных.Нет);
Порядок = Группа.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
Порядок.Поле = Новый ПолеКомпоновкиДанных("Период85");
Порядок.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
Порядок.Использование = Истина;
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
ДоступныйИсточник = Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема);
Компоновщик.Инициализировать(ДоступныйИсточник);
Компоновщик.ЗагрузитьНастройки(Настройки);
Связанные = Компоновщик.Настройки;
Если Связанные.Структура.Количество() <> 1 Тогда
ВызватьИсключение "Нужна одна реальная связанная месячная группировка";
КонецЕсли;
СвояГруппа = Связанные.Структура.Получить(0);
Если ТипЗнч(СвояГруппа) <> Тип("ГруппировкаКомпоновкиДанных") Или СвояГруппа.Имя <> "СвоиМесяцы85"
Или СвояГруппа.ПоляГруппировки.Элементы.Количество() <> 1 Тогда
ВызватьИсключение "Не совпал фактический владелец настроек своей группы";
КонецЕсли;
ПоляГруппы = СвояГруппа.ПоляГруппировки;
ДоступныеГруппы = ПоляГруппы.ДоступныеПоляПолейГруппировок;
ДоступныеГраницы = ПоляГруппы.ДоступныеПоляДополненияПериода;
Если ТипЗнч(ДоступныеГруппы) <> Тип("ДоступныеПоляКомпоновкиДанных")
Или ТипЗнч(ДоступныеГраницы) <> Тип("ДоступныеПоляКомпоновкиДанных") Тогда
ВызватьИсключение "Источник не связал реальные доступные поля месячной группы и границ";
КонецЕсли;
ДатаГруппы = ДоступныеГруппы.НайтиПоле(Новый ПолеКомпоновкиДанных("Период85"));
Если ТипЗнч(ДатаГруппы) <> Тип("ДоступноеПолеКомпоновкиДанных")
Или Не ДатаГруппы.ТипЗначения.СодержитТип(Тип("Дата")) Тогда
ВызватьИсключение "Своё поле группировки не является доступной датой";
КонецЕсли;
Для Номер = 0 По 1 Цикл
Имя = ?(Номер = 0, "Начало85", "Конец85");
Граница = ДоступныеГраницы.НайтиПоле(Новый ПолеКомпоновкиДанных("ПараметрыДанных." + Имя));
Если ТипЗнч(Граница) <> Тип("ДоступноеПолеКомпоновкиДанных")
Или Не Граница.ТипЗначения.СодержитТип(Тип("Дата")) Тогда
ВызватьИсключение "Не найдена своя доступная дата-параметр для дополнения периода";
КонецЕсли;
ЗначениеГраницы = Связанные.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(Имя));
Если ЗначениеГраницы = Неопределено Или Не ЗначениеГраницы.Использование
Или ЗначениеГраницы.Значение <> ?(Номер = 0, Дата(2026, 1, 1), Дата(2026, 3, 31)) Тогда
ВызватьИсключение "Не совпало реальное значение собственной границы";
КонецЕсли;
КонецЦикла;
РеальноеПоле = ПоляГруппы.Элементы.Получить(0);
Если Строка(РеальноеПоле.Поле) <> "Период85"
Или РеальноеПоле.ТипДополнения <> ?(Дополнять, ТипДополненияПериодаКомпоновкиДанных.Месяц, ТипДополненияПериодаКомпоновкиДанных.БезДополнения)
Или Строка(РеальноеПоле.НачалоПериода) <> "ПараметрыДанных.Начало85"
Или Строка(РеальноеПоле.КонецПериода) <> "ПараметрыДанных.Конец85" Тогда
ВызватьИсключение "Реальные настройки месячного дополнения не совпали";
КонецЕсли;
Возврат Связанные;
КонецФункции
Процедура НайтиСвоёПолеМакета85(Тело, Найденные)
Для Каждого Часть Из Тело Цикл
Если ТипЗнч(Часть) <> Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда
ВызватьИсключение "В собственном простом макете неожиданная часть тела";
КонецЕсли;
Для Каждого ПолеМакета Из Часть.Группировка Цикл
Если ТипЗнч(ПолеМакета) <> Тип("ЭлементГруппировкиМакетаКомпоновкиДанных") Тогда
ВызватьИсключение "Реальная коллекция группировки вернула другой тип";
КонецЕсли;
Если ПолеМакета.ИмяПоля = "Период85" Тогда
Найденные.Добавить(ПолеМакета);
КонецЕсли;
КонецЦикла;
НайтиСвоёПолеМакета85(Часть.Тело, Найденные);
КонецЦикла;
КонецПроцедуры
Функция Скомпилировать85(Схема, Настройки, Дополнять)
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Настройки);
Найденные = Новый Массив;
НайтиСвоёПолеМакета85(Макет.Тело, Найденные);
Если Найденные.Количество() <> 1 Тогда
ВызватьИсключение "Нужен единственный фактически скомпилированный Период85, не предполагаемый индекс тела";
КонецЕсли;
ПолеМакета = Найденные[0];
Если ПолеМакета.ГруппировкаРесурса Или ПолеМакета.ТипГруппировки <> ТипГруппировкиКомпоновкиДанных.Элементы
Или ПолеМакета.НаборДанныхИерархии <> "" Тогда
ВызватьИсключение "Месяц должен группировать дату, а не ресурс или неизвестную иерархию";
КонецЕсли;
Дополнение = ПолеМакета.ДополнениеПериода;
Если ТипЗнч(Дополнение) <> Тип("ДополнениеПериодаМакетаКомпоновкиДанных") Тогда
ВызватьИсключение "Нужен реальный дочерний объект дополнения из собственного макета";
КонецЕсли;
Если Дополнение.ТипДополнения <> ?(Дополнять, ТипДополненияПериодаКомпоновкиДанных.Месяц, ТипДополненияПериодаКомпоновкиДанных.БезДополнения) Тогда
ВызватьИсключение "Компилятор не подтвердил выбранный режим дополнения";
КонецЕсли;
Если Дополнять Тогда
Если ТипЗнч(Дополнение.Начало) <> Тип("Дата") Или ТипЗнч(Дополнение.Конец) <> Тип("Дата")
Или Дополнение.Начало <> Дата(2026, 1, 1) Или Дополнение.Конец <> Дата(2026, 3, 31) Тогда
ВызватьИсключение "Компилятор не разрешил свои date-параметры в точные даты границ";
КонецЕсли;
КонецЕсли;
Возврат Макет;
КонецФункции
Функция ВывестиМесяцы85(Макет, Источник, Вывод)
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет, Новый Структура("СвоиМесяцы85", Источник));
Документ = Новый ТабличныйДокумент;
Вывод.ОтображатьПроцентВывода = Ложь;
Вывод.УстановитьДокумент(Документ);
Результат = Вывод.Вывести(Процессор, Ложь);
Если ТипЗнч(Результат) <> Тип("ТабличныйДокумент") Тогда
ВызватьИсключение "Нужен настоящий табличный результат native процессора";
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПрочитатьМесяцы85(Документ, Дополнять)
Если ТипЗнч(Документ) <> Тип("ТабличныйДокумент") Или Документ.ВысотаТаблицы = 0
Или Документ.ВысотаТаблицы > 40 Или Документ.ШиринаТаблицы > 20 Тогда
ВызватьИсключение "Неожиданный настоящий native результат для двух собственных записей";
КонецЕсли;
КолонкаДаты = 0;
КолонкаСуммы = 0;
Заголовки = 0;
Для СтрокаДокумента = 1 По Документ.ВысотаТаблицы Цикл
ДатаВСтроке = 0;
СуммаВСтроке = 0;
Для КолонкаДокумента = 1 По Документ.ШиринаТаблицы Цикл
Текст = СокрЛП(Документ.Область(СтрокаДокумента, КолонкаДокумента).Текст);
Если Текст = "Период85" Тогда
ДатаВСтроке = КолонкаДокумента;
ИначеЕсли Текст = "Сумма85" Тогда
СуммаВСтроке = КолонкаДокумента;
КонецЕсли;
КонецЦикла;
Если ДатаВСтроке > 0 И СуммаВСтроке > 0 Тогда
Заголовки = Заголовки + 1;
КолонкаДаты = ДатаВСтроке;
КолонкаСуммы = СуммаВСтроке;
КонецЕсли;
КонецЦикла;
Если Заголовки <> 1 Или КолонкаДаты >= КолонкаСуммы Тогда
ВызватьИсключение "Нужны единственные фактические заголовки даты и суммы без угадывания координат";
КонецЕсли;
Месяцы = Новый Соответствие;
Всего = 0;
Для СтрокаДокумента = 1 По Документ.ВысотаТаблицы Цикл
Для КолонкаДокумента = 1 По Документ.ШиринаТаблицы Цикл
Если КолонкаДокумента = КолонкаДаты Или КолонкаДокумента = КолонкаСуммы Тогда
Продолжить;
КонецЕсли;
ДругаяЯчейка = Документ.Область(СтрокаДокумента, КолонкаДокумента);
ДругоеЧисло = Неопределено;
Если ДругаяЯчейка.СодержитЗначение Тогда
Если ТипЗнч(ДругаяЯчейка.Значение) = Тип("Число") Тогда
ДругоеЧисло = ДругаяЯчейка.Значение;
КонецЕсли;
ИначеЕсли СокрЛП(ДругаяЯчейка.Текст) <> "" Тогда
Попытка
ДругоеЧисло = Число(ДругаяЯчейка.Текст);
Исключение
ДругоеЧисло = Неопределено;
КонецПопытки;
КонецЕсли;
Если ДругоеЧисло <> Неопределено Тогда
ВызватьИсключение "Неожиданные numeric ячейки вне своих двух native колонок";
КонецЕсли;
КонецЦикла;
ЯчейкаДаты = Документ.Область(СтрокаДокумента, КолонкаДаты);
ЯчейкаСуммы = Документ.Область(СтрокаДокумента, КолонкаСуммы);
ТекстДаты = СокрЛП(ЯчейкаДаты.Текст);
Период = Неопределено;
Если ЯчейкаДаты.СодержитЗначение Тогда
Если ТипЗнч(ЯчейкаДаты.Значение) = Тип("Дата") Тогда
Период = ЯчейкаДаты.Значение;
КонецЕсли;
КонецЕсли;
Если Период = Неопределено Тогда
Для Месяц85 = 1 По 3 Цикл
Если ТекстДаты = Формат(Дата(2026, Месяц85, 1), "ДФ=yyyy-MM-dd") Тогда
Период = Дата(2026, Месяц85, 1);
КонецЕсли;
КонецЦикла;
КонецЕсли;
ТекстСуммы = СокрЛП(ЯчейкаСуммы.Текст);
Если Период = Неопределено Тогда
Если ТекстСуммы <> "" И ТекстСуммы <> "Сумма85" Тогда
ВызватьИсключение "Есть ресурс без собственного месяца: дополнительный итог или неожиданная строка";
КонецЕсли;
Продолжить;
КонецЕсли;
Если Период <> Дата(2026, 1, 1) И Период <> Дата(2026, 2, 1) И Период <> Дата(2026, 3, 1)
Или Месяцы.Получить(Период) <> Неопределено Тогда
ВызватьИсключение "Чужая дата или повторная строка месяца в native результате";
КонецЕсли;
ЗначениеРесурса = Неопределено;
Если ЯчейкаСуммы.СодержитЗначение Тогда
ЗначениеРесурса = ЯчейкаСуммы.Значение;
ИначеЕсли ТекстСуммы <> "" Тогда
Попытка
ЗначениеРесурса = Число(ТекстСуммы);
Исключение
ВызватьИсключение "Свой ресурс не является числом или пустым значением";
КонецПопытки;
КонецЕсли;
Пробел = Период = Дата(2026, 2, 1);
Если Пробел Тогда
Если Не Дополнять Или (ТипЗнч(ЗначениеРесурса) <> Тип("Неопределено")
И ТипЗнч(ЗначениеРесурса) <> Тип("Null") И ТипЗнч(ЗначениеРесурса) <> Тип("Число")) Тогда
ВызватьИсключение "Февральский gap допускает только actual Undefined/Null или числовой0, не Bool/String/Date";
КонецЕсли;
Если ТипЗнч(ЗначениеРесурса) = Тип("Число") И ЗначениеРесурса <> 0 Тогда
ВызватьИсключение "Февраль отсутствует в источнике и не может содержать собственную продажу";
КонецЕсли;
Сумма = 0;
Иначе
Если ТипЗнч(ЗначениеРесурса) <> Тип("Число")
Или ЗначениеРесурса <> ?(Период = Дата(2026, 1, 1), 1000, 2000) Тогда
ВызватьИсключение "Не совпали фактические суммы января или марта";
КонецЕсли;
Сумма = ЗначениеРесурса;
КонецЕсли;
Месяцы.Вставить(Период, Новый Структура("Сумма,Пробел,Ресурс,ТекстРесурса", Сумма, Пробел, ЗначениеРесурса, ТекстСуммы));
Всего = Всего + Сумма;
КонецЦикла;
Если Месяцы.Количество() <> ?(Дополнять, 3, 2) Или Всего <> 3000
Или Месяцы.Получить(Дата(2026, 1, 1)) = Неопределено Или Месяцы.Получить(Дата(2026, 3, 1)) = Неопределено Тогда
ВызватьИсключение "Полный фактический native вывод не подтвердил 2→3 месяца и сумму 3000";
КонецЕсли;
Возврат Месяцы;
КонецФункции
Процедура ПроверитьСвоёОформление85(Оформление, ЧисловойФевраль, ИндексФевраля, БезФевраля)
Все = Оформление.ПолучитьВсе();
Даты = Оформление.ПолучитьВсе(Тип("Дата"));
Строки = Оформление.ПолучитьВсе(Тип("Строка"));
Если Все.Количество() <> ?(БезФевраля, 3, 4) Или Даты.Количество() <> ?(БезФевраля, 2, 3) Или Строки.Количество() <> 1
Или Строки.Получить("Маркер85") <> "e9b935fa-64d8-4d5f-a190-01726ddc40ac"
Или Оформление.Получить(Дата(2026, 1, 1)) <> Новый Цвет(34, 112, 180)
Или Оформление.Получить(Дата(2026, 3, 1)) <> Новый Цвет(39, 146, 95) Тогда
ВызватьИсключение "Полный whitelist четырёх собственных ключей и typed GetAll не совпал";
КонецЕсли;
Февраль = Оформление.Получить(Дата(2026, 2, 1));
Если БезФевраля Тогда
Если Февраль <> Неопределено Тогда
ВызватьИсключение "После Clear(Date,True) числовой февраль должен отсутствовать";
КонецЕсли;
ИначеЕсли ЧисловойФевраль Тогда
Если ТипЗнч(Февраль) <> Тип("Число") Или Февраль <> ИндексФевраля Тогда
ВызватьИсключение "Не сохранён действительно выделенный numeric индекс; его номер не угадываем";
КонецЕсли;
ИначеЕсли Февраль <> Новый Цвет(150, 150, 150) Тогда
ВызватьИсключение "Не подтверждён явный серый цвет отсутствующего месяца";
КонецЕсли;
КонецПроцедуры
Функция ПодготовитьСвоёОформление85(Вывод)
Оформление = Вывод.ОформлениеЗначений;
КонтрольныйВывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
КонтрольноеОформление = КонтрольныйВывод.ОформлениеЗначений;
Если ТипЗнч(Оформление) <> Тип("ОформлениеЗначений") Или ТипЗнч(КонтрольноеОформление) <> Тип("ОформлениеЗначений") Тогда
ВызватьИсключение "Native getter не дал typed объект: не выдумываем Новый ОформлениеЗначений";
КонецЕсли;
Если Оформление.ПолучитьВсе().Количество() <> 0 Или КонтрольноеОформление.ПолучитьВсе().Количество() <> 0 Тогда
ВызватьИсключение "Начальное состояние native map не подтверждено пустым; чужие значения не очищаем";
КонецЕсли;
Оформление.Установить(Дата(2026, 1, 1), Новый Цвет(34, 112, 180));
Если КонтрольноеОформление.ПолучитьВсе().Количество() <> 0 Тогда
ВызватьИсключение "Не подтверждена независимость двух собственных getter maps; слепого Clear/rollback нет";
КонецЕсли;
Оформление.Установить(Дата(2026, 3, 1), Новый Цвет(39, 146, 95));
ИндексФевраля = Оформление.Установить(Дата(2026, 2, 1));
Если ТипЗнч(ИндексФевраля) <> Тип("Число") Или ИндексФевраля < 0
Или Оформление.Установить(Дата(2026, 2, 1)) <> ИндексФевраля Тогда
ВызватьИсключение "Один собственный ключ должен сохранить настоящий выделенный индекс";
КонецЕсли;
Оформление.Установить("Маркер85", "e9b935fa-64d8-4d5f-a190-01726ddc40ac");
ПроверитьСвоёОформление85(Оформление, Истина, ИндексФевраля, Ложь);
ПолныйПакет = Оформление.ПолучитьВсе();
Оформление.УстановитьВсе(ПолныйПакет);
ПроверитьСвоёОформление85(Оформление, Истина, ИндексФевраля, Ложь);
Оформление.Очистить(Тип("Дата"), Истина);
ПроверитьСвоёОформление85(Оформление, Ложь, ИндексФевраля, Истина);
Оформление.Установить(Дата(2026, 2, 1), Новый Цвет(150, 150, 150));
ПроверитьСвоёОформление85(Оформление, Ложь, ИндексФевраля, Ложь);
Если КонтрольноеОформление.ПолучитьВсе().Количество() <> 0 Тогда
ВызватьИсключение "Контрольный map изменился после собственного полного процесса";
КонецЕсли;
Возврат Оформление;
КонецФункции
Функция ПостроитьСвоюДиаграмму85(Месяцы, Оформление, ОбратныйПорядок)
Если Месяцы.Количество() <> 3 Или Не Месяцы.Получить(Дата(2026, 2, 1)).Пробел Тогда
ВызватьИсключение "Диаграмма принимает только проверенный настоящий месячный native результат";
КонецЕсли;
Диаграмма = Новый Диаграмма;
Диаграмма.ТипДиаграммы = ТипДиаграммы.Гистограмма;
Точка = Диаграмма.Точки.Добавить("Сумма85");
Для Номер = 1 По 3 Цикл
Месяц85 = ?(ОбратныйПорядок, ?(Номер = 1, 3, ?(Номер = 2, 1, 2)), Номер);
ДатаСерии = Дата(2026, Месяц85, 1);
РеальныйМесяц = Месяцы.Получить(ДатаСерии);
Серия = Диаграмма.Серии.Добавить(Формат(ДатаСерии, "ДФ=yyyy-MM-dd"));
Серия.Значение = ДатаСерии;
Диаграмма.УстановитьЗначение(Точка, Серия, РеальныйМесяц.Сумма);
КонецЦикла;
Диаграмма.ЗаполнитьЦветаСерий(Оформление);
ПроверитьСвоёОформление85(Оформление, Ложь, 0, Ложь);
Всего = 0;
Если Диаграмма.Серии.Количество() <> 3 Или Диаграмма.Точки.Количество() <> 1 Тогда
ВызватьИсключение "Не совпал полный объём собственной диаграммы";
КонецЕсли;
Для Номер = 0 По 2 Цикл
Серия = Диаграмма.Серии.Получить(Номер);
Месяц85 = ?(ОбратныйПорядок, ?(Номер = 0, 3, ?(Номер = 1, 1, 2)), Номер + 1);
ДатаСерии = Дата(2026, Месяц85, 1);
РеальноеЗначение = Диаграмма.ПолучитьЗначение(Точка, Серия).Значение;
Если Серия.Значение <> ДатаСерии Или Серия.Цвет <> Оформление.Получить(ДатаСерии)
Или ТипЗнч(РеальноеЗначение) <> Тип("Число") Или РеальноеЗначение <> Месяцы.Получить(ДатаСерии).Сумма Тогда
ВызватьИсключение "Фактический logical date key, native цвет или значение серии не совпали";
КонецЕсли;
Всего = Всего + РеальноеЗначение;
КонецЦикла;
Если Всего <> 3000 Тогда
ВызватьИсключение "Настоящие значения диаграммы не подтвердили native сумму 3000";
КонецЕсли;
Возврат Диаграмма;
КонецФункции
Функция ВыполнитьСвойУрок85() Экспорт
ПроверитьСвойСтенд85();
UUIDПакета = Новый УникальныйИдентификатор;
Источник = СоздатьИсточник85(UUIDПакета);
ПроверитьИсточник85(Источник, UUIDПакета);
Схема = СоздатьСхему85(Источник);
НастройкиДо = ПодготовитьНастройки85(Схема, Ложь);
МакетДо = Скомпилировать85(Схема, НастройкиДо, Ложь);
ВыводДо = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ДокументДо = ВывестиМесяцы85(МакетДо, Источник, ВыводДо);
ПрочитатьМесяцы85(ДокументДо, Ложь);
ПроверитьИсточник85(Источник, UUIDПакета);
НастройкиПосле = ПодготовитьНастройки85(Схема, Истина);
МакетПосле = Скомпилировать85(Схема, НастройкиПосле, Истина);
ВыводПосле = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
Оформление = ПодготовитьСвоёОформление85(ВыводПосле);
ВыводПосле.ОформлениеЗначений = Оформление;
Если ВыводПосле.ОформлениеЗначений <> Оформление Тогда
ВызватьИсключение "Свой native output property не вернул присвоенный actual typed map";
КонецЕсли;
ДокументПосле = ВывестиМесяцы85(МакетПосле, Источник, ВыводПосле);
Месяцы = ПрочитатьМесяцы85(ДокументПосле, Истина);
Прямая = ПостроитьСвоюДиаграмму85(Месяцы, Оформление, Ложь);
Переставленная = ПостроитьСвоюДиаграмму85(Месяцы, Оформление, Истина);
ПроверитьИсточник85(Источник, UUIDПакета);
ПроверитьСвоёОформление85(Оформление, Ложь, 0, Ложь);
Возврат Новый Структура("До,После,Прямая,Переставленная,Протокол", ДокументДо, ДокументПосле, Прямая, Переставленная,
"Native вывод: 2 → 3 месяца, сумма 3000. Февраль — пробел источника, не новая продажа. Цвета проверены по native сериям; source 2×3 сохранён.");
КонецФункцииПолный модуль своей управляемой общей формы
Общие → Общие формы → МесяцыЦвета85 → Модуль
Windows thick managed client and server context form; own module only.
&НаКлиенте
Процедура Сформировать85(Команда)
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Если Остановка85 Или ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда <> Команды.Сформировать85 Тогда
ВызватьИсключение "Форма остановлена после ошибки: закройте её, не повторяйте частичные действия";
КонецЕсли;
Попытка
СформироватьНаСервере85();
Исключение
Остановка85 = Истина;
Статус85 = "Отказ: результат не подтверждён. Нет автоматического повтора, очистки или отката.";
ВызватьИсключение;
КонецПопытки;
#Иначе
ВызватьИсключение "Урок только для собственного толстого клиента с управляемым приложением";
#КонецЕсли
КонецПроцедуры
&НаСервере
Процедура СформироватьНаСервере85()
Если Остановка85 Тогда
ВызватьИсключение "Серверная граница также запрещает повтор после частичного отказа";
КонецЕсли;
Попытка
Пакет = УчебныеМесяцы85.ВыполнитьСвойУрок85();
До85 = Пакет.До;
После85 = Пакет.После;
Прямая85 = Пакет.Прямая;
Переставленная85 = Пакет.Переставленная;
Статус85 = Пакет.Протокол;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыПолный модуль своего управляемого приложения
Своя конфигурация → Модуль управляемого приложения
Windows thick managed client, real OnStart event0; own application only.
Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентУправляемоеПриложение Тогда
ОткрытьФорму("ОбщаяФорма.МесяцыЦвета85");
#Иначе
ВызватьИсключение "Свой учебный сценарий только в толстом управляемом клиенте";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Подготовьте только свой новый exact FileCF/единственного actual пользователя/общий модуль/форму.
Создайте и целиком проверьте две typed строки с новым UUID пакета; сумму 3000 вычисляют исходные записи.
В новых unbound настройках добавьте два собственных date-параметра, затем свяжите настоящей схемой и проверьте доступные date fields/actual bound values.
БезДополнения → actual compiled макет/вывод/reader подтверждают январь1000 и март2000 без февраля.
Месяц → новый actual compiled объект дополнения с точными датами. Native getter map получает guarded own-empty состояние; исполните полный Set/GetAll/SetAll/Clear(Type,True) workflow.
Прочитайте настоящие месяцы native output: январь1000, февраль-пробел, март2000; не добавляйте февральскую строку в ТаблицаЗначений.
Постройте две диаграммы из actual reader результата, проверив date keys, native значения и цвета каждой переставленной серии; снова сверяйте полный source.
Как проверить результат
Ожидаемые будущие ручные проверки: source2×3 сохранён, native месяцы2→3, actual сумма3000, February.Пробел=True.
GetAll() содержит4 своих ключа, GetAll(Date)3 и GetAll(String)1. Clear(Date,True) оставляет2 date RGB и marker, Feb Get=None. Финально опять4 ключа с explicitGrey.
Дата серии определяет цвет, не её индекс: January RGB34/112/180, March39/146/95, February150/150/150 в обеих диаграммах.
Замените в только своём исходнике доступное поле/границу/тип/UUID/входную сумму/повторное UI действие: нужен явный отказ, не готовый подставленный результат.
Неопределённый/непустой native map или непредвиденный layout — отказ. Статический PASS не доказывает runtime пустоту, renderer layout или успешный запуск 1С.
Ожидаемый результат
Ожидаемый будущий ручной результат: две настоящие исходные продажи на3000, в native отчёте3 календарных месяца с февральским пробелом, стабильные проверенные native цвета date-серий. RuntimeVerified=False: actual1С/compile/DB/UI/network/backup0.
На что обратить внимание
Readonly available-field/layout-container ссылки не заменяются. Наличие RW дочерних свойств не даёт права присваивать Элемент.ДополнениеПериода.
НачалоПериода/КонецПериода в настройках допускают date, field или enum; compiled Начало/Конец допускают date/enum, но не Field. Здесь native compiler обязан разрешить свои date-параметры в actual dates, иначе fail-stop.
Собственные карты не загружаются/не сохраняются в системное хранилище; правило ≤100 keys одного типа и LRU при записи не проверяется этим четырёхключевым memory примером.
Нельзя писать Новый ОформлениеЗначений или считать FillSeriesColors фабрикой. GetAll даёт соответствие, не новый ValueAppearance; неизвестный native default не стираем.
Сервер и толстый клиент поддерживают ValueAppearance методы; внешнее соединение поддерживает output property, но не эти методы, поэтому внешний контекст здесь не разрешён.
Нормализация пустого февральского ресурса в0 служит диаграмме пробела. Она не доказывает реальную февральскую продажу, не меняет источник и не обещает универсальный способ трактовать Null в рабочих данных.
Проверен authored source/static только; реальные 1С, БД, UI, print/export, внешние настройки, файлы и сеть здесь не запускались.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Создать штатный редактор собственного порога и сверить весь состав отчёта
Сервер создаёт редактор единственной собственной пользовательской настройки в подготовленной пустой группе. Завершённый ввод порогов 0→1→3 проверяется по actual параметру события и полному составу деталей. При пороге 3 пустой итог только наблюдается; типизированный/плоский вывод не обещан native и требует ручной проверки.
Где и как запускать
Полный модуль подготовленной управляемой формы собственного отчёта. Все процедуры на уровне модуля, директивы уже включены. Только толстый управляемый desktop-клиент 8.5.1.1343; runtime не проверен.
Подготовка
Никакие приведённые модули здесь не запускались. Статические проверки не компилируют и не запускают 1С, не подтверждают автоматическую разметку СКД, типизированные значения или отображение.
Создайте новую отдельную пустую учебную информационную базу платформы 8.5.1.1343. Имя конфигурации УчебныеФормыОтчетов85, основной режим запуска УправляемоеПриложение, режим совместимости НеИспользовать. Рабочую конфигурацию не используйте.
Создайте отдельного нового учебного пользователя собственной новой базы. Запустите именно толстый клиент в режиме управляемого приложения. Это обязательный desktop-стенд, не тонкий, web или мобильный клиент: native enum РежимОтображенияРезультатаОтчета доступен только в толстом клиенте.
Оставьте интерфейс собственной новой конфигурации Такси. Не меняйте интерфейс, пользователя или режимы окон рабочего сеанса. Дайте новому учебному пользователю права на собственный отчёт и команды; права текущего рабочего пользователя не меняйте.
В дереве конфигурации Отчёты создайте УчебныеТовары85. Реквизитов прикладных объектов, справочников, документов, регистров и записей базы для него не требуется. Модуль объекта отчёта оставьте пустым: события урока принадлежат ФОРМЕ, не объекту отчёта.
Схема полностью создаётся функцией СоздатьСхему в приложенном серверном общем модуле; файловый макет не нужен. Источник УчебныйИсточник имеет ТипИсточникаДанных Local, набор УчебныеТовары является запросом из собственных двух константных строк. Условие Количество > &МинимальноеКоличество, по умолчанию 0.
Свой параметр порога имеет ОписаниеТипов("Число", КвалификаторыЧисла(1,0,Неотрицательный)): только целые 0..9 по описанию, а правила этого опыта допускают лишь 0, 1, 3. Квалификатор передан явно: native запрещает хранить числа в ОписаниеТипов без него. Это наш узкий учебный тип, не универсальный тип количества.
Собственные четыре выбранных поля: Наименование, Количество, Цена, Сумма. Структура содержит только одну используемую группировку без полей группировки, с АвтоВыбраннымПолем: это детальные записи. Единственный ресурс Сумма вычисляется выражением Сумма(Сумма); в его массив Группировки добавлено документированное значение ОбщийИтог. Вложенных группировок и промежуточных итогов нет. Штатное размещение самого итога не считается заранее подтверждённым.
Полный отдельный модуль УчебныеОтчетыФорм85 вставьте в Общие → Общие модули → УчебныеОтчетыФорм85 → Модуль. Включите Сервер, выключите Клиент, Глобальный и Вызов сервера. Экспортные функции вызываются только из серверных обработчиков собственной формы.
Контракт СОБСТВЕННОГО вывода является условием будущего ручного опыта, не обещанием native авторазметки: одна строка с уникальными подписями Наименование, Количество, Цена, Сумма; далее полные детальные строки; один общий итог для непустого набора; вне найденных четырёх колонок нет данных. Максимум 200 строк и 40 колонок — защитная граница нашего reader, не предел платформы.
Числовые ячейки количества, цены, суммы и непустого общего итога должны иметь СодержитЗначение=Истина и Значение типа Число. Reader не устанавливает эти свойства, не исправляет результат и никогда не преобразует текст 750/50/800 в числа. При нарушении условия он выдаёт диагностику, КонтрольПрошел остаётся Ложь.
Сверка читает actual параметр Результат нового события ПослеКомпоновкиРезультата ДО помещения в реквизит. При опыте с режимами второй источник — actual реквизит формы Результат ПОСЛЕ преобразования. Ни исходный запрос, ни повторное вычисление суммы не подменяют эти источники.
В каждой собственной форме создайте дополнительные реквизиты СостояниеУрока и ОтпечатокДоПомещения типа Строка неограниченной длины, КонтрольПрошел типа Булево, ПорогПриКомпоновке и СобытийДо, СобытийПосле, СобытийИзменения типа Число длиной 6, точность 0, неотрицательный.
Для наблюдения создайте поля ПолеСостояния, ПолеКонтроля, ПолеПорога, ПолеСобытийДо, ПолеСобытийПосле, ПолеСобытийИзменения с путями к одноимённым подготовленным реквизитам СостояниеУрока, КонтрольПрошел, ПорогПриКомпоновке, СобытийДо, СобытийПосле, СобытийИзменения. Всем установите ТолькоПросмотр=Истина. Поле отпечатка необязательно: реквизит смотрите в отладчике.
Назначьте в свойствах событий ФОРМЫ ПриСозданииНаСервере → ПриСозданииНаСервере, ПриКомпоновкеРезультата → ПриКомпоновкеРезультата, ПослеКомпоновкиРезультата → ПослеКомпоновкиРезультата, ПриИзмененииНастроек → ПриИзмененииНастроек. Полные сигнатуры уже в модуле. Не назначайте трёхпараметрическое одноимённое событие модуля объекта отчёта.
АвтоматическоеСохранениеДанныхВНастройках собственной формы оставьте НеИспользовать. Не вызывайте сохранение вариантов, настроек, документа, печать или запись данных. Платформа всё же может читать/сохранять системные настройки отчётной формы: новый пользователь и новая база изолируют опыт, но это НЕ обещание отсутствия внутренних операций.
В Отчёты → УчебныеТовары85 → Формы создайте управляемую форму отчёта УчебныйПорог85 (тип формы Отчёта, Основная). В конструкторе выберите стандартную форму отчёта, не общую форму. Основной реквизит Отчет должен иметь тип ОтчетОбъект.УчебныеТовары85 и признак Основной.
Проверьте созданные конструктором реквизит Результат типа ТабличныйДокумент и поле табличного документа с ПутьКДанным=Результат; явно назовите это собственное поле ПолеРезультата. Стандартная команда Сформировать должна иметь штатный результат. Если конструктор дал иные имена, исправьте подготовку на указанные, не добавляйте второй результат и не угадывайте имя.
Полный основной блок вставьте целиком в Отчёты → УчебныеТовары85 → Формы → УчебныйПорог85 → Модуль формы. Замените только исходный пустой/сгенерированный модуль СВОЕЙ новой учебной формы; никакие модули рабочего отчёта не меняйте.
Создайте команды формы СформироватьИПроверить; каждой назначьте одноимённый обработчик из полного модуля и отдельную кнопку. Разместите их вне ПолеРезультата. Стандартные команды сохранения/печати в опыте не используйте.
Полный отдельный модуль запуска ОткрытьУчебныйПорог85 вставьте в Общие → Общие команды → ОткрытьУчебныйПорог85 → Модуль команды. Команду без параметра разместите в командном интерфейсе собственного учебного приложения. Каждый запуск передаёт свежий UUID ключа уникальности и не должен случайно переиспользовать предыдущий экземпляр.
В корне формы создайте собственную пустую обычную группу ГруппаУчебныхНастроек. Не добавляйте внутрь ручные поля: сервер создаст элементы штатно после загрузки схемы/настроек.
У параметра настроек до загрузки установлен непустой ИдентификаторПользовательскойНастройки=УчебныйПорог и ПредставлениеПользовательскойНастройки=Количество больше. Именно этот ID включает параметр в пользовательские настройки; не ищите выдуманные имена автоматически созданных элементов.
Редактируйте только видимый штатный числовой редактор собственной подписи Количество больше. Допустимые опытные значения 0, 1, 3, без дробей. Завершайте ввод выходом из поля до нажатия СформироватьИПроверить; обработчик на сервере также проверяет фактический тип и значение.
ПриИзмененииНастроек отключает стандартную реакцию только этого события, чтобы отчёт не формировался автоматически при вводе. Оно оставляет явную нашу и стандартную команды формирования доступными; глобальные пользовательские настройки автокомпоновки не меняются.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ЭтаФорма.ТипФормыОтчета <> ТипФормыОтчета.Основная Тогда
Отказ = Истина;
ВызватьИсключение "Подготовьте именно управляемую форму отчёта Основная";
КонецЕсли;
ОбъектОтчета = ЭтаФорма.РеквизитФормыВЗначение("Отчет");
Схема = УчебныеОтчетыФорм85.СоздатьСхему();
ОбъектОтчета.СхемаКомпоновкиДанных = Схема;
ОбъектОтчета.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
ОбъектОтчета.КомпоновщикНастроек.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
ЭтаФорма.ЗначениеВРеквизитФормы(ОбъектОтчета, "Отчет");
ЭтаФорма.ПорогПриКомпоновке = 0;
ЭтаФорма.СобытийДо = 0;
ЭтаФорма.СобытийПосле = 0;
ЭтаФорма.СобытийИзменения = 0;
ЭтаФорма.КонтрольПрошел = Ложь;
ЭтаФорма.ОтпечатокДоПомещения = "";
ЭтаФорма.СостояниеУрока = "Собственная схема готова. Контракт штатного вывода ещё не подтверждён";
ЭтаФорма.СоздатьЭлементыФормыПользовательскихНастроек(ЭтаФорма.Элементы.ГруппаУчебныхНастроек, РежимОтображенияНастроекКомпоновкиДанных.Все, 1);
КонецПроцедуры
&НаСервере
Процедура ПриКомпоновкеРезультата(СтандартнаяОбработка)
СтандартнаяОбработка = Истина;
ЭтаФорма.КонтрольПрошел = Ложь;
ЭтаФорма.ОтпечатокДоПомещения = "";
ОбъектОтчета = ЭтаФорма.РеквизитФормыВЗначение("Отчет");
РабочиеНастройки = ОбъектОтчета.КомпоновщикНастроек.ПолучитьНастройки();
ПараметрНастроек = РабочиеНастройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("МинимальноеКоличество"));
Если ПараметрНастроек = Неопределено Тогда
ВызватьИсключение "В фактических настройках нет собственного параметра";
КонецЕсли;
Если Не ПараметрНастроек.Использование Или ТипЗнч(ПараметрНастроек.Значение) <> Тип("Число") Тогда
ВызватьИсключение "Собственный числовой параметр должен использоваться";
КонецЕсли;
Порог = ПараметрНастроек.Значение;
Если Порог <> 0 И Порог <> 1 И Порог <> 3 Тогда
ВызватьИсключение "Завершите ввод одного из учебных порогов 0, 1, 3";
КонецЕсли;
ЭтаФорма.ПорогПриКомпоновке = Порог;
ЭтаФорма.СобытийДо = ЭтаФорма.СобытийДо + 1;
КонецПроцедуры
&НаСервере
Процедура ПослеКомпоновкиРезультата(Результат, СтандартнаяОбработка)
СтандартнаяОбработка = Истина;
ЭтаФорма.СобытийПосле = ЭтаФорма.СобытийПосле + 1;
ЭтаФорма.КонтрольПрошел = Ложь;
Попытка
Прочитанное = УчебныеОтчетыФорм85.ПрочитатьПлоскийРезультат(Результат);
ЭтаФорма.ОтпечатокДоПомещения = УчебныеОтчетыФорм85.ПроверитьСоставИПолучитьОтпечаток(Прочитанное, ЭтаФорма.ПорогПриКомпоновке);
ЭтаФорма.КонтрольПрошел = Истина;
ЭтаФорма.СостояниеУрока = СтрШаблон("Прочитан фактический параметр события: порог %1; детали %2. %3",
ЭтаФорма.ПорогПриКомпоновке, Прочитанное.Детали.Количество(), Прочитанное.НаблюдениеИтога);
Исключение
ЭтаФорма.ОтпечатокДоПомещения = "";
ЭтаФорма.СостояниеУрока = "Контракт фактического вывода не подтверждён: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПриИзмененииНастроек(СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ЭтаФорма.СобытийИзменения = ЭтаФорма.СобытийИзменения + 1;
ЭтаФорма.КонтрольПрошел = Ложь;
ЭтаФорма.СостояниеУрока = "Настройки изменены. Завершите ввод и явно сформируйте новый результат";
КонецПроцедуры
&НаКлиенте
Процедура СформироватьИПроверить(Команда)
До = ЭтаФорма.СобытийДо;
После = ЭтаФорма.СобытийПосле;
ЭтаФорма.СкомпоноватьРезультат(РежимКомпоновкиРезультата.Непосредственно);
Если ЭтаФорма.СобытийДо <> До + 1 Или ЭтаФорма.СобытийПосле <> После + 1 Тогда
ЭтаФорма.КонтрольПрошел = Ложь;
ЭтаФорма.СостояниеУрока = "Проверьте назначения двух событий именно формы отчёта";
КонецЕсли;
Сообщить(ЭтаФорма.СостояниеУрока);
КонецПроцедурыУчебныеОтчетыФорм85
Общие → Общие модули → УчебныеОтчетыФорм85 → Модуль
Полный отдельный серверный общий модуль УчебныеОтчетыФорм85. Только собственная учебная база и толстый управляемый desktop-клиент 8.5.1.1343; фактический запуск 1С не выполнен.
Функция СоздатьСхему() Экспорт
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "УчебныйИсточник";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "УчебныеТовары";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Истина;
Набор.Запрос = "ВЫБРАТЬ
| ""Книга"" КАК Наименование,
| 3 КАК Количество,
| 250 КАК Цена,
| 750 КАК Сумма
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Ручка"", 1, 50, 50";
Настройки = Схема.НастройкиПоУмолчанию;
Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
Выбранное = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбранное.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
Выбранное.Использование = Истина;
КонецЦикла;
Детали = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Детали.Использование = Истина;
АвтоВыбор = Детали.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоВыбор.Использование = Истина;
Набор.Запрос = "ВЫБРАТЬ Товары.Наименование, Товары.Количество, Товары.Цена, Товары.Сумма
|ИЗ (
|ВЫБРАТЬ
| ""Книга"" КАК Наименование,
| 3 КАК Количество,
| 250 КАК Цена,
| 750 КАК Сумма
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Ручка"", 1, 50, 50
|) КАК Товары
|ГДЕ Товары.Количество > &МинимальноеКоличество";
Порог = Схема.Параметры.Добавить();
Порог.Имя = "МинимальноеКоличество";
Порог.Заголовок = "Количество больше";
Порог.ТипЗначения = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(1, 0, ДопустимыйЗнак.Неотрицательный));
Порог.Значение = 0;
Порог.Использование = ИспользованиеПараметраКомпоновкиДанных.Всегда;
Порог.ЗапрещатьНезаполненныеЗначения = Ложь;
Порог.ДоступенСписокЗначений = Ложь;
Порог.ОграничениеИспользования = Ложь;
Порог.ВключатьВДоступныеПоля = Ложь;
Итог = Схема.ПоляИтога.Добавить();
Итог.ПутьКДанным = "Сумма";
Итог.Выражение = "Сумма(Сумма)";
Итог.Группировки.Добавить("ОбщийИтог");
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("МинимальноеКоличество", 0);
ПараметрНастроек = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("МинимальноеКоличество"));
Если ПараметрНастроек = Неопределено Тогда
ВызватьИсключение "Собственная схема не создала параметр порога";
КонецЕсли;
ПараметрНастроек.Использование = Истина;
ПараметрНастроек.ИдентификаторПользовательскойНастройки = "УчебныйПорог";
ПараметрНастроек.ПредставлениеПользовательскойНастройки = "Количество больше";
Возврат Схема;
КонецФункции
Функция ПрочитатьЯчейку(Документ, НомерСтроки, НомерКолонки)
Ячейка = Документ.Область(НомерСтроки, НомерКолонки);
Содержит = Ячейка.СодержитЗначение;
ЗначениеЯчейки = Неопределено;
Если Содержит Тогда
ЗначениеЯчейки = Ячейка.Значение;
КонецЕсли;
Возврат Новый Структура("Текст,Содержит,Значение", СокрЛП(Строка(Ячейка.Текст)), Содержит, ЗначениеЯчейки);
КонецФункции
Функция ЯчейкаПуста(Ячейка)
Возврат Ячейка.Текст = "" И (Не Ячейка.Содержит Или Ячейка.Значение = Неопределено);
КонецФункции
Функция ЧислоЯчейки(Ячейка, ИмяПоля)
Если Не Ячейка.Содержит Тогда
ВызватьИсключение "Нет типизированного значения поля " + ИмяПоля;
КонецЕсли;
Если ТипЗнч(Ячейка.Значение) <> Тип("Число") Тогда
ВызватьИсключение "Тип значения поля " + ИмяПоля + " не Число";
КонецЕсли;
Возврат Ячейка.Значение;
КонецФункции
Функция ПрочитатьПлоскийРезультат(Документ) Экспорт
Если ТипЗнч(Документ) <> Тип("ТабличныйДокумент") Тогда
ВызватьИсключение "Ожидался фактический ТабличныйДокумент";
КонецЕсли;
Высота = Документ.ВысотаТаблицы;
Ширина = Документ.ШиринаТаблицы;
Если Высота = 0 Или Ширина = 0 Или Высота > 200 Или Ширина > 40 Тогда
ВызватьИсключение "Вывод вне ограниченного собственного плоского контракта 200 на 40";
КонецЕсли;
Заголовки = СтрРазделить("Наименование,Количество,Цена,Сумма", ",");
Колонки = Неопределено;
СтрокаЗаголовков = 0;
Для НомерСтроки = 1 По Высота Цикл
Найденные = Новый Структура;
Для НомерКолонки = 1 По Ширина Цикл
Ячейка = ПрочитатьЯчейку(Документ, НомерСтроки, НомерКолонки);
Если Заголовки.Найти(Ячейка.Текст) <> Неопределено Тогда
Если Найденные.Свойство(Ячейка.Текст) Тогда
ВызватьИсключение "Повтор заголовка в одной строке: " + Ячейка.Текст;
КонецЕсли;
Найденные.Вставить(Ячейка.Текст, НомерКолонки);
КонецЕсли;
КонецЦикла;
Если Найденные.Количество() = 4 Тогда
Если Колонки <> Неопределено Тогда
ВызватьИсключение "Несколько полных строк заголовков: вывод неоднозначен";
КонецЕсли;
Колонки = Найденные;
СтрокаЗаголовков = НомерСтроки;
ИначеЕсли Найденные.Количество() <> 0 Тогда
ВызватьИсключение "Неполная строка собственных заголовков";
КонецЕсли;
КонецЦикла;
Если Колонки = Неопределено Тогда
ВызватьИсключение "Четыре собственных заголовка не найдены в одной строке";
КонецЕсли;
Детали = Новый Массив;
ИтогПрочитан = Ложь;
КандидатовИтога = 0;
ЗначениеИтога = Неопределено;
НаблюдениеИтога = "В колонке Сумма отдельная строка итога не обнаружена";
Для НомерСтроки = 1 По Высота Цикл
Для НомерКолонки = 1 По Ширина Цикл
Если НомерКолонки = Колонки.Наименование Или НомерКолонки = Колонки.Количество
Или НомерКолонки = Колонки.Цена Или НомерКолонки = Колонки.Сумма Тогда
Продолжить;
КонецЕсли;
ВнешняяЯчейка = ПрочитатьЯчейку(Документ, НомерСтроки, НомерКолонки);
Если Не ЯчейкаПуста(ВнешняяЯчейка) Тогда
ВызватьИсключение "Есть данные вне четырёх найденных колонок";
КонецЕсли;
КонецЦикла;
Если НомерСтроки = СтрокаЗаголовков Тогда
Продолжить;
КонецЕсли;
Имя = ПрочитатьЯчейку(Документ, НомерСтроки, Колонки.Наименование);
Количество = ПрочитатьЯчейку(Документ, НомерСтроки, Колонки.Количество);
Цена = ПрочитатьЯчейку(Документ, НомерСтроки, Колонки.Цена);
Сумма = ПрочитатьЯчейку(Документ, НомерСтроки, Колонки.Сумма);
Если Не ЯчейкаПуста(Количество) Или Не ЯчейкаПуста(Цена) Тогда
Если Имя.Текст = "" Тогда
ВызватьИсключение "Детальная строка без наименования";
КонецЕсли;
Если НомерСтроки < СтрокаЗаголовков Тогда
ВызватьИсключение "Детальные данные расположены перед заголовками";
КонецЕсли;
Детали.Добавить(Новый Структура("Наименование,Количество,Цена,Сумма", Имя.Текст,
ЧислоЯчейки(Количество, "Количество"), ЧислоЯчейки(Цена, "Цена"), ЧислоЯчейки(Сумма, "Сумма")));
Иначе
Если Имя.Текст <> "" И Имя.Текст <> "Итого" И Имя.Текст <> "Общий итог" И Имя.Текст <> "Всего" Тогда
ВызватьИсключение "Неполная детальная строка или неизвестная подпись: " + Имя.Текст;
КонецЕсли;
Если Не ЯчейкаПуста(Сумма) Или Имя.Текст <> "" Тогда
КандидатовИтога = КандидатовИтога + 1;
Если КандидатовИтога > 1 Тогда
ВызватьИсключение "Несколько итогов без деталей: вывод неоднозначен";
КонецЕсли;
КонецЕсли;
Если Не ЯчейкаПуста(Сумма) Тогда
ЗначениеИтога = ЧислоЯчейки(Сумма, "общий итог Сумма");
ИтогПрочитан = Истина;
НаблюдениеИтога = "Фактический типизированный итог: " + Строка(ЗначениеИтога);
ИначеЕсли Имя.Текст <> "" Тогда
НаблюдениеИтога = "Фактическая подпись " + Имя.Текст + ": ячейка Сумма пуста";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Новый Структура("Детали,ЕстьИтог,Итог,НаблюдениеИтога", Детали, ИтогПрочитан, ЗначениеИтога, НаблюдениеИтога);
КонецФункции
Функция ПроверитьСоставИПолучитьОтпечаток(Прочитанное, Порог) Экспорт
Если ТипЗнч(Порог) <> Тип("Число") Тогда
ВызватьИсключение "Фактический порог не Число";
КонецЕсли;
Если Порог <> 0 И Порог <> 1 И Порог <> 3 Тогда
ВызватьИсключение "В этом опыте допустимы только пороги 0, 1, 3";
КонецЕсли;
КоличествоОжидается = 0;
Если Порог = 0 Тогда
КоличествоОжидается = 2;
ИначеЕсли Порог = 1 Тогда
КоличествоОжидается = 1;
КонецЕсли;
Если Прочитанное.Детали.Количество() <> КоличествоОжидается Тогда
ВызватьИсключение "Фактическое число детальных строк отличается от собственного набора";
КонецЕсли;
Книга = "";
Ручка = "";
Для Каждого Деталь Из Прочитанное.Детали Цикл
Если Деталь.Наименование = "Книга" Тогда
Если Книга <> "" Или Деталь.Количество <> 3 Или Деталь.Цена <> 250 Или Деталь.Сумма <> 750 Тогда
ВызватьИсключение "Неверная или повторная фактическая строка Книга";
КонецЕсли;
Книга = СтрШаблон("Книга;%1;%2;%3", Деталь.Количество, Деталь.Цена, Деталь.Сумма);
ИначеЕсли Деталь.Наименование = "Ручка" Тогда
Если Ручка <> "" Или Порог <> 0 Или Деталь.Количество <> 1 Или Деталь.Цена <> 50 Или Деталь.Сумма <> 50 Тогда
ВызватьИсключение "Неверная, повторная или лишняя фактическая строка Ручка";
КонецЕсли;
Ручка = СтрШаблон("Ручка;%1;%2;%3", Деталь.Количество, Деталь.Цена, Деталь.Сумма);
Иначе
ВызватьИсключение "Неизвестная фактическая детальная строка";
КонецЕсли;
КонецЦикла;
Если Порог < 3 И Книга = "" Тогда
ВызватьИсключение "В фактическом результате отсутствует Книга";
КонецЕсли;
Если Порог = 0 И Ручка = "" Тогда
ВызватьИсключение "В фактическом результате отсутствует Ручка";
КонецЕсли;
Если Порог < 3 Тогда
Если Не Прочитанное.ЕстьИтог Тогда
ВызватьИсключение "Нет отдельного типизированного общего итога";
КонецЕсли;
Если (Порог = 0 И Прочитанное.Итог <> 800) Или (Порог = 1 И Прочитанное.Итог <> 750) Тогда
ВызватьИсключение "Фактический общий итог отличается от собственного набора";
КонецЕсли;
КонецЕсли;
Возврат СтрШаблон("%1|%2|итог:%3:%4|%5", Книга, Ручка,
Прочитанное.ЕстьИтог, Строка(Прочитанное.Итог), Прочитанное.НаблюдениеИтога);
КонецФункцииОткрытьУчебныйПорог85
Общие → Общие команды → ОткрытьУчебныйПорог85 → Модуль команды
Полный отдельный клиентский модуль общей команды запуска именно собственной подготовленной формы отчёта, толстый управляемый desktop-клиент 8.5.1.1343.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОткрытьФорму("Отчет.УчебныеТовары85.Форма.УчебныйПорог85", , , "owned-report-" + Строка(Новый УникальныйИдентификатор));
КонецПроцедурыРазбор по шагам
Откройте ОткрытьУчебныйПорог85. Проверьте, что собственная группа была пустой до единственного серверного вызова СоздатьЭлементыФормыПользовательскихНастроек с режимом Все и одной колонкой.
Визуально найдите редактор Количество больше. Это будущая ручная проверка штатного UI, не тест количества/имён сгенерированных элементов.
Оставьте 0, завершите ввод и нажмите СформироватьИПроверить. Reader должен подтвердить обе полные записи и отдельно фактический итог 800, либо отказать по контракту.
Введите 1 и выйдите из поля. ПриИзмененииНастроек увеличивает свой счётчик и сбрасывает КонтрольПрошел; старое содержимое результата пока не считается новым проверенным отчётом.
Явно сформируйте снова. Фактический порог снимется перед компоновкой; полный состав теперь только Книга 3/250/750 и отдельный typed общий итог 750.
Введите 3, завершите ввод и сформируйте. Обе собственные записи не проходят строгое условие Количество > 3. Reader требует ноль деталей, но не требует значения итога 0 или определённого вида пустого итога.
Для нулевых деталей наблюдайте НаблюдениеИтога: отсутствие отдельной строки, пустая ячейка при подписи или фактический typed итог. Эти варианты не нормализуются к ожидаемому нулю; отсутствие заголовков всё равно означает отказ контракта.
Верните 0 штатным редактором, завершите ввод и явно сформируйте. Полный фактический состав и итог 800 должны восстановиться только при пригодном фактическом выводе.
Как проверить результат
Порог 0: полный фактический набор Книга и Ручка, общий итог 800. Порог 1: ровно Книга, общий итог 750. Порядок детальных строк не принимается за контракт.
Порог 3: ровно ноль детальных строк; наличие/пустота/значение общего итога записывается как фактическое наблюдение, не как гарантированный 0.
СобытийИзменения наблюдается после ручного ввода, но точное число UI-событий не фиксируется: штатная загрузка настроек тоже может его вызвать.
До явного формирования после изменения КонтрольПрошел=Ложь. После сравнивается ПорогПриКомпоновке именно текущего формирования, не предположение о ещё не завершённом вводе.
Нет доступа по выдуманному имени auto-поля, нет обещания конкретного количества auto-элементов. Их реальное размещение и взаимодействие проверьте вручную.
Пороги вне 0/1/3, неверный тип или неиспользуемый параметр не дают положительного контроля. Не снижайте защиту ради неподтверждённого результата.
Ожидаемый результат
Собственная пользовательская настройка проходит полный штатный маршрут ввод → effective настройки → actual детали и отдельный итог → восстановление исходного порога.
На что обратить внимание
Запуск в 1С не подтверждён. Native API-контракты и статические тесты не доказывают, что стандартный генератор даст наш плоский контракт вывода; это обязательная будущая ручная проверка, а не безусловный успешный результат.
При отсутствии уникальных заголовков, полном повторе заголовков, частичной строке, лишних колонках, нескольких итогах или отсутствии typed values reader отказывает. Не удаляйте диагностику ради зелёного сообщения и не преобразуйте текст числа в ожидаемый результат.
Суммы 750/50/800 в проверке — известный контроль собственного константного набора, но сравниваемая сторона прочитана из фактического документа. Независимый BSL-расчёт 3*250+1*50 не подтверждает сформированный отчёт.
Отказ от СтандартнойОбработки в ПослеКомпоновкиРезультата не отменяет действие, а отключает автоматическое компактное преобразование. Урок оставляет Истина; события и реквизит читаются в разные моменты.
Все уроки ограничены толстым управляемым desktop-клиентом: узкая доступность enum режима не расширяется более широкими контекстами методов.
Никакие записи, файлы, печать или сетевые действия примеры явно не выполняют. Это не означает отсутствия внутренних операций системного хранилища платформы; не переносите опыт на рабочего пользователя.
Пустой набор не гарантирует ни ячейку итога, ни 0, ни даже заголовки. Если собственный контракт заголовков отсутствует, это честный отказ reader, а не успешная сверка нулевой таблицы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.