Формирует список значений данных выбора при вводе по строке, автоподборе текста и быстром выборе. Если требуется выполнить поиск более 32 слов или 1000 символов, то свойство ОграничиватьСтрокуПоиска требуется установить в значение Ложь.
Синтаксис
ПолучитьДанныеВыбора(<ТипЗначения>, <Параметры>)Полное описание, параметры и ограничения
Глобальный контекст.ПолучитьДанныеВыбора (Global context.GetChoiceData)
Глобальный контекст (Global context)
ПолучитьДанныеВыбора (GetChoiceData)
Доступен, начиная с версии 8.2.
Синтаксис:
ПолучитьДанныеВыбора(<ТипЗначения>, <Параметры>)
Параметры:
<ТипЗначения> (обязательный)
Тип: Тип.
Объект метаданных, для которого выполняется формирование типа значений.
Указывается в виде типа.
Например: СправочникСсылка.Товары.
<Параметры> (обязательный)
Тип: Структура.
Содержит параметры для формирования списка значений.
Структура, в которой обязательно должны содержаться следующие ключи:
Отбор (Filter) - тип Структура. Отбор, используемый для поиска данных. Значения элементов отбора могут иметь тип Массив, СписокЗначений, ФиксированныйМассив или иной тип, не являющийся коллекцией; для типов Массив, СписокЗначений, ФиксированныйМассив сравнение выполняется с видом сравнения ВСписке, иначе вид сравнения Равно;
СтрокаПоиска (SearchString) - содержит строку, используемую при поиске данных. Для быстрого выбора содержит значение Неопределено;
ВыборГруппИЭлементов (ChoiceFoldersAndItems) (необязательный) - тип ИспользованиеГруппИЭлементов. Указывает использование групп и элементов;
СпособПоискаСтроки (StringSearchMode) (необязательный) - тип СпособПоискаСтрокиПриВводеПоСтроке. Указывает способ поиска при вводе по строке;
ПолнотекстовыйПоиск (FullTextSearch) (необязательный) - тип ПолнотекстовыйПоискПриВводеПоСтроке. Указывает необходимость использования полнотекстового поиска при вводе по строке;
ОграничиватьСтрокуПоиска (LimitSearchString) (необязательный) - тип Булево. Указывает необходимость применения ограничений на искомую строку при вводе по строке.
Возвращаемое значение:
Тип: СписокЗначений.
Описание:
Формирует список значений данных выбора при вводе по строке, автоподборе текста и быстром выборе.
Если требуется выполнить поиск более 32 слов или 1000 символов, то свойство ОграничиватьСтрокуПоиска требуется установить в значение Ложь.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Вызов метода выполняет обращение к серверу.
Примечание:
При вызове на тонком и веб-клиентах в режиме низкой скорости соединения возвращаемые значения кэшируются.
Клиентский кэш сбрасывается, если два раза подряд были запрошены данные с одинаковыми значениями параметров.
В режиме совместимости конфигурации Версия8_3_17 и ниже рекомендуется устанавливать свойство ОграничиватьСтрокуПоиска в значение Истина, чтобы при выполнении сложных запросов генерировалась ошибка.
Использование в версии:
Доступен, начиная с версии 8.2.
Описание изменено в версии 8.3.18.
Методическая информация
Практические примеры
Реальные данные выбора клиента: две области списка и свои картинки
Получить настоящие данные выбора, применить типовую и readonly policy двух собственных controls и через действительный ValueListItem выполнить маршрут A/B/A.
Где и как запускать
Полный модуль ordinary обработки КритерийПульт85.Пульт85; actual native list controls и кнопка. Клиентский интерфейс, без записей в ИБ.
Подготовка
Это не пример для рабочей базы. Вручную создайте совершенно новую собственную пустую 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, СвояФормаКритерия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 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(Паспорт);
Возврат Новый Структура("Клиент,Ссылки,Сумма", Клиент, Ссылки, Сумма);
КонецФункции
#КонецЕслиПолный 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");
КонецФункции
#КонецЕслиПолный 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.Открыть();
#Иначе
ВызватьИсключение "Этот урок поддерживает только толстый обычный клиент";
#КонецЕсли
КонецПроцедурыРазбор по шагам
NativeGetChoiceData с обоими required аргументами и полной параметрической Structure.
Проверить actual список2 и everyitem ref/повторы; библиотечные картинки14×14/readback.
Один native ValueList в подготовленных own TextBox/TableBox, DescriptionTypes policy и запрет порядка.
Только реальная выбранная строка собственного списка и native ButtonClick запускают следующие A/B/A этапы.
Как проверить результат
Нет unknowninput, искусственного вызова callback или предположенного имени встроенной картинки.
Actual list/control policies читаются обратно.
Числа берутся из nativeFind/source, не подставляются в интерфейс вместо расчёта.
Ожидаемый результат
Пользователь получает2 собственных клиента и наблюдает actual A750 → B250 → A750 при неизменном source1000.
На что обратить внимание
Программно ValueListItem.Picture допускает только пустую или библиотечную картинку; здесь используется исключительно собственная library.
TableBox списка значений даёт ValueListItem, а TableBox критерия — object ref: эти значения нельзя смешивать.
FieldListValueType ограничивает значения редактора, а не является правами доступа к базе данных.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.