Как выбрать и найти дубли документов в 1С:Бухгалтерия 3.0

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

При регулярном обмене данными, загрузке документов через ЭДО или внешние сервисы интеграции в 1С:Бухгалтерия 3.0 могут появляться дубликаты документов Поступление (акты, накладные, УПД). Проанализируем причины возникновения дублей, а также разберем по шагам варианты их поиска: от применения стандартных инструментов БСП до написания собственных запросов и программных обработок.

Причины возникновения дублей документов от поставщиков

Выясним причину появления дублирующихся записей. В платформе 1С встроен контроль уникальности по полю Номер. Тем не менее дубли все равно попадают в базу данных по следующим причинам:

  1. Обмен данными с флагом загрузки: При загрузке через ЭДО, РИБ или универсальный обмен данные записываются с установленным свойством ОбменДанными.Загрузка = Истина, из-за чего стандартные проверки уникальности в событии ПередЗаписью прогоняются без блокировки записи.
  2. Дублирование по входящим реквизитам: Платформа контролирует системный реквизит Номер. Но на практике дубли от контрагентов возникают по реквизитам НомерВходящегоДокумента и ДатаВходящегоДокумента, для которых платформа не выполняет автоматическую проверку уникальности.
  3. Различия в символах: Входящие номера могут отличаться служебными символами, неразрывными пробелами или сочетанием латинских и кириллических букв. Визуально номера кажутся одинаковыми, но платформа воспринимает их как разные строки.

Способ 1. Использование типовой обработки подсистемы БСП «Поиск и удаление дублей»

Рассмотрим наименее трудоемкий вариант, не требующий разработки программного кода. В конфигурацию 1С:Бухгалтерия 3.0 включена стандартная подсистема Библиотеки Стандартных Подсистем (БСП).

Разберем порядок действий при работе с типовой обработкой:

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных.
  2. Откроем пункт Поиск и удаление дублей.
  3. В поле выбора области поиска определим документ Поступление (акты, накладные).
  4. В правилах сравнения укажем реквизиты, совпадение которых определяет дубликат (например, Контрагент, НомерВходящегоДокумента, ДатаВходящегоДокумента и Сумма документа).
  5. Нажмем кнопку Найти дубли. Обработка сформирует список совпадений и предоставит возможность выполнить объединение элементов с автоматической заменой ссылок во всех связанной документации.

Способ 2. Поиск дублей с помощью запроса 1С (СГРУППИРОВАТЬ ПО и ИМЕЮЩИЕ)

Посмотрим, как найти повторяющиеся документы с помощью языка запросов 1С. Для агрегации записей и отбора комбинаций, встретившихся более одного раза, применяется конструкция СГРУППИРОВАТЬ ПО совместно с условием ИМЕЮЩИЕ КОЛИЧЕСТВО(...) > 1.

Проанализируем пример запроса, который выявляет дублирующиеся группы по контрагенту и входящему номеру:


Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|	Поступление.Контрагент КАК Контрагент,
|	Поступление.НомерВходящегоДокумента КАК НомерВходящегоДокумента,
|	Поступление.ДатаВходящегоДокумента КАК ДатаВходящегоДокумента,
|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Поступление.Ссылка) КАК Количество
|ИЗ
|	Документ.ПоступлениеТоваровУслуг КАК Поступление
|ГДЕ
|	Поступление.Проведен = ИСТИНА
|СГРУППИРОВАТЬ ПО
|	Поступление.Контрагент,
|	Поступление.НомерВходящегоДокумента,
|	Поступление.ДатаВходящегоДокумента
|ИМЕЮЩИЕ
|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Поступление.Ссылка) > 1";

Результат = Запрос.Выполнить();

Если требуется получить полный список конкретных ссылок на все документы-дубли для дальнейшей обработки, применим пакетный запрос с использованием временной таблицы:


Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|	Поступление.Контрагент КАК Контрагент,
|	Поступление.НомерВходящегоДокумента КАК НомерВходящегоДокумента,
|	Поступление.ДатаВходящегоДокумента КАК ДатаВходящегоДокумента
|ПОМЕСТИТЬ ВТ_ДублирующиеГруппы
|ИЗ
|	Документ.ПоступлениеТоваровУслуг КАК Поступление
|ГДЕ
|	Поступление.Дата МЕЖДУ &НачДата И &КонДата
|СГРУППИРОВАТЬ ПО
|	Поступление.Контрагент,
|	Поступление.НомерВходящегоДокумента,
|	Поступление.ДатаВходящегоДокумента
|ИМЕЮЩИЕ
|	КОЛИЧЕСТВО(Поступление.Ссылка) > 1
|;
|
|ВЫБРАТЬ
|	Поступление.Ссылка КАК Ссылка,
|	Поступление.Контрагент КАК Контрагент,
|	Поступление.НомерВходящегоДокумента КАК НомерВходящегоДокумента,
|	Поступление.ДатаВходящегоДокумента КАК ДатаВходящегоДокумента,
|	Поступление.Ответственный КАК Ответственный
|ИЗ
|	Документ.ПоступлениеТоваровУслуг КАК Поступление
|	ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ДублирующиеГруппы КАК Группы
|		ПО Поступление.Контрагент = Группы.Контрагент
|		И Поступление.НомерВходящегоДокумента = Группы.НомерВходящегоДокумента
|		И Поступление.ДатаВходящегоДокумента = Группы.ДатаВходящегоДокумента
|УПОРЯДОЧИТЬ ПО
|	Поступление.Контрагент,
|	Поступление.НомерВходящегоДокумента";

Запрос.УстановитьПараметр("НачДата", НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр("КонДата", КонецДня(ДатаОкончания));

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	// Логика обработки конкретного документа-дубля
КонецЦикла;

Способ 3. Программный обход выборки с сравнением предыдущих значений

Рассмотри еще один подход: данные выбираются из базы с обязательной сортировкой по проверяемым полям, после чего алгоритм последовательно сравнивает значение текущей строки с предыдущей.

Посмотрим на пример функции, возвращающей таблицу найденных дубликатов:


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

Особенности работы с дублями проведенных документов

При пометке на удаление или замене документов «Поступление товаров и услуг» учтем важные детали учетных механизмов 1С:

  1. Влияние на регистры учета: Поступление формирует проводки по бухучету и записи в регистрах накопления НДС. Простое удаление или пометка на удаление без распроведения документа приведет к искажению остатков и ошибкам в Книге покупок.
  2. Подчиненные объекты: С документом поступления обычно связаны Счет-фактура полученный, входящие акты и другие документы. Перед пометкой дубля на удаление обязательно перенаправьте ссылки подчиненных объектов на оставляемый оригинальный документ (для этого рекомендуется штатный механизм объединения дублей БСП).
← На главную