При включенной функциональной опции раздельного ведения партнеров и контрагентов пользователи часто сталкиваются с неудобством: в форме списка справочника Партнеры отсутствует возможность быстро найти нужную позицию по ИНН. Поскольку менеджеры по продажам и закупкам в ежедневной работе обращаются именно к партнерам, вопрос организации быстрого поиска по юридическим реквизитам становится критически важным. Разберем архитектурные причины такого поведения платформы и рассмотрим практические способы решения этой задачи.
Проанализируем структуру хранения данных в типовых конфигурациях (1С:Управление торговлей 11, 1С:ERP, 1С:Комплексная автоматизация):
Партнеры предназначен для ведения управленческого учета (сети, холдинги, торговые марки), а справочник Контрагенты хранит регламентированные данные (ИНН, КПП, ОГРН, банковские счета). Одному партнеру может соответствовать несколько контрагентов. По этой причине реквизит ИНН хранится исключительно в справочнике Контрагенты.СГРУППИРОВАТЬ ПО) или соединение с агрегированными подзапросами в динамических списках отключает порционную динамическую подгрузку данных и существенно замедляет открытие формы.Партнеры является иерархическим. При установке отбора на динамический список по списку ссылок узлы-родители могут скрываться, если они не попали в выборку, что нарушает дерево отображения. Для корректной работы со структурой подчиненности используется регистр сведений ИерархияПартнеров.Наиболее удобным и производительным решением является добавление на форму списка собственного поля ввода для поиска по ИНН. Разберем алгоритм его реализации по шагам:
Партнеры.ПолеПоискаИНН и выносим его в командную панель или область фильтров формы.Контрагенты, получаем список партнеров и накладываем отбор на динамический список Список.Посмотрим на пример серверной процедуры установки отбора:
&НаСервере
Процедура УстановитьОтборПоИНННаСервере(Знач ТекстИНН)
// Очищаем предыдущий отбор по полю Ссылка, если он был установлен ранее
ЭлементОтбора = Неопределено;
Для Каждого Элемент Из Список.КомпоновкаДанныхКлиента.Отбор.Элементы Цикл
Если Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка") Тогда
ЭлементОтбора = Элемент;
Прервать;
КонецЕсли;
КонецЦикла;
Если ПустаяСтрока(ТекстИНН) Тогда
Если ЭлементОтбора <> Неопределено Тогда
ЭлементОтбора.Использование = Ложь;
КонецЕсли;
Возврат;
КонецЕсли;
// Запрашиваем партнеров, связанных с найденными контрагентами
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Контрагенты.Партнер КАК Партнер
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН ПОДОБНО &ИНН + ""%""
| И Контрагенты.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)";
Запрос.УстановитьПараметр("ИНН", СокрЛП(ТекстИНН));
МассивПартнеров = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Партнер");
// Накладываем отбор на динамический список
Если ЭлементОтбора = Неопределено Тогда
ЭлементОтбора = Список.КомпоновкаДанныхКлиента.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
КонецЕсли;
ЭлементОтбора.ПравоеЗначение = МассивПартнеров;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
Если на предприятии используется сложная иерархия партнеров (головные компании, обособленные подразделения), запрос можно дополнить соединением с регистром сведений ИерархияПартнеров, чтобы в результат отбора попадали вышестоящие родительские узлы.
Для ускорения ввода первичных документов удобно научить поле выбора партнера распознавать ввод ИНН. Для этого переопределим обработчик ОбработкаПолученияДанныхВыбора в модуле менеджера справочника Партнеры:
ДанныеВыбора.СтандартнаяОбработка = Ложь, чтобы система не выполняла повторный поиск по наименованию партнера.Если внесение изменений в конфигурацию не планируется, рассмотрим организационные и штатные возможности:
Контрагент (где штатно доступен поиск по ИНН), после чего связанный Партнер подставится в документ автоматически.ИНН становится доступной непосредственно в общем списке.