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