В процессе разработки конфигурации на платформе 1С:Предприятие 8.3 одной из наиболее востребованных задач является создание удобного интерфейса для заполнения табличных частей. Стандартное добавление строк через кнопку «Добавить» не всегда удобно, особенно когда список номенклатуры насчитывает тысячи позиций. В таких случаях на помощь приходит механизм подбора. В данной статье мы подробно разберем, как реализовать кнопку подбора в документе Сборка, чтобы пользователь мог быстро выбирать материалы и работы.
Давайте проанализируем, чем «Подбор» отличается от обычного выбора значения в поле. При обычном выборе форма закрывается сразу после выбора одного элемента. При подборе же пользователь должен иметь возможность выбрать несколько позиций подряд, не закрывая окно выбора, а выбранные товары должны автоматически появляться в табличной части документа. Рассмотрим по шагам, как это реализовать на управляемых формах.
Для начала нам необходимо создать визуальный элемент, на который будет нажимать пользователь. Откроем форму документа Сборка в конфигураторе и выполним следующие действия:
Подбор.Материалы). Платформа автоматически создаст кнопку.Действие, чтобы создать обработчик на клиенте.Разберем код, который необходимо написать в созданном обработчике. Нам нужно программно открыть форму выбора справочника Номенклатура.
&НаКлиенте
Процедура Подбор(Команда)
// Определим параметры открытия формы
ПараметрыПодбора = Новый Структура;
ПараметрыПодбора.Вставить("ЗакрыватьПриВыборе", Ложь);
ПараметрыПодбора.Вставить("МножественныйВыбор", Истина);
// Укажем владельца формы - это сама форма документа
// Это критически важно, чтобы сработало событие ОбработкаВыбора
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыПодбора, ЭтаФорма);
КонецПроцедуры
Посмотрим на ситуацию глубже: в документе Сборка нам могут быть нужны не все записи справочника. Например, нам нужны только материалы или услуги (работы), но не готовая продукция. Мы можем передать параметры отбора в форму выбора. Проанализируем, как дополнить наш код структурой Отбор.
&НаКлиенте
Процедура Подбор(Команда)
ПараметрыПодбора = Новый Структура;
ПараметрыПодбора.Вставить("ЗакрыватьПриВыборе", Ложь);
ПараметрыПодбора.Вставить("МножественныйВыбор", Истина);
// Создаем отбор по виду номенклатуры
// Предположим, у нас есть перечисление ВидыНоменклатуры
СписокВидов = Новый Массив;
СписокВидов.Добавить(ПредопределенноеЗначение("Перечисление.ВидыНоменклатуры.Материал"));
СписокВидов.Добавить(ПредопределенноеЗначение("Перечисление.ВидыНоменклатуры.Работа"));
Отбор = Новый Структура("ВидНоменклатуры", СписокВидов);
ПараметрыПодбора.Вставить("Отбор", Отбор);
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыПодбора, ЭтаФорма);
КонецПроцедуры
Когда пользователь выбирает элемент в открывшемся окне, форма выбора посылает оповещение своему владельцу (форме документа). Чтобы «поймать» этот выбор, нам нужно реализовать обработчик события формы ОбработкаВыбора. Рассмотрим, как правильно перенести данные в табличную часть.
В модуле формы документа выберем в списке событий формы ОбработкаВыбора. Обратите внимание, что выбранное значение (ВыбранноеЗначение) может быть как одиночной ссылкой, так и массивом ссылок (если включен множественный выбор).
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
// Проверим, что данные пришли именно из формы выбора номенклатуры
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Номенклатура") Тогда
ДобавитьНоменклатуруВТаблицу(ВыбранноеЗначение);
ИначеЕсли ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда
Для Каждого Элемент Из ВыбранноеЗначение Цикл
ДобавитьНоменклатуруВТаблицу(Элемент);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьНоменклатуруВТаблицу(НоменклатураСсылка)
// Сначала проверим, нет ли уже такой позиции в документе
// Чтобы не дублировать строки, а увеличивать количество
ПараметрыПоиска = Новый Структура("Номенклатура", НоменклатураСсылка);
НайденныеСтроки = Объект.Материалы.НайтиСтроки(ПараметрыПоиска);
Если НайденныеСтроки.Количество() > 0 Тогда
ТекущаяСтрока = НайденныеСтроки[0];
ТекущаяСтрока.Количество = ТекущаяСтрока.Количество + 1;
Иначе
// Если товара нет - добавляем новую строку
НоваяСтрока = Объект.Материалы.Добавить();
НоваяСтрока.Номенклатура = НоменклатураСсылка;
НоваяСтрока.Количество = 1;
// Здесь можно вызвать серверную процедуру для заполнения цен и единиц измерения
ЗаполнитьРеквизитыНоменклатурыНаСервере(НоваяСтрока.НомерСтроки - 1);
КонецЕсли;
КонецПроцедуры
Выясним причину, по которой стандартная форма выбора не всегда удобна. В крупных решениях (УНФ, ERP) часто используется специальная обработка «Подбор номенклатуры». Выделим ее основные преимущества:
Если вы решите создать такую форму самостоятельно, принцип останется тем же: вы открываете форму обработки, а по кнопке «Перенести» вызываете метод ОповеститьОВыборе(КорзинаТаблица). В форме документа в ОбработкаВыбора вы получите всю таблицу сразу и циклом перенесете ее в документ.
В документе Сборка важно учитывать логику. Если в документе две табличные части (например, «Продукция» и «Материалы»), необходимо гарантировать, что данные попадут в нужный список. Для этого при открытии формы подбора можно передать дополнительный параметр:
ПараметрыПодбора.Вставить("ИмяТабличнойЧасти", "Материалы");
Затем в ОбработкаВыбора вы сможете проверить ИсточникВыбора или использовать переданные параметры, чтобы понять, куда именно записывать данные.
Резюмируем: Реализация подбора требует четкого понимания взаимодействия форм. Используйте ОткрытьФорму с параметром Владелец, передавайте нужные настройки через Структуру и всегда обрабатывайте результат в ОбработкаВыбора. Это сделает вашу конфигурацию профессиональной и удобной для конечного пользователя.