Ограничить настоящее системное перечисление и разобрать пустой список

Учебные задачи

Полный модуль собственной обычной формы: реальные элементы правильного контекста, точные свойства/события и подробная проверка UI/RAM без запуска1С при подготовке справочника.

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

Полный модуль обычной формы ОпытЭлементов85 в новом стенде УчебныеРасширенияЭлементов85. Только толстый Windows-клиент с обычными формами; не управляемый/серверный модуль.

Подготовка

  1. Новая пустая конфигурация УчебныеРасширенияЭлементов85, платформа8.5.1.1343, обычное приложение и толстый Windows-клиент с обычными формами. Не управляемая форма, не серверный модуль, не рабочая УТ/КА/УНФ.

  2. Обработки → ОпытЭлементов85: реквизит СогласенНаСвоюФорму85 Булево и для табличного урока Товары85 ТаблицаЗначений. Создайте обычную форму Форма; основной код — полный модуль этой формы.

  3. На главной панели заранее разместите флажок Подтверждение85, Данные=СогласенНаСвоюФорму85, и обычную кнопку УчебнаяКоманда85. Расположите их выше будущих учебных полей; форму/панель сделайте достаточного размера не менее120×70 логических единиц.

  4. Свяжите ПриОткрытии формы с одноимённой процедурой без параметров. Нажатие УчебнаяКоманда85 в редакторе не назначайте: полный код задаёт Новый Действие с точным именем экспортной процедуры.

  5. У обработчика Нажатие обычной кнопки в форме есть первый параметр Элемент, хотя базовая страница Кнопка.Нажатие показывает Нажатие(). Это добавление расширения элемента, расположенного в форме; не убирайте параметр.

  6. Для системного урока Режим85 НЕ создавайте заранее. Настоящий ПолеВвода добавляется через ЭлементыФормы.Добавить, ни с реквизитом обработки, ни с документом не связывается. ТипЗначения задаёт именно РежимЗаписиДокумента, затем расширение ДоступныеЗначения ограничивает реальные значения.

  7. Для панельного урока Контейнер85/Первое85/Второе85 НЕ создавайте заранее. Это три собственных динамических элемента: настоящая вложенная Панель и два ПолеВвода на ней. Ни поле, ни таблица не назначается владельцем формы.

  8. Координаты/ширина/высота — логические единицы относительно собственной панели, не пиксели экрана. Первый редактор имеет6/6/68/6 и правую привязку к своей панели шириной80; второй расположен ниже.

  9. Для табличного урока добавьте только ТабличноеПоле Таблица85 с Данные=Товары85. Остальные его колонки создаёт код; заранее настроенные колонки рабочей формы не используются.

  10. Доплата85 — новая отдельная колонка интерфейса, не колонка ТаблицаЗначений Товары85; её Данные не назначаются. ТипЗначения разрешается менять только у этого несвязанного редактора, не у связанных Наименование/Количество/Цена/Сумма.

  11. ПриИзменении поля ввода в колонке имеет первый параметр Элемент от расширения табличного поля; базовый ПриИзменении() дополнительных параметров не имеет. Экспортная ДоплатаИзменена85(Элемент) назначается реальному редактору, напрямую вручную не вызывается.

  12. Каждый урок — отдельная новая форма или полная замена её модуля; одноимённые ПриОткрытии не склеиваются. Переменные состояния обычного модуля формы не переносите в общий серверный модуль.

  13. F7 и обновление только своего стенда. Откройте собственную форму, подтвердите флажком опыт и выполните будущие ручные проверки. Системный режим записи в данном уроке лишь выбранное значение интерфейса: документов и проведения нет.

  14. runtimeVerifiedScenarios=0:1С/GUI здесь не запускались, поля/события/привязки реально не выполнялись, базы/метаданные конфигураций не изменялись и новые резервные копии/архивы не создавались.

Процедура ПриОткрытии()
    ПроверитьСвойСтенд85();
    СогласенНаСвоюФорму85 = Ложь;
    Если ЭтаФорма.ЭлементыФормы.Найти("Режим85") <> Неопределено Тогда
        ВызватьИсключение "Своё имя Режим85 уже занято; существующий элемент не используется";
    КонецЕсли;
    Поле = ЭтаФорма.ЭлементыФормы.Добавить(Тип("ПолеВвода"), "Режим85", Истина, ЭтаФорма.Панель);
    Поле.ТипЗначения = Новый ОписаниеТипов("РежимЗаписиДокумента");
    Поле.Лево = 6;
    Поле.Верх = 18;
    Поле.Ширина = 55;
    Поле.Высота = 6;
    Поле.КнопкаВыбора = Истина;
    Поле.Значение = РежимЗаписиДокумента.Запись;
    Варианты = Новый СписокЗначений;
    Варианты.Добавить(РежимЗаписиДокумента.Запись, "Только записать");
    Варианты.Добавить(РежимЗаписиДокумента.Проведение, "Записать и провести");
    Поле.ДоступныеЗначения = Варианты;
    Если Поле.ДоступныеЗначения.Количество() <> 2
        Или Поле.ДоступныеЗначения.Получить(0).Значение <> РежимЗаписиДокумента.Запись
        Или Поле.ДоступныеЗначения.Получить(1).Значение <> РежимЗаписиДокумента.Проведение Тогда
        ВызватьИсключение "Реальный список системного поля должен содержать два значения в собственном порядке";
    КонецЕсли;
    Кнопка = ЭтаФорма.ЭлементыФормы.УчебнаяКоманда85;
    Кнопка.УстановитьДействие("Нажатие", Новый Действие("ПереключитьОграничение85"));
    Сообщить("Выберите режим в собственном поле. Первое нажатие снимает ограничение, второе возвращает два значения. Документ не создаётся и не записывается.");
КонецПроцедуры

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

Процедура ПроверитьСвойСтенд85()
КонецПроцедуры

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

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

  1. В своём обычном модуле форма/версия проверяются, имя Режим85 должно отсутствовать.

  2. Настоящее свободное ПолеВвода создаётся на главной панели, ТипЗначения принимает описание системного перечисления.

  3. Список содержит сами Запись/Проведение в нужном порядке, подписи не заменяют значения.

  4. Команда после согласия заменяет ограничение пустым списком: доступны все три системных значения.

  5. Возвращая ограничение, текущее значение сначала устанавливают в разрешённую Запись.

  6. Реальное выбранное значение и число элементов ограничения выводятся; запись документа отсутствует.

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

  1. Создан настоящий Режим85 нужного типа, не строковый список статусов.

  2. Начальный порядок Запись/Проведение подтверждён.

  3. После первого нажатия пустой список допускает все значения, включая ОтменаПроведения.

  4. После второго список снова содержит2 значения и текущее значение Запись.

  5. Никакой документ или операция проведения не вызываются.

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

Ожидаемые результаты относятся только к будущему отдельно разрешённому ручному опыту в собственном толстом клиенте. runtimeVerifiedScenarios=0.

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

  1. Три расширения с внутренним названием Расширение — разные контексты: системное перечисление в поле, расположение на панели и редактор колонки. Это не устанавливаемые расширения конфигурации CFE.

  2. Новый Расширение не существует. Дополнительные члены появляются у настоящего элемента нужного вида/местоположения. Поля и панель создаются документированным ЭлементыФормы.Добавить, редактор колонки получается из ЭлементУправления.

  3. ДоступныеЗначения — именно СписокЗначений для системного перечисления, не общий СписокВыбора строкового статуса. Порядок списка соответствует порядку выбора; пустой список означает все значения, не запрет всех.

  4. Ограничение клиента не является бизнес-правом. Код не записывает документ и не подтверждает возможность проведения; выбранное РежимЗаписиДокумента только учебное значение.

  5. ТипЗначения самостоятельного поля меняется лишь без связи с данными. Значение передаётся самим системным перечислением, не его текстовым представлением.

  6. Владельцем своей формы не назначается поле ввода или таблица: такая роль делает некоторые свойства расширения панели/формы недоступными. Код предназначен обычной собственной форме обработки.

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

  8. УстановитьПривязку с одной границей снимает её привязки. Перед геометрией сбрасываются четыре старые привязки, затем справа задаётся своя жёсткая привязка.

  9. Реальная компоновка зависит от темы/масштаба. Урок проверяет изменение ширины в логических единицах с допуском0.5, но не выдаёт статический аудит за реальную проверку пикселей.

  10. АктивизироватьПоУмолчанию в установленной RU-справке помечено Только чтение, хотя примечание обсуждает установку. Код только читает реальный Булево-признак; текущий фокус меняется через ТекущийЭлемент, не запись в readonly.

  11. ПорядокОбхода задаёт маршрут фокуса, ПорядокОтображения — перекрытие элементов. Их нельзя подменять индексом коллекции или значением своего товара.

  12. Видимость скрывает собственное поле, но не удаляет значение и не защищает данные. Свертка допускается лишь для поддерживаемого вида/направления; здесь второе ПолеВвода сворачивается вниз.

  13. Значение редактора колонки относится к текущему вводу. У несвязанной Доплата85 нет сохранённого значения в каждой строке ТаблицаЗначений; это демонстрация разового пересчёта, не готовая долговременная модель наценок.

  14. Запись ТипЗначения редактора запрещена у связанных колонок. Для изменения типов данных меняют собственную схему ТаблицаЗначений отдельно, а не свойства связанной ячейки.

  15. ПолучитьДействие возвращает Действие, не строку имени процедуры. Проверка типа подтверждает наличие назначенного объекта; реальную работу доказывает отдельный будущий ввод и счётчик события.

  16. Программное присваивание Значение не вызывает ПриИзменении. Код не имитирует событие прямым вызовом обработчика и не обещает рекурсивный повтор из-за нормализации числа.

  17. Экспортный обработчик реального события имеет точную сигнатуру: Элемент передаётся первым расширением формы/табличного поля. Не путайте базовую справку события с итоговой сигнатурой в месте размещения.

  18. В табличном уроке проверяется принадлежность текущей строки своей таблице. Количество/цена/сумма живут только в RAM; никаких объектов базы, SQL-записей или документов нет.

  19. Для первой проверки нужно ровно одно интерактивное изменение доплаты10 у Книги. Если изменили другую строку/несколько значений, переоткройте свою форму для исходного состояния.

  20. Статические проверки не запускают интерфейс1С: runtimeVerifiedScenarios=0. Новых архивов/резервных копий нет; ограничения GUI и события требуют отдельного разрешённого ручного опыта.

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

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

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

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

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