Миниатюра Запрет дублирования контрагентов 1С

Как известно, 1С Бухгалтерия 3.0 только оповещает о дублировании контрагентов, но при этом позволяет записать очередной дубль контрагента в базу. Что бы закрыть эту возможность мы реализуем процедуру, которая будет делать запрет дублирования контрагентов в 1С с одинаковыми ИНН/КПП.  Процедура описана очень подробно, поэтому с этой задачей сможет справиться любой опытный пользователь 1С.



Одной из проблем ведения любого учета является проблема дублирования данных. В итоге — поступление происходит по одном учетным данным, списание — по другим, и возникает вопрос — ПОЧЕМУ НЕ СПИСАЛОСЬ? Для частичного решения данной проблемы в 1С Бухгалтерия 3.0 (и других конфигураций, имеющих контрагентов с реквизитами ИНН и КПП) реализуем запрет дублирования контрагентов в 1С.

План действий у нас будет простой: мы будем перехватывать событие записи контрагентов, проверять наличие контрагентов с текущими реквизитами ИНН/КПП и, в случае нахождения дубля, делать ОТКАЗ. Теоретически, мы можем сделать проверку дублирования в модуле объекта справочника «Контрагенты», но это плохой способ доработки типовой конфигурации, поскольку внесенные изменения могут быть затерты при следующих обновлениях конфигурации.

Хочу сказать про ограничения базовых версий 1С Предприятие, одно из которых — невозможность изменения типового функционала конфигураций, т.е. рассмотренный способ запрета дублирования контрагентов в 1С нельзя реализовать в базовых версиях 1С Предприятие.

Итак, приступим…

Первым делом создаем резервную копию рабочей базы данных.

В случае, если ваша рабочая конфигурация находится на поддержке, то снимаем конфигурацию с поддержки. Для этого в конфигураторе 1С открываем форму настройки поддержки (Конфигурация — Поддержка — Настройка поддержки…), кликаем по кнопке «Включить возможность изменения» и соглашаемся с отменой полного автоматического обновления.

включить возможность изменения конфигураций 1с

В окне настроек правил обмена выбираем пункт «Объект поставщика редактируется с сохранением поддержки», нажимаем «Ок» и ждем изменения режима.

 Для создания запрета дублирования контрагентов в 1С нам будут необходимы:

  1. Подписка на событие, которая будет выполнять перехват записи контрагента и выполнять свою обработку в стандартной процедуре «Обработка проверки заполнения»;
  2. Серверный общий модуль, в который будет введен код обработки подписки на событие.

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

создание общего модуля 1с

В свойствах общего модуля задаем имя, в моем примере имя будет «ЯПрограммистРу», устанавливаем галочки «Сервер» и «Вызов сервера».

Создаем подписку на событие. Для этого раскрываем дерево конфигурации и устанавливаем указатель на «Общие» — «Подписки на события» и так же нажимаем «Создать».

создание подписки на событие 1с

В свойствах задаем Имя «ЗапретДублированияКонтрагентов»; выбираем источник, чье событие мы перехватываем, — это объект справочника «Контрагенты» (соответственно, в источнике устанавливаем  «СправочникОбъект.Контрагенты»); выбираем событие «ОбработкаПроверкиЗаполнения». В поле обработчик жмем кнопку «Открыть», и из открывшегося списка общих модулей выбираем созданный нами выше общий модуль «ЯПрограммитРу» (см. рисунок выше).

После корректного выполнения всех операций у вас должнен появиться код объявления процедуры ЗапретДублированияКонтрагентовОбработкаПроверкиЗаполнения() в общем модуле «ЯПрограммитРу».

Пишем внутри процедуры следующий код:

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

КонецПроцедуры

Немного объясню процедуру запрета дублирования контрагентов в 1С. Изначально мы проверяем — заполнены ли реквизиты ИНН/КПП и в случае не заполнения одного из них, отказываем от обработки. Таким образом мы оставляем возможность создания контрагентов, у которых ИНН/КПП не известно или не существует.

Процедура ОбработкаПроверкиЗаполнения выполняется до процедуры записи, поэтому мы проверяем текущие записи справочника «Контрагенты» на присутствие записываемых сочетаний реквизитов ИНН/КПП с помощью запроса. Если запрос Пустой(), то значит контрагента, с заданной комбинацией ИНН/КПП в базе не существует, поэтому мы не препятствуем записи. Если же запрос НЕ Пустой(), то мы перебираем возвращенные записи и сообщаем пользователю коды элементов справочника «Контрагенты», с идентичными реквизитами ИНН/КПП и делаем Отказ = Истина, т.е. отказываемся от записи.

Сохраняем внесенные в конфигурацию изменения, через нажатие F7 или выбирая пункт меню Конфигурация — «Обновить конфигурацию базы данных».

Для проверки запускам базу в режиме 1С Предприятие. Теперь, если мы сделаем копию контрагента с заполненными ИНН/КПП, то 1С не позволит его записать и выведет сообщение:

Запрет дублирования контрагентов в 1С

В нашей базе уже был задублирован контрагент и мы попытались ввести ещё один дубль. Как видите, сработал наш запрет на запись и сообщил обо всех дублях базы, а значит наша задача выполнена!

В следующих публикациях мы рассмотрим, что делать, когда дубли уже присутствуют в базе 1С. Следите за публикациями.

До новых встреч!


Запрет дублирования контрагентов в 1С

Запрет дублирования контрагентов в 1С: 3 комментария

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Рейтинг@Mail.ru
Яндекс.Метрика
Здесь находится аттестат нашего WM идентификатора 739402762981
Проверить аттестат