|
удаление повторяющихся строк из табличной части документа | ☑ | ||
---|---|---|---|---|
0
f1user56
07.09.12
✎
08:10
|
ребята есть вот такая процедура
Процедура ДоговорПриИзменении(Элемент) ЭлементыТцп.Очистить(); Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | Бит_ТЦП.ТЦП КАК ТЦП, | Бит_ТЦП.Цена |ИЗ | РегистрСведений.Бит_ТЦП КАК Бит_ТЦП |ГДЕ | Бит_ТЦП.Бит_РамочноеСоглашение = &РамочноеСоглашение"; Запрос.УстановитьПараметр("РамочноеСоглашение", Договор.Бит_РамочноеСоглашение); Если Не Договор.Бит_РамочноеСоглашение.Пустая() Тогда Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл новаястрока = ЭлементыТЦП.Добавить(); новаястрока.Тцп = Выборка.ТЦП; новаястрока.Цена = Выборка.Цена; КонецЦикла; Иначе Сообщить("Нельзя добавлять дополнительные соглашения в качестве рамочных!"); Договор=Справочники.ДоговорыКонтрагентов.ПустаяСсылка(); КонецЕсли; КонецПроцедуры и после нее есть удаление строк с нулевым количеством. Появилась необходимость по кнопке добавлять эти же данные из договора, но чтобы данные не повторялись. Мучаюсь - как удалить повторяющиеся строки?? вы меня не разу еще не подводили ребята) Спасибо всем заранее |
|||
1
IamAlexy
07.09.12
✎
08:11
|
добавляй только те данные которых нет в таблице и вуаля - проблема решена :)
|
|||
2
f1user56
07.09.12
✎
08:14
|
кааак?
|
|||
3
Shade84
07.09.12
✎
08:21
|
Мне тоже интересно :)
|
|||
4
Shade84
07.09.12
✎
08:22
|
каак? :-)
|
|||
5
Песец
07.09.12
✎
08:27
|
имхо, табчасть в запрос, сгруппировать и просуммировать, заодно можно и условие на неноль, результат в табчасть.
|
|||
6
f1user56
07.09.12
✎
08:55
|
вот запрос
"ВЫБРАТЬ | Бит_ТЦП.ТЦП КАК ТЦП, | Бит_ТЦП.Цена КАК Цена, | Бит_СметаЭлементыТЦП.ТЦП КАК ТЦП1 |ИЗ | Документ.Бит_Смета.ЭлементыТЦП КАК Бит_СметаЭлементыТЦП | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Бит_ТЦП КАК Бит_ТЦП | ПО Бит_СметаЭлементыТЦП.ТЦП <> Бит_ТЦП.ТЦП |ГДЕ | Бит_ТЦП.Бит_РамочноеСоглашение = &РамочноеСоглашение"; что с ним не так?:( |
|||
7
Maxus43
07.09.12
✎
09:10
|
что такое Бит? зачем ругатся на форуме?
|
|||
8
Serg_1960
07.09.12
✎
09:28
|
(0) Сорри, алгоритм из серии "поток сознания в бессознательном состоянии".
"...после нее есть удаление строк с нулевым количеством" - а где "количество" в строках, которые вы добавляете? Цена - есть, а где количество? PS: Что значит "повторяющие строки"? По какому набору реквизитов уникальность хотите иметь? |
|||
9
f1user56
07.09.12
✎
09:32
|
количество заполняется в документ ручками, если количество не заполнено - то эта строка считается ненужной и после этого удаляется по нажатию кнопки. Потом, для пользователя если он вдруг случайно не заполнил у нужной строки(строк) количество необходимо вернуть данные по кнопке, и для этого необходимо, чтобы строки которые в таблице были исключены из следующей выборки! Вот как-то так! :)
|
|||
10
Мимохожий Однако
07.09.12
✎
09:38
|
Не надо потакать пользователям. Добавь дополнительное предупреждение при удалении строк с выводом "нулевых"
|
|||
11
Serg_1960
07.09.12
✎
09:43
|
(9) Как я понял - это два действия, автономных и независимых друг от друга. Подключить две обработки к табличной части документа. Одна удаляет строки с нулевым количеством. Другая - добавляе отсутствующие в ТЧ строки по регистру сведений. Так?
|
|||
12
vmv
07.09.12
✎
09:43
|
(9) это подбор называется
одно табличное поле - это данные даокумента второе табличное поле - это данные набора а удаление/возврат удаленных - от лукавого в любом случае садомазо) |
|||
13
f1user56
07.09.12
✎
09:53
|
(11), Да, так точно
|
|||
14
Мимохожий Однако
07.09.12
✎
09:55
|
При обработке запроса по заполнению табличной части проверяй наличие строки с номенклатурой и добавляй только отсутствующие.
|
|||
15
Serg_1960
07.09.12
✎
09:57
|
(13) Первый алгоритм как-то так (если количество -> реквизит "Количество" ТЧ):
Отбор = Новый Структура("Количество",0); НайденныеСтроки = ЭлементыТЦП.НайтиСтроки(Отбор); Для Каждого Строка Из НайденныеСтроки Цикл ЭлементыТЦП.Удалить(Строка); КонецЦикла; |
|||
16
Мимохожий Однако
07.09.12
✎
09:58
|
После удаления повторяй цикл заново.
|
|||
17
f1user56
07.09.12
✎
09:59
|
(15) Первый алгоритм есть, нужен второй как раз
|
|||
18
Шапокляк
07.09.12
✎
10:00
|
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл ///Вот тут проверяй уже имеющиеся в ЭлементыТЦП строки так, самон примитивное, что можно сделать ЕстьПовтор=Ложь; Для каждого Стр Из ЭлементыТЦП Цикл Если Стр.Тратата=Выборка.Тратата Тогда ЕстьПовтор=Истина; Прервать; КонецЕсли; КонецЦикла; Если Не ЕстьПовтор Тогда новаястрока = ЭлементыТЦП.Добавить(); новаястрока.Тцп = Выборка.ТЦП; новаястрока.Цена = Выборка.Цена; КонецЕсли; КонецЦикла; |
|||
19
Aprobator
07.09.12
✎
10:01
|
(0) нефига не понял у ТЧ метод свернуть украли что ли?
|
|||
20
Мимохожий Однако
07.09.12
✎
10:03
|
При обработке выборки
Если ТЧ.Найти(...) Тогда продолжить |
|||
21
f1user56
07.09.12
✎
10:08
|
(18) Премного благодарен, сударь!
Вообще всем спасибо! |
|||
22
Reset
07.09.12
✎
10:09
|
(21) Она сударыня.
|
|||
23
f1user56
07.09.12
✎
10:10
|
(18) Премного благодарен, сударыня, простите мои слепые глаза)
|
|||
24
Serg_1960
07.09.12
✎
10:13
|
Алгоритм из (0) подправь так, чтобы он не добавлял "повторяющиеся" строки. примерно так:
Запрос.Текст = "ВЫБРАТЬ | Бит_ТЦП.ТЦП КАК ТЦП, | Бит_ТЦП.Цена |ИЗ | РегистрСведений.Бит_ТЦП КАК Бит_ТЦП |ГДЕ | Бит_ТЦП.Бит_РамочноеСоглашение = &РамочноеСоглашение"; Запрос.УстановитьПараметр("РамочноеСоглашение", Договор.Бит_РамочноеСоглашение); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Отбор = Новый Структура("ТЦП",Выборка.ТЦП); НайденныеСтроки = ЭлементыТЦП.НайтиСтроки(Отбор); Если НайденныеСтроки.Количество() = 0 Тогда НоваяСтрока = ЭлементыТЦП.Добавить(); НоваяСтрока.Тцп = Выборка.ТЦП; НоваяСтрока.Цена = Выборка.Цена; КонецЕсли; КонецЦикла |
|||
25
Aprobator
07.09.12
✎
10:18
|
народ не иначе обкурился в пятницу уже.
|
|||
26
Serg_1960
07.09.12
✎
10:20
|
(25) Угу, уже обкурился. Ты ещё алгоритм (19) озвучь - будет совсем весело :)
|
|||
27
Serg_1960
07.09.12
✎
10:25
|
И кстати: алгоритм из (6) - не стоит использовать. Ибо он требует предворительной записи документа. В экранной форме редактирования этого самого документа - совсем "не фонтан" :)
|
|||
28
Aprobator
07.09.12
✎
10:27
|
пятница вступила в свои права. Эх, везет людям, а мне еще пахать (
|
|||
29
Aprobator
07.09.12
✎
10:28
|
(26) ТС, пусть сам СП читает.
|
|||
30
Serg_1960
07.09.12
✎
10:31
|
"Чужую беду - руками разведу" - не мешай раслабляться от своих проблем на проблеме автора. К сотому посту будет озвучен генеальный алгоритм, удолетворяющий всех :)
|
|||
31
Aprobator
07.09.12
✎
10:34
|
(30) ну не до такой же степени. Новички же принимают все за чистую монету, а потом откуда столько криворуких 1С - ников?
|
|||
32
f1user56
07.09.12
✎
10:38
|
ребята вы о чем вообще? :)
|
|||
33
Serg_1960
07.09.12
✎
10:39
|
Хех :) Всё что здесь написано - может оказать неверным. Зато - не скучно - мы общаемся. Почему неверно? Ну, например, "Цена" может быть измерением или реквизитом в регистре сведений. Кто не понял - переспросите, объясню.
|
|||
34
Aprobator
07.09.12
✎
10:40
|
(33) вот только не надо усугублять то )
|
|||
35
f1user56
07.09.12
✎
10:41
|
то что написала Шапокляк, спасибо ей искренне от души, работает вполне нормально) но ваших советов хватит с запасом)))
|
|||
36
zladenuw
07.09.12
✎
10:43
|
Процедура ДоговорПриИзменении(Элемент)
ЭлементыТцп.Очистить(); Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | Бит_ТЦП.ТЦП КАК ТЦП, | Бит_ТЦП.Цена |ИЗ | РегистрСведений.Бит_ТЦП КАК Бит_ТЦП |ГДЕ | Бит_ТЦП.Бит_РамочноеСоглашение = &РамочноеСоглашение"; Запрос.УстановитьПараметр("РамочноеСоглашение", Договор.Бит_РамочноеСоглашение); Если Не Договор.Бит_РамочноеСоглашение.Пустая() Тогда Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Если ЭлементыТЦП.Найти(Выборка.ТЦП, "ТЦП") = Неопределно Тогда новаястрока = ЭлементыТЦП.Добавить(); новаястрока.Тцп = Выборка.ТЦП; новаястрока.Цена = Выборка.Цена; КонецЕсли КонецЦикла; Иначе Сообщить("Нельзя добавлять дополнительные соглашения в качестве рамочных!"); Договор=Справочники.ДоговорыКонтрагентов.ПустаяСсылка(); КонецЕсли; КонецПроцедуры |
|||
37
Aprobator
07.09.12
✎
10:44
|
(32) ну во первых, чтобы не получать лишнее, это можно отсечь уже в запросе,
как в (25).
это раз. Во вторых у ТЧ есть метод свернуть. ТЧ.Свернуть("ИмяКолонки1,ИмяКолонки2") - и все дублей нет. По поводу написанного в (18) ......... |
|||
38
Serg_1960
07.09.12
✎
10:46
|
(34)... да и для (36) тоже :) ТС не ответил на вопрос об "повторяющихся" строках. Почему-то все, вдруг, решили что уникальность по одному реквизиту и этот реквизит - "ТМЦ". Вот я и выложил алгоритм, который легко "адаптировать" за счет изменения условий отбора.
(37) А если не только количество, но и цена - различные? |
|||
39
Aprobator
07.09.12
✎
10:47
|
(36) народ, ну реально -завязывайте уже.
|
|||
40
Serg_1960
07.09.12
✎
10:48
|
(38) Упс. "ТМЦ" -> "ТЦП". Обговорился :)
|
|||
41
Aprobator
07.09.12
✎
10:48
|
(38) на (6) посмотри. Там только один реквизит проверяется.
|
|||
42
zladenuw
07.09.12
✎
10:49
|
(38) ТС молчал про дубли строк. если несколько параметров то использовать НайтиСтроки(<ПараметрыОтбора>) и я думаю вопрос закрыт. так пусть ТС думаем.
|
|||
43
Serg_1960
07.09.12
✎
10:50
|
Согласен. Автору решать, когда завязать. Если, по его мнению, ответ уже дан - пусть скажет "Всем - спасибо"(с) и тем самым закроет тему.
|
|||
44
zladenuw
07.09.12
✎
10:50
|
(24) может сразу все запросом что бы по феншую :)
|
|||
45
Aprobator
07.09.12
✎
10:53
|
(44) феншуй чуть дальше в (25) )
|
|||
46
Aprobator
07.09.12
✎
10:53
|
ТС теперь явно в растерянности )
|
|||
47
zladenuw
07.09.12
✎
10:56
|
а несколько параметров ? :)
|
|||
48
zladenuw
07.09.12
✎
10:56
|
а хотя для Тяпници достаточно и этого. что то добрые все сегодня :)
|
|||
49
Aprobator
07.09.12
✎
10:58
|
(47) я уже ссылался на (6) - там проверяется один параметр. Потому и запрос писался под 1 параметр.
|
|||
50
Serg_1960
07.09.12
✎
10:58
|
(24) и (25) Я обещал к сотому посту полный алгоритм озвучить. В (24) ещё пары-тройки условий не хватает ТиИ ТЧ документа (например, на количество() > 1; "лишние" строки тцп - не по договору...).
|
|||
51
Aprobator
07.09.12
✎
10:59
|
ну вас нафиг) *Ушел работать*
|
|||
52
Serg_1960
07.09.12
✎
11:00
|
(50) Тьфу. Со ссылками наврал. Фсё. У меня с утра уже тяпница :)
|
|||
53
Serg_1960
07.09.12
✎
11:00
|
Ну вас нафиг. "Ушел работать"(51)
|
|||
54
zladenuw
07.09.12
✎
11:01
|
(50) если на то пошло. то нужно получить ТЧ Документа и на основание его колонок делать запрос к РС и проверять на уникальность и тогда получим выборку которая запишет недостающие элементы в ТЧ. а еще лучше получить тех которых не хватает и те которые есть и результат загрузить в ТЧ :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |