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