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