Когда речь заходит о обработке выбора в 1С, многие начинающие разработчики и даже опытные пользователи сталкиваются с путаницей. Этот механизм — один из ключевых элементов взаимодействия с базой данных в системе 1С:Предприятие, но его часто путают с обычными диалогами выбора или отчётами. На самом деле обработка выбора — это специализированный инструмент, который позволяет гибко управлять данными, отображаемыми пользователю в интерактивных формах.

В этой статье мы разберём, что такое обработка выбора на техническом уровне, как она отличается от стандартных запросов и отчётов, и где её применение оправдано. Вы узнаете о трёх основных типах обработок выбора (простые, сложные и динамические), увидите реальные примеры кода на встроенном языке 1С 8.3, а также получите чек-лист по типичным ошибкам, которые допускают даже профессионалы. Особое внимание уделим интеграции обработок выбора с управляемыми формами и мобильным приложением 1С — актуальная тема для 2026 года.

Если вы когда-нибудь задавались вопросом, почему при выборе элемента справочника в форме документа появляется не стандартное окно, а кастомный список с фильтрами — скорее всего, там задействована именно обработка выбора. Далее вы поймёте, как этот механизм работает изнутри и как его настроить под специфические бизнес-задачи.

Что такое обработка выбора в 1С: определение и назначение

В терминологии 1С:Предприятие обработка выбора — это программный модуль, который определяет логику отображения и фильтрации данных при интерактивном выборе пользователем элементов справочников, документов или других объектов метаданных. В отличие от статических запросов, обработка выбора позволяет:

  • 🔹 Динамически формировать список доступных значений на основе контекста (например, показывать только активные контрагентов для текущего документа).
  • 🔹 Настраивать внешний вид окна выбора: добавлять колонки, группировки, условное оформление.
  • 🔹 Реализовывать сложную логику фильтрации, включая проверку прав доступа или бизнес-правил (например, запрет выбора товаров с нулевым остатком).
  • 🔹 Интегрироваться с управляемыми формами и мобильным клиентом, обеспечивая единый пользовательский опыт.

Технически обработка выбора представляет собой совокупность:

  1. Модуля на встроенном языке , где описывается алгоритм формирования данных.
  2. Опциональной формы (если требуется нестандартный интерфейс).
  3. Настроек в метаданных, связывающих обработку с конкретным реквизитом или полем ввода.

Важно понимать, что обработка выбора не является самостоятельным объектом конфигурации — она привязывается к полям ввода через свойство ПолеВыбора или метод УстановитьОбработкуВыбора(). Это позволяет переопределять стандартное поведение системы без модификации типовых конфигураций.

📊 Как часто вы используете кастомные обработки выбора в 1С?
Никогда не использовал
Только для сложных задач
Регулярно в типовых доработках
Постоянно разрабатываю свои

Три типа обработок выбора: когда и какой использовать

В практике разработки на выделяют три основных подхода к реализации обработок выбора, каждый из которых решает свои задачи. Выбор типа зависит от требований к гибкости, производительности и сложности логики.

Тип обработки Пример использования Плюсы Минусы
Простая обработка
(на основе запроса)
Выбор номенклатуры в документе "Реализация товаров" с фильтром по складу ✅ Быстрая разработка
✅ Минимальная нагрузка на сервер
❌ Ограниченная логика
❌ Нет динамического изменения списка
Сложная обработка
(с формой и модулем)
Выбор контрагента с проверкой кредитного лимита и историей заказов ✅ Гибкая логика
✅ Интерактивный интерфейс
❌ Более высокая нагрузка
❌ Требует больше кода
Динамическая обработка
(с обновлением по событиям)
Выбор сотрудников с фильтрацией по текущему подразделению и должности ✅ Реагирует на изменения контекста
✅ Подходит для комплексных правил
❌ Сложность отладки
❌ Возможны задержки при большом объёме данных

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

Процедура УстановитьОбработкуВыбора(Элемент, ДанныеВыбора)

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| Номенклатура.Наименование КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.ЭтотУзел И

| Номенклатура.ПометкаУдаления = ЛОЖЬ И

| Номенклатура.ВидНоменклатуры = &Вид

|УПОРЯДОЧИТЬ ПО

| Наименование";

Запрос.УстановитьПараметр("Вид", Справочники.ВидыНоменклатуры.Товар);

Результат = Запрос.Выполнить();

ДанныеВыбора.Загрузить(Результат);

КонецПроцедуры

Для сложных сценариев (например, когда нужно показать дополнительную информацию о выбранном элементе или реализовать многоуровневую фильтрацию) потребуется создавать форму обработки выбора с собственными элементами управления. В этом случае логика описывается в модуле формы, а данные могут подгружаться динамически при изменении фильтров.

💡

Если обработка выбора используется в мобильном клиенте 1С, избегайте сложных форм с большим количеством элементов — это может привести к тормозам на слабых устройствах. Отдавайте предпочтение простым спискам с минимальной логикой.

Как создать обработку выбора: пошаговая инструкция

Рассмотрим процесс создания обработки выбора на примере задачи: ограничить выбор контрагентов в документе "Заказ покупателя" только теми, у кого есть действующий договор. Для этого выполните следующие шаги:

☑️ Создание обработки выбора в 1С

Выполнено: 0 / 5

Шаг 1. Определение требований

Перед написанием кода сформулируйте:

  • 📌 Какие данные должны отображаться в списке (колонки, группировки)?
  • 📌 Какие фильтры нужно применить (по статусу, дате, связанным объектам)?
  • 📌 Нужна ли дополнительная информация о выбранном элементе (например, остаток по договору)?

Шаг 2. Создание модуля обработки

Добавьте в общий модуль (например, РаботаСВыборами) следующую процедуру:

Процедура ОбработкаВыбораКонтрагентов(Элемент, ДанныеВыбора, СтандартнаяОбработка) Экспорт

// Отменяем стандартную обработку

СтандартнаяОбработка = Ложь;

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ РАЗЛИЧНЫЕ

| Контрагенты.Ссылка КАК Ссылка,

| Контрагенты.Наименование КАК Наименование,

| ДоговорыКонтрагентов.Номер КАК НомерДоговора,

| ДоговорыКонтрагентов.Дата КАК ДатаДоговора

|ИЗ

| Справочник.Контрагенты КАК Контрагенты

| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов

| ПО Контрагенты.Ссылка = ДоговорыКонтрагентов.Контрагент

|ГДЕ

| Контрагенты.ПометкаУдаления = ЛОЖЬ И

| ДоговорыКонтрагентов.Ссылка ЕСТЬ NULL ИЛИ

| ДоговорыКонтрагентов.ДатаОкончания >= &ТекущаяДата

|УПОРЯДОЧИТЬ ПО

| Наименование";

Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());

Результат = Запрос.Выполнить();

// Настраиваем отображаемые колонки

ДанныеВыбора.Колонки.Очистить();

ДанныеВыбора.Колонки.Добавить("Наименование");

ДанныеВыбора.Колонки.Добавить("НомерДоговора", Новый ОписаниеТипов("Строка"));

ДанныеВыбора.Колонки.Добавить("ДатаДоговора", Новый ОписаниеТипов("Дата"));

ДанныеВыбора.Загрузить(Результат);

КонецПроцедуры

Шаг 3. Привязка обработки к полю

В модуле формы документа "Заказ покупателя" добавьте в процедуру ПриСозданииНаСервере() следующий код:

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Элементы.Контрагент.УстановитьОбработкуВыбора(

"РаботаСВыборами.ОбработкаВыбораКонтрагентов");

КонецПроцедуры

Шаг 4. Тестирование

Перейдите в пользовательский режим и проверьте:

  • 🔍 Открывается ли кастомное окно выбора при клике на поле "Контрагент"?
  • 🔍 Корректно ли применяются фильтры (например, контрагенты без действующих договоров не показываются)?
  • 🔍 Сохраняется ли выбранное значение в документе?
💡

Всегда тестируйте обработку выбора в режиме "1С:Предприятие" с правами обычного пользователя — некоторые ошибки (например, связанные с правами доступа) проявляются только в этом режиме.

Типичные ошибки и как их избежать

Даже опытные разработчики иногда сталкиваются с проблемами при работе с обработками выбора. Вот наиболее распространённые ошибки и способы их решения:

⚠️ Внимание: Если обработка выбора используется в распределённой базе данных (РИБ), убедитесь, что логика фильтрации учитывает особенности репликации. Например, проверка остатков на складе должна выполняться с учётом узла РИБ, иначе пользователи разных баз увидят неактуальные данные.

Ошибка 1. Зацикливание при рекурсивных вызовах

Если в обработке выбора вы снова открываете форму выбора (например, для связанного справочника), может возникнуть бесконечный цикл. Решение:

  • 🛠 Используйте флаг СтандартнаяОбработка для контроля рекурсии.
  • 🛠 Выносите вложенные выборы в отдельные процедуры.

Ошибка 2. Медленная работа при большом объёме данных

Если запрос в обработке выбора возвращает тысячи строк, интерфейс будет "подвисать". Оптимизируйте так:

  • 🛠 Добавьте ограничение по количеству строк (ПЕРВЫЕ 1000).
  • 🛠 Используйте индексированные поля в условиях ГДЕ.
  • 🛠 Реализуйте постраничную загрузку данных.

Ошибка 3. Некорректное отображение колонок

Если в списке выбора отображаются не те колонки или в неправильном порядке, проверьте:

  • 🔧 Соответствие имён колонок в коде и в ДанныеВыбора.Колонки.
  • 🔧 Типы данных колонок (например, для даты должен быть указан тип Дата).

Ошибка 4. Игнорирование прав доступа

Обработка выбора может показывать данные, к которым у пользователя нет прав. Всегда добавляйте проверку:

ГДЕ

Номенклатура.ПометкаУдаления = ЛОЖЬ И

Номенклатура.ПроверитьПраваНаОбъект(ТипПравДоступа.Чтение) = ИСТИНА

Ошибка 5. Несовместимость с мобильным клиентом

Некоторые конструкции (например, сложные формы с вложенными таблицами) не работают в мобильном приложении . Используйте:

  • 📱 Простые списки без группировок.
  • 📱 Минимальный набор колонок.
  • 📱 Асинхронную загрузку данных.
Пример кода для асинхронной загрузки в мобильном клиенте

Процедура ОбработкаВыбораАсинхронно(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

ЗапросДанных.ВыполнитьАсинхронно(Новый ОписаниеОповещения(

"ПослеЗагрузкиДанныхВыбора", ЭтотОбъект, ДанныеВыбора));

КонецПроцедуры

Процедура ПослеЗагрузкиДанныхВыбора(Результат, ДанныеВыбора) Экспорт

ДанныеВыбора.Загрузить(Результат);

КонецПроцедуры

Продвинутые техники: динамические фильтры и интеграция с бизнес-логикой

Для решения комплексных задач обработки выбора можно интегрировать с бизнес-логикой системы. Рассмотрим два продвинутых сценария:

Сценарий 1. Динамическая фильтрация по контексту документа

Допустим, в документе "Заказ покупателя" нужно показывать только тех контрагентов, которые относятся к текущему подразделению менеджера. Для этого:

  1. Получите текущее подразделение из данных сеанса.
  2. Добавьте условие в запрос обработки выбора.
  3. Обновите список при изменении подразделения в документе.
Процедура ОбработкаВыбораКонтрагентов(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

ТекущееПодразделение = Документы.ЗаказыПокупателей.ТекущийДокумент().Подразделение;

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Контрагенты.Ссылка КАК Ссылка,

| Контрагенты.Наименование КАК Наименование

|ИЗ

| Справочник.Контрагенты КАК Контрагенты

|ГДЕ

| Контрагенты.Подразделение = &Подразделение";

Запрос.УстановитьПараметр("Подразделение", ТекущееПодразделение);

// ... остальной код

КонецПроцедуры

Сценарий 2. Интеграция с внешними системами

Если данные для выбора хранятся во внешней системе (например, в CRM или ERP), можно загружать их динамически через HTTPСервис или WS-соединение. Пример:

Процедура ОбработкаВыбораТоваровИзERP(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

// Формируем запрос к внешнему API

Запрос = Новый HTTPЗапрос("https://api.erp-system.ru/goods");

Запрос.Заголовки.Вставить("Authorization", ПолучитьТокенERP());

Ответ = Новый HTTPСоединение().Получить(Запрос);

Данные = JSON.Прочитать(Ответ.ПолучитьТекст());

// Преобразуем данные для 1С

ТаблицаДанных = Новый ТаблицаЗначений;

ТаблицаДанных.Колонки.Добавить("Ссылка");

ТаблицаДанных.Колонки.Добавить("Наименование");

Для Каждого Товар Из Данные.Товары Цикл

Строка = ТаблицаДанных.Добавить();

Строка.Ссылка = Товар.Ид;

Строка.Наименование = Товар.Название;

КонецЦикла;

ДанныеВыбора.Загрузить(ТаблицаДанных);

КонецПроцедуры

Для ускорения работы кэшируйте результаты внешних запросов на стороне , но не забывайте обновлять кэш при изменении данных в внешней системе.

Обработка выбора в управляемых формах: особенности и лайфхаки

С переходом на управляемые формы в 1С 8.3 механизм обработки выбора претерпел изменения. Вот ключевые моменты, которые нужно учитывать:

1. Привязка через свойство "ПолеВыбора"

В управляемых формах обработку выбора можно привязать:

  • 🔗 Через свойство ПолеВыбора элемента формы (например, ПолеВвода или ПолеСписка).
  • 🔗 Программно через метод УстановитьОбработкуВыбора().

2. Использование параметров

В управляемых формах удобно передавать контекстные параметры в обработку выбора. Например, чтобы передать текущий документ:

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Элементы.Номенклатура.УстановитьОбработкуВыбора(

"ОбработкиВыбора.ВыборНоменклатурыДляДокумента",

Новый Структура("Документ", ЭтотОбъект));

КонецПроцедуры

В модуле обработки выбора параметры доступны через второй аргумент:

Процедура ВыборНоменклатурыДляДокумента(Элемент, ДанныеВыбора, Параметры) Экспорт

ТекущийДокумент = Параметры.Документ;

// Далее используем данные документа для фильтрации

КонецПроцедуры

3. Динамическое обновление списка

В управляемых формах можно обновлять данные обработки выбора без переоткрытия формы, реагируя на события. Например, при изменении склада обновить список номенклатуры:

Процедура СкладПриИзменении(Элемент)

Элементы.Номенклатура.ОбновитьДанныеВыбора();

КонецПроцедуры

4. Особенности работы в веб-клиенте

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

  • 🌐 Избегайте сложных форм с большим количеством элементов — это увеличивает время загрузки.
  • 🌐 Для больших списков используйте ОтображатьПозициюПрокрутки для ускорения рендеринга.
  • 🌐 Тестируйте обработку в разных браузерах (особенно в Edge и Safari, где могут быть нюансы с отображением).
💡

В управляемых формах для ускорения работы обработки выбора используйте серверные вызовы (асинхронные методы) вместо клиентских. Это уменьшит нагрузку на браузер пользователя.

Примеры реальных задач и их решения

Разберём несколько практических кейсов, где обработка выбора помогает решить бизнес-задачи.

Кейс 1. Выбор сотрудников с учётом графика работы

Задача: В документе "Заявка на отпуск" нужно показывать только тех сотрудников, которые числятся в текущем подразделении и не находятся в другом отпуске.

Решение:

Процедура ОбработкаВыбораСотрудников(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

ТекущаяДата = ТекущаяДата();

ТекущееПодразделение = Документы.ЗаявкиНаОтпуск.ТекущийДокумент().Подразделение;

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Сотрудники.Ссылка КАК Ссылка,

| Сотрудники.Наименование КАК Наименование

|ИЗ

| Справочник.Сотрудники КАК Сотрудники

|ГДЕ

| Сотрудники.Подразделение = &Подразделение И

| НЕ СУЩЕСТВУЕТ (

| ВЫБРАТЬ

| ЗаявкиНаОтпускСотрудники.Сотрудник КАК Сотрудник

| ИЗ

| Документ.ЗаявкиНаОтпуск.Сотрудники КАК ЗаявкиНаОтпускСотрудники

| ГДЕ

| ЗаявкиНаОтпускСотрудники.Сотрудник = Сотрудники.Ссылка И

| ЗаявкиНаОтпускСотрудники.Ссылка.ДатаНачала <= &ТекущаяДата И

| ЗаявкиНаОтпускСотрудники.Ссылка.ДатаОкончания >= &ТекущаяДата

| )";

Запрос.УстановитьПараметр("Подразделение", ТекущееПодразделение);

Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());

ДанныеВыбора.Загрузить(Запрос.Выполнить());

КонецПроцедуры

Кейс 2. Многоуровневый выбор с группировкой

Задача: В справочнике "Номенклатура" нужно реализовать выбор с группировкой по категориям и подкатегориям, при этом показывать остатки на складе.

Решение: Используем обработку выбора с формой, где реализуем иерархический список:

Процедура ОбработкаВыбораНоменклатурыСГруппировкой(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

// Создаём форму с деревом и таблицей

ФормаВыбора = ПолучаемФорму("Справочник.Номенклатура.ФормаВыбораСГруппировкой");

ФормаВыбора.Элементы.ДеревоГрупп.ЗагрузитьГруппы();

ФормаВыбора.Элементы.ТаблицаНоменклатуры.ЗагрузитьДанные();

Если ФормаВыбора.ОткрытьМодально() Тогда

ДанныеВыбора.Значение = ФормаВыбора.ВыбранныйЭлемент;

КонецЕсли;

КонецПроцедуры

Кейс 3. Выбор с предварительным просмотром

Задача: При выборе изображения для товара показывать превью картинки прямо в окне выбора.

Решение: Используем форму обработки выбора с элементом ПолеHTMLДокумента для отображения превью:

Процедура ОбработкаВыбораИзображений(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

ФормаВыбора = ПолучаемФорму("ОбщаяФорма.ВыборИзображений");

ФормаВыбора.Элементы.СписокФайлов.ЗагрузитьСписок();

ФормаВыбора.ОбновитьПревью();

Если ФормаВыбора.ОткрытьМодально() Тогда

ДанныеВыбора.Значение = ФормаВыбора.ВыбранныйФайл;

КонецЕсли;

КонецПроцедуры

FAQ: Частые вопросы по обработке выбора в 1С

Можно ли использовать обработку выбора для полей с типом "Строка" или "Число"?

Нет, обработка выбора в предназначена только для полей, которые ссылаются на объекты метаданных (справочники, документы, планы видов характеристик и т.д.). Для строк или чисел можно использовать ПолеВвода с подсказками (УстановитьПодсказку()) или создавать кастомные формы выбора.

Как сделать, чтобы обработка выбора работала только для определённой роли пользователя?

Добавьте проверку прав в начале процедуры обработки:

Процедура МояОбработкаВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

Если НЕ ГлобальныйКонтекст.Пользователь.ПроверитьПрава("РольАдминистратор") Тогда

Возврат;

КонецЕсли;

// Остальной код

КонецПроцедуры

Или используйте условие в запросе:

ГДЕ

Номенклатура.ПометкаУдаления = ЛОЖЬ И

Номенклатура.ПроверитьПраваНаОбъект(ТипПравДоступа.Чтение) = ИСТИНА

Почему обработка выбора не работает в мобильном приложении 1С?

Вероятные причины:

  1. Используются неsupported элементы формы (например, ПолеHTMLДокумента).
  2. Запрос возвращает слишком много данных (в мобильном клиенте лимит строгоже).
  3. Обработка выбора привязана через ПолеВыбора, но не адаптирована для мобильной платформы.

Решение: упростите форму, уменьшите объём данных и используйте асинхронную загрузку.

Как передать в обработку выбора данные из текущей формы?

Используйте третий параметр метода УстановитьОбработкуВыбора(), куда можно передать структуру с данными:

Элементы.Контрагент.УстановитьОбработкуВыбора(

"МойМодуль.ОбработкаВыбораКонтрагентов",

Новый Структура(

"ТекущийДокумент", ЭтотОбъект,

"ТолькоАктивные", Истина

)

);

В обработке выбора доступ к параметрам:

Процедура ОбработкаВыбораКонтрагентов(