Как заменить ссылку на существующего контрагента при попытке создания дубля из формы документа в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет IT и автоматизация бизнеса
← На главную

В практической работе с конфигурациями на платформе 1С:Предприятие 8.3 (например, в 1С:Управление нашей фирмой) часто возникает проблема дублирования нормативно-справочной информации (НСИ). Типичный сценарий: менеджер оформляет документ Расходная накладная, вводит ИНН или наименование нового клиента, не находит его мгновенно в быстром выборе и нажимает кнопку «Создать». Несмотря на то, что в базе уже есть контрагент с таким же ИНН, система может лишь выдать предупреждение, но не запретить создание дубля.

В этой статье мы подробно разберем, как реализовать механизм бесшовной подмены ссылки. Мы сделаем так, чтобы при попытке создания нового контрагента система проверяла его по ключевым реквизитам (ИНН, КПП, телефон), и в случае обнаружения дубля автоматически закрывала форму создания, подставляя уже существующего контрагента в исходный документ.

Понимание механизма платформы: Владелец формы и ОповеститьОВыборе

Для начала разберем, как технически устроена связь между формой документа и формой создания нового элемента справочника. Когда пользователь нажимает кнопку «Создать» (или «плюс») в поле ввода документа, платформа выполняет следующие действия:

  1. Открывает форму нового элемента справочника Контрагенты.
  2. В качестве Владельца открываемой формы устанавливается поле ввода исходного документа (доступно через свойство ЭтаФорма.Владелец).
  3. При успешной записи нового элемента платформа автоматически отправляет ссылку на созданный объект обратно владельцу, заполняя реквизит документа.

Наша задача — перехватить этот процесс. Если в процессе открытия или заполнения карточки мы понимаем, что такой контрагент уже существует, мы должны:

  1. Отменить открытие формы нового элемента (или закрыть ее без записи).
  2. Передать ссылку на уже существующего контрагента обратно в поле ввода документа с помощью метода ОповеститьОВыборе().

Шаг 1. Реализация проверки при открытии формы элемента справочника

Рассмотрим базовый и наиболее изящный способ решения задачи. Мы внесем изменения в модуль формы элемента справочника Контрагенты (это можно сделать напрямую или через расширение конфигурации).

Основную логику мы поместим в обработчик события ПриОткрытии на клиенте. Если открывается форма абсолютно нового (еще не записанного) элемента, мы инициируем проверку.


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Проверяем, что это новый элемент (ссылка пустая)
    Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
        
        // Передаем управление процедуре проверки дублей
        СсылкаНаНайденный = НайтиСуществующегоКонтрагентаПоПараметрам();
        
        Если ЗначениеЗаполнено(СсылкаНаНайденный) Тогда
            
            // Если дубликат найден, отменяем открытие текущей формы создания
            Отказ = Истина;
            
            // Проверяем, что форма была открыта из другого объекта (например, из документа)
            Если ЭтаФорма.Владелец <> Неопределено Тогда
                // Передаем ссылку существующего контрагента в документ-владелец
                ОповеститьОВыборе(СсылкаНаНайденный);
            Иначе
                // Если форму открыли просто из списка, можем открыть найденного контрагента для просмотра/редактирования
                ПоказатьЗначение(, СсылкаНаНайденный);
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Метод ОповеститьОВыборе() посылает сигнал элементу-владельцу (в нашем случае — полю ввода в Расходной накладной), передавая туда готовую ссылку. Платформа отрабатывает это событие штатным образом, заполняя реквизит на форме документа.

Шаг 2. Разработка функции поиска дубликатов

Теперь выясним, как реализовать саму проверку. Функция поиска должна выполняться на сервере. Мы можем искать контрагента по введенному ИНН, телефону или наименованию. Рассмотрим пример функции, которая ищет соответствие по ИНН:


&НаСервереБезКонтекста
Функция НайтиСуществующегоКонтрагентаПоПараметрам()
    
    // В реальной задаче параметры для поиска можно запросить у пользователя 
    // через промежуточную форму ввода ИНН/Телефона перед открытием карточки.
    // Для примера рассмотрим поиск по ИНН, если он был передан в параметрах заполнения.
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
        |	Контрагенты.Ссылка КАК Ссылка
        |ИЗ
        |	Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |	Контрагенты.ИНН = &ИНН
        |	И НЕ Контрагенты.ПометкаУдаления";
        
    Запрос.УстановитьПараметр("ИНН", "7701020304"); // Здесь должен быть реальный ИНН для поиска
    
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Ссылка;
    КонецЕсли;
    
    Возврат Справочники.Контрагенты.ПустаяСсылка();
    
КонецФункции

Альтернативное решение: Интерактивная форма проверки

Если автоматическая подстановка без ведома пользователя кажется вам слишком неявной, можно применить более мягкий подход. При попытке создания нового контрагента мы можем открывать промежуточную форму «Поиск и проверка контрагента».

Разберем этот алгоритм по шагам:

  1. В обработчике ПриОткрытии формы нового контрагента мы устанавливаем Отказ = Истина и открываем вспомогательную форму подбора.
  2. В этой форме пользователь вводит ИНН, КПП или телефон.
  3. Система динамически показывает список найденных похожих контрагентов.
  4. Если пользователь видит нужного контрагента, он нажимает кнопку «Выбрать». Программа вызывает ОповеститьОВыборе(ВыбранныйКонтрагент) на уровне вспомогательной формы, и ссылка мгновенно попадает в исходный документ.
  5. Если контрагент действительно новый, пользователь нажимает «Создать нового», вспомогательная форма закрывается, и открывается стандартная чистая карточка создания.

Использование штатных возможностей БСП (Библиотеки Стандартных Подсистем)

Прежде чем писать собственный программный код, обязательно проанализируйте настройки вашей конфигурации 1С. В большинстве современных решений (включая 1С:УНФ, 1С:УТ, 1С:ERP) встроен стандартный механизм контроля дублей от БСП.

Для активации этой возможности выполните следующие действия:

  1. Перейдите в раздел Администрирование — Общие настройки.
  2. Найдите пункт, отвечающий за проверку контрагентов (в разных конфигурациях он может находиться в подразделах «Проверка контрагентов» или «Настройки CRM»).
  3. Включите строгую проверку по ИНН/КПП.

При включенной опции платформа при попытке записи дублирующего контрагента не просто выдаст предупреждающее сообщение, а выведет специальное диалоговое окно со списком найденных похожих элементов и предложит кнопку «Использовать существующего». При ее нажатии форма создания закроется, а выбранная ссылка автоматически вернется в ваш документ.

Рекомендации по организации работы с НСИ

Технические доработки — это эффективный инструмент, однако корень проблемы часто лежит в плоскости организации бизнес-процессов. Для наведения полного порядка в справочнике контрагентов рекомендуется придерживаться следующих правил:

Мы подробно рассмотрели технические нюансы работы с формами в 1С 8.3. Использование механизма ОповеститьОВыборе() совместно с грамотно настроенным контролем дубликатов позволит вам значительно повысить юзабилити системы и сохранить базу данных в чистоте.

← На главную