Имя: Пароль:
1C
 
Проверка на одинаковые строки в документах
0 Boroda444
 
24.06.09
00:20
Подскажите принципиальную схему как проверяеются документы на дубли строк. :)
1 Птица
 
24.06.09
00:31
например, запрос:
внутреннее соединение ТЧ с самой собой по несвопадающим номерам строк и по контролируемым реквизитам. если не пусто, значит есть дубли
2 Найлло
 
24.06.09
02:03
Если без запроса, то можно пробежаться по всем строкам ТЧ и методом Найти() табличной части выяснить, какие строки задваиваются. В параметр метода забиваешь структуру для отбора по необходимым параметрам.
3 AndreyFAN
 
24.06.09
02:07
Тупо, но работает

   СтрокаТЧ   = ЭлементыФормы.Таблица.ТекущаяСтрока;    
   УжеЕстьЭтотТовар=0;
   Для каждого Строка из Таблица цикл
       Если Строка.Товар=СтрокаТЧ.Товар тогда
           УжеЕстьЭтотТовар=УжеЕстьЭтотТовар+1;
       КонецЕсли;
   КонецЦикла;
   Если УжеЕстьЭтотТовар>1 тогда
       Предупреждение ("ЭТОТ ТОВАР УЖЕ ЕСТЬ В НАКЛАДНОЙ! ВЫ НЕВНИМАТЕЛЬНЫ.",3);
   КонецЕсли;
4 AndreyFAN
 
24.06.09
02:08
это в Процедура ТаблицаТоварПриИзменении(Элемент)
5 MoneG
 
24.06.09
08:26
(3) всегда будет предупреждение выдавать, т.к. сама проверочная строка в общую кучу попадает.

(1) +1
6 Леха Дум
 
24.06.09
08:29
(0) Зачем тебе такая проверка? Проще потом в запросе все это свернуть.
(3) действительно тупо
7 Леха Дум
 
24.06.09
08:37
(0) если так надо - держи, использовали когда переходили с 7.7 на 8.0. Потом отказались

//-----------------------------------------------------------  
Функция ПроверкаНаДублиСтрок(Ссылка, ИмяТаблЧасти = "Товары", Колонка = "Товар", Колонка2 = "", Отказ = Ложь, Заголовок = "") Экспорт

   ИмяДока = Ссылка.Метаданные().Имя;
   
   ЕстьДополнительно = Колонка2 <> "";
   
   Запрос = Новый Запрос;
   Запрос.Текст =    "ВЫБРАТЬ
                   |    Док." + Колонка + " КАК ID,
                   |    ПРЕДСТАВЛЕНИЕ(Док." + Колонка + ") КАК Сверка," + ?(ЕстьДополнительно,"
                   |    ПРЕДСТАВЛЕНИЕ(Док." + Колонка2 + ") КАК Сверка2,", "") + "
                   |    Док.НомерСтроки КАК НомерСтроки,
                   |    ДокКопия.НомерСтроки КАК НомерСтрокиКопия
                   |ИЗ
                   |    Документ." + ИмяДока + "." + ИмяТаблЧасти + " КАК Док
                   |        СОЕДИНЕНИЕ Документ." + ИмяДока + "." + ИмяТаблЧасти + " КАК ДокКопия
                   |        ПО Док." + Колонка + "= ДокКопия." + Колонка + "
                   |            И Док.НомерСтроки < ДокКопия.НомерСтроки" + ?(ЕстьДополнительно,"
                   |            И Док." + Колонка2 + "= ДокКопия." + Колонка2, "") + "
                   |ГДЕ
                   |    Док.Ссылка = &Ссылка
                   |    И ДокКопия.Ссылка = &Ссылка
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |    ID,
                   |    НомерСтроки";

   Запрос.УстановитьПараметр("Ссылка", Ссылка);
   Результат = Запрос.Выполнить().Выбрать();
   ЕстьДубль = Ложь;
   СтрокаСообщения = "Проверка табличной части на дублирующиеся строки:
                   |Обнаружены одинаковые позиции! Колонк"
                   + ?(ЕстьДополнительно, "и: "  +Колонка +" и " + Колонка2, "а: "+ Колонка);
   
   Пока Результат.Следующий() Цикл
       
       Если ЕстьДополнительно Тогда
           Значение = СокрП(Результат.Сверка)+ ", " + Результат.Сверка2;
       Иначе
           Значение = Результат.Сверка;
       КонецЕсли;
       
       СтрокаСообщения = СтрокаСообщения  + Символы.ПС + "Строка № " + Формат(Результат.НомерСтроки, "ЧГ=")
                       + " и строка № " + Формат(Результат.НомерСтрокиКопия, "ЧГ=")
                       + " значение: " + Значение;
       ЕстьДубль = Истина;
                                   
   КонецЦикла;    
       
   Если ЕстьДубль Тогда
       ОбщегоНазначения.СообщитьОбОшибке(СтрокаСообщения, Отказ, Заголовок);
   КонецЕсли;    
   
   Возврат Отказ;
   
КонецФункции // ПроверкаНаДублиСтрок()

можно конечно сделать универсальней, но нам хватило и в таком варианте (за универсальность как правило приходится платить временем выполнения
8 lxndr
 
24.06.09
08:45
Еще вариант:
Свернуть по всем колонкам, сравнить количество строк с исходной
9 Леха Дум
 
24.06.09
08:46
(8) а как найти при этом номер нужных строк? :)
10 lxndr
 
24.06.09
08:54
(9) Не получится в этом случае
11 Ненавижу 1С
 
гуру
24.06.09
08:55
Выгружаем в ТЗ, добавляем числовое поле, устанавливаем везде в нем 1, сворачиваем, по этому полю суммируем. Находим строки где >1. Для каждой такой строки находим строки в исходной ТЧ.
12 also
 
24.06.09
08:57
а ВЫБРАТЬ РАЗЛИЧНЫЕ для кого?
13 also
 
24.06.09
08:58
+(12) Самый быстрый вариант будет
14 Ненавижу 1С
 
гуру
24.06.09
08:58
(12) особенно если документ еще не записан
15 Леха Дум
 
24.06.09
09:00
Расклад простой: Оцените трудозатраты оператора на поиск дублей, оцените затраты процессорного времени на поиск дублей в любом варианте поиска этих самых дублей и получите существенное замедление общего процесса.
А теперь если просто брать и сворачивать при проведении, брать и сворачивать при печати?
16 Ненавижу 1С
 
гуру
24.06.09
09:03
(15) случай (11) только для НЕзаписанных данных, к записанным лучше запрос
17 Леха Дум
 
24.06.09
09:07
(16) что лучше запрос или поиск в ТЗ - в (15) про это ни слова, речь идет об общем замедлении работы человека с системой
18 Stepa86
 
24.06.09
09:07
для уменьшения числа ошибок лучше проверять на дубли во время ввода документа, при вводе уже существующей строки говорим юзверю, что "такое уже есть, перейти на нее????" и не даем создать дубль... + сворачивание в передзаписью
19 Ненавижу 1С
 
гуру
24.06.09
09:09
а в чем проблема с дублями строк?
20 AndreyFAN
 
24.06.09
18:32
(5) нифига не попадает, посмотри код, там же Если>1
(6) однако код короткий и работает
21 AndreyFAN
 
24.06.09
18:34
в (3) для работы оператора
а вот для проверки уже записанного документа
коротко и ясно

Для каждого СтрокаТЧ из Товары цикл
       Для каждого СтрокаТЧ2 из Товары цикл
           Если СтрокаТЧ.НомерСтроки<>СтрокаТЧ2.НомерСтроки
               и СтрокаТЧ.Товар=СтрокаТЧ2.Товар тогда
               СообщитьОбОшибке(""+СтрокаТЧ.Товар+" - встречается более одного раза! №№Строки= "+СтрокаТЧ.НомерСтроки+" и "+СтрокаТЧ2.НомерСтроки+" . ЕдиницыИзмерения= "+СтрокаТЧ.ЕдИзмСкан+" и "+СтрокаТЧ2.ЕдИзмСкан);
           КонецЕсли;
       КонецЦикла;
   КонецЦикла;
23 acsent
 
24.06.09
18:46
(21) За такой код со спеца по 1С выгоняют с позором
24 AndreyFAN
 
24.06.09
18:51
а я не спец, я директор, мне пофиг изящество, вот уже 3 года этот кусок работает в РевизииСканированияВМагазине...
25 AndreyFAN
 
24.06.09
18:55
и чем (21) фунционально хуже чем нагромождение в (7) ?
26 Мимохожий Однако
 
24.06.09
19:03
В зависимости от цели поиска дублей строк меняется и реализация этой задачи. Если не дать добавлять дубль, то не давать сохранять строку. Если надо сложить, то свёртка при записи.