Выбрать один товар и отметить несколько в отдельных legacy-диалогах

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

На своём отдельном стенде с разрешённой модальностью строим список из фиксированного массива, обрабатываем две разные отмены и не путаем пометку списка с удалением данных.

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

Полный обычный клиентский общий модуль УчебныеСписки85 в отдельном legacy-стенде; обычный толстый клиент с заранее разрешённой модальностью.

Подготовка

  1. НОВАЯ отдельная файловая база 8.5.1.1343: конфигурация УчебныеМодальныеСписки85, совместимость НеИспользовать, обычное приложение, толстый обычный клиент. Не использовать рабочую базу и не менять ради примера её режим модальности. Здесь runtimeVerifiedScenarios=0.

  2. Только в собственной новой конфигурации заранее установите РежимИспользованияМодальности=Использовать. Это специальный legacy-стенд для синхронных методов, не рекомендация для современной управляемой формы или веб-клиента.

  3. Общий модуль УчебныеСписки85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, остальные клиентские флаги=Нет, Привилегированный=Нет. Полный основной модуль вставляется целиком. Обработка УчебныеСписки85 → обычная основная форма Пульт → кнопка Выполнить с действием ВыполнитьНажатие; полный модуль формы ниже.

  4. Не нужны справочники, записи товаров и документы: Книга/Ручка/Тетрадь и ключи 1/2/3 создаются в памяти. F7 и обновление только этого собственного стенда, затем Пульт обычного толстого клиента. Не запускайте в веб-клиенте.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойКонтекст();
    Если Метаданные.РежимИспользованияМодальности <> Метаданные.СвойстваОбъектов.РежимИспользованияМодальности.Использовать Тогда
        ВызватьИсключение "Этот отдельный legacy-стенд должен заранее разрешать модальность; настройки чужой базы не меняем";
    КонецЕсли;
    Источник = Новый Массив;
    Источник.Добавить("Книга");
    Источник.Добавить("Ручка");
    Источник.Добавить("Тетрадь");
    Названия = Новый ФиксированныйМассив(Источник);
    Если Названия.ВГраница() <> Названия.Количество() - 1 Или Названия.ВГраница() <> 2 Тогда
        ВызватьИсключение "У трёх значений последний индекс два, не три";
    КонецЕсли;
    Пустой = Новый ФиксированныйМассив(Новый Массив);
    Если Пустой.ВГраница() <> -1 Тогда
        ВызватьИсключение "Для пустого массива верхняя граница должна быть минус один";
    КонецЕсли;
    Список = Новый СписокЗначений;
    Если Названия.Количество() > 0 Тогда
        Для Индекс = 0 По Названия.ВГраница() Цикл
            Список.Добавить(Индекс + 1, Названия[Индекс], Ложь);
        КонецЦикла;
    КонецЕсли;
    Выбранный = Список.ВыбратьЭлемент("Один учебный товар", Список.Получить(0));
    Если Выбранный = Неопределено Тогда
        Сообщить("Первый диалог отменён; поля отсутствующего элемента не читаем.");
        Возврат;
    КонецЕсли;
    Сообщить("Выбран " + Выбранный.Представление + "; внутренний ключ " + Строка(Выбранный.Значение));
    Если Не Список.ОтметитьЭлементы("Отметьте несколько учебных товаров") Тогда
        Для Каждого Элемент Из Список Цикл
            Элемент.Пометка = Ложь;
        КонецЦикла;
        Сообщить("Второй диалог отменён; свои локальные пометки явно возвращены к исходным Ложь.");
        Возврат;
    КонецЕсли;
    Отмеченные = Новый Массив;
    Для Каждого Элемент Из Список Цикл
        Если Элемент.Пометка Тогда
            Отмеченные.Добавить(Элемент.Представление);
        КонецЕсли;
    КонецЦикла;
    Если Отмеченные.Количество() = 0 Тогда
        Сообщить("ОК нажат, но ничего не отмечено. Это допустимый отдельный результат.");
    Иначе
        Сообщить("Отмечены: " + СтрСоединить(Отмеченные, ", "));
    КонецЕсли;
    Сообщить("Пометка элемента списка — флажок в памяти, не ПометкаУдаления объекта базы.");
КонецПроцедуры

Процедура ПроверитьСвойКонтекст()
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Нужен собственный стенд УчебныеМодальныеСписки85 платформы 8.5.1.1343";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
    КонецЕсли;
КонецПроцедуры
УчебныеСписки85.Пульт

УчебныеМодальныеСписки85 → Обработки → УчебныеСписки85 → Формы → Пульт → Модуль

Полный модуль своей обычной формы; не выполнялся.

Процедура ВыполнитьНажатие(Кнопка)
    УчебныеСписки85.ВыполнитьПример();
КонецПроцедуры

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

  1. Проверяем собственный контекст и заранее разрешённую модальность. Свойство метаданных только читается: код не меняет режим конфигурации, чтобы заставить чужую базу принять устаревший диалог.

  2. Новый ФиксированныйМассив получает обязательный обычный Массив. Три имени имеют индексы 0/1/2; ВГраница равна Количество()-1. Для пустого массива это -1, а не допустимая позиция для чтения.

  3. Перед индексным циклом отдельно проверяем ненулевое количество. ВГраница задаёт включённую верхнюю границу, список получает внутренние числовые ключи 1/2/3 и независимые строковые представления.

  4. ВыбратьЭлемент получает заголовок и существующий элемент этого же списка для начального позиционирования. Возвращает ЭлементСпискаЗначений или Неопределено; при отмене поля не читаются и второй диалог не открывается.

  5. ОтметитьЭлементы возвращает Булево: Истина означает ОК, но не означает, что отмечен хоть один товар. После ОК самостоятельно обходим Пометка каждого локального элемента и собираем отмеченные представления.

  6. При отмене второго диалога не предполагаем, что платформа откатила все локальные флажки. Явно возвращаем свои первоначальные Ложь и прекращаем опыт; чужих исходных значений здесь нет.

  7. Пометка элемента СпискаЗначений — локальный UI-флажок. Не вызываем УстановитьПометкуУдаления, ПолучитьОбъект или Записать у товаров: объекты информационной базы вообще не создавались.

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

  1. Будущий тест на отдельном legacy-стенде: F7, выбрать Книга, во втором диалоге отметить Книга/Тетрадь и нажать ОК. Ожидается вывод этих двух названий без операций над базой.

  2. Отмена первого окна даёт сообщение и немедленный выход; обращений к Выбранный.Значение при Неопределено нет.

  3. Отмена второго окна возвращает только свои локальные флажки к исходным Ложь. В новом запуске создаётся новый список, не сохраняется прежняя отметка.

  4. ОК без флажков — допустимый результат с отдельным сообщением, а не ошибка и не отмена.

  5. ВГраница для трёх значений равна 2, для пустого равна -1. При НеИспользовать guard должен отказать; не меняйте рабочую конфигурацию, используйте документированные ПоказатьВыборЭлемента/ПоказатьОтметкуЭлементов или async-варианты в других уроках.

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

Будущий результат зависит от действий человека в двух своих диалогах; никакого выбора, удаления товаров или записи базы здесь не выполнялось.

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

  1. Синхронные модальные методы не универсальны: веб-клиент не заявлен в их доступности, НеИспользовать требует немодального API. Урок специально отделён от управляемой навигационной формы.

  2. ВыбратьЭлемент возвращает элемент, не его Значение и не Булево. ОтметитьЭлементы возвращает Булево, а список изменяется через локальные пометки.

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

  4. Пометка списка не равна ПометкаУдаления бизнес-объекта. Не переносите destructive-часть примера из справки на собственные товары.

  5. Фиксированный массив не допускает изменения состава, но не является общей гарантией глубокого копирования вложенных объектов. Здесь только строки.

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

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

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

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

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