Расширение поля ввода для описания типа.ТипыВВидеДерева

Свойства · TypesAsTree

Тип: Булево. Устанавливает способ отображения типов - в виде дерева или в виде списка. Если Истина, то при редактировании типа доступные типы будут представлены в виде дерева, иначе - в виде списка. По умолчанию указывается способ отображения в виде списка.

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

Расширение поля ввода для описания типа.ТипыВВидеДерева (Text box for type description extension.TypesAsTree)

Расширение поля ввода для описания типа (Text box for type description extension)

ТипыВВидеДерева (TypesAsTree)

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

Использование:
Чтение и запись.
Описание:
Тип: Булево.
Устанавливает способ отображения типов - в виде дерева или в виде списка.
Если Истина, то при редактировании типа доступные типы будут представлены в виде дерева, иначе - в виде списка.
По умолчанию указывается способ отображения в виде списка.
Доступность:

Толстый клиент.

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

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

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

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

Выбрать описание числового типа и построить настоящий счет1000

Самостоятельный полный модуль своей обычной общей формы; настоящие native источники и полная проверка собственного счета.

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

Полный модуль ОбщаяФорма.ОписаниеКолонки85, обычная форма толстого клиента.

Подготовка

  1. Вручную создайте НОВУЮ отдельную файловую ИБ по точному пути C:\1C85_OwnOrdinaryEditors\47a694a9-b495-4d06-9bcc-6d773cc319fd\Base. Это UUID-каталог учебного стенда, не идентификатор рабочей ИБ. Не используйте копию УТ/КА/УНФ/БП, клиент-серверную ИБ или рабочий сеанс. Здесь ничего не создавалось и 1С не запускалась.

  2. Конфигурация Уч85ОбычныеРедакторыСчета: основное приложение Обычное приложение, Режим совместимости Не использовать; платформа8.5.1.1343. Нет BSP, расширений, общих модулей, прикладных объектов и хранилищ. Создайте только одну роль УчебныйАдминистратор85: Администрирование для ПолучитьПользователей, использование своих общих форм и перечисления. Единственный пользователь с тем же именем получает эту роль; нет гостя/другого пользователя.

  3. Создайте Перечисление.ПозицияСчета85 и ровно3 значения В ЭТОМ ПОРЯДКЕ: Книга85 (синоним Книга), Бумага85 (синоним Бумага), Папка85 (синоним Папка). Форм перечисления нет. Это настоящие metadata enum-ссылки, не строки и не ранее существующие записи каталога.

  4. Создайте три Общие формы, вид Обычная: ОписаниеКолонки85, НастройкиПостроителя85, РедакторСчета85. Они не являются формами отчета и не используют поле/табличное поле в качестве владельца. Данные у всех показанных полей ввода и табличных полей оставьте пустыми: модуль задает настоящий native Значение, а не строку произвольного имени переменной.

  5. В выбранной форме добавьте реквизит Состояние85 Строка500 с полем только для просмотра. Все остальные источники существуют в переменных полного модуля и создаются заново ПриОткрытии. Источники не подгружаются из соседней карточки; общий модуль не нужен.

  6. Свяжите обычное событие формы ПриОткрытии с ПриОткрытии() без параметров. Для каждой названной обычной кнопки свяжите Нажатие с одноименной процедурой(Кнопка), ровно один native параметр. Не вызывайте эти события вручную и не передавайте Неопределено вместо кнопки.

  7. Вставьте полный основной модуль этой карточки в точную выбранную общую форму. Остальные две общие формы могут пока оставаться пустыми, если их уроки еще не установлены: они не вызываются и не предоставляют скрытых помощников. В модуле обычного приложения установите полный поддерживающий модуль этой карточки; он открывает только выбранную форму.

  8. Запускайте только собственную новую ИБ в ТОЛСТОМ клиенте с ОБЫЧНЫМ приложением. Сначала вручную проверьте строку соединения и имя пользователя. Guard обязан отказать при другом пути, версии, режиме совместимости, metadata составе или пользователе; guard не является обещанием защиты рабочего окружения от произвольного другого кода.

  9. Добавьте ПолеВвода ТипКоличество85 без Данные и ТабличноеПоле Результат85. Кнопки ПостроитьСчет85 и ПереключитьВид85. ТипЗначения поля ввода станет ОписаниеТипов, его Значение — реальный Number9,0; ДоступныеТипы ограничивает Число/Строка с квалификаторами, составной выбор запрещен.

  10. Числовое значение выбранного ОписаниеТипов НЕ равно числу2. Это схема типа: код использует ее при создании настоящей колонки Количество85, затем заполняет три строки2×250/3×100/4×50.

Перем Начато85;

Процедура ПриОткрытии()
    ПроверитьСреду85();
    Если Начато85 <> Неопределено Тогда
        ВызватьИсключение "Откройте новый экземпляр учебной формы";
    КонецЕсли;
    Начато85 = Истина;
    Ввод85 = ЭлементыФормы.ТипКоличество85;
    Если ТипЗнч(Ввод85) <> Тип("ПолеВвода") Или Ввод85.Имя <> "ТипКоличество85" Или Ввод85.Данные <> "" Тогда
        ВызватьИсключение "Нужно собственное поле ввода без связи с чужими данными";
    КонецЕсли;
    Ввод85.ТипЗначения = Новый ОписаниеТипов("ОписаниеТипов");
    Ввод85.Значение = ЧисловойТип85();
    Ввод85.ДоступныеТипы = Новый ОписаниеТипов("Число,Строка", Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный), Новый КвалификаторыСтроки(20));
    Ввод85.РазрешитьСоставнойТип = Ложь;
    Ввод85.ТипыВВидеДерева = Истина;
    Пересчитать85();
КонецПроцедуры

Процедура ПостроитьСчет85(Кнопка)
    ПроверитьКнопку85(Кнопка, "ПостроитьСчет85");
    Пересчитать85();
КонецПроцедуры

Процедура ПереключитьВид85(Кнопка)
    ПроверитьКнопку85(Кнопка, "ПереключитьВид85");
    Ввод85 = ЭлементыФормы.ТипКоличество85;
    Было85 = XML85(Ввод85.Значение);
    Ввод85.ТипыВВидеДерева = Не Ввод85.ТипыВВидеДерева;
    Если XML85(Ввод85.Значение) <> Было85 Тогда
        ВызватьИсключение "Переключение дерева не должно менять описание типа";
    КонецЕсли;
    Пересчитать85();
КонецПроцедуры

Процедура Пересчитать85()
    Ввод85 = ЭлементыФормы.ТипКоличество85;
    Если Ввод85.РазрешитьСоставнойТип Или XML85(Ввод85.ДоступныеТипы) <> XML85(Новый ОписаниеТипов("Число,Строка", Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный), Новый КвалификаторыСтроки(20))) Тогда
        ВызватьИсключение "Изменились правила выбора собственного типа";
    КонецЕсли;
    Выбранный85 = Ввод85.Значение;
    Если ТипЗнч(Выбранный85) <> Тип("ОписаниеТипов") Тогда
        ВызватьИсключение "Поле должно вернуть настоящее ОписаниеТипов";
    КонецЕсли;
    Если Выбранный85.Типы().Количество() <> 1 Или Не Выбранный85.СодержитТип(Тип("Число"))
        Или XML85(Выбранный85) <> XML85(ЧисловойТип85()) Тогда
        ВызватьИсключение "Для количества выберите только Число9,0 неотрицательное; Строка не подходит арифметике";
    КонецЕсли;
    Результат85 = СтрокиСчета85(Выбранный85);
    Если XML85(Результат85.Колонки.Найти("Количество85").ТипЗначения) <> XML85(Выбранный85) Тогда
        ВызватьИсключение "Описание выбранного типа не использовано в реальной числовой колонке";
    КонецЕсли;
    ПроверитьСтроки85(Результат85, Ложь);
    ПолеВывода85 = ТабличноеПоле85("Результат85");
    ПолеВывода85.Значение = Результат85;
    ПолеВывода85.СоздатьКолонки();
    ПолеВывода85.ТолькоПросмотр = Истина;
    Если ПолеВывода85.Значение <> Результат85 Тогда
        ВызватьИсключение "В таблице показан другой источник";
    КонецЕсли;
    Состояние85 = "Выбранный тип создал числовую колонку. Реальные строки500/300/200, итог1000. Дерево=" + Строка(Ввод85.ТипыВВидеДерева);
КонецПроцедуры

Процедура ПроверитьСреду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", , Новый УникальныйИдентификатор).Открыть();
КонецПроцедуры

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

  1. Подготовьте только указанный собственный FileCF и настоящие controls.

  2. Откройте форму настоящим application callback; initializer строит только собственные объекты в памяти.

  3. Используйте только подготовленные native кнопки и сверяйте реальные source/owner/type/results до и после каждого действия.

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

  1. Первое открытие: реальные enum-коды, количества2/3/4, цены250/100/50, суммы500/300/200; полный итог1000.

  2. ПереключитьВид85 меняет дерево на список и обратно: описание выбранного типа сравнивается целиком через native XML, числа остаются1000.

  3. В штатном выборе собственного поля выберите Строка и нажмите ПостроитьСчет85: отказ ДО создания/привязки новой таблицы. Верните Число9,0 неотрицательное; таблица снова проходит полный typed readback. Отмена штатного выбора не объявляется native Bool: убедитесь, что прежнее Значение и итог сохранены.

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

Рабочая задача отделяет типизацию, настройки интерфейса и настоящее вычисление счета; все PRIMARY употреблены в основном модуле своей формы.

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

  1. Код только написан и проверяется статически: actual1С/UI/БД/сеть/печать/хранилища не выполнялись. Отрисовку и реальные callbacks проверяйте лично в подготовленной новой ИБ; резервные копии не создавались.

  2. Это обычные ПолеВвода/ТабличноеПоле толстого клиента, НЕ управляемые ПолеФормы/ТаблицаФормы. ТипЗначения можно записать только у несвязанного контрола; для связанного Данные это readonly. Value/Data недоступны, если control сам назначен владельцем формы — поэтому владелец здесь только обычная форма.

  3. Режимы дерева, отображения полей/именованных настроек, доступа к интерактивному порядку и ограничений доступных полей меняют интерфейс редактора. Это не фильтр счета, не security, не запрет использования поля в схеме; числа проверяются отдельным настоящим процессором.

  4. После частичной ошибки настройки не обещаны атомарность или rollback. Закройте свой экземпляр и откройте новый; чужие UI настройки не очищаются. Sticky отказ этапов СКД нельзя сбросить повторным initializer.

  5. Параметрические ограничения6937 НЕ используются и не кредитуются: хотя English alias совпадает с available-fields extension, их реальный тип другой; Add3445 имеет противоречивый native return. FIELD5998 берется только из своего настоящего ДоступныеПоляКомпоновкиДанных, Add3286 возвращает именно FieldRestriction.

  6. Оформление в коллекционном выводе не объявляется видимым цветом: реальные данные результата проверяются независимо; пользователь видит политики и именованные элементы только в настоящем редакторе. Не создавайте новый control-extension/type из неизвестного конструктора.

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

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

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

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

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