Предназначен для управления критериями отбора и предоставляет доступ к значениям типа КритерийОтбораМенеджер.<Имя критерия>. Доступ к объекту осуществляется через свойство глобального контекста КритерииОтбора.
Примеры платформы
Форма = КритерииОтбора.Контрагенты.ПолучитьФорму("ОсновнаяФорма");Полное описание, параметры и ограничения
КритерииОтбораМенеджер (FilterCriteriaManager)
КритерииОтбораМенеджер (FilterCriteriaManager)
Доступен, начиная с версии 8.0.
Элементы коллекции:
КритерийОтбораМенеджер.<Имя критерия>
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются менеджеры критериев отбора.
Возможно обращение к менеджеру критерия отбора посредством оператора [...]. В качестве аргумента передается имя критерия отбора, как оно задано в конфигурации.
Свойства:
<Имя критерия отбора> (<Filter criteria name>)
Описание:
Предназначен для управления критериями отбора и предоставляет доступ к значениям типа КритерийОтбораМенеджер.<Имя критерия>. Доступ к объекту осуществляется через свойство глобального контекста КритерииОтбора.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Возможен обмен с сервером.
Пример:
Форма = КритерииОтбора.Контрагенты.ПолучитьФорму("ОсновнаяФорма");
См. также:
Глобальный контекст, свойство КритерииОтбора
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Критерий клиента: один состав, два разных вида связанных объектов
Прочитать реальные реквизиты состава собственного критерия и независимо посчитать суммы actual объектов клиента, найденных системным менеджером.
Где и как запускать
Один полный модуль КритерийИсточник85 собственной FileCF, только толстый обычный клиент; все операции данных readonly.
Подготовка
Это не пример для рабочей базы. Вручную создайте совершенно новую собственную пустую File ИБ C:\1c-labs\OwnCriterionClientExplorer85_a6945f42-884d-4431-8b73-dcc6a731db8e\IB на отдельном учебном Windows стенде платформы8.5.1.1343. Уже существующий путь не переиспользуйте и не очищайте. Зарегистрированная строка File="путь"; проверяется буквально. Здесь ни каталог, ни CF, ни ИБ, ни записи не создавались;1С не запускалась.
Конфигурация УчебныйКритерийКлиента85: совместимость НеИспользовать; ОсновнойРежимЗапуска ОбычноеПриложение. В Конфигураторе Сервис → Параметры → Общие → редактирование конфигурации для режима запуска «Управляемое приложение и обычное приложение». Это настройка редактора, не выдуманное свойство SupportedRunModes. Только два справочника, один документ, один критерий, одна обработка, два общих модуля, две общие картинки и одна роль. Регистров, движений, разделителей, расширений, подписок, фоновых заданий и иных прикладных объектов нет; модули объектов/менеджеров пусты.
Справочник Клиенты85: неиерархический, без владельцев, табличных частей и предопределённых элементов; Код Строка12, Наименование80, автонумерацияНет/контроль уникальностиДа. Единственный реквизит Маркер85: Строка36. Справочник Связи85 с теми же стандартными настройками: Маркер85 Строка36, Клиент85 только СправочникСсылка.Клиенты85, Сумма85 только Число10,2. Документ Счет85: Номер Строка12, автонумерацияНет/контроль уникальностиДа, проведениеЗапретить, движения и табличные части отсутствуют. Его три реквизита Маркер85/Клиент85/Сумма85 имеют те же точные типы.
Критерий отбора СвязиКлиента85: Тип только СправочникСсылка.Клиенты85. Откройте свойство Состав кнопкой выбора и включите ровно Справочник.Связи85.Реквизит.Клиент85 и Документ.Счет85.Реквизит.Клиент85. Это два реквизита, а не два произвольных имени таблиц. Программа читает readonly Состав, проверяет Количество2 и Содержит обоих actual metadata реквизитов, не записывает его и не использует недокументированный индекс.
До установки startup вручную запишите пять собственных объектов стандартными формами. Клиенты: A85/Клиент А, B85/Клиент Б. Связи: RELATED-A85/Обращение А/Клиент85=actual сохранённый A85/Сумма85=250. Счета: INV-A85/10.10.2026 12:00:00/A85/500 и INV-B85/10.10.2026 12:30:00/B85/250. У всех Маркер85=a6945f42-884d-4431-8b73-dcc6a731db8e, ПометкаУдаленияFalse, у каталогов ПредопределенныйFalse, у счетов ПроведенFalse. Ссылки выбираются на реально сохранённых клиентов, не конструируются из UUID. Источник связей состоит из трёх объектов на1000, кроме двух самих клиентов.
Единственная роль Клиент85Чтение и пользователь Клиент85Ученик: на этапе ручного заполнения временно разрешите своей роли запись только этих собственных объектов. Перед упражнением в Конфигураторе снимите Добавление/Изменение/Удаление и интерактивное редактирование у обоих каталогов и документа; оставьте Чтение/Просмотр/ВводПоСтроке, использование своей обработки и АктивныеПользователи для проверки единственного подключения. Без RLS и привилегированности. Сохраните/обновите исключительно свою CF, закройте первоначальный клиент и Конфигуратор. В будущем учебном запуске программа фактически проверяет ЧтениеTrue и три права записиFalse для каждого источника; роль с полными правами откажет. Не переключайте права программно и не применяйте такой порядок к production.
ОбщиеМодули КритерийИсточник85 и КритерийФорма85: ГлобальныйНет, КлиентОбычноеПриложениеДа, КлиентУправляемоеПриложениеНет, СерверНет, ВнешнееСоединениеНет, ПривилегированныйНет, повторное использованиеНеИспользовать. В первый целиком SOURCE, во второй целиком EXPLORER. Они выполняются только в том же обычном клиенте, не являются серверными RPC-помощниками.
В КритерииОтбора → СвязиКлиента85 → Формы создайте ОБЫЧНУЮ форму Список85, основную форму критерия. Её основной реквизит Список85 имеет конкретный тип КритерийОтбораСписок.СвязиКлиента85; табличное поле Результаты85 связано Данные=Список85 и работает как список критерия, не как ТаблицаЗначений. Поле ТолькоПросмотрДа, форма ТолькоПросмотрДа. Добавьте СтатусСтроки85 Строка2000 readonly. CRITERION_FORM целиком в модуль; native ПриОткрытии0 → ПриОткрытии, у Результаты85 ПриАктивизацииСтроки0 плюс общий первый Элемент → Строка85(Элемент). Actual list создаёт штатная подготовленная форма; конструктора NewCriterionList нет. Если actual значение имеет иной тип/Неопределено, остановитесь: код не подставляет фиктивный пустой объект.
Обработка КритерийПульт85: единственная основная ОБЫЧНАЯ форма Пульт85. Реквизиты МеткаПульта85 Строка36 и Статус85 Строка2000 readonly. Табличное поле Клиенты85 и поле ввода ОписаниеВыбора85: Данные пустое, их значение устанавливается явно полученным native СписокЗначений; тип значения поля ввода — СписокЗначений, обе области readonly. У списка покажите стандартные колонки Значение/Представление/Картинка, запретите редактирование и изменение порядка. Кнопка Показать85: Нажатие0 плюс общий первый Кнопка → Показать85(Кнопка). ПриОткрытии → ПриОткрытии0. CHOICE полностью в модуль; APPLICATION в МодульОбычногоПриложения. Никогда не вызывайте native обработчики вручную.
В ОбщиеКартинки вручную добавьте КлиентА85 и КлиентБ85: собственные одиночные растровые PNG14×14 без вариантов и коллекций, например голубой и зелёный квадраты. Это явные новые ресурсы собственной CF, не предполагаемые имена стандартной библиотеки. Программа читает actual БиблиотекаКартинок, проверяет TypePicture и native Ширина()/Высота()14, присваивает каждому actual ValueListItem только библиотечную картинку и проверяет readback. Picture.Width/Height могут вернуть Неопределено у коллекции — тогда отказ, а не выдуманный размер. Файлы/картинки здесь не создавались и не скачивались.
После ручной подготовки запустите только один толстый обычный клиент своего стенда. NativeGetChoiceData получает тип Клиенты85 и настоящую Structure с required Отбор/СтрокаПоиска. Это чтение, не создание/подмена клиентов. Программа проверит все два actual ValueListItem, refs/повторы/картинки, свяжет один actual список с двумя собственными controls и проверит native типовую policy поля ввода и запрет порядка таблицы.
Вручную активируйте A в пульте и нажмите Показать85: настоящий Find(A) обязан вернуть ровно ссылку СвязиA и СчетA. Их суммы берутся из полного источника и складываются, итог750, не печатается готовое литеральное750 вместо результата. Затем выберите B/нажмите: один actual СчетB на250; затем снова A: два actual объекта на750. Каждый этап заново проверяет весь источник, все пять сохранённых refs и каждое поле actual GetObject. Отказ/неверный выбор до этапа не меняет данные. После ошибки интерфейса stickyСТОП, нет blind retry/rollback.
В каждой открытой форме критерия вручную выберите действительную строку. Native событие от своего Результаты85 предоставляет CurrentRow/CurrentData как ref объекта, не как ValueTableRow. Она сверяется с actual Find-массивом этого клиента. Неопределено означает, что интерфейс ещё не предоставил строку: дождитесь/выберите её сами, не имитируйте callback и не присваивайте золотую строку. Числа доказываются Find/полными запросами, а не обещанием полной перечислимости всех GUI-строк. Закрывается только сохранённая собственная предыдущая форма; если она не закрылась, новую код не создаёт.
#Если ТолстыйКлиентОбычноеПриложение Тогда
Процедура ПроверитьПоле85(МД, Имя, ОжидаемыйТип, Длина = 0)
Поле = МД.Реквизиты.Найти(Имя);
Если Поле = Неопределено Или Поле.Тип.Типы().Количество() <> 1 Или Не Поле.Тип.СодержитТип(ОжидаемыйТип) Тогда
ВызватьИсключение "Не подтверждён единственный объявленный тип поля " + Имя;
КонецЕсли;
Если ОжидаемыйТип = Тип("Строка") И Поле.Тип.КвалификаторыСтроки.Длина <> Длина Тогда
ВызватьИсключение "Не совпала длина своей строки";
КонецЕсли;
Если ОжидаемыйТип = Тип("Число") И (Поле.Тип.КвалификаторыЧисла.Разрядность <> 10 Или Поле.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 2) Тогда
ВызватьИсключение "Сумма должна иметь тип Число10,2";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСхему85()
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnCriterionClientExplorer85_a6945f42-884d-4431-8b73-dcc6a731db8e\IB"";" Или Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или Метаданные.ОсновнойРежимЗапуска <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Или ТранзакцияАктивна() Тогда
ВызватьИсключение "Только точный собственный File стенд без совместимости и транзакции";
КонецЕсли;
Если Метаданные.Справочники.Количество() <> 2 Или Метаданные.Документы.Количество() <> 1
Или Метаданные.КритерииОтбора.Количество() <> 1 Или Метаданные.Обработки.Количество() <> 1
Или Метаданные.ОбщиеМодули.Количество() <> 2 Или Метаданные.Роли.Количество() <> 1 Или Метаданные.ОбщиеКартинки.Количество() <> 2
Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0
Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0
Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0
Или Метаданные.Константы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0
Или Метаданные.ОбщиеФормы.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0
Или Метаданные.ПараметрыСеанса.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0
Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ХранилищаНастроек.Количество() <> 0
Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Чужая схема, разделители, обработчики или данные запрещены";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Расширения не входят в упражнение";
КонецЕсли;
Для Каждого Имя Из СтрРазделить("Клиенты85,Связи85", ",") Цикл
МД = Метаданные.Справочники.Найти(Имя);
Если МД = Неопределено Или МД.Иерархический Или МД.Владельцы.Количество() <> 0 Или МД.ТабличныеЧасти.Количество() <> 0
Или МД.Реквизиты.Количество() <> ?(Имя = "Клиенты85", 1, 3) Тогда
ВызватьИсключение "Не подтверждён собственный простой справочник";
КонецЕсли;
ПроверитьПоле85(МД, "Маркер85", Тип("Строка"), 36);
Если Имя = "Связи85" Тогда
ПроверитьПоле85(МД, "Клиент85", Тип("СправочникСсылка.Клиенты85"));
ПроверитьПоле85(МД, "Сумма85", Тип("Число"));
КонецЕсли;
КонецЦикла;
Документ = Метаданные.Документы.Найти("Счет85");
Если Документ = Неопределено Или Документ.Реквизиты.Количество() <> 3 Или Документ.ТабличныеЧасти.Количество() <> 0 Или Документ.Движения.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой счёт без движений и табличных частей";
КонецЕсли;
ПроверитьПоле85(Документ, "Маркер85", Тип("Строка"), 36);
ПроверитьПоле85(Документ, "Клиент85", Тип("СправочникСсылка.Клиенты85"));
ПроверитьПоле85(Документ, "Сумма85", Тип("Число"));
Критерий = Метаданные.КритерииОтбора.Найти("СвязиКлиента85");
Если Критерий = Неопределено Или Критерий.Тип.Типы().Количество() <> 1 Или Не Критерий.Тип.СодержитТип(Тип("СправочникСсылка.Клиенты85"))
Или Критерий.Состав.Количество() <> 2 Или Не Критерий.Состав.Содержит(Метаданные.Справочники.Связи85.Реквизиты.Клиент85)
Или Не Критерий.Состав.Содержит(Документ.Реквизиты.Клиент85) Тогда
ВызватьИсключение "Состав критерия должен быть ровно двумя собственными реквизитами Клиент85";
КонецЕсли;
Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Если Пользователь = Неопределено Или Пользователь.Имя <> "Клиент85Ученик" Или Не РольДоступна("Клиент85Чтение") Тогда
ВызватьИсключение "Нужен собственный учебный читатель";
КонецЕсли;
Соединения = ПолучитьСоединенияИнформационнойБазы();
Если ТипЗнч(Соединения) <> Тип("Массив") Или Соединения.Количество() <> 1 Тогда
ВызватьИсключение "Оставьте только своё учебное подключение";
КонецЕсли;
Если Соединения[0].НомерСоединения <> НомерСоединенияИнформационнойБазы() Или Соединения[0].Пользователь.УникальныйИдентификатор <> Пользователь.УникальныйИдентификатор Тогда
ВызватьИсключение "Подключение не совпало с текущим своим сеансом";
КонецЕсли;
Объекты = Новый Массив;
Объекты.Добавить(Метаданные.Справочники.Клиенты85);
Объекты.Добавить(Метаданные.Справочники.Связи85);
Объекты.Добавить(Документ);
Для Каждого МД Из Объекты Цикл
Если Не ПравоДоступа("Чтение", МД) Или ПравоДоступа("Добавление", МД) Или ПравоДоступа("Изменение", МД) Или ПравоДоступа("Удаление", МД) Тогда
ВызватьИсключение "Упражнение требует чтения без прав записи; привилегированный режим тоже не подходит";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПрочитатьИсточник85() Экспорт
ПроверитьСхему85();
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка,Код,Наименование,ПометкаУдаления,Предопределенный,Маркер85 ИЗ Справочник.Клиенты85";
Клиенты = Запрос.Выполнить().Выгрузить();
Если Клиенты.Количество() <> 2 Или Клиенты.Колонки.Количество() <> 6 Тогда
ВызватьИсключение "Нужно ровно два своих клиента";
КонецЕсли;
КлиентА = Неопределено;
КлиентБ = Неопределено;
Для Каждого Строка Из Клиенты Цикл
Если ТипЗнч(Строка.Ссылка) <> Тип("СправочникСсылка.Клиенты85") Или Строка.Ссылка.Пустая() Или Строка.ПометкаУдаления Или Строка.Предопределенный
Или Строка.Маркер85 <> "a6945f42-884d-4431-8b73-dcc6a731db8e" Тогда
ВызватьИсключение "Чужой/помеченный клиент";
КонецЕсли;
Если Строка.Код = "A85" И Строка.Наименование = "Клиент А" И КлиентА = Неопределено Тогда
КлиентА = Строка.Ссылка;
ИначеЕсли Строка.Код = "B85" И Строка.Наименование = "Клиент Б" И КлиентБ = Неопределено Тогда
КлиентБ = Строка.Ссылка;
Иначе
ВызватьИсключение "Лишний/изменённый клиент";
КонецЕсли;
Объект = Строка.Ссылка.ПолучитьОбъект();
Если ТипЗнч(Объект) <> Тип("СправочникОбъект.Клиенты85") Или Объект.Метаданные() <> Метаданные.Справочники.Клиенты85
Или Объект.Ссылка <> Строка.Ссылка Или Объект.Код <> Строка.Код Или Объект.Наименование <> Строка.Наименование
Или Объект.ПометкаУдаления <> Строка.ПометкаУдаления Или Объект.Предопределенный <> Строка.Предопределенный Или Объект.Маркер85 <> Строка.Маркер85 Тогда
ВызватьИсключение "Все поля actual объекта клиента не совпали с полным запросом";
КонецЕсли;
КонецЦикла;
Если КлиентА = Неопределено Или КлиентБ = Неопределено Или КлиентА = КлиентБ Тогда
ВызватьИсключение "Не подтверждены разные actual ссылки A/B";
КонецЕсли;
Данные = Новый ТаблицаЗначений;
Данные.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("СправочникСсылка.Связи85,ДокументСсылка.Счет85"));
Данные.Колонки.Добавить("Клиент", Новый ОписаниеТипов("СправочникСсылка.Клиенты85"));
Данные.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 2)));
Запрос.Текст = "ВЫБРАТЬ Ссылка,Код,Наименование,ПометкаУдаления,Предопределенный,Маркер85,Клиент85,Сумма85 ИЗ Справочник.Связи85";
Связи = Запрос.Выполнить().Выгрузить();
Если Связи.Количество() <> 1 Или Связи.Колонки.Количество() <> 8 Тогда
ВызватьИсключение "Нужна только одна собственная связь";
КонецЕсли;
Строка = Связи[0];
Если ТипЗнч(Строка.Ссылка) <> Тип("СправочникСсылка.Связи85") Или Строка.Ссылка.Пустая() Или Строка.ПометкаУдаления Или Строка.Предопределенный
Или Строка.Код <> "RELATED-A85" Или Строка.Наименование <> "Обращение А" Или Строка.Маркер85 <> "a6945f42-884d-4431-8b73-dcc6a731db8e"
Или Строка.Клиент85 <> КлиентА Или ТипЗнч(Строка.Сумма85) <> Тип("Число") Или Строка.Сумма85 <> 250 Тогда
ВызватьИсключение "Не подтверждена связь А на250";
КонецЕсли;
Объект = Строка.Ссылка.ПолучитьОбъект();
Если ТипЗнч(Объект) <> Тип("СправочникОбъект.Связи85") Или Объект.Метаданные() <> Метаданные.Справочники.Связи85
Или Объект.Ссылка <> Строка.Ссылка Или Объект.Код <> Строка.Код Или Объект.Наименование <> Строка.Наименование
Или Объект.ПометкаУдаления <> Строка.ПометкаУдаления Или Объект.Предопределенный <> Строка.Предопределенный
Или Объект.Маркер85 <> Строка.Маркер85 Или Объект.Клиент85 <> Строка.Клиент85 Или Объект.Сумма85 <> Строка.Сумма85 Тогда
ВызватьИсключение "Все поля actual связи не совпали с запросом";
КонецЕсли;
СвязьА = Строка.Ссылка;
Новая = Данные.Добавить(); Новая.Ссылка = Строка.Ссылка; Новая.Клиент = Строка.Клиент85; Новая.Сумма = Строка.Сумма85;
Запрос.Текст = "ВЫБРАТЬ Ссылка,Номер,Дата,ПометкаУдаления,Проведен,Маркер85,Клиент85,Сумма85 ИЗ Документ.Счет85";
Счета = Запрос.Выполнить().Выгрузить();
Если Счета.Количество() <> 2 Или Счета.Колонки.Количество() <> 8 Тогда
ВызватьИсключение "Нужно ровно два своих счёта";
КонецЕсли;
СчетА = Неопределено; СчетБ = Неопределено;
Для Каждого Строка Из Счета Цикл
Если ТипЗнч(Строка.Ссылка) <> Тип("ДокументСсылка.Счет85") Или Строка.Ссылка.Пустая() Или Строка.ПометкаУдаления Или Строка.Проведен
Или Строка.Маркер85 <> "a6945f42-884d-4431-8b73-dcc6a731db8e" Или ТипЗнч(Строка.Сумма85) <> Тип("Число") Тогда
ВызватьИсключение "Чужой/проведённый счёт";
КонецЕсли;
Если Строка.Номер = "INV-A85" И Строка.Дата = Дата(2026, 10, 10, 12, 0, 0) И Строка.Клиент85 = КлиентА И Строка.Сумма85 = 500 И СчетА = Неопределено Тогда
СчетА = Строка.Ссылка;
ИначеЕсли Строка.Номер = "INV-B85" И Строка.Дата = Дата(2026, 10, 10, 12, 30, 0) И Строка.Клиент85 = КлиентБ И Строка.Сумма85 = 250 И СчетБ = Неопределено Тогда
СчетБ = Строка.Ссылка;
Иначе
ВызватьИсключение "Лишний/изменённый счёт";
КонецЕсли;
Объект = Строка.Ссылка.ПолучитьОбъект();
Если ТипЗнч(Объект) <> Тип("ДокументОбъект.Счет85") Или Объект.Метаданные() <> Метаданные.Документы.Счет85
Или Объект.Ссылка <> Строка.Ссылка Или Объект.Номер <> Строка.Номер Или Объект.Дата <> Строка.Дата
Или Объект.ПометкаУдаления <> Строка.ПометкаУдаления Или Объект.Проведен <> Строка.Проведен
Или Объект.Маркер85 <> Строка.Маркер85 Или Объект.Клиент85 <> Строка.Клиент85 Или Объект.Сумма85 <> Строка.Сумма85 Тогда
ВызватьИсключение "Все поля actual счёта не совпали с запросом";
КонецЕсли;
Новая = Данные.Добавить(); Новая.Ссылка = Строка.Ссылка; Новая.Клиент = Строка.Клиент85; Новая.Сумма = Строка.Сумма85;
КонецЦикла;
Если СчетА = Неопределено Или СчетБ = Неопределено Или СчетА = СчетБ Или Данные.Количество() <> 3 Или Данные.Итог("Сумма") <> 1000 Тогда
ВызватьИсключение "Не подтверждены все ссылки и фактический общий итог1000";
КонецЕсли;
Возврат Новый Структура("А,Б,СвязьА,СчетА,СчетБ,Данные", КлиентА, КлиентБ, СвязьА, СчетА, СчетБ, Данные);
КонецФункции
Процедура ПроверитьСохранность85(До) Экспорт
Если ТипЗнч(До) <> Тип("Структура") Или До.Количество() <> 6 Тогда
ВызватьИсключение "Неизвестный исходный паспорт";
КонецЕсли;
После = ПрочитатьИсточник85();
Если До.А <> После.А Или До.Б <> После.Б Или До.СвязьА <> После.СвязьА Или До.СчетА <> После.СчетА Или До.СчетБ <> После.СчетБ
Или ТипЗнч(До.Данные) <> Тип("ТаблицаЗначений") Или До.Данные.Количество() <> 3 Или До.Данные.Колонки.Количество() <> 3 Тогда
ВызватьИсключение "Смена actual ссылок/формы собственного полного источника";
КонецЕсли;
Проверенные = Новый Массив;
Для Каждого Строка Из До.Данные Цикл
Если Проверенные.Найти(Строка.Ссылка) <> Неопределено Тогда
ВызватьИсключение "Повтор ссылки в исходном полном паспорте";
КонецЕсли;
Совпадения = После.Данные.НайтиСтроки(Новый Структура("Ссылка", Строка.Ссылка));
Если Совпадения.Количество() <> 1 Или Совпадения[0].Клиент <> Строка.Клиент Или Совпадения[0].Сумма <> Строка.Сумма Тогда
ВызватьИсключение "Изменена строка собственного полного источника";
КонецЕсли;
Проверенные.Добавить(Строка.Ссылка);
КонецЦикла;
КонецПроцедуры
Функция НайтиСвоиСвязи85(Клиент) Экспорт
Паспорт = ПрочитатьИсточник85();
Если ТипЗнч(Клиент) <> Тип("СправочникСсылка.Клиенты85") Или Клиент.Пустая() Или Клиент <> Паспорт.А И Клиент <> Паспорт.Б Тогда
ВызватьИсключение "Разрешены только actual клиенты A/B этого нового стенда";
КонецЕсли;
Управление = КритерииОтбора;
Если ТипЗнч(Управление) <> Тип("КритерииОтбораМенеджер") Тогда
ВызватьИсключение "Не подтверждена системная коллекция менеджеров критериев";
КонецЕсли;
Количество = 0;
Для Каждого Менеджер Из Управление Цикл
Если ТипЗнч(Менеджер) <> Тип("КритерийОтбораМенеджер.СвязиКлиента85") Тогда
ВызватьИсключение "Чужой критерий";
КонецЕсли;
Количество = Количество + 1;
КонецЦикла;
Если Количество <> 1 Тогда
ВызватьИсключение "Нужен только один свой criterion manager";
КонецЕсли;
Менеджер = Управление.СвязиКлиента85;
Ссылки = Менеджер.Найти(Клиент);
Если ТипЗнч(Ссылки) <> Тип("Массив") Или Ссылки.Количество() <> ?(Клиент = Паспорт.А, 2, 1) Тогда
ВызватьИсключение "NativeFind не подтвердил actual объём2/1";
КонецЕсли;
Проверенные = Новый Массив; Сумма = 0;
Для Каждого Ссылка Из Ссылки Цикл
Если ТипЗнч(Ссылка) <> Тип("СправочникСсылка.Связи85") И ТипЗнч(Ссылка) <> Тип("ДокументСсылка.Счет85") Тогда
ВызватьИсключение "Неверный native тип найденной ссылки";
КонецЕсли;
Если Ссылка.Пустая() Или Проверенные.Найти(Ссылка) <> Неопределено Тогда
ВызватьИсключение "Пустая/дублированная native ссылка";
КонецЕсли;
Совпадения = Паспорт.Данные.НайтиСтроки(Новый Структура("Ссылка", Ссылка));
Если Совпадения.Количество() <> 1 Или Совпадения[0].Клиент <> Клиент Тогда
ВызватьИсключение "NativeFind вернул чужой объект или объект другого клиента";
КонецЕсли;
Сумма = Сумма + Совпадения[0].Сумма;
Проверенные.Добавить(Ссылка);
КонецЦикла;
Если Сумма <> ?(Клиент = Паспорт.А, 750, 250) Тогда
ВызватьИсключение "Actual ссылки не дали независимый итог750/250";
КонецЕсли;
ПроверитьСохранность85(Паспорт);
Возврат Новый Структура("Клиент,Ссылки,Сумма", Клиент, Ссылки, Сумма);
КонецФункции
#КонецЕслиПолный native form/list workflow
ОбщиеМодули → КритерийФорма85, целиком
ClientOrdinaryДа, ServerНет; actual typed form factory
#Если ТолстыйКлиентОбычноеПриложение Тогда
Функция ПрочитатьСвоюФорму85(Форма) Экспорт
КритерийИсточник85.ПрочитатьИсточник85();
Если ТипЗнч(Форма) <> Тип("Форма") Или ТипЗнч(Форма.ПараметрОтборПоЗначению) <> Тип("СправочникСсылка.Клиенты85") Тогда
ВызватьИсключение "Нужна actual собственная ordinary форма критерия";
КонецЕсли;
Результат = КритерийИсточник85.НайтиСвоиСвязи85(Форма.ПараметрОтборПоЗначению);
Поле = Форма.ЭлементыФормы.Результаты85;
Если ТипЗнч(Поле) <> Тип("ТабличноеПоле") Или Поле.Имя <> "Результаты85" Или Поле.Данные <> "Список85" Тогда
ВызватьИсключение "Не подтверждено собственное поле criterion list";
КонецЕсли;
Список = Поле.Значение;
Если ТипЗнч(Список) <> Тип("КритерийОтбораСписок.СвязиКлиента85") Или Список <> Форма.Список85 Тогда
ВызватьИсключение "Нужен настоящий основной реквизит подготовленной формы, не новый неизвестный список";
КонецЕсли;
Если Список.Отбор.Количество() <> 1 Или Не Список.Отбор.ЗначениеОтбора.Использование
Или Список.Отбор.ЗначениеОтбора.Значение <> Результат.Клиент Или Список.Отбор.ЗначениеОтбора.ВидСравнения <> ВидСравнения.Равно
Или Не Поле.ТолькоПросмотр Или Не Форма.ТолькоПросмотр Тогда
ВызватьИсключение "Не подтверждён ровно один собственный readonly отбор Равно";
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ОткрытьСвойКритерий85(Владелец, Клиент) Экспорт
Паспорт = КритерийИсточник85.ПрочитатьИсточник85();
Если ТипЗнч(Владелец) <> Тип("Форма") Или Владелец.МеткаПульта85 <> "a6945f42-884d-4431-8b73-dcc6a731db8e"
Или ТипЗнч(Владелец.ЭлементыФормы.Клиенты85) <> Тип("ТабличноеПоле") Тогда
ВызватьИсключение "Нужен actual пульт своего приложения";
КонецЕсли;
Результат = КритерийИсточник85.НайтиСвоиСвязи85(Клиент);
Ключ = Новый УникальныйИдентификатор;
Форма = КритерииОтбора.СвязиКлиента85.ПолучитьФорму("Список85", Владелец, Ключ);
Если Форма = Неопределено Или ТипЗнч(Форма) <> Тип("Форма") Или Форма.Открыта() Или Форма.КлючУникальности <> Ключ Или Форма.ВладелецФормы <> Владелец Тогда
ВызватьИсключение "Не подтверждена новая собственная форма и её actual владелец";
КонецЕсли;
Форма.ПараметрОтборПоЗначению = Результат.Клиент;
Поле = Форма.ЭлементыФормы.Результаты85;
Если ТипЗнч(Поле) <> Тип("ТабличноеПоле") Или Поле.Имя <> "Результаты85" Или Поле.Данные <> "Список85"
Или ТипЗнч(Поле.Значение) <> Тип("КритерийОтбораСписок.СвязиКлиента85") Тогда
ВызватьИсключение "Неверный actual typed main/control binding";
КонецЕсли;
Список = Поле.Значение;
Если Список <> Форма.Список85 Или Список.Отбор.Количество() <> 1 Тогда
ВызватьИсключение "Не подтверждён собственный singleton отбор";
КонецЕсли;
Поле.ТолькоПросмотр = Истина;
Форма.ТолькоПросмотр = Истина;
Список.Отбор.ЗначениеОтбора.Установить(Результат.Клиент, Истина);
Список.Обновить();
Факт = ПрочитатьСвоюФорму85(Форма);
Если Факт.Клиент <> Клиент Или Факт.Сумма <> Результат.Сумма Или Факт.Ссылки.Количество() <> Результат.Ссылки.Количество() Тогда
ВызватьИсключение "Нативные параметры/отбор/Find readback не совпали";
КонецЕсли;
КритерийИсточник85.ПроверитьСохранность85(Паспорт);
Форма.Открыть();
Возврат Форма;
КонецФункции
Функция ПрочитатьРеальнуюСтроку85(Форма, Элемент) Экспорт
Если Элемент <> Форма.ЭлементыФормы.Результаты85 Тогда
ВызватьИсключение "Чужой источник native события строки";
КонецЕсли;
Результат = ПрочитатьСвоюФорму85(Форма);
Данные = Элемент.ТекущиеДанные;
Текущая = Элемент.ТекущаяСтрока;
Если Данные = Неопределено Или Текущая = Неопределено Тогда
Возврат "Строка ещё не предоставлена интерфейсом. Дождитесь списка и вручную выберите свою строку.";
КонецЕсли;
Если ТипЗнч(Данные) <> Тип("СправочникСсылка.Связи85") И ТипЗнч(Данные) <> Тип("ДокументСсылка.Счет85") Тогда
ВызватьИсключение "Criterion table возвращает ref, не строку таблицы значений";
КонецЕсли;
Если Текущая <> Данные Или Результат.Ссылки.Найти(Данные) = Неопределено Тогда
ВызватьИсключение "Actual текущая ссылка не относится к своему клиенту";
КонецЕсли;
Возврат "Подтверждена actual ссылка: " + Строка(Данные) + "; независимый итог клиента: " + Формат(Результат.Сумма, "ЧГ=0;ЧДЦ=2");
КонецФункции
#КонецЕслиПолный пульт реального выбора
Обработки → КритерийПульт85 → Формы → Пульт85 → Модуль
Толстый обычный клиент, native button1/OnOpen0
Перем Паспорт85, СвояФормаКритерия85, СледующийЭтап85, Ошибка85;
Процедура ПриОткрытии()
Ошибка85 = Истина;
Паспорт85 = КритерийИсточник85.ПрочитатьИсточник85();
МеткаПульта85 = "a6945f42-884d-4431-8b73-dcc6a731db8e";
Параметры = Новый Структура("Отбор,СтрокаПоиска,ОграничиватьСтрокуПоиска", Новый Структура("Маркер85", МеткаПульта85), Неопределено, Истина);
Выборы = ПолучитьДанныеВыбора(Тип("СправочникСсылка.Клиенты85"), Параметры);
Если ТипЗнч(Выборы) <> Тип("СписокЗначений") Или Выборы.Количество() <> 2 Тогда
ВызватьИсключение "NativeGetChoiceData не подтвердил два actual клиента";
КонецЕсли;
А = 0; Б = 0;
Для Каждого Выбор Из Выборы Цикл
Если ТипЗнч(Выбор.Значение) <> Тип("СправочникСсылка.Клиенты85") Или Выбор.Значение.Пустая() Тогда
ВызватьИсключение "Чужой native тип выбора";
КонецЕсли;
Если Выбор.Значение = Паспорт85.А Тогда
Значок = БиблиотекаКартинок.КлиентА85;
А = А + 1;
ИначеЕсли Выбор.Значение = Паспорт85.Б Тогда
Значок = БиблиотекаКартинок.КлиентБ85;
Б = Б + 1;
Иначе
ВызватьИсключение "Чужая actual ссылка выбора";
КонецЕсли;
Если ТипЗнч(Значок) <> Тип("Картинка") Или Значок.Ширина() <> 14 Или Значок.Высота() <> 14 Тогда
ВызватьИсключение "Подготовьте свои одиночные library картинки14×14 без вариантов/коллекции";
КонецЕсли;
Выбор.Картинка = Значок;
Если Выбор.Картинка <> Значок Тогда
ВызватьИсключение "Actual картинка собственного элемента не совпала";
КонецЕсли;
КонецЦикла;
Если А <> 1 Или Б <> 1 Тогда
ВызватьИсключение "Список должен содержать ровно каждого своего клиента, без повторов";
КонецЕсли;
Таблица = ЭлементыФормы.Клиенты85;
Ввод = ЭлементыФормы.ОписаниеВыбора85;
Если ТипЗнч(Таблица) <> Тип("ТабличноеПоле") Или Таблица.Имя <> "Клиенты85" Или Таблица.Данные <> ""
Или ТипЗнч(Ввод) <> Тип("ПолеВвода") Или Ввод.Имя <> "ОписаниеВыбора85" Или Ввод.Данные <> "" Тогда
ВызватьИсключение "Не подтверждены два собственных unbound list controls";
КонецЕсли;
Таблица.Значение = Выборы;
Ввод.Значение = Выборы;
Ввод.ТипЗначенияСписка = Новый ОписаниеТипов("СправочникСсылка.Клиенты85");
Таблица.ИзменятьПорядокСтрок = Ложь;
Таблица.ТолькоПросмотр = Истина;
Ввод.ТолькоПросмотр = Истина;
Если Таблица.Значение <> Выборы Или Ввод.Значение <> Выборы Или Таблица.ИзменятьПорядокСтрок
Или Ввод.ТипЗначенияСписка.Типы().Количество() <> 1 Или Не Ввод.ТипЗначенияСписка.СодержитТип(Тип("СправочникСсылка.Клиенты85"))
Или Не Таблица.ТолькоПросмотр Или Не Ввод.ТолькоПросмотр Тогда
ВызватьИсключение "Не совпала фактическая list/interface policy";
КонецЕсли;
КритерийИсточник85.ПроверитьСохранность85(Паспорт85);
СвояФормаКритерия85 = Неопределено;
СледующийЭтап85 = 1;
Статус85 = "Общий источник1000. Вручную выберите строку клиента А, затем нажмите Показать85. Этапы: A750 → B250 → A750.";
Ошибка85 = Ложь;
КонецПроцедуры
Процедура Показать85(Кнопка)
Если Кнопка <> ЭлементыФормы.Показать85 Или Кнопка.Имя <> "Показать85" Или Ошибка85 <> Ложь Или СледующийЭтап85 > 3 Тогда
ВызватьИсключение "Только свой native button и незавершённый корректный этап";
КонецЕсли;
Выбранный = ЭлементыФормы.Клиенты85.ТекущаяСтрока;
Если Выбранный = Неопределено Тогда
Статус85 = "Вручную активируйте строку своего клиента. Код не имитирует выбор или callback.";
Возврат;
КонецЕсли;
Если ТипЗнч(Выбранный) <> Тип("ЭлементСпискаЗначений") Или ЭлементыФормы.Клиенты85.Значение.НайтиПоЗначению(Выбранный.Значение) <> Выбранный Тогда
ВызватьИсключение "Нужен настоящий текущий элемент actual списка своего поля";
КонецЕсли;
Если Выбранный.Значение <> ?(СледующийЭтап85 = 2, Паспорт85.Б, Паспорт85.А) Тогда
Статус85 = "На этом этапе выберите клиента " + ?(СледующийЭтап85 = 2, "Б", "А") + ". Никакие данные не изменены.";
Возврат;
КонецЕсли;
Ошибка85 = Истина;
Попытка
КритерийИсточник85.ПроверитьСохранность85(Паспорт85);
Если СвояФормаКритерия85 <> Неопределено И СвояФормаКритерия85.Открыта() Тогда
СвояФормаКритерия85.Закрыть();
Если СвояФормаКритерия85.Открыта() Тогда
ВызватьИсключение "Прежняя собственная форма не закрылась; новую не создаём";
КонецЕсли;
КонецЕсли;
СвояФормаКритерия85 = КритерийФорма85.ОткрытьСвойКритерий85(ЭтаФорма, Выбранный.Значение);
Результат = КритерийФорма85.ПрочитатьСвоюФорму85(СвояФормаКритерия85);
Если Результат.Клиент <> Выбранный.Значение Или Результат.Сумма <> ?(СледующийЭтап85 = 2, 250, 750) Тогда
ВызватьИсключение "Не совпал действительный клиент/числовой этап";
КонецЕсли;
СледующийЭтап85 = СледующийЭтап85 + 1;
КритерийИсточник85.ПроверитьСохранность85(Паспорт85);
Статус85 = "NativeFind: объектов " + Формат(Результат.Ссылки.Количество(), "ЧГ=0") + ", сумма " + Формат(Результат.Сумма, "ЧГ=0;ЧДЦ=2")
+ ". В открывшемся списке вручную выберите строку: её actual ref проверяется отдельным native событием. Общий source1000 неизменён.";
Ошибка85 = Ложь;
Исключение
Ошибка85 = Истина;
Статус85 = "СТОП: состояние собственного интерфейса неизвестно; не повторять вслепую. " + ОписаниеОшибки();
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыПолный native обработчик строки критерия
КритерииОтбора → СвязиКлиента85 → Формы → Список85 → Модуль
Толстый обычный клиент; native OnOpen0/OnActivateRow1
Процедура ПриОткрытии()
Результат = КритерийФорма85.ПрочитатьСвоюФорму85(ЭтаФорма);
СтатусСтроки85 = "Клиент подтверждён. NativeFind дал " + Формат(Результат.Ссылки.Количество(), "ЧГ=0") + " объекта; сумма " + Формат(Результат.Сумма, "ЧГ=0;ЧДЦ=2") + ". Выберите строку вручную.";
КонецПроцедуры
Процедура Строка85(Элемент)
Если Элемент <> ЭлементыФормы.Результаты85 Тогда
ВызватьИсключение "Чужой элемент события строки";
КонецЕсли;
Если Элемент.ТекущиеДанные = Неопределено Или Элемент.ТекущаяСтрока = Неопределено Или ПараметрОтборПоЗначению = Неопределено Тогда
СтатусСтроки85 = "Список ещё не предоставил строку или свой параметр. Дождитесь подготовки и вручную выберите строку.";
Возврат;
КонецЕсли;
СтатусСтроки85 = КритерийФорма85.ПрочитатьРеальнуюСтроку85(ЭтаФорма, Элемент);
КонецПроцедурыПолный startup собственного пульта
Конфигурация → Модуль обычного приложения
NativeOnStart0; only ordinarythick
Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентОбычноеПриложение Тогда
Ключ85 = Новый УникальныйИдентификатор;
Форма85 = Обработки.КритерийПульт85.ПолучитьФорму("Пульт85",, Ключ85);
Если Форма85 = Неопределено Или ТипЗнч(Форма85) <> Тип("Форма") Или Форма85.Открыта() Или Форма85.КлючУникальности <> Ключ85 Тогда
ВызватьИсключение "Не подтверждён собственный новый ordinary пульт";
КонецЕсли;
Форма85.Открыть();
#Иначе
ВызватьИсключение "Этот урок поддерживает только толстый обычный клиент";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Подготовить только пять собственных сохранённых объектов.
Проверить точную File ИБ, readonly права, состав2 и полный источник1000.
Native criterion manager Find получает только actual A/B ref.
Каждую найденную ссылку сопоставить с ровно одной полной строкой источника: A2/750, B1/250, A2/750.
Как проверить результат
Все поля query/GetObject сверены; refs не создаются из неизвестных UUID.
Нет зависимости от порядка массива Find и нет золотой подстановки результата.
Свежий полный source и actual refs проверяются после чтения.
Ожидаемый результат
Будущий ручной результат: общий source1000, actualFind A2/750 → B1/250 → A2/750. Здесь1С не запускалась.
На что обратить внимание
Состав критерия задаётся в метаданных: фильтрация запроса или UI сама не заменяет Состав.
Find возвращает массив ссылок разных типов, не объекты или строки таблицы.
Отсутствие изменений подтверждает только текущий полный readback своей новой fixture, не атомарность или универсальную защиту от конкурентных операций.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.