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

В этой статье мы разберем все этапы реализации подбора — от базовой настройки в типовой конфигурации до написания собственных обработок с использованием 1С:Query и управляемых форм. Особое внимание уделим типовым ошибкам, которые допускают разработчики при кастомизации подбора, а также оптимизации производительности при работе с большими справочниками (100 000+ позиций). Если вы только начинаете осваивать , здесь вы найдете пошаговые инструкции с примерами кода. Опытные программисты смогут оценить нюансы работы с динамическими списками и нестандартными сценариями подбора.

1. Стандартный подбор в 1С: где используется и как включается

В типовой конфигурации 1С:Управление торговлей или 1С:ERP механизм подбора уже интегрирован в ключевые документы:

  • 📦 Заказы клиентов — подбор номенклатуры в табличную часть;
  • 📋 Поступление товаров — добавление позиций из справочника;
  • 🔄 Перемещение товаров — выбор из нескольких складов;
  • 💰 Счета на оплату — подбор услуг или товаров для клиента.

Чтобы активировать стандартный подбор, достаточно:

  1. Открыть документ (например, Заказ клиента);
  2. Перейти в табличную часть (например, Товары);
  3. Нажать кнопку Подбор на панели инструментов или клавишу F9.

Система откроет форму подбора с фильтрами по номенклатуре, характеристикам, сериям и другим реквизитам. Однако стандартная форма часто ограничена:

  • 🔍 Нет возможности сохранять часто используемые фильтры;
  • 📊 Отсутствует группировка по произвольным полям;
  • 🔄 Нельзя подгружать данные из внешних источников (например, остатки с сайта).
📊 Какой механизм подбора вы используете чаще?
Стандартный подбор 1С
Кастомизированный подбор
Внешние обработки
Не использую подбор

2. Кастомизация стандартного подбора: добавление фильтров и колонок

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

  1. Создайте расширение для конфигурации (Конфигуратор → Расширения → Добавить).
  2. Найдите форму подбора (например, ФормаПодбораТоваров) и добавьте в нее новые элементы:

// Пример добавления колонки"Артикул поставщика" в форму подбора

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

ЭлементыФормы.Список.Колонки.Добавить("АртикулПоставщика");

ЭлементыФормы.Список.Колонки.АртикулПоставщика.Заголовок ="Артикул (поставщик)";

ЭлементыФормы.Список.Колонки.АртикулПоставщика.Ширина = 120;

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

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


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

ЭлементыФормы.Фильтр.Элементы.ДобавитьТекст("Поставщик",

Новый ОписаниеОпцийФильтра("Поставщик", Новый ОписаниеТипов("СправочникСсылка.Контрагенты")));

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

Важно учитывать, что при кастомизации через расширения:

  • 🔧 Изменения сохранятся при обновлении типовой конфигурации;
  • 🔄 Можно отключить расширение без потери данных;
  • ⚠️ Некоторые объекты (например, ДинамическийСписок) требуют особой аккуратности при модификации.
💡

Если после добавления колонок данные не отображаются, проверьте права доступа к реквизиту в ролях пользователей.

3. Реализация подбора с нуля: создание обработки

Когда стандартный подбор принципиально не подходит (например, нужно подбирать данные из нескольких справочников или с внешним API), разумнее создать внешнюю обработку подбора. Алгоритм действий:

  1. Создайте новую обработку (Файл → Новый → Обработка).
  2. Добавьте реквизиты для хранения отобранных данных (например, СписокВыбранныхТоваров).
  3. Разместите на форме:
    • 🔍 Поле ввода для поиска;
    • 📋 Таблицу с результатами;
    • ✅ Кнопки"Добавить" и"Закрыть".
  4. Напишите обработчики для загрузки данных и передачи результатов в документ.
  5. Пример кода для загрузки данных с фильтрацией:

    
    

    Процедура ЗагрузитьДанные(Фильтр ="")

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

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

    "ВЫБРАТЬ

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

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

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

    |ИЗ

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

    |ГДЕ

    | Номенклатура.Наименование ПОДОБНО &Фильтр

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

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

    Запрос.УстановитьПараметр("Фильтр","%" + Фильтр +"%");

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

    СписокТоваров.Очистить;

    Выборка = Результат.Выбрать;

    Пока Выборка.Следующий Цикл

    НоваяСтрока = СписокТоваров.Добавить;

    НоваяСтрока.Ссылка = Выборка.Ссылка;

    НоваяСтрока.Наименование = Выборка.Наименование;

    НоваяСтрока.Артикул = Выборка.Артикул;

    КонецЦикла;

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

    Для передачи данных обратно в документ используйте метод ЗакрытьИВернутьЗначение:

    
    

    Процедура ДобавитьВыбранное(Команда)

    Возврат ЗакрытьИВернутьЗначение(СписокВыбранныхТоваров.Выгрузить);

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

    Добавлены все необходимые реквизиты|Настроены права доступа|Протестирована работа с большими данными|Проверена совместимость с мобильным клиентом (если нужно)|-->

    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.Прочитать(Ответ.ПолучитьТекст);

    // Обрабатываем данные и добавляем в список подбора

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

    ⚠️ Внимание: При работе с внешними источниками:

    • 🔒 Всегда проверяйте SSL-сертификаты (иначе 1С заблокирует запрос);
    • 🕒 Учитывайте тайм-ауты (по умолчанию — 30 секунд);
    • 🔄 Предусмотрите обработку ошибок (например, Исключение при обрыве связи).
Пример обработки ошибок при HTTP-запросе

Процедура ПолучитьДанныеБезопасно

Попытка

// Код запроса

Исключение

Сообщить("Ошибка соединения:" + ОписаниеОшибки);

Возврат Ложь;

КонецПопытки;

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

6. Типовые ошибки и их решения

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

  1. Подбор не открывается

    Причина: Отсутствует право на объект метаданных или форма подбора удалена.

    Решение: Проверьте роли пользователя в Администрирование → Пользователи.

  2. Данные не отображаются в списке

    Причина: Неверный запрос или отсутствуют права на чтение справочника.

    Решение: Выполните запрос в отладчике (Отладка → Выполнить выражение).

  3. Подбор работает медленно

    Причина: Отсутствуют индексы или запрос выбирает все поля.

    Решение: Оптимизируйте запрос (см. раздел 4).

  4. Не сохраняются настройки фильтров

    Причина: Настройки хранятся в пользовательских данных, которые сбрасываются.

    Решение: Сохраняйте фильтры в ХранилищеЗначений.

⚠️ Внимание: Если после обновления 1С перестал работать кастомизированный подбор, проверьте:

  • 🔧 Совместимость расширений с новой версией платформы;
  • 📝 Изменения в структуре метаданных (например, переименованные реквизиты);
  • 🔄 Обновления в типовой конфигурации, которые могли перезаписать ваши формы.

7. Расширенные сценарии: подбор с учетом остатков, цен и характеристик

В реальных бизнес-задачах часто требуется подбор не просто по наименованию, а с учетом:

  • 📦 Остатков на складах;
  • 💰 Актуальных цен;
  • 🔧 Характеристик товара (цвет, размер);
  • 📅 Сроков годности (для продуктов).

Пример запроса для подбора с остатками:


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

"ВЫБРАТЬ

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

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

| ОстаткиТоваров.КоличествоОстаток КАК Остаток

|ИЗ

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

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(

| &ДатаОтчета,

| Склад = &ТекущийСклад

| ) КАК ОстаткиТоваров

| ПО Номенклатура.Ссылка = ОстаткиТоваров.Номенклатура

|ГДЕ

| ОстаткиТоваров.КоличествоОстаток > 0

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

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

Для подбора с характеристиками используйте виртуальные таблицы:


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

"ВЫБРАТЬ

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

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

|ИЗ

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

| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры

| ПО Номенклатура.Ссылка = ХарактеристикиНоменклатуры.Номенклатура

|ГДЕ

| ХарактеристикиНоменклатуры.Цвет = &Цвет";

⚠️ Внимание: При работе с виртуальными таблицами регистров накопления (ОстаткиТоваров.Остатки) всегда указывайте период и измерения, иначе запрос будет выполняться неоптимально.

8. Подбор в мобильном приложении 1С

Если вы используете 1С:Мобильная платформа, учтите ее особенности:

  • 📱 Ограниченный экран — упрощайте интерфейс подбора;
  • 📶 Медленный интернет — минимизируйте объем передаваемых данных;
  • 🔋 Ограниченные ресурсы — избегайте сложных запросов.

Пример адаптивного подбора для мобильного клиента:


// Используем легкий запрос с лимитом

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

"ВЫБРАТЬ ПЕРВЫЕ 50

| Наименование,

| Артикул

|ИЗ

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

|ГДЕ

| Наименование ПОДОБНО &Поиск

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

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

// Отправляем только необходимые данные

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

ДанныеДляМобильногоКлиента = Новый Массив;

Пока Выборка = Результат.Выбрать Цикл

ДанныеДляМобильногоКлиента.Добавить(

Новый Структура("Наименование,Артикул", Выборка.Наименование, Выборка.Артикул)

);

КонецЦикла;

Для ускорения работы в мобильном приложении:

  • 🔍 Используйте поиск по первым символам (а не полнотекстовый);
  • 📥 Кэшируйте часто запрашиваемые данные;
  • 🔄 Обновляйте список только при явном запросе пользователя.
💡

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

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

Как сделать подбор по штрихкоду?

Добавьте в форму подбора поле ввода для штрихкода и обработчик события ПриИзменении:


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

Если ЗначениеЗаполнено(Элемент.Значение) Тогда

Номенклатура = Справочники.Номенклатура.НайтиПоШтрихкоду(Элемент.Значение);

Если Номенклатура.Пустая Тогда

Сообщить("Товар не найден!");

Иначе

ДобавитьВПодбор(Номенклатура);

КонецЕсли;

КонецЕсли;

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

Можно ли сделать подбор с фотографиями товаров?

Да, для этого:

  1. Добавьте реквизит Фотография (тип ХранилищеЗначения) в справочник Номенклатура;
  2. В форму подбора добавьте колонку типа ПолеКартинки;
  3. При загрузке данных укажите источник картинки: Строка.Картинка = Номенклатура.Фотография.Получить.

⚠️ Для ускорения загрузки используйте уменьшенные превью (ПолучитьКартинку(100, 100)).

Как ограничить подбор по определенному складу?

Добавьте параметр ТекущийСклад в запрос:


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

"ВЫБРАТЬ

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

|ИЗ

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

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(

| &Дата,

| Склад = &ТекущийСклад

| ) КАК Остатки

| ПО Номенклатура.Ссылка = Остатки.Номенклатура

|ГДЕ

| Остатки.КоличествоОстаток > 0";

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

Форма.ТекущийСклад = ДокументОбъект.Склад;
Почему подбор не показывает актуальные цены?

Цены в подборе берутся из регистра ЦеныНоменклатуры. Проверьте:

  • 📅 Дату, на которую запрашиваются цены (должна совпадать с датой документа);
  • 🏷️ Тип цен (например,"Розничная" или"Оптовая");
  • 🔄 Актуальность записей в регистре (возможно, цены не пересчитаны).

Пример корректного запроса цен:


ВЫБРАТЬ

ЦеныНоменклатуры.Цена КАК Цена

ИЗ

РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

ГДЕ

ЦеныНоменклатуры.Номенклатура = &Номенклатура

И ЦеныНоменклатуры.ТипЦен = &ТипЦен

И ЦеныНоменклатуры.Период = МАКСИМУМ(ЦеныНоменклатуры.Период)

Как сделать подбор с группировкой по категориям?

Используйте ИЕРАРХИЯ в запросе:


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

"ВЫБРАТЬ

| Номенклатура.Родитель КАК Категория,

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

|ИЗ

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

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

| ИЕРАРХИЯ Номенклатура.Родитель ВОЗРАСТАНИЮ,

| Наименование ВОЗРАСТАНИЮ";

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

ЭлементыФормы.Список.Группировка.Добавить("Категория");