Проверка номенклатуры на имеющиеся ссылки и пометка ее на удаление

1. LastSoldier 255 20.01.15 10:05 Сейчас в теме
Всем привет! Пытаюсь создать свою первую внешнюю обработку, мне надо сделать так:
пробежаться по всему списку номенклатуры, если на номенклатуру нет никаких ссылок или есть только ссылки на установку цен, то пометить эту номенклатуру на удаление удаление и все.
Вот что написал:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура.Наименование";
РезультатЗапроса = Запрос.Выполнить().Выбрать();

Пока РезультатЗапроса.Следующий() Цикл

Если ??? Тогда

Элемент.ПометкаУдаления = Истина;

КонецЕсли;

КонецЦикла;
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. AnryMc 849 20.01.15 10:15 Сейчас в теме
(1) LastSoldier, Если надо удалить то можно воспользоваться Пометка на удаление неиспользуемых элементов справочников и документов
http://infostart.ru/public/65132/
там же можно посмотреть как...

Если "поучиться самому" - то в чем смысл приведенного кода? (в чём вопрос)
5. Boneman 298 20.01.15 10:16 Сейчас в теме
(1) LastSoldier, чтобы что-то делать с объектом, тебе надо его получить.
А из запроса - выходят только ссылки на эти объекты.

Вообще, примеров в интернете - 100500штук, на каждом сайте.
учись искать информацию. Задача простецкая.
Код специально не привожу.

Да и готовых обработок, которые умеют все это делать, еще столько же.
В них можно и код подсмотреть.
34. tsmgeorg@gmail.com 26.01.15 12:07 Сейчас в теме
(1) LastSoldier,
Если хотите выборочно, вот пример. Весь массив ссылок справочника если поместить в параметр функции найтипоссылкам(МассивОбъектов) будет очень долго искать. А в данном примере можно хоть отследить
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ДоговорыКонтрагентов.Ссылка
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
| ДоговорыКонтрагентов.ПометкаУдаления = ИСТИНА";
РезультатЗапроса = Запрос.Выполнить();

Сообщение = Новый СообщениеПользователю;
Если Не РезультатЗапроса.Пустой() Тогда

ВыборкаЗапроса = РезультатЗапроса.Выбрать();
Пока ВыборкаЗапроса.Следующий() Цикл

МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(ВыборкаЗапроса.Ссылка);
ТЗСсылок = НайтиПоСсылкам(МассивОбъектов);
Если ТЗСсылок.Количество() = 0 Тогда
СправочникОбъект = ВыборкаЗапроса.Ссылка.ПолучитьОбъект();
Сообщение.Текст = "Удален договор" + СокрЛП(ВыборкаЗапроса.Ссылка);
Сообщение.Сообщить();
СправочникОбъект.Удалить();
КонецЕсли;
КонецЦикла;
КонецЕсли;
52. AlexO 135 09.02.15 17:40 Сейчас в теме
(1) LastSoldier, столько обсуждения - будет неуважительно, если не выложишь обработку ))
53. LastSoldier 255 12.02.15 22:50 Сейчас в теме
(52) AlexO, Если Вам такая обработка нужна, то могу и выложить ее. Она только помечает номенклатуру на удаление и все. С пустыми ссылками или с теми что ниже описанны, остальные не трогает
 Если (ДРегистры="Установка цен номенклатуры") 
                    или (ДРегистры="Группы значений доступа") 
                    или (ДРегистры="(не используется) Группы значений доступа") Тогда 
Прикрепленные файлы:
ВО_Пометка_на_удаление_неиспользуемой_номенклатурыя.epf
Светлый ум; +1 Ответить
2. spezc 782 20.01.15 10:14 Сейчас в теме
1. Получить запросом список номенклатуры как у тебя в сабже.
2. НайтиПоСсылкам(<СписокСсылок>);
3. Пройтись по результату п.2, в случае если удовлетворяют твоим условиям - пометить на удаление
6. LastSoldier 255 20.01.15 12:09 Сейчас в теме
(2) вот я как раз и не могу понять как получить этот СписокСсылок, для НайтиПоСсылкам(<СписокСсылок>);
7. ololoanonim 3 20.01.15 12:39 Сейчас в теме
(6) LastSoldier, Это описано в синтаксис помощнике. Там даже пример приведен.
3. Bienko 212 20.01.15 10:15 Сейчас в теме
НайтиПоСсылкам (< Список ссылок> )
Параметры:
<Список ссылок> Обязательный
Тип: Массив. Массив со списком ссылок на объекты, ссылки на которые нужно найти.
Возвращаемое значение:
Тип: ТаблицаЗначений. Таблица значений, состоящая из ко­лонок с индексами: 0 - Искомая ссылка; 1 - Ссылка на объект, который содержит искомую ссылку.
Описание:
Осуществляет поиск ссылок на объекты.
8. LastSoldier 255 20.01.15 13:04 Сейчас в теме
Я смотрел этот пример
Ссылки = НайтиПомеченныеНаУдаление();

ТабСсылок = НайтиПоСсылкам(Ссылки);

Мне не надо искать помеченные на удаление, тем более все подряд. вот я и не могу понять как ему указать что надо искать только "номенклатуру" и не всю подряд, а сначала номенклатуру №1 и все ее ссылки, потом номенклатуру № 2 и все ее ссылки и тд.
Это моя первая обработка, я много не знаю.
Напишите пример если не трудно, ну там о партнерах, чтобы понять хоть суть
9. Boneman 298 20.01.15 13:12 Сейчас в теме
(8) LastSoldier, вместо помеченных на удаление, у тебя должен быть твой массив. Который ты получаешь запросом.
10. Boneman 298 20.01.15 13:19 Сейчас в теме
(8) LastSoldier,

Пока РезультатЗапроса.Следующий() Цикл 
     МассивСсылок = Новый Массив;
     МассивСсылок.Добавить(РезультатЗапроса.Ссылка);
     ТабСсылок = НайтиПоСсылкам(МассивСсылок);
     Если ТабСсылок.Количество() >0 тогда
         // Ссылки есть, 
     иначе
         // нихрена нету, обрабатываем
     КонецЕсли;
КонецЦикла;

Показать
LastSoldier; +1 Ответить
11. ololoanonim 3 20.01.15 14:50 Сейчас в теме
(10) Boneman, Только надо не добавлять в массив значения, а переназначать первый
МассивСсылок = Новый Массив(1);
Пока РезультатЗапроса.Следующий() Цикл 
     МассивСсылок[0] = РезультатЗапроса.Ссылка;
     ТабСсылок = НайтиПоСсылкам(МассивСсылок);
     Если ТабСсылок.Количество() >0 тогда
         // Ссылки есть, 
     иначе
         // нихрена нету, обрабатываем
     КонецЕсли;
КонецЦикла;
Показать

Иначе он будет каждый раз увеличивать массив и следовательно потом будет искать по большому массиву. Вроде так.
12. Boneman 298 20.01.15 14:54 Сейчас в теме
(11) ololoanonim,
Только надо не добавлять в массив значения, а переназначать первый

так у меня же внутри каждой итерации новый массив создается,
поэтому там всегда будет одно значение.
13. ololoanonim 3 20.01.15 14:59 Сейчас в теме
(12) Boneman, Вы правы. Но мне глаз "режет". Совсем загоняли старшие программисты :)
14. LastSoldier 255 21.01.15 08:56 Сейчас в теме
(10) огромное спасибо. Теперь я понял как это делается. Дальше буду смотреть что надо отбирать, думаю тут пока справлю, о результате обязательно отпишусь.
Скажите, в 1с есть такое, чтобы когда я проверяю мою обработку(Начать отладку), не закрывать постоянно 1с
15. Boneman 298 21.01.15 09:18 Сейчас в теме
(14) LastSoldier, если обработка внешняя, то закрывать 1С не нужно. Достаточно, закрыть и заново открыть эту обработку.
16. vladir 114 21.01.15 09:30 Сейчас в теме
(14) LastSoldier, Чтобы не закрывать/открывать обработку сделай на форме кнопку "Перезагрузить" а в модуле формы Процедуру для кнопки:
Процедура КоманднаяПанель1Перезагрузка(Кнопка)
	Для каждого МетаФорма Из ЭтаФорма.Метаданные().Формы Цикл
		ТекФорма = ПолучитьФорму(МетаФорма);
		Если ТекФорма.Открыта() Тогда
			ТекФорма.Закрыть();
			Если ТекФорма = ЭтаФорма Тогда
				Если Найти(Строка(ТипЗнч(ЭтотОбъект)), "Внешняя обработка объект:") = 1 Тогда
					ВнешниеОбработки.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(МетаФорма.Имя).Открыть();
				Иначе
					ВнешниеОтчеты.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(МетаФорма.Имя).Открыть();
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
Показать


Код взят на Инфостарте, найди автора и передай ему спасибо :)))
LastSoldier; +1 Ответить
17. LastSoldier 255 21.01.15 14:28 Сейчас в теме
А подскажите, как обратиться к массиву ссылок, к столбцу Данные или Методанные
18. LastSoldier 255 21.01.15 15:54 Сейчас в теме
Вот что получилось, вроде работает, только еще не все условия учел
Оцените и скажите замечания.
Проблема что очень долго все обрабатывает

&НаСервере
Процедура ВыполнитьИзменениеНаСервере()

Запрос = Новый Запрос; 
Запрос.Текст = "ВЫБРАТЬ
               |	Номенклатура.Ссылка
               |ИЗ
               |	Справочник.Номенклатура КАК Номенклатура
               |ГДЕ
               |	НЕ Номенклатура.ЭтоГруппа
               |
               |УПОРЯДОЧИТЬ ПО
               |	Номенклатура.Наименование"; 
РезультатЗапроса = Запрос.Выполнить().Выбрать();

Пока РезультатЗапроса.Следующий() Цикл 
     Элемент = РезультатЗапроса.Ссылка.ПолучитьОбъект();
     МассивСсылок = Новый Массив;
     МассивСсылок.Добавить(РезультатЗапроса.Ссылка);
     ТабСсылок = НайтиПоСсылкам(МассивСсылок);
	 Если ТабСсылок.Количество() >0 тогда
		  Сч=ТабСсылок.Количество() - 1;
		  Пока Сч>=0 Цикл
                ДРегистры=ТабСсылок.Получить(Сч).Метаданные.Синоним;
				Если (ДРегистры="Установка цен номенклатуры") 
					или (ДРегистры="Группы значений доступа") 
					или (ДРегистры="(не используется) Группы значений доступа") Тогда 
					Сч=Сч-1;
				Иначе
					Прервать;
				КонецЕсли;
				Если Сч=0 Тогда	
					Элемент.ПометкаУдаления = Истина;
					Элемент.Записать();
				КонецЕсли;
		  КонецЦикла;
     Иначе 
			Элемент.ПометкаУдаления = Истина; 
		    Элемент.Записать();
	 КонецЕсли;
КонецЦикла;
	
КонецПроцедуры
Показать
23. dj_serega 391 23.01.15 09:24 Сейчас в теме
(18) LastSoldier, так как я любитель модульного программирования то вынес бы пометку на удаление в отдельную процедуру. Передавая туда ссылку на объект:
Процедура ВыполнитьПометкуУдаления(ЭлементПометкиУдаления)
            ЭлементПометкиУдаленияОбъект = ЭлементПометкиУдаления.ПолучитьОбъект();
            ЭлементПометкиУдаленияОбъект.УстановитьПометкуУдаления(Истина); 
            ЭлементПометкиУдаленияОбъект.Записать();
КонецПроцедуры

- это раз.
Второе:
"ПометкаУдаления = Истина" я бы заменил на "УстановитьПометкуУдаления(Истина)" (как и написал выше).
24. LastSoldier 255 23.01.15 15:46 Сейчас в теме
(23) dj_serega, а скажите, чем это лучше, вынести в отдельный модуль и "ПометкаУдаления = Истина" я бы заменил на "УстановитьПометкуУдаления(Истина)"???
Это ускоряет работу обработки или чем оно помогает?
Мне как начинающему, это не понят. Поясните пожалуйста в кратце
А можно как-то эту часть ускорить?
ТабСсылок = НайтиПоСсылкам(МассивСсылок);

очень тут долго обрабатываются данные
25. caponid 23.01.15 16:31 Сейчас в теме
(24) LastSoldier, так писал уже в (21) - отрабатывай пакетом

	Пока РезультатЗапроса.Следующий() Цикл 
		
		МассивСсылок = Новый Массив;
		МассивСсылок.Добавить(РезультатЗапроса.Ссылка);
		Элементов = 1;
		Пока РезультатЗапроса.Следующий() Цикл
			Элементов = Элементов + 1
			МассивСсылок.Добавить(РезультатЗапроса.Ссылка);
			Если Элементов = 999 Тогда
				Прервать;
			КонецЕсли; 
		КонецЦикла; 
		ТабСсылок = НайтиПоСсылкам(МассивСсылок);
		
		// обрабатывай ТЗ ТабСсылок
		
	КонецЦикла;	
Показать


НайтиПоСсылкам(МассивСсылок) для 1000 ссылок будет работать по времени как для 1й
26. LastSoldier 255 23.01.15 17:24 Сейчас в теме
(25) caponid, я сегодня если успею или завтра попробую этот вариант и обязательно Вам отпишусь, не пропадайте далеко )
Я просто подумал может еще кто что-то подскажет
29. LastSoldier 255 24.01.15 13:19 Сейчас в теме
(25) caponid, а подскажи, как теперь надо двигаться по массиву.
Я вот сделал "Для каждого Элем ИЗ МассивСсылок цикл", а как должен выглядеть второй цикл который будет двигать только по ссылкам этого элемента?
Пока еще сам не понял
30. LastSoldier 255 26.01.15 10:09 Сейчас в теме
(25) caponid, а как в цикле это теперь все отрабатывать? пока ничего не получается. Мне же тут надо одним циклом обходить элементы, а другим ссылки на эти элементы. Вот как сделать эти циклы так и не пойму, двигаться по элемента еще понятно "Для каждого Элем ИЗ МассивСсылок цикл", а как теперь двигаться по ссылкам этого элемента и как указывать ссылки для следующего элемента?
27. dj_serega 391 23.01.15 20:49 Сейчас в теме
(24) LastSoldier,
1. Если какой-то код используется 2 раза, то его, логично вынести в отдельную процедуру/функцию. И если нужно будет "допилять" 1 строку, то её нужно будет "допиливать" в одном месте (а не 2х, 3х, и тд).
Согласен что для одной обработки это не актуально, но выработав привычку так писать, будет проще в будущем :)
К примеру если нужно во всех формах объектаов (их 150), ПриСозданииНаСервере, установить ТолькоПросмотр если нет роли Бухгалтер. Можно написать "ТолькоПросмотр = Не РольДоступна("Бухгалтер")". А если нужно потом добавить првоерку на "ПолныеПрава"? Придется менять все объекты, а если вызывать общую процедуру то придется менять только в одном месте :)

2. У "Пометка = Истина" и "УстановитьПометкуУдаления()" разницы между собой практически нет. И в первом и во втором случае выполняется пометка на удаление. Какая же между ними разница почитайте в СП :)
LastSoldier; +1 Ответить
28. LastSoldier 255 23.01.15 23:10 Сейчас в теме
(27) dj_serega, 1 Я Вас понял, действительно в дальнейшем мне это очень поможет, Спасибо
2 Прочитал, прочитал, очень полезно )
(25) caponid, Это получится намного лучше обрабатывать сразу кучу товара. А скажите, сколько строк можно загонять в массив чтобы все работало корректно?
1000 товара и всех их ссылки, это будет не многовато?
19. LastSoldier 255 22.01.15 16:20 Сейчас в теме
обработка работала несколько часов и всего проверила примерно пару тысяч только, можно как-то ускорить ее работу?
20. caponid 22.01.15 17:27 Сейчас в теме
ну, для оптимизации ПолучитьОбъект() делай когда он реально нужен, а не для каждого элемента - процентов 20 прибавит в скорости...

и по хорошему надо чистить записи регистров которые пропускаешь - или сделать потом ТИИ с очисткой ссылок не найденных объектов..
21. caponid 22.01.15 17:37 Сейчас в теме
МассивСсылок = Новый Массив;
     МассивСсылок.Добавить(РезультатЗапроса.Ссылка);
     ТабСсылок = НайтиПоСсылкам(МассивСсылок);


можно еще добавить - обрабатывать не по 1й ссылке, а пакетом по допустим по 1000 ссылок - время работы функции НайтиПоСсылкам увеличется незначительно, но сразу отработает 1000 ссылок.

можно замерить скорость поиска 1й ссылки и 1000 - думаю там будут расхождения в 10ки секунд всего
22. LastSoldier 255 22.01.15 18:28 Сейчас в теме
Спасибо за советы, буду пробовать, о результатах отпишусь, если будут какие еще идеи подкинь начинающему плиз )
31. caponid 26.01.15 10:58 Сейчас в теме
Учитесь работать не записями, а наборами - сначала будет трудно, потом пройдет :).

Есть 2 набора - МассивСсылок и ТабСсылок

1. Надо удалить все элементы на которые нет ссылок - т.е свернуть ТабСсылок по 1му полю и сравнить с МассивСсылок - нужно выбрать все элементы с МассивСсылок которые не входят в ТабСсылок.
Сравнение есть на форуме http://forum.infostart.ru/forum86/topic118274/message1240216/#message1240216

2. Исключения для отдельных регистров надеюсь сделали в НайтиПоСсылкам(<СписокСсылок>, <ОбластьПоиска>, <ВключитьОбъекты>, <ИсключитьОбъекты>) ?
32. LastSoldier 255 26.01.15 11:56 Сейчас в теме
(31) Это получается что нам надо взять 1 элемент из МассивСсылок, сравнить с элементами ТабСсылок и если есть ссылки, то записать эти данные в Таблицу3? ну а если нет ссылок, то сразу пометить на удаление.
А по второму <ИсключитьОбъекты> "Установка цен номенклатуры"
"Группы значений доступа")
"(не используется) Группы значений доступа"
Это и будут мои исключения?
36. LastSoldier 255 26.01.15 15:49 Сейчас в теме
(31) caponid, Вы имели ввиду это сделать?
	 МассивИскл = Новый Массив;
	 МассивИскл.Добавить("Установка цен номенклатуры");
	 МассивИскл.Добавить("Группы значений доступа");
	 МассивИскл.Добавить("(не используется) Группы значений доступа");
     ТабСсылок = НайтиПоСсылкам(МассивЭлементов,,,МассивИскл);

Но оно не работает, выдает ошибку
37. caponid 26.01.15 17:16 Сейчас в теме
(36) LastSoldier, в помощи же все написано
<ИсключитьОбъекты> (необязательный)

Тип: Массив.
В качестве элементов массива могут выступать:
Объект метаданных,
Строка – полное имя объекта метаданных.
Свойство позволяет явно указать объекты метаданных, которые следует исключить из области поиска ссылок на объекты.
Допустимые значения:
Неопределено
Пустой массив (нет объектов, которые необходимо дополнительно включить в область поиска).
Массив объектов метаданных.

т.е надо написать
МассивИскл = Новый Массив;
//если строкой
МассивИскл.Добавить("РегистрыСведений.ИсключаемыйРегистр");
МассивИскл.Добавить("Справочники.ИсключаемыйСправочник");
//или по метаданным
МассивИскл.Добавить(Метаданные.РегистрыСведений.Найти("ИсключаемыйРегистр");
...
Показать
38. LastSoldier 255 26.01.15 18:16 Сейчас в теме
(37) caponid, Чет все равно не работает
	 МассивИскл = Новый Массив;
	 МассивИскл.Добавить(Метаданные.Документы.Найти("УстановкаЦенНоменклатуры"));
	 МассивИскл.Добавить(Метаданные.РегистрыСведений.Найти("ГруппыЗначенийДоступа"));
	 МассивИскл.Добавить(Метаданные.РегистрыСведений.Найти("УдалитьГруппыЗначенийДоступа"));
     ТабСсылок = НайтиПоСсылкам(МассивЭлементов,,,МассивИскл);

Та же самая ошибка
{Форма.Форма.Форма(36)}: Ошибка при вызове метода контекста (НайтиПоСсылкам)
ТабСсылок = НайтиПоСсылкам(МассивЭлементов,,,МассивИскл);
по причине:
Несоответствие типов (параметр номер '4')
И так то же
        МассивИскл = Новый Массив;
	МассивИскл.Добавить("РегистрыСведений.ГруппыЗначенийДоступа");
	МассивИскл.Добавить("РегистрыСведений.УдалитьГруппыЗначенийДоступа");
	МассивИскл.Добавить("Документы.УстановкаЦенНоменклатуры");
        ТабСсылок = НайтиПоСсылкам(МассивЭлементов,,,МассивИскл);
39. caponid 26.01.15 19:14 Сейчас в теме
(38) LastSoldier,

Странно, что то не получается и у меня тоже.
Пробовал и метаданными, в включенных так и исключенных - ошибка в параметре 3 и 4

8.3.5.1383

Ошибка платформы?
Завтра попробую на другой.
40. LastSoldier 255 26.01.15 19:22 Сейчас в теме
(39) caponid, платформа у меня такая же.
А может просто пройти по массиву и удалить строки с ненужными регистрами? Если не получится как планировали
33. caponid 26.01.15 12:01 Сейчас в теме
и если есть ссылки, то записать эти данные в Таблицу3

если там есть ссылки, то зачем нам их куда-то записывать?
А по второму <ИсключитьОбъекты>
читаем встроенную помощь.
35. LastSoldier 255 26.01.15 14:52 Сейчас в теме
(33) caponid, А что мы вообще там собрались исключать НайтиПоСсылкам(МассивСсылок)? мы же должны пройти все элементы массива
Чет то что Вы описали пока сложно для меня
41. LastSoldier 255 27.01.15 14:30 Сейчас в теме
Вот сделал, для всей базы еще не проверял, но работает в сотню раз быстрее )

Процедура ВыполнитьИзменениеНаСервере()

Запрос = Новый Запрос; 
Запрос.Текст = "ВЫБРАТЬ
               |	Номенклатура.Ссылка
               |ИЗ
               |	Справочник.Номенклатура КАК Номенклатура
               |ГДЕ
               |	НЕ Номенклатура.ЭтоГруппа
               |
               |УПОРЯДОЧИТЬ ПО
               |	Номенклатура.Наименование"; 
РезультатЗапроса = Запрос.Выполнить().Выбрать();

Пока РезультатЗапроса.Следующий() Цикл
	 МассивЭлементов = Новый Массив;
     МассивЭлементов.Добавить(РезультатЗапроса.Ссылка);
	 Элементов=1;
	 Пока РезультатЗапроса.Следующий() Цикл
		 Элементов = Элементов + 1;
		 МассивЭлементов.Добавить(РезультатЗапроса.Ссылка);
		 Если Элементов = 500 Тогда
			 Элементов=1;
             Прервать;
		 КонецЕсли;
	 КонецЦикла;
     ТабСсылок = НайтиПоСсылкам(МассивЭлементов);
	 Если ТабСсылок.Количество() >0 тогда
		  Сч=ТабСсылок.Количество() - 1;
		  Пока Сч>=0 Цикл
				ДРегистры=ТабСсылок.Получить(Сч).Метаданные.Синоним;
				Если (ДРегистры="Установка цен номенклатуры") 
					или (ДРегистры="Группы значений доступа") 
					или (ДРегистры="(не используется) Группы значений доступа") Тогда
					ТабСсылок.Удалить(Сч);
					Сч=Сч-1;
				Иначе
					Сч=Сч-1;
				КонецЕсли;
			КонецЦикла;
	 КонецЕсли;
	 ТабСсылок.Свернуть("Ссылка");
	 СчМ=МассивЭлементов.Количество() - 1;
	 Пока СчМ>=0 Цикл
		 СтрокаСРМ=МассивЭлементов.Получить(СчМ).Наименование;
		 СчТ=ТабСсылок.Количество() - 1;
		 Пока СчТ>=0 Цикл
			 СтрокаСРТ=ТабСсылок.Получить(СчТ).Ссылка.Наименование;
			 Если СтрокаСРМ=СтрокаСРТ Тогда
				 Прервать;
			 Иначе
				 СчТ=СчТ-1;
			 КонецЕсли;
			 Если СчТ=-1 Тогда 
				 ВыполнитьПометкуУдаления(МассивЭлементов[СчМ].Ссылка);
			 КонецЕсли;
		 КонецЦикла;
		 СчМ=СчМ-1;
	 КонецЦикла; 
КонецЦикла;
	
КонецПроцедуры;
Показать
42. caponid 27.01.15 18:35 Сейчас в теме
Если Элементов = 500 Тогда
             Элементов=1;
             Прервать;
         КонецЕсли;

здесь Элементов=1 лишнее
43. LastSoldier 255 27.01.15 19:17 Сейчас в теме
(42) caponid, Сори, я понял свою ошибку, Спасибо
44. LastSoldier 255 28.01.15 13:06 Сейчас в теме
Все работает, уже удалил из базы более 10 000 тысяч товаров которые не используются. Всем огромное Спасибо, особенно "caponid"
45. LastSoldier 255 28.01.15 14:55 Сейчас в теме
Подскажите еще такую вещь, в чем разница и что лучше между
1)Удаление неиспользуемых элементов справочников
и
2)Удаление помеченных объектов.
Просто после того как я прошелся обработкой которая пометила 10к товара на удаление, я использовал первый метод (он намного быстрее), но он удалил не 10к товара, а 10 043, откуда еще взялись эти 43???
А "Удаление помеченных объектов" удаляет 10к, ну оччччеееень долго.
46. caponid 28.01.15 15:25 Сейчас в теме
Можно было все на самом деле сделать гораздо проще)) - есть стандартная процедура УдалитьОбъекты()
	//МассивСсылок.Добавить(Выборка.Ссылка);
	//массив ссылок на удаление

	НайденныеДанные = Новый ТаблицаЗначений; // вернет тз того, что не смог удалить
	ОбластьПоиска = Новый Массив; // пустой массив - так нужно:)
	ИсключитьОбъекты = Новый Массив;  // по этим объектам проверки на ссылочную целостность не будет
	ИсключитьОбъекты.Добавить(Метаданные.РегистрыСведений.РегистрЧегоТоТам);
	
	УстановитьМонопольныйРежим(Истина);
	УдалитьОбъекты(МассивСсылок, Истина, НайденныеДанные, ОбластьПоиска, , ИсключитьОбъекты); 
	УстановитьМонопольныйРежим(Ложь);
Показать
47. caponid 28.01.15 15:27 Сейчас в теме
я использовал первый метод (он намного быстрее)

так он удаляет не только номенклатуру
48. LastSoldier 255 28.01.15 16:00 Сейчас в теме
(47) caponid, ну я просто поставил галочку только у номенклатуры, поэтому у меня и возник такой вопрос ).
А ссылки эти ДРегистры="Группы значений доступа")
ДРегистры="(не используется) Группы значений доступа")
то же удалятся следом за номенклатурой?
(46) caponid, Не все так просто, я не могу их сразу удалить, так как они есть в "установке цен" "Если (ДРегистры="Установка цен номенклатуры")". Я их сначала пометил на удаление, потом другой обработкой прошелся по документам "установке цен", удалил их оттуда, перезаписал документы, а вот только после их можно удалять. Если бы их не было в "установке цен", тогда я с Вами был бы согласен чтобы удалить их сразу
49. caponid 28.01.15 16:28 Сейчас в теме
(48) LastSoldier, то что вносишь в исключения - на ссылочный контроль не проверяется - в тех объектах будет вместо этой номенклатуры <Объект не найден>
50. LastSoldier 255 29.01.15 08:43 Сейчас в теме
(49) caponid, а они разве не будут удаляться вместе с номенклатурой? зачем пустые ссылки в базе. Или их из базы потом еще самому удалять надо будет?
51. dj_serega 391 29.01.15 08:58 Сейчас в теме
(50) LastSoldier,
а они разве не будут удаляться вместе с номенклатурой?

нет конечно.
зачем пустые ссылки в базе.

А кто сказал что "объект не найден" это пустая ссылка? Там как раз все есть. Но оно немного испорчено. Почитайте в тырнете про объект не найден. Поймете.
Или их из базы потом еще самому удалять надо будет?

И это делать не просто. Нужно перебирать все объекты. Смотреть в каждый: он битый или нет.
Тут есть несколько вариантов проверки. Но в любом случае такого лучше не допускать.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот