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