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