|   |   | 
| 
 | удаление повторяющихся строк из табличной части документа | ☑ | ||
|---|---|---|---|---|
| 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) если на то пошло. то нужно получить ТЧ Документа и на основание его колонок делать запрос к РС и проверять на уникальность и тогда получим выборку которая запишет недостающие элементы в ТЧ. а еще лучше получить тех которых не хватает и те которые есть и результат загрузить в ТЧ :)     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |