Механизм подбора номенклатуры — одна из наиболее частых задач при разработке учетных систем на платформе 1С:Предприятие. Нередко разработчики сталкиваются с ситуацией, когда форма подбора открывается, пользователь выбирает товар и количество, метод ОповеститьОВыборе успешно отрабатывает без ошибок, однако в вызывающую форму документа данные так и не попадают. Разберем по шагам причины такого поведения платформы и выясним, как правильно связать форму подбора с табличной частью документа.
В платформе 1С метод ОповеститьОВыборе не рассылает данные широковещательно по всей системе. Он передает выбранное значение исключительно владельцу формы (свойство ВладелецФормы). Если владелец не определен или обработчик события настроен некорректно, оповещение просто игнорируется платформой.
Рассмотрим типовые ошибки, которые приводят к сбою передачи данных:
ПолучитьФорму(ИмяФормы, Владелец, КлючУникальности). Если передать форму документа вместо табличного поля, обработчик в табличном поле не вызовется.ЭтаФорма), событие выбора должно перехватываться процедурой модуля формы ОбработкаВыбора(ЗначениеВыбора, Источник). Если же владельцем назначено табличное поле (ЭлементыФормы.Товары), вызов направляется в процедуру события элемента управления ТоварыОбработкаВыбора.Разберем классическую схему, когда форма подбора открывается с указанием конкретного табличного поля в качестве владельца.
Шаг 1. Открытие формы подбора из документа
В модуле формы документа при нажатии на кнопку командной панели открываем форму подбора и передаем табличное поле ЭлементыФормы.Товары вторым параметром:
Процедура КоманднаяПанельТоварыПодбор(Кнопка)
ФормаПодбора = Обработки.гарПодбор.ПолучитьФорму("Форма", ЭлементыФормы.Товары, ЭтаФорма);
ФормаПодбора.РежимВыбора = Истина;
ФормаПодбора.МножественныйВыбор = Истина;
ФормаПодбора.ЗакрыватьПриВыборе = Ложь;
ФормаПодбора.Открыть();
КонецПроцедуры
Шаг 2. Формирование структуры данных и отправка выбора
В форме подбора при выборе строки списка (или после модального ввода количества) вызываем стандартный метод ОповеститьОВыборе:
Процедура СписокНоменклатурыВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
ТекСтрока = ЭлементыФормы.СписокНоменклатуры.ТекущиеДанные;
Если ТекСтрока.Ссылка.ЭтоГруппа Тогда
Возврат;
Иначе
СтандартнаяОбработка = Ложь;
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Номенклатура", ТекСтрока.Ссылка);
СтруктураДанных.Вставить("ЕдиницаИзмерения", ТекСтрока.Ссылка.ЕдиницаДляОтчетов);
СтруктураДанных.Вставить("Количество", 1);
ОповеститьОВыборе(СтруктураДанных);
КонецЕсли;
КонецПроцедуры
Шаг 3. Обработка полученных данных в документе
В свойствах табличного поля Товары в строке события ОбработкаВыбора привязываем процедуру ТоварыОбработкаВыбора:
Процедура ТоварыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтрокаТЧ = Товары.Добавить();
СтрокаТЧ.Номенклатура = ВыбранноеЗначение.Номенклатура;
СтрокаТЧ.ЕдиницаИзмерения = ВыбранноеЗначение.ЕдиницаИзмерения;
СтрокаТЧ.Количество = ВыбранноеЗначение.Количество;
СтрокаТЧ.Цена = УзнатьЦену(СтрокаТЧ);
СтрокаТЧ.Сумма = СтрокаТЧ.Цена * СтрокаТЧ.Количество;
КонецПроцедуры
Проанализируем альтернативный вариант, когда владельцем формы подбора выступает форма документа (ЭтаФорма). В этом случае обработка выполняется на уровне формы, а не конкретного элемента.
При открытии передаем форму:
ФормаПодбора = Обработки.гарПодбор.ПолучитьФорму("Форма", ЭтаФорма, ЭтаФорма);
ФормаПодбора.РежимВыбора = Истина;
ФормаПодбора.МножественныйВыбор = Истина;
ФормаПодбора.ЗакрыватьПриВыборе = Ложь;
ФормаПодбора.Открыть();
В модуле формы документа описываем стандартную процедуру события формы ОбработкаВыбора:
Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
Если ТипЗнч(ЗначениеВыбора) = Тип("Структура") Тогда
СтрокаТЧ = Товары.Добавить();
СтрокаТЧ.Номенклатура = ЗначениеВыбора.Номенклатура;
СтрокаТЧ.ЕдиницаИзмерения = ЗначениеВыбора.ЕдиницаИзмерения;
СтрокаТЧ.Количество = ЗначениеВыбора.Количество;
СтрокаТЧ.Цена = УзнатьЦену(СтрокаТЧ);
СтрокаТЧ.Сумма = СтрокаТЧ.Цена * СтрокаТЧ.Количество;
КонецЕсли;
КонецПроцедуры
Если в процессе подбора открывается дополнительное окно для запроса количества, цены или коэффициента, необходимо помнить о правилах возврата значений:
Форма.ОткрытьМодально() возвращает значение только в том случае, если форма закрывается с передачей параметра: ЭтаФорма.Закрыть(СтруктураДанных).Неопределено. Поэтому перед вызовом ОповеститьОВыборе обязательно проверяем результат на заполненность:
ФормаВвода = ПолучитьФорму("ФормаВводаПараметров");
ФормаВвода.Номенклатура = ТекСтрока.Ссылка;
СтруктураДанных = ФормаВвода.ОткрытьМодально();
Если СтруктураДанных <> Неопределено Тогда
ОповеститьОВыборе(СтруктураДанных);
КонецЕсли;
Соблюдение соответствия между переданным объектом-владельцем и обработчиком события гарантирует безошибочную передачу данных из подбора в табличную часть.