Забыл сказать, что 1с7.7+sql2000 на win2k3 R2 SE x64
Захожу с клиентского компа.
Условие в запросе не соответствует условию в цикле. Перепиши его так же, как и в программе.
Спасибо, всё заработало!
Учитывая что 7.7 выполняет запросы на клиенте можешь попробовать вынести условие в функцию (посмотри как отразится на скорости):
...
|Условие (ПроверитьСпр(Спр)=1);
...
Функция ПроверитьСпр(Спр)
Если Спр.Вид()="Перемещение" Тогда
Если (ДокументыСклада.Документ.Склад <> ДокументыСклада.Владелец) Тогда
Если (ДокументыСклада.Документ.СкладПолучатель <> ДокументыСклада.Владелец) Тогда
Возврат 1;
...
КонецЕсли;
Возврат 0;
КонецФункции
С вынесенным в функцию условием чуть медленней, но в целом примерно так же.
В варианте проверки перебором также переделал условие (для удобства также вынес проверку в функцию), получилось так:
Функция ПроверитьДок(Док,Владелец)
Состояние("Инициализация интерфейса! Подождите окончания. Проверка документов склада за "+Док.ДатаДок);
Если Док.Вид()="Перемещение" Тогда
Если (Док.Склад <> Владелец) Тогда
Если (Док.СкладПолучатель <> Владелец) Тогда
Возврат 1;
КонецЕсли;
КонецЕсли;
ИначеЕсли Док.Склад <> Владелец Тогда
Возврат 1;
КонецЕсли;
Возврат 0;
КонецФункции // ПроверитьДок
...
СписокНаУдаление = СоздатьОбъект("СписокЗначений");
Элемент = СоздатьОбъект("Справочник.ДокументыСклада");
ДокументыСклада = СоздатьОбъект("Справочник.ДокументыСклада");
ДокументыСклада.ВыбратьЭлементы(0); // выбирать элементы без учета иерархии
Пока ДокументыСклада.ПолучитьЭлемент() = 1 Цикл
Если ПроверитьДок(ДокументыСклада.Документ,ДокументыСклада.Владелец) = 1 Тогда
СписокНаУдаление.ДобавитьЗначение(ДокументыСклада.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
Сообщить("На удаление:");
Для а = 1 По СписокНаУдаление.РазмерСписка() Цикл
Если Элемент.НайтиЭлемент(СписокНаУдаление.ПолучитьЗначение(а)) = 1 Тогда
Попытка
Сообщить(Элемент); // физическое удаление
Исключение
КонецПопытки;
КонецЕсли;
КонецЦикла;
работает 80-90 секунд
Вариант с запросом:
Функция ПроверитьДок(Док,Владелец)
Если Док.Вид()="Перемещение" Тогда
Если (Док.Склад <> Владелец) Тогда
Если (Док.СкладПолучатель <> Владелец) Тогда
Возврат 1;
КонецЕсли;
КонецЕсли;
ИначеЕсли Док.Склад <> Владелец Тогда
Возврат 1;
КонецЕсли;
КонецЕсли;
Возврат 0;
КонецФункции // ПроверитьДок
...
Элемент = СоздатьОбъект("Справочник.ДокументыСклада");
ТекстЗапроса = "
//{{ЗАПРОС(Сформировать)
|Спр = Справочник.ДокументыСклада.ТекущийЭлемент;
|Владелец = Справочник.ДокументыСклада.Владелец;
|Док = Справочник.ДокументыСклада.Документ;
|Условие (ПроверитьДок(Док,Владелец) = 1);
|Без Итогов;
|Группировка Спр Без Групп;
|";//}}ЗАПРОС
Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Пока Запрос.Группировка() = 1 Цикл
Если Элемент.НайтиЭлемент(Запрос.Спр) = 1 Тогда
Попытка
Сообщить(Элемент);
//Элемент.Удалить(1); // физическое удаление
Исключение
КонецПопытки;
КонецЕсли;
КонецЦикла;
Работает 110-150 (!) секунд.
Обычно запросом побыстрее, а тут вовсе даже наоборот, причём настолько!
Непонятно.