Разработка и Конфигурация · 12 мин
Как сделать форму подбора в 1С
Как создать форму подбора в 1С: динамический список, отборы, передача выбранных товаров в документ. Пошаговая инструкция с кодом и типичными ошибками.
Форма подбора в 1С — это вспомогательная форма, которая открывается из документа или другого объекта и позволяет пользователю выбрать элементы справочника (чаще всего номенклатуру) с передачей результата обратно в табличную часть. Типовые конфигурации уже содержат такие формы, но в самописных решениях и при доработках подбор приходится создавать вручную.
Существует два базовых подхода. Первый — стандартный выбор через форму выбора справочника с параметром «РежимВыбора», который подходит для одиночного подбора. Второй — полноценная форма подбора с динамическим списком, отборами по группам и свойствам, отображением остатков и множественным выбором. Ниже разобран второй вариант, поскольку именно его обычно имеют в виду под «формой подбора».
Материал ориентирован на управляемые формы (тонкий клиент, веб-клиент) и платформу 1С:Предприятие 8.3. Для обычных форм подход схож, но используется другой объектная модель — табличное поле вместо динамического списка и модальное открытие.
Какой вариант подбора выбрать под свою задачу
Прежде чем создавать форму, определите сценарий использования. От него зависит, достаточно ли стандартного механизма платформы или нужна собственная разработка.
Сравнение вариантов подбора
Подходит для одиночного выбора элемента. Включается параметром РежимВыбора=Истина. Не даёт отбора по остаткам и множественного подбора без доработки.
Форма выбора с параметром МножественныйВыбор=Истина. Позволяет отметить несколько элементов, но не показывает остатки и цены без доработки.
Произвольная форма с динамическим списком, отборами, остатками, ценами и корзиной выбранных позиций. Максимальная гибкость, но требует разработки и сопровождения.
В конфигурациях на БСП есть готовые механизмы подбора номенклатуры. Подходит, если конфигурация типовая и доработка не нужна.
Для документа «Реализация товаров» в самописной конфигурации чаще всего оправдан третий вариант: менеджеру нужно видеть остатки, цены и быстро набирать корзину товаров. Для простого справочника контрагентов достаточно первого.
Создание формы подбора с динамическим списком
Создайте новую общую форму (или форму списка справочника «Номенклатура» с именем, например, «ФормаПодбора»). Основной реквизит формы — динамический список с произвольным запросом, если нужно показать остатки и цены.
Пример запроса динамического списка с остатками:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Наименование КАК Наименование,
ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
ПО Номенклатура.Ссылка = Остатки.Номенклатура
Обратите внимание: если динамический список построен на произвольном запросе с соединениями, поле «Ссылка» должно быть помечено как ключевое (свойство «Основная таблица» не используется, поэтому в настройках списка укажите ключевое поле). Без этого выбор элемента и стандартные команды работать не будут.
- 1Создайте общую форму или форму списка справочника с произвольным запросом динамического списка
- 2Добавьте реквизит формы «Корзина» — таблицу значений с колонками Номенклатура, Количество, Цена
- 3Разместите на форме динамический список, таблицу корзины и командную панель с кнопками «Перенести в документ» и «Закрыть»
- 4Напишите обработчик двойного клика или команды «Добавить в корзину» — копирование текущей строки списка в таблицу корзины
- 5Напишите команду переноса: закрытие формы с возвратом массива структур через Закрыть(Результат) или ОповеститьОВыборе
- 6В документе добавьте команду «Подбор» с открытием формы и обработчиком ОбработкаВыбора или оповещения
- 7Проверьте работу в тонком и веб-клиенте, при необходимости включите серверные вызовы корректно
Открытие формы подбора из документа
Форму подбора открывают из команды формы документа. Ключевой момент — передача параметров и получение результата. Рекомендуемый способ для управляемого приложения — открытие с оповещением:
&НаКлиенте
Процедура Подбор(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Склад", Объект.Склад);
ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Ложь);
Оповещение = Новый ОписаниеОповещения("ПодборЗавершение", ЭтотОбъект);
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаПодбора",
ПараметрыФормы, ЭтотОбъект, , , , Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ПодборЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Для Каждого СтрокаПодбора Из Результат Цикл
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = СтрокаПодбора.Номенклатура;
НоваяСтрока.Количество = СтрокаПодбора.Количество;
НоваяСтрока.Цена = СтрокаПодбора.Цена;
КонецЦикла;
КонецПроцедуры
Параметр «ЗакрыватьПриВыборе = Ложь» позволяет оставить форму открытой после каждого выбора — пользователь подбирает позиции одну за другой, не открывая форму заново. Это стандартный параметр форм выбора, он работает и для самостоятельно созданных форм списка.
Передача выбранных данных обратно в документ
Есть два механизма возврата результата. Первый — возврат значения при закрытии формы через метод Закрыть(Результат), где результат — массив структур или таблица, сериализованная в массив. Этот способ работает с описанием оповещения, как показано выше.
Второй — метод ОповеститьОВыборе(ВыбранноеЗначение) на стороне формы подбора и обработчик ОбработкаВыбора в форме документа. Этот вариант удобен, когда подбор идёт порциями: каждая добавленная позиция сразу попадает в документ, а форма остаётся открытой.
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Результат = Новый Структура;
Результат.Вставить("Номенклатура", ТекущиеДанные.Ссылка);
Результат.Вставить("Количество", 1);
ОповеститьОВыборе(Результат);
КонецПроцедуры
В форме документа создайте обработчик события ОбработкаВыбора (директива &НаКлиенте), который проверяет имя источника и добавляет строку. Проверка источника обязательна, если из документа могут открываться несколько разных форм выбора.
Отборы, поиск и удобство работы пользователя
Форма подбора должна экономить время, иначе пользователи будут игнорировать её и выбирать позиции построчно. Минимальный набор удобств: отбор по группе номенклатуры, строка быстрого поиска по наименованию и артикулу, отбор «только с остатками».
Отборы устанавливайте программно при открытии формы через элементы отбора динамического списка или через параметры компоновки данных, если список построен на СКД. Пример установки отбора по складу из параметра формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Склад") Тогда
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
Список, "Склад", Параметры.Склад);
КонецЕсли;
КонецПроцедуры
Для поиска по подстроке используйте стандартную строку поиска динамического списка — она работает без программирования, если у списка включено соответствующее свойство. Собственный поиск по штрихкоду добавляется отдельным полем с обработчиком изменения и запросом к регистру штрихкодов.
Если подбором пользуются продавцы на рабочем месте кассира, добавьте в форму поле ввода количества прямо в строке корзины и обработку сканера штрихкодов через событие ОбработкаОповещения с источником «СканерШтрихкода». Это ускоряет подбор сильнее, чем любые отборы.
Проверка работы и типичные ошибки
После разработки проверьте форму в реальном сценарии: откройте документ, запустите подбор, выберите несколько позиций, закройте форму и убедитесь, что табличная часть заполнена корректно, а модифицированность документа установилась.
Как проверить результат
Каждая выбранная позиция появляется в табличной части документа с нужным количеством
Строки дублируются, количество обнуляется или не переносится
Форма подбора закрывается вместе с документом-владельцем, результат не теряется
После закрытия документа остаётся открытое окно подбора
При открытии применяется отбор по складу или группе из параметров
Список показывает все элементы, отбор игнорируется
Пользователь видит только доступные ему элементы (RLS работает в динамическом списке автоматически)
Пользователь без прав на регистр остатков получает ошибку при открытии формы
Ограничения и когда привлекать разработчика
Простую форму подбора с одиночным выбором можно сделать без программирования — достаточно настроить форму выбора справочника и параметры. Динамический список с остатками, корзина и передача данных требуют навыков встроенного языка 1С и понимания клиент-серверного взаимодействия.
Если требуется подбор с характеристиками, сериями, несколькими складами и сложными ценами, рациональнее использовать готовые механизмы БСП или привлечь разработчика: объём работы заметно превышает учебный пример, а ошибки в ценообразовании напрямую влияют на финансовые документы.
Что важно запомнить
Форма подбора строится на динамическом списке с ключевым полем, открывается из документа с описанием оповещения, а результат передаётся массивом структур через Закрыть() или ОповеститьОВыборе(). Проверяйте дубли строк, работу отборов и закрытие формы вместе с владельцем. Доработки типовых конфигураций выполняйте через расширения и тестируйте на копии.
Часто задаваемые вопросы
Чем форма подбора отличается от обычной формы выбора?
Форма выбора предназначена для выбора одного элемента и закрывается после выбора. Форма подбора рассчитана на многократный выбор: она остаётся открытой, содержит отборы, остатки, корзину и передаёт в документ набор позиций. Технически это может быть та же форма списка, но с параметром «ЗакрыватьПриВыборе = Ложь» и дополнительной логикой.
Как передать таблицу значений из формы подбора в документ?
Напрямую таблицу значений между формами передавать нельзя из-за ограничений сериализации. На сервере формы подбора преобразуйте таблицу в массив структур (циклом по строкам с заполнением структуры по колонкам) и верните этот массив через Закрыть(Результат) или оповещение. В документе массив обходится циклом и разворачивается в табличную часть.
Почему при выборе строки в динамическом списке возвращается Неопределено?
Чаще всего причина в том, что у динамического списка с произвольным запросом не указано ключевое поле. Откройте настройки списка в конфигураторе и установите ключевым полем «Ссылка». Также проверьте, что поле ссылки присутствует в выборке запроса и доступно в данных текущей строки.
Как сделать, чтобы форма подбора не закрывалась после каждого выбора?
Передайте в параметры формы «ЗакрыватьПриВыборе = Ложь» при открытии. Тогда после каждого выбора форма останется открытой, а в документ позиции будут попадать через событие ОбработкаВыбора. Закрытие формы выполняется пользователем вручную или кнопкой «Перенести и закрыть».
Можно ли сделать подбор без программирования?
Частично. Стандартная форма выбора справочника с включённым множественным выбором настраивается через параметры без кода, но не показывает остатки, цены и корзину. Для полноценного подбора с остатками и передачей корзины в документ код на встроенном языке потребуется в любом случае.
Работает ли форма подбора в веб-клиенте?
Да, если она построена на управляемых формах и не использует модальные методы и средства, недоступные в веб-клиенте (например, некоторые компоненты работы с файлами без расширения). Открытие через описания оповещений и динамические списки в веб-клиенте поддерживаются полностью.