Когда речь заходит о обработке выбора в 1С, многие начинающие разработчики и даже опытные пользователи сталкиваются с путаницей. Этот механизм — один из ключевых элементов взаимодействия с базой данных в системе 1С:Предприятие, но его часто путают с обычными диалогами выбора или отчётами. На самом деле обработка выбора — это специализированный инструмент, который позволяет гибко управлять данными, отображаемыми пользователю в интерактивных формах.
В этой статье мы разберём, что такое обработка выбора на техническом уровне, как она отличается от стандартных запросов и отчётов, и где её применение оправдано. Вы узнаете о трёх основных типах обработок выбора (простые, сложные и динамические), увидите реальные примеры кода на встроенном языке 1С 8.3, а также получите чек-лист по типичным ошибкам, которые допускают даже профессионалы. Особое внимание уделим интеграции обработок выбора с управляемыми формами и мобильным приложением 1С — актуальная тема для 2026 года.
Если вы когда-нибудь задавались вопросом, почему при выборе элемента справочника в форме документа появляется не стандартное окно, а кастомный список с фильтрами — скорее всего, там задействована именно обработка выбора. Далее вы поймёте, как этот механизм работает изнутри и как его настроить под специфические бизнес-задачи.
Что такое обработка выбора в 1С: определение и назначение
В терминологии 1С:Предприятие обработка выбора — это программный модуль, который определяет логику отображения и фильтрации данных при интерактивном выборе пользователем элементов справочников, документов или других объектов метаданных. В отличие от статических запросов, обработка выбора позволяет:
- 🔹 Динамически формировать список доступных значений на основе контекста (например, показывать только активные контрагентов для текущего документа).
- 🔹 Настраивать внешний вид окна выбора: добавлять колонки, группировки, условное оформление.
- 🔹 Реализовывать сложную логику фильтрации, включая проверку прав доступа или бизнес-правил (например, запрет выбора товаров с нулевым остатком).
- 🔹 Интегрироваться с управляемыми формами и мобильным клиентом, обеспечивая единый пользовательский опыт.
Технически обработка выбора представляет собой совокупность:
- Модуля на встроенном языке 1С, где описывается алгоритм формирования данных.
- Опциональной формы (если требуется нестандартный интерфейс).
- Настроек в метаданных, связывающих обработку с конкретным реквизитом или полем ввода.
Важно понимать, что обработка выбора не является самостоятельным объектом конфигурации — она привязывается к полям ввода через свойство ПолеВыбора или метод УстановитьОбработкуВыбора(). Это позволяет переопределять стандартное поведение системы без модификации типовых конфигураций.
Три типа обработок выбора: когда и какой использовать
В практике разработки на 1С выделяют три основных подхода к реализации обработок выбора, каждый из которых решает свои задачи. Выбор типа зависит от требований к гибкости, производительности и сложности логики.
| Тип обработки | Пример использования | Плюсы | Минусы |
|---|---|---|---|
| Простая обработка (на основе запроса) |
Выбор номенклатуры в документе "Реализация товаров" с фильтром по складу | ✅ Быстрая разработка ✅ Минимальная нагрузка на сервер |
❌ Ограниченная логика ❌ Нет динамического изменения списка |
| Сложная обработка (с формой и модулем) |
Выбор контрагента с проверкой кредитного лимита и историей заказов | ✅ Гибкая логика ✅ Интерактивный интерфейс |
❌ Более высокая нагрузка ❌ Требует больше кода |
| Динамическая обработка (с обновлением по событиям) |
Выбор сотрудников с фильтрацией по текущему подразделению и должности | ✅ Реагирует на изменения контекста ✅ Подходит для комплексных правил |
❌ Сложность отладки ❌ Возможны задержки при большом объёме данных |
Для большинства типовых задач достаточно простой обработки на основе запроса. Например, если нужно ограничить выбор товаров только теми, которые есть на складе, можно использовать следующий код:
Процедура УстановитьОбработкуВыбора(Элемент, ДанныеВыбора)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтотУзел И
| Номенклатура.ПометкаУдаления = ЛОЖЬ И
| Номенклатура.ВидНоменклатуры = &Вид
|УПОРЯДОЧИТЬ ПО
| Наименование";
Запрос.УстановитьПараметр("Вид", Справочники.ВидыНоменклатуры.Товар);
Результат = Запрос.Выполнить();
ДанныеВыбора.Загрузить(Результат);
КонецПроцедуры
Для сложных сценариев (например, когда нужно показать дополнительную информацию о выбранном элементе или реализовать многоуровневую фильтрацию) потребуется создавать форму обработки выбора с собственными элементами управления. В этом случае логика описывается в модуле формы, а данные могут подгружаться динамически при изменении фильтров.
Если обработка выбора используется в мобильном клиенте 1С, избегайте сложных форм с большим количеством элементов — это может привести к тормозам на слабых устройствах. Отдавайте предпочтение простым спискам с минимальной логикой.
Как создать обработку выбора: пошаговая инструкция
Рассмотрим процесс создания обработки выбора на примере задачи: ограничить выбор контрагентов в документе "Заказ покупателя" только теми, у кого есть действующий договор. Для этого выполните следующие шаги:
☑️ Создание обработки выбора в 1С
Шаг 1. Определение требований
Перед написанием кода сформулируйте:
- 📌 Какие данные должны отображаться в списке (колонки, группировки)?
- 📌 Какие фильтры нужно применить (по статусу, дате, связанным объектам)?
- 📌 Нужна ли дополнительная информация о выбранном элементе (например, остаток по договору)?
Шаг 2. Создание модуля обработки
Добавьте в общий модуль (например, РаботаСВыборами) следующую процедуру:
Процедура ОбработкаВыбораКонтрагентов(Элемент, ДанныеВыбора, СтандартнаяОбработка) Экспорт
// Отменяем стандартную обработку
СтандартнаяОбработка = Ложь;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Наименование КАК Наименование,
| ДоговорыКонтрагентов.Номер КАК НомерДоговора,
| ДоговорыКонтрагентов.Дата КАК ДатаДоговора
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
| ПО Контрагенты.Ссылка = ДоговорыКонтрагентов.Контрагент
|ГДЕ
| Контрагенты.ПометкаУдаления = ЛОЖЬ И
| ДоговорыКонтрагентов.Ссылка ЕСТЬ NULL ИЛИ
| ДоговорыКонтрагентов.ДатаОкончания >= &ТекущаяДата
|УПОРЯДОЧИТЬ ПО
| Наименование";
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
Результат = Запрос.Выполнить();
// Настраиваем отображаемые колонки
ДанныеВыбора.Колонки.Очистить();
ДанныеВыбора.Колонки.Добавить("Наименование");
ДанныеВыбора.Колонки.Добавить("НомерДоговора", Новый ОписаниеТипов("Строка"));
ДанныеВыбора.Колонки.Добавить("ДатаДоговора", Новый ОписаниеТипов("Дата"));
ДанныеВыбора.Загрузить(Результат);
КонецПроцедуры
Шаг 3. Привязка обработки к полю
В модуле формы документа "Заказ покупателя" добавьте в процедуру ПриСозданииНаСервере() следующий код:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.Контрагент.УстановитьОбработкуВыбора(
"РаботаСВыборами.ОбработкаВыбораКонтрагентов");
КонецПроцедуры
Шаг 4. Тестирование
Перейдите в пользовательский режим и проверьте:
- 🔍 Открывается ли кастомное окно выбора при клике на поле "Контрагент"?
- 🔍 Корректно ли применяются фильтры (например, контрагенты без действующих договоров не показываются)?
- 🔍 Сохраняется ли выбранное значение в документе?
Всегда тестируйте обработку выбора в режиме "1С:Предприятие" с правами обычного пользователя — некоторые ошибки (например, связанные с правами доступа) проявляются только в этом режиме.
Типичные ошибки и как их избежать
Даже опытные разработчики 1С иногда сталкиваются с проблемами при работе с обработками выбора. Вот наиболее распространённые ошибки и способы их решения:
⚠️ Внимание: Если обработка выбора используется в распределённой базе данных (РИБ), убедитесь, что логика фильтрации учитывает особенности репликации. Например, проверка остатков на складе должна выполняться с учётом узла РИБ, иначе пользователи разных баз увидят неактуальные данные.
Ошибка 1. Зацикливание при рекурсивных вызовах
Если в обработке выбора вы снова открываете форму выбора (например, для связанного справочника), может возникнуть бесконечный цикл. Решение:
- 🛠 Используйте флаг
СтандартнаяОбработкадля контроля рекурсии. - 🛠 Выносите вложенные выборы в отдельные процедуры.
Ошибка 2. Медленная работа при большом объёме данных
Если запрос в обработке выбора возвращает тысячи строк, интерфейс будет "подвисать". Оптимизируйте так:
- 🛠 Добавьте ограничение по количеству строк (
ПЕРВЫЕ 1000). - 🛠 Используйте индексированные поля в условиях
ГДЕ. - 🛠 Реализуйте постраничную загрузку данных.
Ошибка 3. Некорректное отображение колонок
Если в списке выбора отображаются не те колонки или в неправильном порядке, проверьте:
- 🔧 Соответствие имён колонок в коде и в
ДанныеВыбора.Колонки. - 🔧 Типы данных колонок (например, для даты должен быть указан тип
Дата).
Ошибка 4. Игнорирование прав доступа
Обработка выбора может показывать данные, к которым у пользователя нет прав. Всегда добавляйте проверку:
ГДЕ
Номенклатура.ПометкаУдаления = ЛОЖЬ И
Номенклатура.ПроверитьПраваНаОбъект(ТипПравДоступа.Чтение) = ИСТИНА
Ошибка 5. Несовместимость с мобильным клиентом
Некоторые конструкции (например, сложные формы с вложенными таблицами) не работают в мобильном приложении 1С. Используйте:
- 📱 Простые списки без группировок.
- 📱 Минимальный набор колонок.
- 📱 Асинхронную загрузку данных.
Пример кода для асинхронной загрузки в мобильном клиенте
Процедура ОбработкаВыбораАсинхронно(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ЗапросДанных.ВыполнитьАсинхронно(Новый ОписаниеОповещения(
"ПослеЗагрузкиДанныхВыбора", ЭтотОбъект, ДанныеВыбора));
КонецПроцедуры
Процедура ПослеЗагрузкиДанныхВыбора(Результат, ДанныеВыбора) Экспорт
ДанныеВыбора.Загрузить(Результат);
КонецПроцедуры
Продвинутые техники: динамические фильтры и интеграция с бизнес-логикой
Для решения комплексных задач обработки выбора можно интегрировать с бизнес-логикой системы. Рассмотрим два продвинутых сценария:
Сценарий 1. Динамическая фильтрация по контексту документа
Допустим, в документе "Заказ покупателя" нужно показывать только тех контрагентов, которые относятся к текущему подразделению менеджера. Для этого:
- Получите текущее подразделение из данных сеанса.
- Добавьте условие в запрос обработки выбора.
- Обновите список при изменении подразделения в документе.
Процедура ОбработкаВыбораКонтрагентов(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущееПодразделение = Документы.ЗаказыПокупателей.ТекущийДокумент().Подразделение;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Наименование КАК Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Подразделение = &Подразделение";
Запрос.УстановитьПараметр("Подразделение", ТекущееПодразделение);
// ... остальной код
КонецПроцедуры
Сценарий 2. Интеграция с внешними системами
Если данные для выбора хранятся во внешней системе (например, в CRM или ERP), можно загружать их динамически через HTTPСервис или WS-соединение. Пример:
Процедура ОбработкаВыбораТоваровИзERP(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Формируем запрос к внешнему API
Запрос = Новый HTTPЗапрос("https://api.erp-system.ru/goods");
Запрос.Заголовки.Вставить("Authorization", ПолучитьТокенERP());
Ответ = Новый HTTPСоединение().Получить(Запрос);
Данные = JSON.Прочитать(Ответ.ПолучитьТекст());
// Преобразуем данные для 1С
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("Ссылка");
ТаблицаДанных.Колонки.Добавить("Наименование");
Для Каждого Товар Из Данные.Товары Цикл
Строка = ТаблицаДанных.Добавить();
Строка.Ссылка = Товар.Ид;
Строка.Наименование = Товар.Название;
КонецЦикла;
ДанныеВыбора.Загрузить(ТаблицаДанных);
КонецПроцедуры
Для ускорения работы кэшируйте результаты внешних запросов на стороне 1С, но не забывайте обновлять кэш при изменении данных в внешней системе.
Обработка выбора в управляемых формах: особенности и лайфхаки
С переходом на управляемые формы в 1С 8.3 механизм обработки выбора претерпел изменения. Вот ключевые моменты, которые нужно учитывать:
1. Привязка через свойство "ПолеВыбора"
В управляемых формах обработку выбора можно привязать:
- 🔗 Через свойство
ПолеВыбораэлемента формы (например,ПолеВводаилиПолеСписка). - 🔗 Программно через метод
УстановитьОбработкуВыбора().
2. Использование параметров
В управляемых формах удобно передавать контекстные параметры в обработку выбора. Например, чтобы передать текущий документ:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.Номенклатура.УстановитьОбработкуВыбора(
"ОбработкиВыбора.ВыборНоменклатурыДляДокумента",
Новый Структура("Документ", ЭтотОбъект));
КонецПроцедуры
В модуле обработки выбора параметры доступны через второй аргумент:
Процедура ВыборНоменклатурыДляДокумента(Элемент, ДанныеВыбора, Параметры) Экспорт
ТекущийДокумент = Параметры.Документ;
// Далее используем данные документа для фильтрации
КонецПроцедуры
3. Динамическое обновление списка
В управляемых формах можно обновлять данные обработки выбора без переоткрытия формы, реагируя на события. Например, при изменении склада обновить список номенклатуры:
Процедура СкладПриИзменении(Элемент)
Элементы.Номенклатура.ОбновитьДанныеВыбора();
КонецПроцедуры
4. Особенности работы в веб-клиенте
При использовании обработок выбора в веб-клиенте учитывайте:
- 🌐 Избегайте сложных форм с большим количеством элементов — это увеличивает время загрузки.
- 🌐 Для больших списков используйте
ОтображатьПозициюПрокруткидля ускорения рендеринга. - 🌐 Тестируйте обработку в разных браузерах (особенно в Edge и Safari, где могут быть нюансы с отображением).
В управляемых формах для ускорения работы обработки выбора используйте серверные вызовы (асинхронные методы) вместо клиентских. Это уменьшит нагрузку на браузер пользователя.
Примеры реальных задач и их решения
Разберём несколько практических кейсов, где обработка выбора помогает решить бизнес-задачи.
Кейс 1. Выбор сотрудников с учётом графика работы
Задача: В документе "Заявка на отпуск" нужно показывать только тех сотрудников, которые числятся в текущем подразделении и не находятся в другом отпуске.
Решение:
Процедура ОбработкаВыбораСотрудников(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущаяДата = ТекущаяДата();
ТекущееПодразделение = Документы.ЗаявкиНаОтпуск.ТекущийДокумент().Подразделение;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Наименование КАК Наименование
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Подразделение = &Подразделение И
| НЕ СУЩЕСТВУЕТ (
| ВЫБРАТЬ
| ЗаявкиНаОтпускСотрудники.Сотрудник КАК Сотрудник
| ИЗ
| Документ.ЗаявкиНаОтпуск.Сотрудники КАК ЗаявкиНаОтпускСотрудники
| ГДЕ
| ЗаявкиНаОтпускСотрудники.Сотрудник = Сотрудники.Ссылка И
| ЗаявкиНаОтпускСотрудники.Ссылка.ДатаНачала <= &ТекущаяДата И
| ЗаявкиНаОтпускСотрудники.Ссылка.ДатаОкончания >= &ТекущаяДата
| )";
Запрос.УстановитьПараметр("Подразделение", ТекущееПодразделение);
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
ДанныеВыбора.Загрузить(Запрос.Выполнить());
КонецПроцедуры
Кейс 2. Многоуровневый выбор с группировкой
Задача: В справочнике "Номенклатура" нужно реализовать выбор с группировкой по категориям и подкатегориям, при этом показывать остатки на складе.
Решение: Используем обработку выбора с формой, где реализуем иерархический список:
Процедура ОбработкаВыбораНоменклатурыСГруппировкой(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Создаём форму с деревом и таблицей
ФормаВыбора = ПолучаемФорму("Справочник.Номенклатура.ФормаВыбораСГруппировкой");
ФормаВыбора.Элементы.ДеревоГрупп.ЗагрузитьГруппы();
ФормаВыбора.Элементы.ТаблицаНоменклатуры.ЗагрузитьДанные();
Если ФормаВыбора.ОткрытьМодально() Тогда
ДанныеВыбора.Значение = ФормаВыбора.ВыбранныйЭлемент;
КонецЕсли;
КонецПроцедуры
Кейс 3. Выбор с предварительным просмотром
Задача: При выборе изображения для товара показывать превью картинки прямо в окне выбора.
Решение: Используем форму обработки выбора с элементом ПолеHTMLДокумента для отображения превью:
Процедура ОбработкаВыбораИзображений(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ФормаВыбора = ПолучаемФорму("ОбщаяФорма.ВыборИзображений");
ФормаВыбора.Элементы.СписокФайлов.ЗагрузитьСписок();
ФормаВыбора.ОбновитьПревью();
Если ФормаВыбора.ОткрытьМодально() Тогда
ДанныеВыбора.Значение = ФормаВыбора.ВыбранныйФайл;
КонецЕсли;
КонецПроцедуры
FAQ: Частые вопросы по обработке выбора в 1С
Можно ли использовать обработку выбора для полей с типом "Строка" или "Число"?
Нет, обработка выбора в 1С предназначена только для полей, которые ссылаются на объекты метаданных (справочники, документы, планы видов характеристик и т.д.). Для строк или чисел можно использовать ПолеВвода с подсказками (УстановитьПодсказку()) или создавать кастомные формы выбора.
Как сделать, чтобы обработка выбора работала только для определённой роли пользователя?
Добавьте проверку прав в начале процедуры обработки:
Процедура МояОбработкаВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Если НЕ ГлобальныйКонтекст.Пользователь.ПроверитьПрава("РольАдминистратор") Тогда
Возврат;
КонецЕсли;
// Остальной код
КонецПроцедуры
Или используйте условие в запросе:
ГДЕ
Номенклатура.ПометкаУдаления = ЛОЖЬ И
Номенклатура.ПроверитьПраваНаОбъект(ТипПравДоступа.Чтение) = ИСТИНА
Почему обработка выбора не работает в мобильном приложении 1С?
Вероятные причины:
- Используются неsupported элементы формы (например,
ПолеHTMLДокумента). - Запрос возвращает слишком много данных (в мобильном клиенте лимит строгоже).
- Обработка выбора привязана через
ПолеВыбора, но не адаптирована для мобильной платформы.
Решение: упростите форму, уменьшите объём данных и используйте асинхронную загрузку.
Как передать в обработку выбора данные из текущей формы?
Используйте третий параметр метода УстановитьОбработкуВыбора(), куда можно передать структуру с данными:
Элементы.Контрагент.УстановитьОбработкуВыбора(
"МойМодуль.ОбработкаВыбораКонтрагентов",
Новый Структура(
"ТекущийДокумент", ЭтотОбъект,
"ТолькоАктивные", Истина
)
);
В обработке выбора доступ к параметрам:
Процедура ОбработкаВыбораКонтрагентов(