Имя: Пароль:
1C
1C 7.7
v7: Пометка на удаление.
, ,
0 progaoff
 
10.07.18
11:09
Есть таблица значений, в ней отображены элементы справочника, есть необходимость, удалять записи из таблицы, но и при этом помечать на удаление элемент справочника, подскажите что ни будь по этому поводу.
1 1Сергей
 
10.07.18
11:15
(0) эм... ну, надо взять и сделать. Что тут подсказывать?
2 progaoff
 
10.07.18
11:21
(1) да ладно?)
3 Владимир1С
 
10.07.18
11:22
(0)Внимательно читаем синтаксис помощник.
4 vladko
 
10.07.18
11:44
(0) ничего сложного:
Спр = СоздатьОбъект("Справочник.Контрагенты");
//Перебираем таблицу значений с конца в начало, т.к. надо удалять ненужные строки в ней
ТЗконтрагенты.ВыбратьСтроки();
Для н = -ТЗконтрагенты.КоличествоСтрок() по -1 Цикл
ТЗконтрагенты.ПолучитьСтрокуПоНомеру(-н);
Если <Условие> Тогда
  Спр.НайтиЭлемент(ТЗконтрагенты.Контрагент);
  Спр.Удалить(0);
  
  ТЗконтрагенты.УдалитьСтроку();

КонецЕсли;
КонецЦикла;
5 progaoff
 
10.07.18
11:47
(4) Спасибо.
6 1Сергей
 
10.07.18
12:09
(4) Вот это зачем:

ТЗконтрагенты.ВыбратьСтроки();
7 Salimbek
 
10.07.18
12:28
(6) Видимо - по привычке ))) И только потом цикл был переписан, а привычка осталась ))
8 HawkEye
 
10.07.18
16:47
я один не понял, в чем была принципиальная сложность написания кода?
9 uno-group
 
10.07.18
17:51
(8) Предположу, что в обратном обходе ТЗ. если идти в прямом обходе то при удалении строки тз пропускалась следующая за ней строка.
10 Злопчинский
 
10.07.18
18:03
После удаления можно тупо делать ПолучитьСьтрокуПоНомеру(предыдущая строка) или вообще заново иницилизировтаь выборку...
11 Остап Сулейманович
 
10.07.18
18:07
(10) "заново иницилизировтаь выборку" - Феерично.
Особенно если удалить нужно несколько десятков строк.
12 Базис
 
naïve
10.07.18
18:12
(11) Время Злопчинского бесконечно ценней времени сервера. А код простой получается.
13 Остап Сулейманович
 
10.07.18
18:17
(12) Это типа так :
Пока 1=1 Цикл
  НачатьЗаново = 0;
  ТЗ.ВыбратьСтроки();
  Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    Если <Условие> Тогда
      ТЗ.УдалитьСтроку();
      НачатьЗаново = 1;
      Прервать;
    КонецЕсли;
  КонецЦикла;
  Если НачатьЗаново = 0 Тогда
    Прервать;
  КонецЕсли;
КонецЦикла;

Нифига себе простой код.
14 Базис
 
naïve
10.07.18
18:20
(13) Метку поставь перед циклом, и никому не говори, "Кто это накодил" (произносится с интонацией воспитателя котёнка).
15 Остап Сулейманович
 
10.07.18
18:21
(14) Птля... За метку я забыл. Сыплю голову пеплом (((
16 Базис
 
naïve
10.07.18
18:29
(15) Мне оставь, я посыплю за плохой пример.
17 GreyK
 
10.07.18
18:30
Простенько и без заморочек:

Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    Пока (ПустоеЗначение(ТЗ.НомерСтроки) = 0) И (здесь условие удаления) Цикл
        ТЗ.УдалитьСтроку();
    КонецЦикла;
КонецЦикла;
18 GreyK
 
10.07.18
18:33
+(17) Пропустил "ТЗ.ВыбратьСтроки();".
19 Djelf
 
10.07.18
18:36
Для смелых - 1sqlite 3.24.0.22

DELETE FROM Справочник_Контрагенты
WHERE CODE  in( 'Ц01002513','Ц01002095')
20 Djelf
 
10.07.18
18:37
+(19) Правда без пометки, хрясь и всё!
21 HawkEye
 
10.07.18
19:30
(9) так человек спрашивал как пометить на удаление элемент, а не как удалить строку...  впрочем, кто их поймет этих ЕГЭ-программистов.
22 GreyK
 
10.07.18
19:35
(21) Издеваешься? Пометка на удаление и удаление справочника из ТЗ не сбивает выборку ТЗ.
23 progaoff
 
06.08.18
12:39
(20) нет, так нельзя, (4) получилось что удаляет строку из ТЗ но в справочнике пометку не ставит.
24 Builder
 
06.08.18
12:48
(23) Чего, месяц отлаживал и не удаляет?
В (4) есть код, который ставит пометку на удаление.
25 progaoff
 
06.08.18
12:49
(24) Да есть, но толку, ТЗконтрагенты.УдалитьСтроку(); отрабатывает только вот этот метод.
26 Builder
 
06.08.18
12:51
(25) Отладчик открой, там много интересного.
Посмотри что возвращает Спр.НайтиЭлемент(ТЗконтрагенты.Контрагент);
27 Builder
 
06.08.18
12:52
(25) Что то мне подсказывает что ТЗконтрагенты.Контрагент - это не элемент справочника, а строка.
28 progaoff
 
06.08.18
13:01
(26) 0
29 progaoff
 
06.08.18
13:03
Процедура УдалитьСтроку()    
Спр = СоздатьОбъект("Справочник.БП_УслугиБанку");
СписокРемонта.ВыбратьСтроки();
Для н = -СписокРемонта.КоличествоСтрок() по -1 Цикл
СписокРемонта.ПолучитьСтрокуПоНомеру(-н);

  Спр.НайтиЭлемент(СписокРемонта.Объект);
  Спр.Удалить(0);
  
  СписокРемонта.УдалитьСтроку();

КонецЦикла;

Конецпроцедуры
30 Cthulhu
 
06.08.18
13:49
Процедура УдалитьСтроку()    
Для н = -СписокРемонта.КоличествоСтрок() по -1 Цикл
СписокРемонта.ПолучитьСтрокуПоНомеру(-н);
//ping!
Если ТипЗначения(СписокРемонта.Объект)<>ТипЗначения(Спр) Тогда
  Сообщить("Ойёо ну и балбес - в справочнике не справочник искать","!!!"); Продолжить;
ИначеЕсли СписокРемонта.Объект.Вид()<>Спр.Вид() Тогда
  Сообщить("Ойёо ну и балбес - в справочнике "+Спр.Вид()+" искать элементы справочника "+СписокРемонта.Объект.Вид(),"!!!"); Продолжить;
ИначеЕсли СписокРемонта.Объект.Выбран()<>1 Тогда
  Сообщить("Ойёо ну и балбес - пустое неизвестно чо в справочник искать и пытаться удалять","!!!"); Продолжить;
КонецЕсли;
//pong!
//.......
  Спр.НайтиЭлемент(СписокРемонта.Объект);
  Спр.Удалить(0);
  
  СписокРемонта.УдалитьСтроку();

КонецЦикла;

Конецпроцедуры
31 progaoff
 
06.08.18
16:37
Фиг с ней с этой пометкой.
Процедура УдалитьСтроку()    
    Спр = СоздатьОбъект("Справочник.БП_УслугиБанку");
    Спр.ВыбратьЭлементы();
    Спр.ИспользоватьВладельца(ТекущийЭлемент());
    Спр.ПорядокНаименований();
Если Выбран() = 1 Тогда    
    Спр.УдалитьИзСписка = Перечисление.Булево.Да;
    СписокРемонта.УдалитьСтроку();
КонецЕсли    
Конецпроцедуры    
Реквизит не устанавливает,  Не выбран элемент! Не пойму что не так.
32 HawkEye
 
06.08.18
16:40
(31) нет ПолучитьЭлемент() и нет Записать()
33 Эльниньо
 
06.08.18
17:08
(31)
Процедура УдалитьСтроку()    
    Спр = СоздатьОбъект("Справочник.БП_УслугиБанку");
    Спр.ИспользоватьВладельца(ТекущийЭлемент());
    Спр.ПорядокНаименований();
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        с = 0;
        СписокРемонта.НайтиЗначение(Спр.ТекущийЭлемент(), с, "Объект");
        Если с > 0 Тогда
            Спр.УдалитьИзСписка = Перечисление.Булево.Да;
            Спр.Записать();
            СписокРемонта.УдалитьСтроку(с);
        КонецЕсли;
    КонецЦикла;
КонецЕсли
34 Cthulhu
 
06.08.18
17:24
(33): вангую ответ:
не корректирует никакие элементы.
35 progaoff
 
06.08.18
17:25
(34) да  СписокРемонта.НайтиЗначение(Спр.ТекущийЭлемент(), с, "Объект"); = 0
36 Cthulhu
 
06.08.18
17:27
(35): а ты из (30) если-конецесли блок попробуй все-таки...
37 progaoff
 
06.08.18
17:30
(36) Пробовал))
38 progaoff
 
06.08.18
17:32
Сообщить("Ойёо ну и балбес - в справочнике "+Спр.Вид()+" искать элементы справочника "+СписокРемонта.Объект.Вид(),"!!!"); Продолжить;
39 progaoff
 
06.08.18
17:32
(38) Результат
40 DenVaz
 
06.08.18
17:38
Список с пометками, кнопка удалить. Просто кнопка удалить.

СправочникДляУдаления = СоздатьОбъект("Справочник.***");

Функция УдалениеЭлементаСправочника(ЭлементСправочника)
СправочникДляУдаления.НайтиЭлемент(ЭлементСправочника);
СправочникДляУдаления.Удалить(0);
КонецФункции
41 Эльниньо
 
06.08.18
17:43
Что это было?
42 DenVaz
 
06.08.18
17:47
Ну список с пометками, лажа)... Таблица значений у него. Ну и тему не читал. Я так понял удалить ему надо... Вот функция находи элемент удаляй. А как находить в цикле по пометкам или просто с кнопки - дело хозяйское. В (0) ничего не написано, а дальше я не читал - лень)
43 DenVaz
 
06.08.18
17:55
Если делать отбор из таблицы значений по строки по флагу.
То я бы отсортировал, нашел точку смены флага, вырезал таблицу с искомым флагом - по ней перебрал элементы и грохнул бы справочики.  Всегда так делал - работает почти мгновенно. Уверен с наивысшей возможной скоростью... Нежели тупой перебор в цикле.
44 DenVaz
 
06.08.18
17:57
+(43) Ну это если скорость важна.
45 DenVaz
 
06.08.18
17:58
+(43) Потому что системная сортировка таблицы - всегда круче реализована чем ваши переборы на макроязыке....
46 DenVaz
 
06.08.18
17:59
+(45) И ситемный поиск значения тоже.
47 Cthulhu
 
06.08.18
18:01
(38): это не результат.
если эта ветка сработала - тогда следующий вопрос: ну и?
lol
48 progaoff
 
06.08.18
18:02
(47) СписокРемонта.Объект = Срань
49 Cthulhu
 
06.08.18
18:02
(46): ну системный поиск в тз - тот же тупой перебор...
50 progaoff
 
06.08.18
18:03
Процедура УдалитьСтроку()    
    Спр = СоздатьОбъект("Справочник.БП_УслугиБанку");
    Спр.ИспользоватьВладельца(ТекущийЭлемент());
    Спр.ПорядокНаименований();
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        с = СписокРемонта.ТекущаяСтрока();
        СписокРемонта.НайтиЗначение(Спр.ТекущийЭлемент(), с, "Объект");
        Если с > 0 Тогда
            Спр.УдалитьИзСписка = Перечисление.Булево.Да;
            Спр.Записать();
            СписокРемонта.УдалитьСтроку(с);
        КонецЕсли;
    КонецЦикла;



Конецпроцедуры    
В таком виде изменяет все что есть в таблице
51 Cthulhu
 
06.08.18
18:05
(50): а это потому, что ты синтакс-помощника не умеешь читать.
номер строки в параметрах ненулевой - поиск віполняется только в єтой строке, и знпчение єтого параметра (номера строки) не изменяется.
52 progaoff
 
06.08.18
18:08
(51) Хоспади, да как же его слепить то)?
53 DenVaz
 
06.08.18
18:09
(49) Даже если так - не на макроязыке, уж поверь работает кратно быстрее).
// Пример
ТЗ.Сортировать("Флаг+");
НомерСтроки = 0;
КоличествоСтрокТЗ = ТЗ.КоличествоСтрок;
ТЗ.НайтиЗначение(ФлагУдаления,НомерСтроки , "Флаг");


ТЗДляУдаления = СоздатьОбъект("ТаблицаЗначений");
ТЗ.Выгрузить(ТЗДляУдаления, НомерСтроки, КоличествоСтрокТЗ);

//Далее перебор в цикле ТЗДляУдаления и пометка на
//удаление справочника.
ТЗ.Выгрузить(ТЗ,1,НомерСтроки-1); // загрузка
//результирующей таблицы
54 HawkEye
 
06.08.18
18:10
(50) какой ужас...
Спр = СоздатьОбъект("Справочник.БП_УслугиБанку");
СписокРемонта.ВыбратьСтроки();
пока  СписокРемонта.ПолучитьСтроку() = 1 Цикл
  Спр.НайтиЭлемент(СписокРемонта.Объект);
Спр.УдалитьИзСписка = Перечисление.Булево.Да;
            Спр.Записать();
КонецЕсли;

КонецЦикла;
СписокРемонта.УдалитьСтроки()
55 Cthulhu
 
06.08.18
18:11
(52): ну с самого начала - не надо пробовать лепить из г0вна (как ты это пытаешься сделать).
пункт два - подумать.
мне этого обычно хватает.
(ты, кстати, так и не дал ответа на то, какое сообщение выдается при проверке типа+вида значения, которое ты пытаешься искать в справочнике)
56 progaoff
 
07.08.18
08:41
(38) вот здесь же ответил)
57 HawkEye
 
07.08.18
08:53
(56) т.е. тебе написали: "Ойёо ну и балбес - в справочнике "+ХХХХХХ+" искать элементы справочника "+УУУУУУ"
а ты все продолжаешь искать? )))))
58 DenVaz
 
07.08.18
10:08
(56) Что ты мучишься давай напишу за 500.
59 hhhh
 
07.08.18
10:18
(56) вот это бредятина

      с = СписокРемонта.ТекущаяСтрока();
  

выкинь
60 progaoff
 
07.08.18
10:39
(58) хочу что бы дошло(
61 progaoff
 
07.08.18
10:39
(59) да вкурсе)
62 DenVaz
 
07.08.18
12:20
(60) Давай за 1000, за + 500 я тебе вобъю в башку что да как.
63 DenVaz
 
07.08.18
12:20
+(62) Пока у меня время есть и ностальгия по коддингу )
64 Kigo_Kigo
 
07.08.18
12:30
Ребят, я что то пока читал всю суть вопроса растерял, что в итоге надо автору то?
65 hhhh
 
07.08.18
12:47
(64) что-то типа (50)
66 HawkEye
 
07.08.18
12:50
(64) забей... он сам не знает что ему надо и не понимает что в окне сообщений выдается.....
68 progaoff
 
07.08.18
13:26
(66) Ну с чего вдруг не пойму, мне нужно каким то способом либо пометить на удаление элемент справочника находящийся в ТЗ либо присвоить реквизит что бы потом при заполнении ТЗ отбирать по нему. Не могу понять как правильно с позиционироваться на элементе.
69 HawkEye
 
07.08.18
13:29
(68) чтобы понять как правильно... надо понять что у тебя есть...
для позиционирования на элементе справочника, есть методы:
НайтиЭлемент()
НайтиПоКоду()
НайтиПоНаименованию()
НайтиПоРеквизиту()

все они описаны в СП....
70 catena
 
07.08.18
13:30
(68)Но в (38) же уже выяснили, что в ТЗ не элементы справочника (как минимум, не элементы того справочника, в котором происходит поиск).

Не надо вводить сообщество в заблуждение.
71 DenVaz
 
07.08.18
15:57
Я еще одного понять не могу зачем автору 77 ? Нафиг это все....
Независимо от того, куда вы едете — это в гору и против ветра!