О борьбе с дублированием при загрузке поступлений

Клиент загружает поступления из нескольких XLS-таблиц.

В инвойсе перечислен товар, количество, цена, сумма.

В спецификации подробное описание товара — поля, описывающие товар.

Есть еще штуки 3 таблиц.

Сначала таблицы загружаются в таблицы значений, потом соединяются левым соединением с таблицей инвойса.

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

Скорее всего, что-то поменялось в программном обеспечении поставщика. Но какая именно из таблиц приводит к дублированию, не понятно.

Можно было пойти по пути проверки условий соединений, свертки таблиц по ключам. Но сами условия соединения довольно сложные, я решил туда не вмешиваться, а обработать уже готовую таблицу.

Предварительно я добавил в таблицу инвойсов порядковый номер строки:

Инвойсы.Колонки.Добавить("ПорядковыйНомер", Новый ОписаниеТипов("Число"));
ПорядковыйНомер = 1;
Для Каждого Стр Из Инвойсы Цикл
	Стр.ПорядковыйНомер = ПорядковыйНомер;
	ПорядковыйНомер = ПорядковыйНомер + 1;
КонецЦикла;

Далее протащил этот порядковый номер по всем промежуточным временным таблицам в запросе.

И потом уже обработал таблицу строк для загрузки поступлений:

	ПредСтрока = Неопределено;
	Всего = ТЗ.Количество();
	Для Инд = 1 ПО Всего Цикл 
		Строка = ТЗ[Всего - Инд];
		Если ПредСтрока <> Неопределено Тогда
			Если ПредСтрока.ПорядковыйНомер = Строка.ПорядковыйНомер Тогда
				С = "";
				Для Каждого Колонка ИЗ ТЗ.Колонки Цикл
					ИмяКолонки = Колонка.Имя;
					Если Строка[ИмяКолонки] <> ПредСтрока[ИмяКолонки] Тогда
						С = С + ?(С = "", "", Символы.ПС) + Символы.Таб + ИмяКолонки + ":" + Строка[ИмяКолонки] + " : " + ПредСтрока[ИмяКолонки] + "";
					КонецЕсли;                                                                                                 
				КонецЦикла;
				Сообщить("Исключен дубль: " + Символы.ПС + С); 
				ТЗ.Удалить(Строка);
				Продолжить; //Чтобы не запомнило строку как предыдущую
			КонецЕсли;
		КонецЕсли;
		ПредСтрока = Строка;
	КонецЦикла;

Пользователю выводил сообщения, какие поля в дублях отличаются.

Объем: 1 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

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

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