Получить реальные данные выбора задачи: Равно и В списке

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

Две собственные записи внутри отменяемой транзакции: обязательные параметры быстрого выбора, скалярный/коллекционный отбор, значения/представления и отсутствие совпадений.

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

Полный серверный общий модуль УчебныйЦикл85, собственный пустой стенд УчебныеДанныеВыбора85; отдельный управляемый клиентский модуль вызова.

Подготовка

  1. Новая пустая конфигурация УчебныеДанныеВыбора85 на платформе8.5.1.1343, управляемое приложение и толстый клиент Windows. Это другой стенд, не УчебныеФормыМенеджера85.

  2. УчебнаяЗадача85: номер Строка9 с автонумерацией, Наименование100. УчебныйПроцесс85: номер Строка9, автонумерация, Задача=УчебнаяЗадача85; карта Старт → Опыт85 → Финиш без адресации/обработчиков.

  3. У обоих объектов Маркер85 Строка36, Индексирование=Индексировать, без обязательного заполнения. Исследуемый вид перед опытом пуст, нет чужих или ранее сохранённых записей.

  4. Модули объектов, менеджеров и точек пустые: нет ПередЗаписью с запретом из урока форм и нет ОбработкаПолученияДанныхВыбора. Запрос выбора должен выполнять стандартную обработку.

  5. У своего вида включите стандартный быстрый выбор. Поля Ввод по строке: Наименование у задачи, Номер у процесса; поиск строки здесь выключен значением Неопределено.

  6. Общие → Общие модули → УчебныйЦикл85: Сервер и ВызовСервера Истина, Глобальный/Привилегированный Ложь, остальные флаги и повторное использование выключены. Вставьте весь основной код одного урока.

  7. Обработки → Запуск85 → управляемая форма Форма: ПодтверждаюПустойСтенд85 и Занято85 Булево исходно Ложь, Итог85 Строка неограниченной длины только для просмотра.

  8. Назначьте команду ВыполнитьПример85 кнопке и установите Действие=ВыполнитьСвойЦикл85. Вставьте отдельный полный модуль формы из дополнительного блока; процедура ВыполнитьСвойЦикл85 передаёт согласие в УчебныйЦикл85.ВыполнитьПример85.

  9. F7 и обновление только своего стенда. runtimeVerifiedScenarios=0: 1С, серверный вызов, запись/выбор/откат здесь не выполнялись.

  10. Код сам создаёт две разные плановые ссылки, проверяет их незанятость, создаёт настоящие объекты, пишет их только в свою транзакцию и откатывает её.

  11. После согласия будущий ручной опыт сравнивает4 результата: скалярный маркер2, массив двух ссылок2, массив одной ссылки1, отсутствующий маркер0.

  12. Не выносите результат в живую форму выбора во время транзакции, не добавляйте ФиксироватьТранзакцию и не копируйте код в рабочую базу.

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

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

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

Полный модуль своей управляемой формы: согласие, занятость и серверный вызов УчебныйЦикл85.ВыполнитьПример85.

&НаКлиенте
Процедура ВыполнитьСвойЦикл85(Команда)
    Если Не ПодтверждаюПустойСтенд85 Или Занято85 Тогда
        ВызватьИсключение "Нужно собственное подтверждение и отсутствие другого опыта";
    КонецЕсли;
    Занято85 = Истина;
    Попытка
        Итог85 = УчебныйЦикл85.ВыполнитьПример85(ПодтверждаюПустойСтенд85);
    Исключение
        Занято85 = Ложь;
        Итог85 = ОписаниеОшибки();
        ВызватьИсключение;
    КонецПопытки;
    Занято85 = Ложь;
КонецПроцедуры

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

  1. Проверка стенда, согласия, версии, отсутствия чужой транзакции и пустого собственного вида выполняется до создания записей.

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

  3. Параметры содержат обязательные Отбор и СтрокаПоиска. Неопределено означает быстрый выбор без строкового поиска; ОграничиватьСтрокуПоиска=Истина не снимает защиту поиска.

  4. Скалярный Маркер85 задаёт Равно и возвращает свою пару. Каждое значение реально имеет ссылочный тип данного учебного вида и непустое пользовательское представление.

  5. Массив в Отбор.Ссылка задаёт В списке. Сначала две ссылки, затем после удаления второго элемента из массива только первая; состав списка проверяется, порядок не предполагается.

  6. Несуществующий собственный маркер возвращает пустой СписокЗначений, а не Неопределено и не пустую ссылку.

  7. Собственная транзакция откатывается при успехе и ошибке. После отката проверяется отсутствие обоих собственных объектов; ни одно выбранное значение не выдаётся за сохранённую бизнес-запись.

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

  1. Получены количества2,2,1,0 с правильными реальными собственными ссылками.

  2. Результат каждого вызова — СписокЗначений; элементы имеют Значение своего ссылочного типа и непустое Представление.

  3. Список одной ссылки содержит только первую; повторные/посторонние значения приводят к исключению.

  4. Скалярный отбор и массив ссылок объясняются разными сравнениями, без ручного построения строки запроса.

  5. После отката оба ПолучитьОбъект возвращают Неопределено; нет незакрытой транзакции, старта маршрута, выполнения или удаления.

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

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

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

  1. СписокЗначений состоит из элементов; ссылкой является Элемент.Значение, а текстом Элемент.Представление. Сам элемент не равен бизнес-ссылке.

  2. Отбор и СтрокаПоиска обязательны даже для быстрого выбора. Неопределено в СтрокаПоиска — не отсутствие результата и не произвольная пустая строка.

  3. Для Массив/ФиксированныйМассив/СписокЗначений в значении отбора применяется В списке, для скаляра Равно. В этом уроке массив содержит только реальные собственные ссылки.

  4. Параметры.Отбор содержит тот же массив СвоиСсылки; Удалить(1) меняет его в памяти. Это удаление элемента массива, не удаление записи базы.

  5. Нет гарантии порядка стандартных данных выбора; проверяется принадлежность/число уникальных ссылок, не позиция отображения.

  6. Метод менеджера получает ровно один объект параметров. Два аргумента могут переадресовать вызов глобальному ПолучитьДанныеВыбора; это другой контракт.

  7. Метод вызывает ОбработкаПолученияДанныхВыбора менеджера. Свой пустой модуль сохраняет стандартную обработку; произвольный рабочий обработчик может изменить результаты или сделать внешнее действие.

  8. Это не универсальный поиск всех записей: результат зависит от настроек выбора, прав и обработчика. Для полного произвольного набора используйте отдельный запрос/выборку.

  9. 32 слова/1000 символов относятся к ограничениям строкового поиска. Урок не отключает ограничения и не включает полнотекстовый поиск.

  10. Два созданных объекта не запускают маршрут и не выполняют задачу. Флаги исполнения только исходные, они не присваиваются для имитации.

  11. Откат отменяет собственные записи, но не произвольные внешние побочные действия. Поэтому нужен новый стенд без обработчиков/подписок/обмена, не рабочая база.

  12. После отката прежние ссылочные значения больше не обозначают существующие записи. Не передавайте их в рабочий интерфейс как сохранённые объекты.

  13. Статические проверки не подтверждают запуск сервера, запись, выбор или откат. runtimeVerifiedScenarios=0, реальных действий1С, сети, файлов и новых резервных копий нет.

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

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

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

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

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