Расширение формы критерия отбора.ПараметрОтборПоЗначению

Свойства · FilterByValueParameter

Тип: Произвольный. Содержит параметр, используемый для передачи форме значения отбора.

Полное описание, параметры и ограничения

Расширение формы критерия отбора.ПараметрОтборПоЗначению (Filter criterion form extension.FilterByValueParameter)

Расширение формы критерия отбора (Filter criterion form extension)

ПараметрОтборПоЗначению (FilterByValueParameter)

Доступен, начиная с версии 8.0.

Использование:
Чтение и запись.
Описание:
Тип: Произвольный.
Содержит параметр, используемый для передачи форме значения отбора.
Доступность:

Толстый клиент.

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Настоящая обычная форма критерия и проверка её действительной строки

Получить свою скомпилированную форму критерия, установить собственный ref-параметр и native отбор, обновить её actual список и проверить настоящий источник события строки.

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

Полный client-only модуль КритерийФорма85; только собственная ordinary criterion form и TableBox. Поддержка native событий полностью приложена.

Подготовка

  1. Это не пример для рабочей базы. Вручную создайте совершенно новую собственную пустую File ИБ C:\1c-labs\OwnCriterionClientExplorer85_a6945f42-884d-4431-8b73-dcc6a731db8e\IB на отдельном учебном Windows стенде платформы8.5.1.1343. Уже существующий путь не переиспользуйте и не очищайте. Зарегистрированная строка File="путь"; проверяется буквально. Здесь ни каталог, ни CF, ни ИБ, ни записи не создавались;1С не запускалась.

  2. Конфигурация УчебныйКритерийКлиента85: совместимость НеИспользовать; ОсновнойРежимЗапуска ОбычноеПриложение. В Конфигураторе Сервис → Параметры → Общие → редактирование конфигурации для режима запуска «Управляемое приложение и обычное приложение». Это настройка редактора, не выдуманное свойство SupportedRunModes. Только два справочника, один документ, один критерий, одна обработка, два общих модуля, две общие картинки и одна роль. Регистров, движений, разделителей, расширений, подписок, фоновых заданий и иных прикладных объектов нет; модули объектов/менеджеров пусты.

  3. Справочник Клиенты85: неиерархический, без владельцев, табличных частей и предопределённых элементов; Код Строка12, Наименование80, автонумерацияНет/контроль уникальностиДа. Единственный реквизит Маркер85: Строка36. Справочник Связи85 с теми же стандартными настройками: Маркер85 Строка36, Клиент85 только СправочникСсылка.Клиенты85, Сумма85 только Число10,2. Документ Счет85: Номер Строка12, автонумерацияНет/контроль уникальностиДа, проведениеЗапретить, движения и табличные части отсутствуют. Его три реквизита Маркер85/Клиент85/Сумма85 имеют те же точные типы.

  4. Критерий отбора СвязиКлиента85: Тип только СправочникСсылка.Клиенты85. Откройте свойство Состав кнопкой выбора и включите ровно Справочник.Связи85.Реквизит.Клиент85 и Документ.Счет85.Реквизит.Клиент85. Это два реквизита, а не два произвольных имени таблиц. Программа читает readonly Состав, проверяет Количество2 и Содержит обоих actual metadata реквизитов, не записывает его и не использует недокументированный индекс.

  5. До установки 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, кроме двух самих клиентов.

  6. Единственная роль Клиент85Чтение и пользователь Клиент85Ученик: на этапе ручного заполнения временно разрешите своей роли запись только этих собственных объектов. Перед упражнением в Конфигураторе снимите Добавление/Изменение/Удаление и интерактивное редактирование у обоих каталогов и документа; оставьте Чтение/Просмотр/ВводПоСтроке, использование своей обработки и АктивныеПользователи для проверки единственного подключения. Без RLS и привилегированности. Сохраните/обновите исключительно свою CF, закройте первоначальный клиент и Конфигуратор. В будущем учебном запуске программа фактически проверяет ЧтениеTrue и три права записиFalse для каждого источника; роль с полными правами откажет. Не переключайте права программно и не применяйте такой порядок к production.

  7. ОбщиеМодули КритерийИсточник85 и КритерийФорма85: ГлобальныйНет, КлиентОбычноеПриложениеДа, КлиентУправляемоеПриложениеНет, СерверНет, ВнешнееСоединениеНет, ПривилегированныйНет, повторное использованиеНеИспользовать. В первый целиком SOURCE, во второй целиком EXPLORER. Они выполняются только в том же обычном клиенте, не являются серверными RPC-помощниками.

  8. В КритерииОтбора → СвязиКлиента85 → Формы создайте ОБЫЧНУЮ форму Список85, основную форму критерия. Её основной реквизит Список85 имеет конкретный тип КритерийОтбораСписок.СвязиКлиента85; табличное поле Результаты85 связано Данные=Список85 и работает как список критерия, не как ТаблицаЗначений. Поле ТолькоПросмотрДа, форма ТолькоПросмотрДа. Добавьте СтатусСтроки85 Строка2000 readonly. CRITERION_FORM целиком в модуль; native ПриОткрытии0 → ПриОткрытии, у Результаты85 ПриАктивизацииСтроки0 плюс общий первый Элемент → Строка85(Элемент). Actual list создаёт штатная подготовленная форма; конструктора NewCriterionList нет. Если actual значение имеет иной тип/Неопределено, остановитесь: код не подставляет фиктивный пустой объект.

  9. Обработка КритерийПульт85: единственная основная ОБЫЧНАЯ форма Пульт85. Реквизиты МеткаПульта85 Строка36 и Статус85 Строка2000 readonly. Табличное поле Клиенты85 и поле ввода ОписаниеВыбора85: Данные пустое, их значение устанавливается явно полученным native СписокЗначений; тип значения поля ввода — СписокЗначений, обе области readonly. У списка покажите стандартные колонки Значение/Представление/Картинка, запретите редактирование и изменение порядка. Кнопка Показать85: Нажатие0 плюс общий первый Кнопка → Показать85(Кнопка). ПриОткрытии → ПриОткрытии0. CHOICE полностью в модуль; APPLICATION в МодульОбычногоПриложения. Никогда не вызывайте native обработчики вручную.

  10. В ОбщиеКартинки вручную добавьте КлиентА85 и КлиентБ85: собственные одиночные растровые PNG14×14 без вариантов и коллекций, например голубой и зелёный квадраты. Это явные новые ресурсы собственной CF, не предполагаемые имена стандартной библиотеки. Программа читает actual БиблиотекаКартинок, проверяет TypePicture и native Ширина()/Высота()14, присваивает каждому actual ValueListItem только библиотечную картинку и проверяет readback. Picture.Width/Height могут вернуть Неопределено у коллекции — тогда отказ, а не выдуманный размер. Файлы/картинки здесь не создавались и не скачивались.

  11. После ручной подготовки запустите только один толстый обычный клиент своего стенда. NativeGetChoiceData получает тип Клиенты85 и настоящую Structure с required Отбор/СтрокаПоиска. Это чтение, не создание/подмена клиентов. Программа проверит все два actual ValueListItem, refs/повторы/картинки, свяжет один actual список с двумя собственными controls и проверит native типовую policy поля ввода и запрет порядка таблицы.

  12. Вручную активируйте A в пульте и нажмите Показать85: настоящий Find(A) обязан вернуть ровно ссылку СвязиA и СчетA. Их суммы берутся из полного источника и складываются, итог750, не печатается готовое литеральное750 вместо результата. Затем выберите B/нажмите: один actual СчетB на250; затем снова A: два actual объекта на750. Каждый этап заново проверяет весь источник, все пять сохранённых refs и каждое поле actual GetObject. Отказ/неверный выбор до этапа не меняет данные. После ошибки интерфейса stickyСТОП, нет blind retry/rollback.

  13. В каждой открытой форме критерия вручную выберите действительную строку. Native событие от своего Результаты85 предоставляет CurrentRow/CurrentData как ref объекта, не как ValueTableRow. Она сверяется с actual Find-массивом этого клиента. Неопределено означает, что интерфейс ещё не предоставил строку: дождитесь/выберите её сами, не имитируйте callback и не присваивайте золотую строку. Числа доказываются Find/полными запросами, а не обещанием полной перечислимости всех GUI-строк. Закрывается только сохранённая собственная предыдущая форма; если она не закрылась, новую код не создаёт.

#Если ТолстыйКлиентОбычноеПриложение Тогда

Функция ПрочитатьСвоюФорму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");
КонецФункции

#КонецЕсли
Полный источник и native Find

ОбщиеМодули → КритерийИсточник85, целиком

ClientOrdinaryДа, ServerНет; readonly own source

#Если ТолстыйКлиентОбычноеПриложение Тогда

Процедура ПроверитьПоле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(Паспорт);
    Возврат Новый Структура("Клиент,Ссылки,Сумма", Клиент, Ссылки, Сумма);
КонецФункции

#КонецЕсли
Полный пульт реального выбора

Обработки → КритерийПульт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.Открыть();
#Иначе
    ВызватьИсключение "Этот урок поддерживает только толстый обычный клиент";
#КонецЕсли
КонецПроцедуры

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

  1. Получить actual compiled form по имени, своему владельцу и новому ключу.

  2. Проверить native основной CriterionList и реальную binding TableBox.

  3. Child Filter.SelectValue.Set(ref,True), Refresh0, независимый Find/readback.

  4. Открыть native форму и дать пользователю выбрать её строку; настоящий callback сверит CurrentData ref.

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

  1. Form Undefined/reuse/foreignowner/type mismatch дают отказ.

  2. Отбор ровно один, useTrue/Равно/ownref и readonly policy проверены.

  3. CurrentDataUndefined не заменяется неизвестной или золотой строкой.

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

Форма отражает своего клиента; её actual current ref входит в nativeFind-массив. Полное число GUI-строк не обещается.

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

  1. GetForm338 native description ошибочно говорит о журнале документов: raw справка сохранена, используется exact criterion topic/собственная подготовленная форма.

  2. Нельзя создать CriterionList неизвестным конструктором или присвоить ему ValueTable.

  3. Refresh перечитывает данные, но не обещает синхронного готового CurrentData во всех интерфейсных состояниях.

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

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

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

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

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