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