Имя: Пароль:
1C
Админ
удаление повторяющихся строк из табличной части документа
, ,
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) если на то пошло. то нужно получить ТЧ Документа и на основание его колонок делать запрос к РС и проверять на уникальность и тогда получим выборку которая запишет недостающие элементы в ТЧ. а еще лучше получить тех которых не хватает и те которые есть и результат загрузить в ТЧ :)