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