Найти свои процессы по реальным ключам и проверить состав выборки

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

Собственная пара УчебныйПроцесс85: реальные присвоенные номера, уникальные поисковые коды, индексированный отбор и выборка по смешанному источнику ссылок с последующим откатом.

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

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

Подготовка

  1. Создайте новую пустую конфигурацию УчебныйПоискЗадач85 на платформе8.5.1.1343, управляемое приложение и толстый клиент Windows. Рабочие базы и существующие задачи не используются.

  2. Задачи → УчебнаяЗадача85: номер Строка9, автонумерация, Наименование100; Маркер85 Строка36, КодПоиска85 Строка50, без обязательного заполнения.

  3. Бизнес-процессы → УчебныйПроцесс85: номер Строка9 с автонумерацией и непериодической, сквозной нумерацией; Маркер85 Строка36, КодПоиска85 Строка50. Задача=УчебнаяЗадача85.

  4. У обоих видов реквизитов Маркер85 и КодПоиска85 установите Индексирование=Индексировать. Отбор использует ровно один Маркер85, порядок — реальный индексированный КодПоиска85.

  5. Карта процесса: Старт → одиночное действие Опыт85 → Финиш, без адресации, обработчиков и вложенных процессов. Маршрут в коде не стартует; учебные задачи здесь отдельные записи.

  6. Модули обоих объектов и точки маршрута пустые. Не копируйте запрет ПередЗаписью из урока просмотра; поиск изучается на реально записанной собственной паре внутри отменяемой транзакции.

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

  8. Для другого вида объекта замените целиком свой общий модуль, не склеивайте два ВыполнитьПример85. Имена относятся только к этому пустому стенду.

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

  10. Команда и кнопка ВыполнитьСвойЦикл85 с одноимённым действием. Полный модуль формы отдельно; сервер получает только согласие, не произвольный номер или рабочую ссылку.

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

  12. Один пользователь и один клиент, нет фоновых заданий, других писателей, подписок и внешних действий. Перед опытом исследуемый вид объекта должен быть пустым.

  13. Две реальные записи имеют общий собственный UUID-маркер, разные КодПоиска85 с суффиксами-1/-2 и даты10:00/11:00 внутри учебного периода09:00–12:00 9октября2026. Это данные опыта, не фильтр вашей рабочей базы.

  14. Номера берутся из записанных объектов после автонумерации. Строки999999999/888888888 используются только как подтверждённо отсутствующий отрицательный тест, а не как идентификатор существующего объекта.

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

  16. Подтвердите пустой стенд и вручную запустите команду. Все поиски выполняются в одной собственной транзакции, которая отменяется как при успехе, так и при ошибке. После отката память объектов не переиспользуется.

  17. Этот основной код исследует УчебныйПроцесс85; тип его нумерации и длины полей должны совпадать с подготовкой.

Функция ВыполнитьПример85(Согласие) Экспорт
    Если Не Согласие Тогда
        ВызватьИсключение "Только собственный новый пустой стенд УчебныйПоискЗадач85 с согласием";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Не используйте чужую транзакцию для учебного поиска";
    КонецЕсли;
    ВыборкаДо = БизнесПроцессы.УчебныйПроцесс85.Выбрать();
    Если ВыборкаДо.Следующий() Тогда
        ВызватьИсключение "Исследуемый учебный вид должен быть пустым";
    КонецЕсли;
    Маркер = Строка(Новый УникальныйИдентификатор);
    СсылкаПервой = БизнесПроцессы.УчебныйПроцесс85.ПолучитьСсылку(Новый УникальныйИдентификатор);
    СсылкаВторой = БизнесПроцессы.УчебныйПроцесс85.ПолучитьСсылку(Новый УникальныйИдентификатор);
    ОтсутствующаяСсылка = БизнесПроцессы.УчебныйПроцесс85.ПолучитьСсылку(Новый УникальныйИдентификатор);
    Если СсылкаПервой = СсылкаВторой Или СсылкаПервой = ОтсутствующаяСсылка Или СсылкаВторой = ОтсутствующаяСсылка Тогда
        ВызватьИсключение "Собственные плановые ссылки должны различаться";
    КонецЕсли;
    Если СсылкаПервой.ПолучитьОбъект() <> Неопределено Или СсылкаВторой.ПолучитьОбъект() <> Неопределено
        Или ОтсутствующаяСсылка.ПолучитьОбъект() <> Неопределено Тогда
        ВызватьИсключение "Плановая ссылка уже занята; чужие записи не используются";
    КонецЕсли;
    НачалоПериода = Дата(2026, 10, 9, 9, 0, 0);
    КонецПериода = Дата(2026, 10, 9, 12, 0, 0);
    НачатьТранзакцию();
    Попытка
        Первая = БизнесПроцессы.УчебныйПроцесс85.СоздатьБизнесПроцесс();
        Первая.УстановитьСсылкуНового(СсылкаПервой);
        Первая.Дата = Дата(2026, 10, 9, 10, 0, 0);
        Первая.Маркер85 = Маркер;
        Первая.КодПоиска85 = Маркер + "-1";
        Вторая = БизнесПроцессы.УчебныйПроцесс85.СоздатьБизнесПроцесс();
        Вторая.УстановитьСсылкуНового(СсылкаВторой);
        Вторая.Дата = Дата(2026, 10, 9, 11, 0, 0);
        Вторая.Маркер85 = Маркер;
        Вторая.КодПоиска85 = Маркер + "-2";
        Первая.Записать();
        Вторая.Записать();
        Если Первая.Номер = "" Или Вторая.Номер = "" Или Первая.Номер = Вторая.Номер Тогда
            ВызватьИсключение "Сначала нужны два реальных различных присвоенных номера";
        КонецЕсли;
        Если БизнесПроцессы.УчебныйПроцесс85.НайтиПоНомеру(Первая.Номер) <> СсылкаПервой Тогда
            ВызватьИсключение "Поиск по реальному номеру не вернул первую собственную запись";
        КонецЕсли;
        Если БизнесПроцессы.УчебныйПроцесс85.НайтиПоНомеру("") <> Неопределено Тогда
            ВызватьИсключение "Пустой номер должен дать Неопределено, не пустую ссылку";
        КонецЕсли;
        НомерОтсутствующей = "999999999";
        Если НомерОтсутствующей = Первая.Номер Или НомерОтсутствующей = Вторая.Номер Тогда
            НомерОтсутствующей = "888888888";
        КонецЕсли;
        Если НомерОтсутствующей = Первая.Номер Или НомерОтсутствующей = Вторая.Номер Тогда
            ВызватьИсключение "Нет свободного отрицательного тестового номера; не угадываем идентичность";
        КонецЕсли;
        НеНайденная = БизнесПроцессы.УчебныйПроцесс85.НайтиПоНомеру(НомерОтсутствующей);
        Если НеНайденная = Неопределено Тогда
            ВызватьИсключение "Непустой отсутствующий номер не должен дать Неопределено";
        КонецЕсли;
        Если Не НеНайденная.Пустая() Тогда
            ВызватьИсключение "Отсутствующий непустой номер должен дать пустую ссылку";
        КонецЕсли;
        Если БизнесПроцессы.УчебныйПроцесс85.НайтиПоРеквизиту("КодПоиска85", Первая.КодПоиска85) <> СсылкаПервой Тогда
            ВызватьИсключение "Поиск по своему уникальному реквизиту не совпал";
        КонецЕсли;
        НеНайденнаяПоРеквизиту = БизнесПроцессы.УчебныйПроцесс85.НайтиПоРеквизиту("КодПоиска85", Маркер + "-missing");
        Если Не НеНайденнаяПоРеквизиту.Пустая() Тогда
            ВызватьИсключение "Несуществующий собственный код должен дать пустую ссылку";
        КонецЕсли;
        Отбор = Новый Структура("Маркер85", Маркер);
        Выборка = БизнесПроцессы.УчебныйПроцесс85.Выбрать(НачалоПериода, КонецПериода, Отбор, "КодПоиска85 Возр");
        ЧислоНайденных = 0;
        Пока Выборка.Следующий() Цикл
            ЧислоНайденных = ЧислоНайденных + 1;
            Если Выборка.Маркер85 <> Маркер Или (Выборка.Ссылка <> СсылкаПервой И Выборка.Ссылка <> СсылкаВторой) Тогда
                ВызватьИсключение "Выборка вышла за границы собственной пары";
            КонецЕсли;
            Если ЧислоНайденных = 1 И Выборка.Ссылка <> СсылкаПервой Тогда
                ВызватьИсключение "Индексированный порядок собственного кода не вернул первую запись первой";
            КонецЕсли;
        КонецЦикла;
        Если ЧислоНайденных <> 2 Тогда
            ВызватьИсключение "Отбор по собственному маркеру должен вернуть два элемента";
        КонецЕсли;
        ИсточникСсылок = Новый Массив;
        ИсточникСсылок.Добавить(СсылкаВторой);
        ИсточникСсылок.Добавить("не ссылка на объект");
        ИсточникСсылок.Добавить(ОтсутствующаяСсылка);
        ИсточникСсылок.Добавить(СсылкаПервой);
        ПоСсылкам = БизнесПроцессы.УчебныйПроцесс85.ВыбратьПоСсылкам(ИсточникСсылок);
        ПроверенаПервая = Ложь;
        ПроверенаВторая = Ложь;
        Пока ПоСсылкам.Следующий() Цикл
            Если ПоСсылкам.Маркер85 <> Маркер Тогда
                ВызватьИсключение "Выборка ссылок вернула не собственный маркер";
            КонецЕсли;
            Если ПоСсылкам.Ссылка = СсылкаПервой И Не ПроверенаПервая Тогда
                ПроверенаПервая = Истина;
            ИначеЕсли ПоСсылкам.Ссылка = СсылкаВторой И Не ПроверенаВторая Тогда
                ПроверенаВторая = Истина;
            Иначе
                ВызватьИсключение "Повторная или неизвестная ссылка в результатах";
            КонецЕсли;
        КонецЦикла;
        Если Не ПроверенаПервая Или Не ПроверенаВторая Тогда
            ВызватьИсключение "Результат по ссылкам не содержит обе свои реальные записи";
        КонецЕсли;
        ПустойИсточник = Новый Массив;
        ПустаяВыборка = БизнесПроцессы.УчебныйПроцесс85.ВыбратьПоСсылкам(ПустойИсточник);
        Если ПустаяВыборка.Следующий() Тогда
            ВызватьИсключение "Пустой источник не должен выбирать существующие записи";
        КонецЕсли;
        ОтменитьТранзакцию();
    Исключение
        Если ТранзакцияАктивна() Тогда
            ОтменитьТранзакцию();
        КонецЕсли;
        ВызватьИсключение;
    КонецПопытки;
    Если ТранзакцияАктивна() Или СсылкаПервой.ПолучитьОбъект() <> Неопределено
        Или СсылкаВторой.ПолучитьОбъект() <> Неопределено Тогда
        ВызватьИсключение "Собственная пара осталась после отката";
    КонецЕсли;
    Возврат "Поиск по реальным номерам/реквизитам и собственные выборки проверены. Пустая ссылка отличается от Неопределено. Неверный тип и отсутствующая ссылка отфильтрованы. Обе собственные записи отменены.";
КонецФункции
ЗапускЦикла85

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

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

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

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

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

  2. Менеджер создаёт два реальных объекта с общим маркером и разными индексированными кодами/датами. В собственной транзакции они записываются и получают реальные разные номера.

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

  4. НайтиПоРеквизиту используется по собственному уникальному КодПоиска85; отсутствие второго кода проверяется как пустая ссылка. Этот метод не выдаётся за поиск полного набора по общему маркеру.

  5. Выбрать получает период, однопольный отбор и индексированный порядок в точном порядке параметров этого менеджера. Выборка должна вернуть две свои записи и первую с кодом-1 раньше кода-2.

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

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

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

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

  1. Реальный номер и собственный КодПоиска85 возвращают первую именно созданную уроком ссылку, а не любую найденную запись.

  2. Пустой номер даёт Неопределено; непустой отсутствующий номер и реквизит — пустую ссылку. Для задачи аналогично проверено пустое точное имя.

  3. Отбор по общему индексированному маркеру возвращает ровно две свои записи в порядке кодов-1/-2.

  4. Выборка по смешанному источнику содержит ровно свою пару; строка неверного типа и незаписанная ссылка не становятся результатами. Пустой массив даёт пустую выборку.

  5. После отката обе записи отсутствуют. Код не запускает маршрут, не выполняет задачу, не фиксирует транзакцию и не удаляет существующие рабочие данные.

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

При будущем собственном ручном запуске подтверждены реальные ключи поиска и точный состав собственных выборок, разные пустые результаты, а обе временные учебные записи отменены.

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

  1. У задачи Выбрать принимает Отбор, Порядок, ДатаНачала, ДатаОкончания; у процесса ДатаНачала, ДатаОкончания, Отбор, Порядок. Нельзя переносить порядок параметров по похожему имени метода.

  2. Структура отбора должна содержать только один элемент. Сложные условия нескольких реквизитов требуют подходящего запроса, а не произвольного расширения этой структуры.

  3. Пользовательские поля отбора и порядка должны быть индексированы. Здесь используются фиксированные строки Маркер85/КодПоиска85, не поле ХранилищеЗначения и не строка неограниченной длины.

  4. НайтиПоРеквизиту возвращает только одну совпавшую запись, не полный набор. Для пары с общим маркером используется Выбрать; для единичного поиска — уникальный собственный КодПоиска85.

  5. НайтиПоНомеру("") возвращает Неопределено. Непустой отсутствующий номер возвращает пустую ссылку; нельзя без проверки сразу вызывать Пустая у Неопределено.

  6. Для периодической нумерации процесса нужен второй аргумент ДатаИнтервала. Здесь настройка непериодическая и применяется однопараметровый вариант по реальному номеру.

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

  8. Если совпавших имён/реквизитов несколько, метод может вернуть только одну запись. Это не обоснование произвольно изменять первую найденную рабочую задачу.

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

  10. Порядок ВыбратьПоСсылкам не приравнивается к порядку массива входа. Код проверяет набор двух своих ссылок и дубликаты, а не индексы возвращаемой выборки.

  11. Плановая непустая ссылка, созданная ПолучитьСсылку, не доказывает наличие объекта. Отсутствующая ссылка специально проверена до опыта и не записывается.

  12. Это простой период, в котором обе собственные даты строго внутри границ. Урок не делает предположений о сложной бизнес-интерпретации начала/конца периода и чужих часовых поясах.

  13. Своя транзакция только отменяется. Не откатывайте чужую; отмена записи базы не отменяет произвольные письмо, файл, печать или сеть из рабочих обработчиков, поэтому они должны отсутствовать.

  14. Откат не возвращает экземпляр объекта языка в исходное состояние и не обещает повторное использование его номера. После опыта проверяется отсутствие по ссылкам и создаются новые экземпляры для нового запуска.

  15. Серверный модуль и собственный стенд обязательны. Прямой доступ к этим объектам из тонкого клиентского обработчика и поиск в production этим примером не разрешаются.

  16. Все учебные записи, поиск, выборки и транзакции здесь только написаны. В1С они не запускались, runtimeVerifiedScenarios=0; новые резервные копии и архивы не создавались.

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

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

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

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

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