![]() |
![]() |
![]() |
|
Проверка на одинаковые строки в документах | ☑ | ||
---|---|---|---|---|
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
|
В зависимости от цели поиска дублей строк меняется и реализация этой задачи. Если не дать добавлять дубль, то не давать сохранять строку. Если надо сложить, то свёртка при записи.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |