Как правильно сделать проверку на дубли

1. D_e_X_T_e_R 575 06.12.16 12:08 Сейчас в теме
Доброго времени. Написал обработку, смысл ее в том, что открывается форма, в ней указывается период и на основании этого периода отбираются документы счета на оплату, далее галочками отмечаются нужные, еще в одном поле формы указывается месяц выписки, затем нажимаем кнопку скопировать и происходит копирование счетов и в созданных счетах, в поле комментарий прописывается месяц выписки. Все это отрабатывает, но проблема в том, что не могу отследить дубли, то есть как я понимаю, перед копированием нужно проверять что то типа
Если СоздаваемыйДокумент.Контрагент = УжеСозданныйДокумент.Контрагент и СоздаваемыйДокумент.Комментарий = УжеСозданныйДокумент.Комментарий

тогда не копировать, но не могу понять как отловить создаваемый документ. У меня идет
ДокументКопия = ЭлементМассива.Скопировать();

То есть он уже создается, а как можно его отловить до создания?
Или может есть более удобный метод проверки на дубли?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Fox-trot 163 06.12.16 13:12 Сейчас в теме
(1)сумбурненько, но попробую
выпиши все реквизиты, по которым дается определение дубля -> делаешь выборку по этим рекизитам
2. S.V.Y 17 06.12.16 12:55 Сейчас в теме
А откуда дубли берутся? Дайте полный код обработки (копирования).
4. igel9780 173 06.12.16 14:05 Сейчас в теме
Я бы реквизит добавил типа "ДокументИсточник" и по нему бы проверял, что в искомом периоде создано, а что нет.
5. D_e_X_T_e_R 575 19.12.16 13:35 Сейчас в теме
Доброго времени. Спасибо всем кто откликнулся, я еще две недели пытался сделать эту проверку. Вроде как работает, а вроде как и нет.
Вот код с комментариями:

Процедура ОсновныеДействияФормыСоздатьСчетаНаОплату(Кнопка)
	
	МассивОтобранныхДокументов = ПолучитьВыбранныеДокументы(); //Отобранные пользователем докумнеты на форме обработки

УжеСозданныеСчета = МассивСчетов();  //Это массив всех существующих счетов
МассивСозданныхДокументов = Новый Массив; 

Для Каждого ЭлементМассива Из МассивОтобранныхДокументов Цикл

                ДокументКопия = ЭлементМассива.Скопировать();
		ДокументКопия.Дата = НоваяДатаДок;
		ДокументКопия.Комментарий = НовыйКомментарий;

Для Каждого Счет ИЗ УжеСозданныеСчета Цикл
			
			Если ДокументКопия.Контрагент = Счет.Контрагент И 
				ДокументКопия.СуммаДокумента = Счет.СуммаДокумента И
				ДокументКопия.Комментарий = Счет.Комментарий Тогда
				
				Сообщить("Документ на основании счета № " + ЭлементМассива.Номер + " " + ЭлементМассива.Дата + " был создан ранее.");
				Сообщить("Документ не создан");
				
				ДокументКопия.Удалить();
				
			ИначеЕсли (ДокументКопия.Контрагент <> Счет.Контрагент И    //Мне не понятно почему, но когда падает в эту ветку, то первую ссылку на документ прогоняет два раза, затем идет на следующий и там по уже все нормально.
				ДокументКопия.СуммаДокумента = Счет.СуммаДокумента И
				ДокументКопия.Комментарий = Счет.Комментарий) ИЛИ
				(ДокументКопия.Контрагент = Счет.Контрагент И 
				ДокументКопия.СуммаДокумента <> Счет.СуммаДокумента И
				ДокументКопия.Комментарий = Счет.Комментарий) ИЛИ
				(ДокументКопия.Контрагент = Счет.Контрагент И 
				ДокументКопия.СуммаДокумента = Счет.СуммаДокумента И
				ДокументКопия.Комментарий <> Счет.Комментарий) Тогда
				
				
				ДокументКопия.Записать();
				
			КонецЕсли;
		КонецЦикла;
		
		МассивСозданныхДокументов.Добавить(ДокументКопия.Ссылка); //В этот массив попадают документы новые, не дубли.
		
	КонецЦикла;


//Далее запускается функция сохранения счетов, по ссылке формируется счет и сохраняется в форматы excel и pdf. Но есть одно но: если обработка отслеживает дубли,то выдается ошибка. {ВнешняяОбработка.Счета.Форма.Форма.Форма(761)}: Преобразование значения к типу Булево не может быть выполнено
	СуммаКПрописи = Сумма + ?(Шапка.СуммаВключаетНДС, 0, СуммаНДС); это при обращении к процедуре сохранить. Ее код - это стандартный код формирования счета на оплату, только в конце дописано чтобы сохранялось на жесткий диск.

Для Каждого ЭлементГотовый Из МассивСозданныхДокументов Цикл   
		СохранениеСчетов = СохранитьСчетНаОплату(ЭлементГотовый);
	КонецЦикла;
	
КонецПроцедуры
Показать


Я уже просто запутался во всем этом. Буду рад если обратите внимание и поможете советом, как правильно сделать эту самую обработку.
8. igel9780 173 19.12.16 20:01 Сейчас в теме
(5) Не-не-не... Не надо так делать. Не стоит притягивать на сервер предприятия все счета и проверять их в цикле. Правильнее отослать массив на сервер SQL (даже если база файловая), и сравнить запросом. Да и связь по Контрагент, Сумма и Комментарий не вполне себе надёжная.
9. D_e_X_T_e_R 575 19.12.16 20:50 Сейчас в теме
(8)А если нет сервера sql?
6. vadim1011985 101 19.12.16 13:51 Сейчас в теме
ДокументКопия = ЭлементМассива.Скопировать();
        ДокументКопия.Дата = НоваяДатаДок;
        ДокументКопия.Комментарий = НовыйКомментарий;

Для Каждого Счет ИЗ УжеСозданныеСчета Цикл
            
            Если ДокументКопия.Контрагент = Счет.Контрагент И ...


Не вижу где ты определяешь переменную ДокументКопия.Контрагент
7. D_e_X_T_e_R 575 19.12.16 13:55 Сейчас в теме
(6)ДокументКопия - это ссылка на документ счет на оплату. И через точку я могу обратиться ко всем реквизитам документа.
10. igel9780 173 19.12.16 21:18 Сейчас в теме
Тогда сервером SQL выступает движок файловой версии, и всё-равно на запросах работает эффективнее.
11. ImHunter 328 20.12.16 07:30 Сейчас в теме
Обычно отслеживаю уникальность создания чего-либо через Соответствие (если идет поиск по одному ключу) или через ТЗ.
Если идет поиск по неск ключам, то примерно так:
Процедура СкопироватьДоки()
	
	// поля, уникальность которых нужно отслеживать
	ПоляПоиска = "Договор, ОО";
	Фильтр = Новый Структура(ПоляПоиска);
	// создаем ТЗ для отслеживания уникальности
	Уникальность = Новый ТаблицаЗначений;
	Уникальность.Колонки.Добавить("Договор");
	Уникальность.Колонки.Добавить("ОО");
	Уникальность.Индексы.Добавить(ПоляПоиска);
	
	// цикл по каким-то данным, где есть одноименные ключевые поля
	Для Каждого ТекСтрока Из БазовыеРасчеты Цикл 
		// заполняем фильтр данными поиска
		ЗаполнитьЗначенияСвойств(Фильтр, ТекСтрока);
		// ищем в ТЗ уникальности
		Если Уникальность.НайтиСтроки().Количество()<>0 Тогда  // уже такие данные есть, пропускаем дальнейший код цикла
			Продолжить;
		КонецЕсли;
		Док = ....; // создаем документ
		ЗаполнитьЗначенияСвойств(Уникальность.Добавить(), Фильтр); // добавляем запись в ТЗ уникальности
	КонецЦикла;
	
КонецПроцедуры
Показать
D_e_X_T_e_R; +1 Ответить
12. ImHunter 328 20.12.16 08:34 Сейчас в теме
Чуть недописал.
Вместо
Уникальность.НайтиСтроки().Количество()<>0

Должно быть
Уникальность.НайтиСтроки(Фильтр).Количество()<>0
D_e_X_T_e_R; +1 Ответить
13. D_e_X_T_e_R 575 20.12.16 15:50 Сейчас в теме
(12)Боже, как много я еще не знаю))) Спасибо, интересный вариант.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот