Механизм подбора в 1С:Предприятие — это один из ключевых инструментов, который упрощает работу пользователей с большими объемами данных. Без него приходование товаров, формирование заказов или подбор номенклатуры превращались бы в утомительный процесс ручного поиска по справочникам. Однако стандартные возможности подбора не всегда покрывают специфические бизнес-задачи: иногда требуется кастомизация интерфейса, добавление дополнительных фильтров или интеграция с внешними системами.
В этой статье мы разберем все этапы реализации подбора — от базовой настройки в типовой конфигурации до написания собственных обработок с использованием 1С:Query и управляемых форм. Особое внимание уделим типовым ошибкам, которые допускают разработчики при кастомизации подбора, а также оптимизации производительности при работе с большими справочниками (100 000+ позиций). Если вы только начинаете осваивать 1С, здесь вы найдете пошаговые инструкции с примерами кода. Опытные программисты смогут оценить нюансы работы с динамическими списками и нестандартными сценариями подбора.
1. Стандартный подбор в 1С: где используется и как включается
В типовой конфигурации 1С:Управление торговлей или 1С:ERP механизм подбора уже интегрирован в ключевые документы:
- 📦 Заказы клиентов — подбор номенклатуры в табличную часть;
- 📋 Поступление товаров — добавление позиций из справочника;
- 🔄 Перемещение товаров — выбор из нескольких складов;
- 💰 Счета на оплату — подбор услуг или товаров для клиента.
Чтобы активировать стандартный подбор, достаточно:
- Открыть документ (например,
Заказ клиента); - Перейти в табличную часть (например,
Товары); - Нажать кнопку
Подборна панели инструментов или клавишуF9.
Система откроет форму подбора с фильтрами по номенклатуре, характеристикам, сериям и другим реквизитам. Однако стандартная форма часто ограничена:
- 🔍 Нет возможности сохранять часто используемые фильтры;
- 📊 Отсутствует группировка по произвольным полям;
- 🔄 Нельзя подгружать данные из внешних источников (например, остатки с сайта).
2. Кастомизация стандартного подбора: добавление фильтров и колонок
Если стандартная форма подбора не покрывает ваши нужды, ее можно модифицировать без изменения типовой конфигурации. Для этого:
- Создайте расширение для конфигурации (
Конфигуратор → Расширения → Добавить). - Найдите форму подбора (например,
ФормаПодбораТоваров) и добавьте в нее новые элементы:
// Пример добавления колонки"Артикул поставщика" в форму подбора
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементыФормы.Список.Колонки.Добавить("АртикулПоставщика");
ЭлементыФормы.Список.Колонки.АртикулПоставщика.Заголовок ="Артикул (поставщик)";
ЭлементыФормы.Список.Колонки.АртикулПоставщика.Ширина = 120;
КонецПроцедуры
Для добавления дополнительных фильтров используйте обработчик ПередОткрытием:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
ЭлементыФормы.Фильтр.Элементы.ДобавитьТекст("Поставщик",
Новый ОписаниеОпцийФильтра("Поставщик", Новый ОписаниеТипов("СправочникСсылка.Контрагенты")));
КонецПроцедуры
Важно учитывать, что при кастомизации через расширения:
- 🔧 Изменения сохранятся при обновлении типовой конфигурации;
- 🔄 Можно отключить расширение без потери данных;
- ⚠️ Некоторые объекты (например,
ДинамическийСписок) требуют особой аккуратности при модификации.
Если после добавления колонок данные не отображаются, проверьте права доступа к реквизиту в ролях пользователей.
3. Реализация подбора с нуля: создание обработки
Когда стандартный подбор принципиально не подходит (например, нужно подбирать данные из нескольких справочников или с внешним API), разумнее создать внешнюю обработку подбора. Алгоритм действий:
- Создайте новую обработку (
Файл → Новый → Обработка). - Добавьте реквизиты для хранения отобранных данных (например,
СписокВыбранныхТоваров). - Разместите на форме:
- 🔍 Поле ввода для поиска;
- 📋 Таблицу с результатами;
- ✅ Кнопки"Добавить" и"Закрыть".
- Напишите обработчики для загрузки данных и передачи результатов в документ.
- 🔒 Всегда проверяйте SSL-сертификаты (иначе 1С заблокирует запрос);
- 🕒 Учитывайте тайм-ауты (по умолчанию — 30 секунд);
- 🔄 Предусмотрите обработку ошибок (например,
Исключениепри обрыве связи).
Пример кода для загрузки данных с фильтрацией:
Процедура ЗагрузитьДанные(Фильтр ="")
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &Фильтр
|УПОРЯДОЧИТЬ ПО
| Наименование";
Запрос.УстановитьПараметр("Фильтр","%" + Фильтр +"%");
Результат = Запрос.Выполнить;
СписокТоваров.Очистить;
Выборка = Результат.Выбрать;
Пока Выборка.Следующий Цикл
НоваяСтрока = СписокТоваров.Добавить;
НоваяСтрока.Ссылка = Выборка.Ссылка;
НоваяСтрока.Наименование = Выборка.Наименование;
НоваяСтрока.Артикул = Выборка.Артикул;
КонецЦикла;
КонецПроцедуры
Для передачи данных обратно в документ используйте метод ЗакрытьИВернутьЗначение:
Процедура ДобавитьВыбранное(Команда)
Возврат ЗакрытьИВернутьЗначение(СписокВыбранныхТоваров.Выгрузить);
КонецПроцедуры
Добавлены все необходимые реквизиты|Настроены права доступа|Протестирована работа с большими данными|Проверена совместимость с мобильным клиентом (если нужно)|-->
4. Оптимизация производительности при подборе
Одна из самых распространенных проблем при работе с подбором — тормоза при обработке больших справочников (от 50 000 позиций). Чтобы ускорить работу:
| Проблема | Решение | Пример кода |
|---|---|---|
| Долгая загрузка данных | Использовать ПакетныеЗапросы и ЛИМИТ |
ЗАПРОС.Текст ="ВЫБРАТЬ ПЕРВЫЕ 100..." |
| Подвисание интерфейса | Выполнять запросы в Фоне |
Запрос.ВыполнитьАсинхронно |
| Медленный поиск | Добавить индексы на поля поиска | ИНДЕКСИРОВАТЬ ПО Наименование |
| Частые обновления списка | Кэшировать результаты запросов | Кэш = Новый Структура; |
Критически важно избегать полных выборок из справочников. Вместо:
ВЫБРАТЬ * ИЗ Справочник.Номенклатура
Используйте:
ВЫБРАТЬ ПЕРВЫЕ 1000 Наименование, Артикул ИЗ Справочник.Номенклатура
При работе с динамическими списками в управляемых формах всегда устанавливайте свойство"ПоказыватьСразу = Ложь" — это предотвратит автоматическую загрузку всех данных при открытии формы.
Оптимизация запросов и использование кэша могут сократить время подбора с 10+ секунд до долей секунды даже на слабом железе.
5. Интеграция подбора с внешними системами
Если данные для подбора хранятся вне 1С (например, на сайте, в Excel или SQL-базе), потребуется настроить обмен. Рассмотрим дваных сценария:
5.1. Подбор из Excel-файла
Для загрузки данных из Excel используйте COMОбъект("Excel.Application"):
Процедура ЗагрузитьИзExcel(ПутьКФайлу)
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.Workbooks.Open(ПутьКФайлу);
Лист = Книга.Worksheets(1);
Строка = 2; // Пропускаем заголовки
Пока Лист.Cells(Строка, 1).Value <> Неопределено Цикл
Артикул = Лист.Cells(Строка, 1).Value;
Наименование = Лист.Cells(Строка, 2).Value;
// Добавляем в список подбора
Строка = Строка + 1;
КонецЦикла;
Excel.Quit;
КонецПроцедуры
5.2. Подбор через HTTP-запросы (REST API)
Для интеграции с веб-сервисами используйте HTTPСоединение:
Процедура ПолучитьДанныеССайта(URL)
Соединение = Новый HTTPСоединение(URL);
Запрос = Новый HTTPЗапрос("/api/goods?filter=...");
Ответ = Соединение.Получить(Запрос);
Данные = JSON.Прочитать(Ответ.ПолучитьТекст);
// Обрабатываем данные и добавляем в список подбора
КонецПроцедуры
⚠️ Внимание: При работе с внешними источниками:
Пример обработки ошибок при HTTP-запросе
Процедура ПолучитьДанныеБезопасно
Попытка
// Код запроса
Исключение
Сообщить("Ошибка соединения:" + ОписаниеОшибки);
Возврат Ложь;
КонецПопытки;
КонецПроцедуры
6. Типовые ошибки и их решения
Даже опытные разработчики сталкиваются с проблемами при настройке подбора. Вот самые распространенные ошибки и способы их исправления:
- Подбор не открывается
Причина: Отсутствует право на объект метаданных или форма подбора удалена.
Решение: Проверьте роли пользователя в
Администрирование → Пользователи. - Данные не отображаются в списке
Причина: Неверный запрос или отсутствуют права на чтение справочника.
Решение: Выполните запрос в отладчике (
Отладка → Выполнить выражение). - Подбор работает медленно
Причина: Отсутствуют индексы или запрос выбирает все поля.
Решение: Оптимизируйте запрос (см. раздел 4).
- Не сохраняются настройки фильтров
Причина: Настройки хранятся в пользовательских данных, которые сбрасываются.
Решение: Сохраняйте фильтры в
ХранилищеЗначений.
⚠️ Внимание: Если после обновления 1С перестал работать кастомизированный подбор, проверьте:
- 🔧 Совместимость расширений с новой версией платформы;
- 📝 Изменения в структуре метаданных (например, переименованные реквизиты);
- 🔄 Обновления в типовой конфигурации, которые могли перезаписать ваши формы.
7. Расширенные сценарии: подбор с учетом остатков, цен и характеристик
В реальных бизнес-задачах часто требуется подбор не просто по наименованию, а с учетом:
- 📦 Остатков на складах;
- 💰 Актуальных цен;
- 🔧 Характеристик товара (цвет, размер);
- 📅 Сроков годности (для продуктов).
Пример запроса для подбора с остатками:
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование,
| ОстаткиТоваров.КоличествоОстаток КАК Остаток
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(
| &ДатаОтчета,
| Склад = &ТекущийСклад
| ) КАК ОстаткиТоваров
| ПО Номенклатура.Ссылка = ОстаткиТоваров.Номенклатура
|ГДЕ
| ОстаткиТоваров.КоличествоОстаток > 0
|УПОРЯДОЧИТЬ ПО
| Наименование";
Для подбора с характеристиками используйте виртуальные таблицы:
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| ХарактеристикиНоменклатуры.Наименование КАК Характеристика
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
| ПО Номенклатура.Ссылка = ХарактеристикиНоменклатуры.Номенклатура
|ГДЕ
| ХарактеристикиНоменклатуры.Цвет = &Цвет";
⚠️ Внимание: При работе с виртуальными таблицами регистров накопления (ОстаткиТоваров.Остатки) всегда указывайте период и измерения, иначе запрос будет выполняться неоптимально.
8. Подбор в мобильном приложении 1С
Если вы используете 1С:Мобильная платформа, учтите ее особенности:
- 📱 Ограниченный экран — упрощайте интерфейс подбора;
- 📶 Медленный интернет — минимизируйте объем передаваемых данных;
- 🔋 Ограниченные ресурсы — избегайте сложных запросов.
Пример адаптивного подбора для мобильного клиента:
// Используем легкий запрос с лимитом
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 50
| Наименование,
| Артикул
|ИЗ
| Справочник.Номенклатура
|ГДЕ
| Наименование ПОДОБНО &Поиск
|УПОРЯДОЧИТЬ ПО
| Наименование";
// Отправляем только необходимые данные
Результат = Запрос.Выполнить;
ДанныеДляМобильногоКлиента = Новый Массив;
Пока Выборка = Результат.Выбрать Цикл
ДанныеДляМобильногоКлиента.Добавить(
Новый Структура("Наименование,Артикул", Выборка.Наименование, Выборка.Артикул)
);
КонецЦикла;
Для ускорения работы в мобильном приложении:
- 🔍 Используйте поиск по первым символам (а не полнотекстовый);
- 📥 Кэшируйте часто запрашиваемые данные;
- 🔄 Обновляйте список только при явном запросе пользователя.
В мобильной версии 1С подбор должен работать без подключения к интернету — реализуйте локальное кэширование критичных данных.
FAQ: Частые вопросы по подбору в 1С
Как сделать подбор по штрихкоду?
Добавьте в форму подбора поле ввода для штрихкода и обработчик события ПриИзменении:
Процедура ШтрихкодПриИзменении(Элемент)
Если ЗначениеЗаполнено(Элемент.Значение) Тогда
Номенклатура = Справочники.Номенклатура.НайтиПоШтрихкоду(Элемент.Значение);
Если Номенклатура.Пустая Тогда
Сообщить("Товар не найден!");
Иначе
ДобавитьВПодбор(Номенклатура);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Можно ли сделать подбор с фотографиями товаров?
Да, для этого:
- Добавьте реквизит
Фотография(типХранилищеЗначения) в справочникНоменклатура; - В форму подбора добавьте колонку типа
ПолеКартинки; - При загрузке данных укажите источник картинки:
Строка.Картинка = Номенклатура.Фотография.Получить.
⚠️ Для ускорения загрузки используйте уменьшенные превью (ПолучитьКартинку(100, 100)).
Как ограничить подбор по определенному складу?
Добавьте параметр ТекущийСклад в запрос:
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(
| &Дата,
| Склад = &ТекущийСклад
| ) КАК Остатки
| ПО Номенклатура.Ссылка = Остатки.Номенклатура
|ГДЕ
| Остатки.КоличествоОстаток > 0";
Передавайте значение склада при открытии формы подбора:
Форма.ТекущийСклад = ДокументОбъект.Склад;
Почему подбор не показывает актуальные цены?
Цены в подборе берутся из регистра ЦеныНоменклатуры. Проверьте:
- 📅 Дату, на которую запрашиваются цены (должна совпадать с датой документа);
- 🏷️ Тип цен (например,"Розничная" или"Оптовая");
- 🔄 Актуальность записей в регистре (возможно, цены не пересчитаны).
Пример корректного запроса цен:
ВЫБРАТЬ
ЦеныНоменклатуры.Цена КАК Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
ЦеныНоменклатуры.Номенклатура = &Номенклатура
И ЦеныНоменклатуры.ТипЦен = &ТипЦен
И ЦеныНоменклатуры.Период = МАКСИМУМ(ЦеныНоменклатуры.Период)
Как сделать подбор с группировкой по категориям?
Используйте ИЕРАРХИЯ в запросе:
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Родитель КАК Категория,
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|УПОРЯДОЧИТЬ ПО
| ИЕРАРХИЯ Номенклатура.Родитель ВОЗРАСТАНИЮ,
| Наименование ВОЗРАСТАНИЮ";
В форме подбора настройте группировку в динамическом списке:
ЭлементыФормы.Список.Группировка.Добавить("Категория");