Создает объект по тексту запроса построителя отчета.
Синтаксис
Новый ПостроительОтчета(<ТекстЗапроса>)Полное описание, параметры и ограничения
ПостроительОтчета.По умолчанию
ПостроительОтчета (ReportBuilder)
Инициализация текстом запроса построителя отчета
Доступен, начиная с версии 8.0.
Синтаксис:
Новый ПостроительОтчета(<ТекстЗапроса>)
Параметры:
<ТекстЗапроса> (необязательный)
Тип: Строка.
Исходный текст запроса.
Описание:
Создает объект по тексту запроса построителя отчета.
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Управлять редактированием: Отбор
В своей обычной форме получаем НастройкаОтбора из настоящего типизированного табличного поля. Меняем разрешения, не удаляя сами данные.
Где и как запускать
Полный модуль новой обычной формы учебной внешней обработки, толстый клиент 8.5.1.1343.
Подготовка
Отдельная собственная конфигурация УчебнаяКонфигурацияСинтаксиса, платформа 8.5.1.1343, толстый клиент с обычными формами. Не управляемая форма и не мобильный клиент.
Создайте отдельную учебную внешнюю обработку и её обычную основную форму. В реквизитах формы добавьте УчебныеДанные с типом Отбор; это реквизит формы, не реквизит документа.
В редакторе формы добавьте ТабличноеПоле с именем ТаблицаНастроек. Свойство Данные свяжите с УчебныеДанные. Расширение определяется типом этих данных, а не ручным созданием класса расширения.
Добавьте обычную кнопку УчебнаяКоманда, назначьте действие УчебнаяКоманда. Событие формы ПриОткрытии свяжите с процедурой ПриОткрытии. Вставьте полный модуль на уровне формы.
Откройте форму и до нажатия кнопки проверьте доступность СвойПорог и СвояКатегория. Нажатие учебной кнопки показывает операции коллекции разрешений и затем очищает только эти разрешения.
Правила доступности интерфейса не являются правами на данные, RLS или запретом программного изменения. Код не записывает базу, не читает рабочие каталоги и не меняет чужие формы.
Это поле связано с Отбор собственного построителя, не с СправочникСписок или ДокументСписок. Для настройки отбора динамического списка Добавить недоступен; данный урок туда не переносить.
Перем ИсходноеКоличество;
Перем Построитель;
Процедура ПриОткрытии()
Данные = Новый ТаблицаЗначений;
Данные.Колонки.Добавить("Категория", Новый ОписаниеТипов("Строка"));
Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
Данные.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Данные.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
Данные.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
Образцы = Новый Массив;
Образцы.Добавить(Новый Структура("Категория,Наименование,Количество,Цена", "Канцелярия", "Книга", 3, 250));
Образцы.Добавить(Новый Структура("Категория,Наименование,Количество,Цена", "Канцелярия", "Ручка", 1, 50));
Образцы.Добавить(Новый Структура("Категория,Наименование,Количество,Цена", "Упаковка", "Коробка", 2, 30));
Для Каждого Образец Из Образцы Цикл
СтрокаДанных = Данные.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаДанных, Образец);
СтрокаДанных.Сумма = СтрокаДанных.Количество * СтрокаДанных.Цена;
КонецЦикла;
Описание = Новый ОписаниеИсточникаДанных(Данные);
Для Каждого Колонка Из Описание.Колонки Цикл
Колонка.Поле = Истина;
Колонка.Отбор = Истина;
Колонка.Порядок = Истина;
Колонка.Измерение = Колонка.Имя = "Категория";
КонецЦикла;
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Описание;
Построитель.ЗаполнитьНастройки();
Построитель.ИзмеренияСтроки.Очистить();
Построитель.ИзмеренияКолонки.Очистить();
Построитель.ВыбранныеПоля.Очистить();
Построитель.ВыбранныеПоля.Добавить("Наименование", "Товар");
Построитель.ВыбранныеПоля.Добавить("Количество", "Количество");
Построитель.ВыбранныеПоля.Добавить("Сумма", "Сумма");
УчебныеДанные = Построитель.Отбор;
Порог = УчебныеДанные.Добавить("Количество", "СвойПорог", "Количество от двух");
Категория = УчебныеДанные.Добавить("Категория", "СвояКатегория", "Только канцелярия");
Если Порог = Неопределено Или Категория = Неопределено Тогда
ВызватьИсключение "Не созданы собственные условия отбора";
КонецЕсли;
Порог.ВидСравнения = ВидСравнения.БольшеИлиРавно;
Порог.Установить(2, Истина);
Категория.Установить("Канцелярия", Истина);
ИсходноеКоличество = 0;
Для Каждого СобственныйЭлемент Из УчебныеДанные Цикл
ИсходноеКоличество = ИсходноеКоличество + 1;
КонецЦикла;
Поле = ЭтаФорма.ЭлементыФормы.ТаблицаНастроек;
Управление = Поле.НастройкаОтбора;
Управление.Очистить();
Управление.Добавить("СвойПорог", Ложь);
Управление.Добавить("СвояКатегория", Истина);
Сообщить("До кнопки: СвойПорог недоступно для интерактивного изменения, СвояКатегория доступно");
КонецПроцедуры
Процедура УчебнаяКоманда(Кнопка)
Поле = ЭтаФорма.ЭлементыФормы.ТаблицаНастроек;
Управление = Поле.НастройкаОтбора;
Первое = Управление.Найти("СвойПорог");
Второе = Управление.Найти("СвояКатегория");
Если Первое = Неопределено Или Второе = Неопределено Тогда
ВызватьИсключение "Откройте свою форму заново: собственные разрешения уже очищены";
КонецЕсли;
Сообщить(Управление.Количество() = 2);
Сообщить(Первое.Имя = "СвойПорог");
Сообщить(НЕ Первое.Доступность);
Сообщить(Второе.Доступность);
Сообщить(Управление.Индекс(Второе) = 1);
Сообщить(Управление.Получить(0) = Первое);
Сообщить(Управление.Найти("НетТакойУчебнойНастройки") = Неопределено);
Первое.Доступность = Истина;
Сообщить(Первое.Доступность);
Управление.Удалить(Второе);
Сообщить(Управление.Количество() = 1);
Управление.Очистить();
Сообщить(Управление.Количество() = 0);
ТекущееКоличество = 0;
Для Каждого СобственныйЭлемент Из УчебныеДанные Цикл
ТекущееКоличество = ТекущееКоличество + 1;
КонецЦикла;
Сообщить(ТекущееКоличество = ИсходноеКоличество);
Сообщить("Очистили только коллекцию разрешений, собственные исходные настройки сохранились");
Построитель.Выполнить();
Результат = Построитель.Результат.Выгрузить();
Сообщить(Результат.Количество() = 1);
Сообщить(Результат[0].Наименование = "Книга");
Сообщить(Результат.Итог("Сумма") = 750);
КонецПроцедурыРазбор по шагам
Создать собственные данные нужного типа и связать их с обычным табличным полем через свойство Данные в редакторе формы.
Получить настоящий объект управления из расширения поля: у этого класса нет конструктора. Добавить своё запрещённое и разрешённое имя.
После ручной проверки интерфейса нажать кнопку. Найти свои элементы по именам, проверить позиции и включить доступность первого.
Удалить второй элемент разрешения, затем очистить только коллекцию разрешений. Сверить количество исходных настроек, а не принимать Очистить за удаление данных.
Повторный запуск требует заново открыть только свою форму: кнопка уже очистила созданные правила доступности.
Как проверить результат
Одиннадцать проверок коллекции разрешений и сохранения исходных настроек дают Истина.
До кнопки проверьте недоступность первого и доступность второго собственного элемента в реальном обычном поле. После кнопки ограничения очищены; исходные данные не удалены.
Ещё три проверки настоящего результата дают Истина: после очистки разрешений условия отбора остаются, результат содержит только Книгу на 750.
Ожидаемый результат
Полный подключённый к обычному редактору пример доступности с собственной типизированной формой и сохранением исходных настроек.
На что обратить внимание
Класс управления и класс исходных данных разные. У элемента управления Имя только читается, Доступность изменяется.
Свойство расширения поля только читается как ссылка на коллекцию. Не присваивайте Поле.НастройкаОтбора = Новый ... и не создавайте несуществующий конструктор.
Очистить разрешения не отключает существующий отбор и не удаляет исходные правила, области или параметры.
Статические проверки пособия подтверждают имена API и структуру кода, но не поведение конкретного редактора обычной формы: его проверяет пользователь в своей учебной базе.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Настроить реальный редактор построителя и отличить UI порядок от сортировки счета
Самостоятельный полный модуль своей обычной общей формы; настоящие native источники и полная проверка собственного счета.
Где и как запускать
Полный модуль ОбщаяФорма.НастройкиПостроителя85, обычная форма толстого клиента.
Подготовка
Вручную создайте НОВУЮ отдельную файловую ИБ по точному пути C:\1C85_OwnOrdinaryEditors\47a694a9-b495-4d06-9bcc-6d773cc319fd\Base. Это UUID-каталог учебного стенда, не идентификатор рабочей ИБ. Не используйте копию УТ/КА/УНФ/БП, клиент-серверную ИБ или рабочий сеанс. Здесь ничего не создавалось и 1С не запускалась.
Конфигурация Уч85ОбычныеРедакторыСчета: основное приложение Обычное приложение, Режим совместимости Не использовать; платформа8.5.1.1343. Нет BSP, расширений, общих модулей, прикладных объектов и хранилищ. Создайте только одну роль УчебныйАдминистратор85: Администрирование для ПолучитьПользователей, использование своих общих форм и перечисления. Единственный пользователь с тем же именем получает эту роль; нет гостя/другого пользователя.
Создайте Перечисление.ПозицияСчета85 и ровно3 значения В ЭТОМ ПОРЯДКЕ: Книга85 (синоним Книга), Бумага85 (синоним Бумага), Папка85 (синоним Папка). Форм перечисления нет. Это настоящие metadata enum-ссылки, не строки и не ранее существующие записи каталога.
Создайте три Общие формы, вид Обычная: ОписаниеКолонки85, НастройкиПостроителя85, РедакторСчета85. Они не являются формами отчета и не используют поле/табличное поле в качестве владельца. Данные у всех показанных полей ввода и табличных полей оставьте пустыми: модуль задает настоящий native Значение, а не строку произвольного имени переменной.
В выбранной форме добавьте реквизит Состояние85 Строка500 с полем только для просмотра. Все остальные источники существуют в переменных полного модуля и создаются заново ПриОткрытии. Источники не подгружаются из соседней карточки; общий модуль не нужен.
Свяжите обычное событие формы ПриОткрытии с ПриОткрытии() без параметров. Для каждой названной обычной кнопки свяжите Нажатие с одноименной процедурой(Кнопка), ровно один native параметр. Не вызывайте эти события вручную и не передавайте Неопределено вместо кнопки.
Вставьте полный основной модуль этой карточки в точную выбранную общую форму. Остальные две общие формы могут пока оставаться пустыми, если их уроки еще не установлены: они не вызываются и не предоставляют скрытых помощников. В модуле обычного приложения установите полный поддерживающий модуль этой карточки; он открывает только выбранную форму.
Запускайте только собственную новую ИБ в ТОЛСТОМ клиенте с ОБЫЧНЫМ приложением. Сначала вручную проверьте строку соединения и имя пользователя. Guard обязан отказать при другом пути, версии, режиме совместимости, metadata составе или пользователе; guard не является обещанием защиты рабочего окружения от произвольного другого кода.
Добавьте настоящие ТабличноеПоле Поля85 и Порядок85, ПолеТабличногоДокумента Документ85 и кнопки ПереключитьНастройки85, ОграничитьПорядок85. Документ85 только для просмотра; никакие отчеты/макеты не нужны.
Код строит ОписаниеИсточникаДанных из собственного TV: Код85 имеет настоящий тип ПеречислениеСсылка.ПозицияСчета85, Название85 содержит реальную Строка(Код85). Меняется лишь путь descriptor-колонки Название85 на Код85.Представление; это договор зависимости колонок, не попытка прочитать .Представление у произвольной строки.
Поля85.Значение получает именно Builder.ДоступныеПоля, Порядок85.Значение — именно Builder.Порядок. После этого СоздатьКолонки. НастройкаПорядка читается из настоящего Порядок85, а не заменяется Новый НастройкаПорядка.
Перем Начато85;
Перем СвоиСтроки85;
Перем СвоеОписание85;
Перем СвойПостроитель85;
Перем ИсходныйXML85;
Перем ПолитикаИзменена85;
Процедура ПриОткрытии()
ПроверитьСреду85();
Если Начато85 <> Неопределено Тогда
ВызватьИсключение "Нужен новый экземпляр собственной формы";
КонецЕсли;
Начато85 = Истина;
СвоиСтроки85 = СтрокиСчета85(ЧисловойТип85());
ПроверитьСтроки85(СвоиСтроки85, Ложь);
ИсходныйXML85 = XML85(СвоиСтроки85);
СвоеОписание85 = Новый ОписаниеИсточникаДанных(СвоиСтроки85);
Если СвоеОписание85.Колонки.Количество() <> 5 Тогда
ВызватьИсключение "Описание должно создаться из всех пяти колонок собственного источника";
КонецЕсли;
Представлений85 = 0;
Для Каждого ОписаниеКолонки85 Из СвоеОписание85.Колонки Цикл
Если СвоиСтроки85.Колонки.Найти(ОписаниеКолонки85.Имя) = Неопределено Тогда
ВызватьИсключение "Колонка описания не принадлежит своему источнику";
КонецЕсли;
ОписаниеКолонки85.Поле = Истина;
ОписаниеКолонки85.Порядок = Истина;
ОписаниеКолонки85.Измерение = ОписаниеКолонки85.Имя = "Код85";
Если ОписаниеКолонки85.Имя = "Название85" Тогда
ОписаниеКолонки85.ПутьКДанным = "Код85.Представление";
Представлений85 = Представлений85 + 1;
Иначе
ОписаниеКолонки85.ПутьКДанным = ОписаниеКолонки85.Имя;
КонецЕсли;
КонецЦикла;
Если Представлений85 <> 1 Тогда
ВызватьИсключение "Нет единственной зависимой колонки представления";
КонецЕсли;
СвойПостроитель85 = Новый ПостроительОтчета;
СвойПостроитель85.ИсточникДанных = СвоеОписание85;
СвойПостроитель85.ВыбранныеПоля.Добавить("Сумма85", "Сумма85");
СвойПостроитель85.Порядок.Добавить("Количество85", "Количество85", "Количество", НаправлениеСортировки.Убыв);
СвойПостроитель85.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
СвойПостроитель85.ВыводитьЗаголовокОтчета = Ложь;
СвойПостроитель85.ВыводитьПодвалОтчета = Ложь;
СвойПостроитель85.ВыводитьШапкуТаблицы = Ложь;
СвойПостроитель85.ВыводитьПодвалТаблицы = Ложь;
СвойПостроитель85.ВыводитьОбщиеИтоги = Ложь;
СвойПостроитель85.ВыводитьДетальныеЗаписи = Истина;
Поля85 = ТабличноеПоле85("Поля85");
Поля85.Значение = СвойПостроитель85.ДоступныеПоля;
Поля85.СоздатьКолонки();
Порядок85 = ТабличноеПоле85("Порядок85");
Порядок85.Значение = СвойПостроитель85.Порядок;
Порядок85.СоздатьКолонки();
УстановитьВид85(Истина);
ПолитикаИзменена85 = Ложь;
ПроверитьИВывести85();
КонецПроцедуры
Процедура УстановитьВид85(Подробно85)
Поля85 = ТабличноеПоле85("Поля85");
Если Поля85.Значение <> СвойПостроитель85.ДоступныеПоля Тогда
ВызватьИсключение "Табличное поле должно редактировать поля именно своего построителя";
КонецЕсли;
Поля85.ОтображатьПоля = Истина;
Поля85.ОтображатьИзмерения = Подробно85;
Поля85.ОтображатьОтбор = Подробно85;
Поля85.ОтображатьПорядок = Подробно85;
Если Не Поля85.ОтображатьПоля Или Поля85.ОтображатьИзмерения <> Подробно85
Или Поля85.ОтображатьОтбор <> Подробно85 Или Поля85.ОтображатьПорядок <> Подробно85 Тогда
ВызватьИсключение "Отображение собственного редактора не подтвердилось";
КонецЕсли;
КонецПроцедуры
Процедура ПереключитьНастройки85(Кнопка)
ПроверитьКнопку85(Кнопка, "ПереключитьНастройки85");
УстановитьВид85(Не ЭлементыФормы.Поля85.ОтображатьИзмерения);
ПроверитьИВывести85();
КонецПроцедуры
Процедура ОграничитьПорядок85(Кнопка)
ПроверитьКнопку85(Кнопка, "ОграничитьПорядок85");
Если ПолитикаИзменена85 Тогда
ВызватьИсключение "Политика уже проверена; для повтора откройте новую форму";
КонецЕсли;
Порядок85 = ТабличноеПоле85("Порядок85");
Если Порядок85.Значение <> СвойПостроитель85.Порядок Тогда
ВызватьИсключение "Чужой источник списка порядка";
КонецЕсли;
Управление85 = Порядок85.НастройкаПорядка;
Если ТипЗнч(Управление85) <> Тип("НастройкаПорядка") Тогда
ВызватьИсключение "Нужна реальная readonly коллекция управления своего элемента";
КонецЕсли;
Для Каждого Правило85 Из Управление85 Цикл
Если Правило85.Имя <> "Количество85" И Правило85.Имя <> "Сумма85" И Правило85.Имя <> "Код85" И Правило85.Имя <> "Цена85" Тогда
ВызватьИсключение "Неизвестная политика интерактивного порядка";
КонецЕсли;
КонецЦикла;
ПолитикаИзменена85 = Истина;
ПравилоСуммы85 = Управление85.Найти("Сумма85");
Если ПравилоСуммы85 = Неопределено Тогда
ПравилоСуммы85 = Управление85.Добавить("Сумма85", Истина);
КонецЕсли;
ПравилоСуммы85.Доступность = Ложь;
Если Управление85.Найти("Сумма85") <> ПравилоСуммы85 Или ПравилоСуммы85.Имя <> "Сумма85" Или ПравилоСуммы85.Доступность Тогда
ВызватьИсключение "Не сохранилась политика собственного интерактивного порядка";
КонецЕсли;
ПроверитьИВывести85();
КонецПроцедуры
Процедура ПроверитьИВывести85()
ПроверитьСтроки85(СвоиСтроки85, Ложь);
Если XML85(СвоиСтроки85) <> ИсходныйXML85 Или СвойПостроитель85.ИсточникДанных <> СвоеОписание85 Тогда
ВызватьИсключение "Изменился полный собственный источник";
КонецЕсли;
Для Каждого ОписаниеКолонки85 Из СвоеОписание85.Колонки Цикл
Если ОписаниеКолонки85.ПутьКДанным <> ?(ОписаниеКолонки85.Имя = "Название85", "Код85.Представление", ОписаниеКолонки85.Имя) Тогда
ВызватьИсключение "Не совпали все реальные пути описания источника";
КонецЕсли;
КонецЦикла;
КодПоля85 = СвойПостроитель85.ДоступныеПоля.Найти("Код85");
Если КодПоля85 = Неопределено Тогда
ВызватьИсключение "Нет родительского поля собственного кода";
КонецЕсли;
ЕстьПредставление85 = Ложь;
Для Каждого Дочернее85 Из КодПоля85.Поля Цикл
Если Дочернее85.ПутьКДанным = "Код85.Представление" Тогда
ЕстьПредставление85 = Истина;
КонецЕсли;
КонецЦикла;
Если Не ЕстьПредставление85 Или СвойПостроитель85.Порядок.Количество() <> 1 Тогда
ВызватьИсключение "Нет настоящей зависимости или изменился реальный порядок";
КонецЕсли;
РеальныйПорядок85 = СвойПостроитель85.Порядок.Получить(0);
Если РеальныйПорядок85.Имя <> "Количество85" Или РеальныйПорядок85.Направление <> НаправлениеСортировки.Убыв Тогда
ВызватьИсключение "UI политика не заменяет настоящий порядок построителя";
КонецЕсли;
Если СвойПостроитель85.ВыбранныеПоля.Количество() <> 1 Или СвойПостроитель85.ВыбранныеПоля.Получить(0).ПутьКДанным <> "Сумма85" Тогда
ВызватьИсключение "Изменился реальный состав вывода построителя";
КонецЕсли;
Документ85 = Новый ТабличныйДокумент;
СвойПостроитель85.Выполнить();
СвойПостроитель85.Вывести(Документ85);
Если Документ85.ВысотаТаблицы < 1 Или Документ85.ВысотаТаблицы > 12 Или Документ85.ШиринаТаблицы <> 1 Тогда
ВызватьИсключение "Нужна одна фактическая колонка суммы без неизвестного оформления";
КонецЕсли;
Числа85 = Новый Массив;
Для Ряд85 = 1 По Документ85.ВысотаТаблицы Цикл
Ячейка85 = Документ85.Область(Ряд85, 1);
Если Ячейка85.СодержитЗначение И ТипЗнч(Ячейка85.Значение) = Тип("Число") Тогда
Числа85.Добавить(Ячейка85.Значение);
КонецЕсли;
КонецЦикла;
Если Числа85.Количество() <> 3 Тогда
ВызватьИсключение "Нужны три реально выведенные суммы";
КонецЕсли;
Для Индекс85 = 0 По 2 Цикл
Если Числа85[Индекс85] <> СвоиСтроки85[2 - Индекс85].Сумма85 Тогда
ВызватьИсключение "Нативный вывод не совпал с независимым порядком4/3/2 и суммами200/300/500";
КонецЕсли;
КонецЦикла;
Если XML85(СвоиСтроки85) <> ИсходныйXML85 Тогда
ВызватьИсключение "Нативный построитель изменил полный исходный счет";
КонецЕсли;
ЭлементыФормы.Документ85.Значение = Документ85;
Состояние85 = "Native вывод200/300/500. Отображение и разрешение UI не заменили реальную сортировку. Полный исходный счет1000 сохранен.";
КонецПроцедуры
Процедура ПроверитьСреду85()
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1C85_OwnOrdinaryEditors\47a694a9-b495-4d06-9bcc-6d773cc319fd\Base"";" Тогда
ВызватьИсключение "Нужна собственная новая файловая учебная ИБ по точному пути";
КонецЕсли;
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Не совпали версия, конфигурация или режим совместимости";
КонецЕсли;
Если Метаданные.ОбщиеФормы.Количество() <> 3 Или Метаданные.Перечисления.Количество() <> 1
Или Метаданные.Роли.Количество() <> 1 Или Метаданные.Роли.Найти("УчебныйАдминистратор85") = Неопределено Тогда
ВызватьИсключение "Нужны только три собственные общие формы, перечисление и учебная роль";
КонецЕсли;
Для Каждого ИмяФормы85 Из СтрРазделить("ОписаниеКолонки85,НастройкиПостроителя85,РедакторСчета85", ",") Цикл
Если Метаданные.ОбщиеФормы.Найти(ИмяФормы85) = Неопределено Тогда
ВызватьИсключение "Нет собственной общей формы";
КонецЕсли;
КонецЦикла;
СвоеПеречисление85 = Метаданные.Перечисления.Найти("ПозицияСчета85");
Если СвоеПеречисление85 = Неопределено Тогда
ВызватьИсключение "Нет собственного перечисления";
КонецЕсли;
Имена85 = СтрРазделить("Книга85,Бумага85,Папка85", ",");
Если СвоеПеречисление85.ЗначенияПеречисления.Количество() <> 3 Тогда
ВызватьИсключение "Нужны ровно три собственных значения перечисления";
КонецЕсли;
Для Индекс85 = 0 По 2 Цикл
Если СвоеПеречисление85.ЗначенияПеречисления.Получить(Индекс85).Имя <> Имена85[Индекс85] Тогда
ВызватьИсключение "Изменился состав собственного перечисления";
КонецЕсли;
КонецЦикла;
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0
Или Метаданные.Отчеты.Количество() <> 0 Или Метаданные.Обработки.Количество() <> 0
Или Метаданные.ОбщиеМодули.Количество() <> 0 Или Метаданные.Константы.Количество() <> 0
Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0
Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0
Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0
Или Метаданные.ХранилищаНастроек.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Прикладные объекты и хранилища в этом стенде запрещены";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Расширения запрещены";
КонецЕсли;
Пользователь85 = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователи85 = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если Пользователь85 = Неопределено Или Пользователи85.Количество() <> 1 Тогда
ВызватьИсключение "Нужен единственный реальный учебный пользователь";
КонецЕсли;
Если Пользователь85.Имя <> "УчебныйАдминистратор85"
Или Пользователи85[0].УникальныйИдентификатор <> Пользователь85.УникальныйИдентификатор Тогда
ВызватьИсключение "Не совпал собственный пользователь";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьКнопку85(Кнопка, Имя85)
ПроверитьСреду85();
Если ТипЗнч(Кнопка) <> Тип("Кнопка") Или Кнопка.Имя <> Имя85 Или Кнопка <> ЭлементыФормы[Имя85] Тогда
ВызватьИсключение "Команда должна прийти от собственной настоящей кнопки";
КонецЕсли;
КонецПроцедуры
Функция ТабличноеПоле85(Имя85)
ПолеТаблицы85 = ЭлементыФормы[Имя85];
Если ТипЗнч(ПолеТаблицы85) <> Тип("ТабличноеПоле") Или ПолеТаблицы85.Имя <> Имя85 Или ПолеТаблицы85.Данные <> "" Тогда
ВызватьИсключение "Нужно свое настоящее обычное табличное поле без связи Данные";
КонецЕсли;
Возврат ПолеТаблицы85;
КонецФункции
Функция СтрокиСчета85(ТипКоличества85)
Строки85 = Новый ТаблицаЗначений;
Строки85.Колонки.Добавить("Код85", Новый ОписаниеТипов("ПеречислениеСсылка.ПозицияСчета85"));
Строки85.Колонки.Добавить("Название85", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(20)));
Строки85.Колонки.Добавить("Количество85", ТипКоличества85);
Денежный85 = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный));
Строки85.Колонки.Добавить("Цена85", Денежный85);
Строки85.Колонки.Добавить("Сумма85", Денежный85);
Коды85 = Новый Массив;
Коды85.Добавить(Перечисления.ПозицияСчета85.Книга85);
Коды85.Добавить(Перечисления.ПозицияСчета85.Бумага85);
Коды85.Добавить(Перечисления.ПозицияСчета85.Папка85);
Для Индекс85 = 0 По 2 Цикл
Строка85 = Строки85.Добавить();
Строка85.Код85 = Коды85[Индекс85];
Строка85.Название85 = Строка(Строка85.Код85);
Строка85.Количество85 = Индекс85 + 2;
Строка85.Цена85 = ?(Индекс85 = 0, 250, ?(Индекс85 = 1, 100, 50));
Строка85.Сумма85 = Строка85.Количество85 * Строка85.Цена85;
КонецЦикла;
Возврат Строки85;
КонецФункции
Функция ЧисловойТип85()
Возврат Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный));
КонецФункции
Функция XML85(Объект85)
Писатель85 = Новый ЗаписьXML;
Писатель85.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(Писатель85, Объект85);
Возврат Писатель85.Закрыть();
КонецФункции
Процедура ПроверитьСтроки85(Результат85, ТолькоКнига85)
Если ТипЗнч(Результат85) <> Тип("ТаблицаЗначений") Или Результат85.Колонки.Количество() <> 5
Или Результат85.Количество() <> ?(ТолькоКнига85, 1, 3) Тогда
ВызватьИсключение "Неверный тип или полный размер фактического счета";
КонецЕсли;
Для Каждого Имя85 Из СтрРазделить("Код85,Название85,Количество85,Цена85,Сумма85", ",") Цикл
Если Результат85.Колонки.Найти(Имя85) = Неопределено Тогда
ВызватьИсключение "Нет фактической колонки счета";
КонецЕсли;
КонецЦикла;
Эталон85 = СтрокиСчета85(ЧисловойТип85());
Увидено85 = Новый Соответствие;
Итог85 = 0;
Для Каждого Факт85 Из Результат85 Цикл
Если ТипЗнч(Факт85.Код85) <> Тип("ПеречислениеСсылка.ПозицияСчета85") Или Увидено85.Получить(Факт85.Код85) <> Неопределено Тогда
ВызватьИсключение "Чужой тип кода или повторенная строка";
КонецЕсли;
Исходная85 = Эталон85.Найти(Факт85.Код85, "Код85");
Если Исходная85 = Неопределено Тогда
ВызватьИсключение "Код не принадлежит собственным трем строкам";
КонецЕсли;
Если ТолькоКнига85 И Факт85.Код85 <> Перечисления.ПозицияСчета85.Книга85 Тогда
ВызватьИсключение "В фильтр попала другая позиция";
КонецЕсли;
Для Каждого Имя85 Из СтрРазделить("Название85,Количество85,Цена85,Сумма85", ",") Цикл
Если ТипЗнч(Факт85[Имя85]) <> ТипЗнч(Исходная85[Имя85]) Или Факт85[Имя85] <> Исходная85[Имя85] Тогда
ВызватьИсключение "Не совпала фактическая ячейка исходного счета";
КонецЕсли;
КонецЦикла;
Увидено85.Вставить(Факт85.Код85, Истина);
Итог85 = Итог85 + Факт85.Количество85 * Факт85.Цена85;
КонецЦикла;
Если Итог85 <> ?(ТолькоКнига85, 500, 1000) Или Результат85.Итог("Сумма85") <> Итог85 Тогда
ВызватьИсключение "Не совпали независимый пересчет и реальные суммы всех строк";
КонецЕсли;
КонецПроцедурыМодуль обычного приложения: открытие только НастройкиПостроителя85
Конфигурация → Модуль обычного приложения. Событие ПриНачалеРаботыСистемы; ровно0параметров.
Процедура ПриНачалеРаботыСистемы()
ПолучитьОбщуюФорму("НастройкиПостроителя85", , Новый УникальныйИдентификатор).Открыть();
КонецПроцедурыРазбор по шагам
Подготовьте только указанный собственный FileCF и настоящие controls.
Откройте форму настоящим application callback; initializer строит только собственные объекты в памяти.
Используйте только подготовленные native кнопки и сверяйте реальные source/owner/type/results до и после каждого действия.
Как проверить результат
Фактический построитель выводит200/300/500 в одну колонку: реальная сортировка количества по убыванию4/3/2. Нативные ячейки читаются, не заполняются контрольными числами.
Переключите компактный/подробный редактор: ОтображатьПоля остаетсяИстина, остальные три флага совместноFalse/True с readback; реальный вывод остается200/300/500 и полный источник1000.
ОграничитьПорядок85 отключает только интерактивное добавление собственной Сумма85 через реальное правило Доступность. Свой уже заданный native порядок Количество85 убыванием сохраняется и повторный native вывод подтверждает его; результат не подменяется сортировкой исходного TV.
Повтор ограничения отказывает. Чужой путь descriptor/поле/порядок или лишняя политика отказывает, неизвестные элементы не удаляются. Если нативное отображение имеет неожиданную ширину/числа, код честно отказывает — статический тест не доказывает формат actual UI.
Ожидаемый результат
Рабочая задача отделяет типизацию, настройки интерфейса и настоящее вычисление счета; все PRIMARY употреблены в основном модуле своей формы.
На что обратить внимание
Код только написан и проверяется статически: actual1С/UI/БД/сеть/печать/хранилища не выполнялись. Отрисовку и реальные callbacks проверяйте лично в подготовленной новой ИБ; резервные копии не создавались.
Это обычные ПолеВвода/ТабличноеПоле толстого клиента, НЕ управляемые ПолеФормы/ТаблицаФормы. ТипЗначения можно записать только у несвязанного контрола; для связанного Данные это readonly. Value/Data недоступны, если control сам назначен владельцем формы — поэтому владелец здесь только обычная форма.
Режимы дерева, отображения полей/именованных настроек, доступа к интерактивному порядку и ограничений доступных полей меняют интерфейс редактора. Это не фильтр счета, не security, не запрет использования поля в схеме; числа проверяются отдельным настоящим процессором.
После частичной ошибки настройки не обещаны атомарность или rollback. Закройте свой экземпляр и откройте новый; чужие UI настройки не очищаются. Sticky отказ этапов СКД нельзя сбросить повторным initializer.
Параметрические ограничения6937 НЕ используются и не кредитуются: хотя English alias совпадает с available-fields extension, их реальный тип другой; Add3445 имеет противоречивый native return. FIELD5998 берется только из своего настоящего ДоступныеПоляКомпоновкиДанных, Add3286 возвращает именно FieldRestriction.
Оформление в коллекционном выводе не объявляется видимым цветом: реальные данные результата проверяются независимо; пользователь видит политики и именованные элементы только в настоящем редакторе. Не создавайте новый control-extension/type из неизвестного конструктора.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.