Имя: Пароль:
1C
1С v8
1C удаление в базе 600 000 элементов (зацикливание)
0 andryscha1c
 
09.11.21
14:38
Пользователь каким то образом зациклил в справочнике группы (около 600 000 тыс. создалось). При попытке пометить на удаление или программно удалить эти группы - вылетало в аварийное завершение. Запрос полностью зависал при выполнении, если в его тексте выбираем эти группы.
Необходимо каким то образом удалить только конкретные группы в справочнике, причем другие элементы не трогать. Удаление таблицы целиком, чревато потерей старых данных, которые учавствуют элементы справочника. Речь сейчас скорее пойдет о порционном удалении... Кто сталкивался?
1 RomanYS
 
09.11.21
14:46
(0) показывай своё "программно удалить".
Возможно сначала стоит расциклить группы, если удалить не получаетсяю
Возможно поможет режим загрузки.
2 pechkin
 
09.11.21
14:48
удаляй програмно, но обменданными.загрузка
3 pechkin
 
09.11.21
14:48
тогда при удалении группы подчинненные не удаляются
4 Garykom
 
гуру
09.11.21
14:48
(1) "покажите друга" ?
5 ДенисЧ
 
09.11.21
14:49
(4) А оно тебе надо? ))
6 Garykom
 
гуру
09.11.21
14:53
(5) Нет, я же не доктор
7 ДенисЧ
 
09.11.21
14:55
(6) "Я не доктор, но посмотреть могу" (с)
8 andryscha1c
 
09.11.21
14:56
(2) как вариант использовать транзакции?
9 andryscha1c
 
09.11.21
14:56
(3) нужно все подчиненные удалить, то есть к примеру на форме выбрал группу, а далее как бы в иерархии все что находится внутри этой группы
10 mistеr
 
09.11.21
14:57
(0) ИР, Подбор и обработка?
11 andryscha1c
 
09.11.21
15:05
(10) групповым изменением объектов хотел воспользоваться, но там зависает уже на этапе отбора
12 tesei
 
09.11.21
15:05
Есть обработка пакетного удаления объектов. Можно вычислить, что именно не удаляется (с определенного момента пакет не будет обработан), и работать с этим.
13 Sapiens_bru
 
09.11.21
15:18
База файловая?
Если нет - такие вещи легко разруливаются на уровне sql сервера.
14 andryscha1c
 
09.11.21
15:20
(13) SQL, куда копать?
15 tesei
 
09.11.21
15:25
+ (12) Вот у тебя 600 000 объектов. Запускаешь пакетное удаление по 20 объектов, будет удаляться до тех пор, пока не споткнется. У проблемного объекта обнуляй родителя.
16 Strogg
 
09.11.21
15:28
(0) в чем проблема написать пакетную обработку пометки и дальнейшего удаления? У меня как-то создалось 2 миллиона наименований продукции ветис, так я порциями по 50к помечал/удалял в течении пары недель.
17 Garykom
 
гуру
09.11.21
15:33
(16) а слабо было в 20-30 потоков запустить на сервере?
18 mistеr
 
09.11.21
15:33
(11) Отбор делай запросом, результат передавай в обработку.
19 andryscha1c
 
09.11.21
15:34
(15) (16) пакетное удаление имеется ввиду делать запрос к примеру по 5000 и удалять программно сразу?
20 Strogg
 
09.11.21
15:36
(17) ха. На какой-то платформе делал многопоточную реглу - так она постоянно вылетала в ошибку. Пробовал добавлять до 10 потоков - выигрыш во времени составил около 30% при постоянных сваливаниях в штопор(причем, при одном потоке отрабатывала на ура!)... Хз, может платформа неудачная была, но многопоточность тогда совсем не зашла...
21 Sapiens_bru
 
09.11.21
15:38
(14) MS-SQL ?
У справочника иерархия элементов или элементов и групп?
22 Dmitrii
 
гуру
09.11.21
15:41
(0) Я не понял. А вы выяснили - в чём конкретно косяк? У какой-то одной группы в качестве родителя указана она сама?
Тогда что мешает найти эту одну проблемную группу и исправить проблему?

Или таких групп множество?

Какие-то сказки венского леса.
23 andryscha1c
 
09.11.21
15:42
(21) групп
24 andryscha1c
 
09.11.21
15:46
(22) у всех групп, раскрывая группы содержит группу с тем же названием что и родитель
25 mistеr
 
09.11.21
15:48
(24) Отключи наконец иерархический просмотр.
26 Garykom
 
гуру
09.11.21
15:49
(20) это очень странно
на той же платформе юзеры не вылетали случаем?
ибо правильно заюзанная ничуть не хуже
часто выбивает фоновые когда ресурсов не хватает, например оперативки
или еще какие то проблемы
27 andryscha1c
 
09.11.21
15:53
(25) это не решит проблему
28 mistеr
 
09.11.21
15:56
(27) Для начала проблему нужно правильно диагностировать. Пока не видно каких-то усилий от тебя в этом направлении.
29 Dmitrii
 
гуру
09.11.21
16:09
(24) >>  у всех групп, раскрывая группы содержит группу с тем же названием что и родитель

А теперь по-русски и в терминах 1С. А не куцым языком пользователя, вчера увидевшего 1С.
30 Dmitrii
 
гуру
09.11.21
16:19
Если справочник с иерархией групп и элементов, я бы тупо удалил (непосредственное удаление без контроля ссылочной целостности) всех групп, которые не являются родителями для элементов.
Вторым шагом (если он вообще потребуется) отобрал бы группы, где <Родитель> = <Ссылка> (группы у которых родитель сама эта группа), и очистил бы реквизит <Родитель>, сделав их таким образом корневыми.
Потом разбирался бы с результатом и при необходимости заставил бы этого пользователя раскладывать группы, вылезшие на предыдущем шаге в корень справочника, по нужным папкам (группам).

Хотя, есть ненулевая вероятность, что всё гораздо проще и в справочнике есть одна единственная группа, где <Родитель> = <Ссылка>. тогда достаточно найти эту группу и исправить в ней родителя на правильного.
31 Sapiens_bru
 
09.11.21
16:21
(23)

Сделай копию базы

Зайди в Sql Management Studio

Найди свою базу, нажми на ней правой кнопкой и выбери "Выполнить Запрос"

Вставь текст запроса:

UPDATE [_Reference32]
set _ParentIDRRef = CAST(0x00000000000000000000000000000000 AS varbinary(16))
where _Folder = 0x00

Вместо _Reference32 подставь имя таблицы где у тебя данные лежат. Инструментов про просмотру структуры базы данных полно

Выполни запрос.

В результате запроса все группы в справочнике потеряют иерархию. При этом элементы справочника останутся в своих группах. Останется собрать справочник заново, распихать группы по группам.
32 Sapiens_bru
 
09.11.21
16:22
(31) Миста криво куски кода определяет(
В тексте запроса три строки, не ошибись
33 Dmitrii
 
гуру
09.11.21
16:54
Если автор умудрился сотворить (0), то сейчас ему только прямых SQL-запросов не хватает, чтобы убить базу окончательно.
34 timurhv
 
09.11.21
17:11
(33) Написано что пользователь, но ИМХО это план обмена или обработка.
35 andryscha1c
 
09.11.21
23:24
(33) (34) сотворил это пользователь, скорее с помощью запущенной обработки.
36 andryscha1c
 
09.11.21
23:26
(31) это очистит все данные с таблицы? (нужен отбор по группе определенной, сохранив элементы)
37 andryscha1c
 
09.11.21
23:31
(36) where _Folder = 0x00 вот тут это как то определить надо будет вместо 0x00?
38 Ёпрст
 
09.11.21
23:57
(37) 0x01 - элемент, 0x00 - группа
39 Ёпрст
 
09.11.21
23:58
но, я бы так не делал.
40 TormozIT
 
гуру
09.11.21
23:58
Объект = Ссылка.ПолучитьОбъект();
Объект.ОбменДанными.Загрузка = Истина;
Объект.Родитель = 0;
Объект.Записать();

Не помогает разве?
41 Ёпрст
 
09.11.21
23:59
(40) помогает, просто автор не может толком объяснить, что у него "зацикленно"
42 Ёпрст
 
10.11.21
00:01
Проще так написать, если Родитель = ссылке у группы

UPDATE [_Reference32]
set _ParentIDRRef = CAST(0x00000000000000000000000000000000 AS varbinary(16))
where _ParentIDRRef = _IDRRef
43 andryscha1c
 
10.11.21
00:42
44 andryscha1c
 
10.11.21
00:43
(40) надо полностью удалить элементы групп, выше скрин
45 серый КТУЛХУ
 
10.11.21
01:27
(43): о, кучно пошло... кто-то с рекурсией криво поигрался небось...
46 Sapiens_bru
 
10.11.21
05:12
(36) Ты программист 1С?
Если нет, позови программиста.

Я думал у тебя справочник зациклен и средствами платформы не обрабатывается. Предложил как его расциклить, а уж обработать сам знаешь как.
Но похоже не знаешь.

Программист с подобными проблемами помогает так : подключается, слушает пользователя, смотрит вместе с ним в рабочую базу, уточняет
задачу вопросами. Потом берет копию базы и на ней делает хорошо. Показывает пользователю. Если их понятие о "хорошо" совпало - те же действия выполняются в рабочей базе

Ты пытаешься решить проблему через два глухих телефона. Первое - нифига не можешь объяснить что нужно сделать. Второе - попытаешься применить решение сам без понятия как оно работает.
47 Обработка
 
10.11.21
05:31
Задача в теме - одно из задач чтобы понять человек может стать кодером или нет.
Пусть даже на уровне логики чтоб решил без всякого языка программирования.
48 Ёпрст
 
10.11.21
09:24
(43) и? Тут нет никакого "зацикливания" . Все группы имеют уникальный код.
Можно их удалить примитивным запросом, тупо удалять все группы, если количество групп с одинаковым наименованием >1
49 Dmitrii
 
гуру
10.11.21
09:53
(35) >> сотворил это пользователь, скорее с помощью запущенной обработки.

А такие "волшебные" обработки у вас пользователи сами пишут?
Ну к чему ей богу эти детские отмазки? Я ж без особых претензий к тебе. Все ошибаются.

Но, судя по тому, что ты не в состоянии даже понять источник и причину проблемы, лучше руками через прямые запросы к СУБД ничего не делать.
Тем более, что с вероятностью 99.9% проблема решается средствами платформы и даже без программирования.
50 Garykom
 
гуру
10.11.21
09:57
(49) Угу. В типовых есть Корректировка данных > Групповое изменение реквизитов
51 Ёпрст
 
10.11.21
11:11
На вот, поставишь своё имя базы, своё имя таблички и своё наименование. Занимайся


use [Base666] --сюда воткнуть своё имя базы
delete
  from [_Reference666]  --сюда воткнуть своё имя таблички от справочника Номенклатура
  where [_Folder] = 0x00
  and [_Description] = 'Полуфабрикаты'
  and [_IDRRef] not in (select [_ParentIDRRef]  from [_Reference666] where [_Folder] = 0x01) ---сюда воткнуть своё имя таблички от справочника Номенклатура
52 youalex
 
10.11.21
11:52
(51) если такая структура будет, удалит корневой элемент и будет битая ссылка у второй группы

Полуфабрикаты
Полуфабрикаты
   Элемент1
53 Ёпрст
 
10.11.21
12:00
(52) ?
54 Ёпрст
 
10.11.21
12:00
посмотри внимательнее
55 Ёпрст
 
10.11.21
12:00
там всё ровно
56 Ёпрст
 
10.11.21
12:06
Да.. будет битая, ну и ладно
57 Ёпрст
 
10.11.21
12:07
проапдейтить потом оставшуюся группу поуфабрикат на предмет родителя
58 Ёпрст
 
10.11.21
12:11
Поправил, занимайся


use [Base666] --сюда воткнуть своё имя базы
delete
  from [_Reference666]  --сюда воткнуть своё имя таблички от справочника Номенклатура
  where [_Folder] = 0x00
  and [_Description] = 'Полуфабрикаты'
  and [_IDRRef] not in (select [_ParentIDRRef]  from [_Reference666] where [_Folder] = 0x01) ---сюда воткнуть своё имя таблички от справочника Номенклатура
go
update [_Reference666]
set [_ParentIDRRef] = CAST(0 as varbinary(16))
where [_Folder] = 0x00
  and [_Description] = 'Полуфабрикаты'
59 andryscha1c
 
11.11.21
01:38
(58) вам можно как то написать лично для решения задачи $$$ посредством запроса sql?
60 Ёпрст
 
11.11.21
01:45
(59) дык тебе же дали готовый запрос, подставь своё имя таблички и имя базы и всё
61 andryscha1c
 
11.11.21
09:54
(60) к сожалению, пытался по всякому, не сработало
62 Ёпрст
 
11.11.21
10:06
(61) Не сработало, это как ? :))
63 andryscha1c
 
11.11.21
11:19
(62) обработано 0 записей, как будто бы запрос пустой выдал. Могу вам на почту хотя бы скрин скинуть?)
64 andryscha1c
 
11.11.21
11:20
(63) хоть он и выполнился успешно, но ничего не удалилось
65 OldCondom
 
11.11.21
11:26
(62) видимо от того, что вы по очень странной причине  решили, что данному персонажу можно не писать комментарий в запросе update "вот сюда воткнуть имя таблички".
66 andryscha1c
 
11.11.21
11:36
(65) поменяли
67 OldCondom
 
11.11.21
11:46
откуда имя таблицы справочника взяли? Чудес не бывает
68 Ёпрст
 
11.11.21
11:55
(63) ну дай доступ по тимвьюверу/анидеску/эммиадмину ..посмотрю, че ты там творишь
69 Ёпрст
 
11.11.21
11:55
70 andryscha1c
 
11.11.21
11:57
(69) Спасибо. напишу.
71 Ёпрст
 
11.11.21
13:09
Короче, имя таблички было другое, ибо справочник болтался в расширении, ну и табличка с X в конце. А так, починилось.
72 OldCondom
 
11.11.21
13:29
собственно 67. Это печально конечно, откровенно профессиональные импотенты появляются все чаще.
73 andryscha1c
 
12.11.21
23:51
(71) спасибо, большое, за помощь!
74 GANR
 
13.11.21
12:24
(0) Если нужных элементов немного, делается так:
1. Выгрузить нужные элементы через ВыгрузкаЗагрузкаДанных или самопальную обработку
2. truncate table убить все данные
3. Загрузить выгруженные в п.1 данные с ОбменДанными.Загрузка = Истина