Имя: Пароль:
1C
1С v8
Получить список документов
0 Тиль
 
22.08.11
07:35
Парни такая проблемка:Хочу удалить документы из базы непосредственно по организации, написал такое:

   //выбираем документы по орагнизации
   Выборка=Документы.ПлатежноеПоручениеИсходящее.Выбрать() ;
   Пока Выборка.следующий() Цикл
       Если Выборка.Организация=ПолеВВода1 Тогда//находим документ по реквизиту Организация
           //проверяем проведен ли документ и если да помечаем на удаление, это удалит все движения по документу и удаляем его
           Если Выборка.Проведен тогда
           Док=Выборка.ПолучитьОбъект();
           Док.УстановитьПометкуУдаления(Истина);
           Док.Удалить();
           КонецЕсли;
           //Заканчиваем с пометкой удаления и собственно самим удалением
           //Сообщаем какой документ удален
                       
           Сообщить ("Удален Документ " +Выборка.Ссылка);
       
       КонецЕсли;
   КонецЦикла;

Но здесь только по одному документу. Как перебрать все документы в базе?
1 Азат
 
22.08.11
07:36
Для Каждого Док Из Метаданные["Документы"] Цикл
  Имя = Док.Имя;
  Выборка = Документы[Имя].Выбрать();
  бла-бла-бла

КонецЦикла;

ну как-то так, за точность не ручаюсь
2 Wobland
 
22.08.11
07:43
Выборка.Организация=ПолеВВода1 - как это?
3 Wobland
 
22.08.11
07:44
а непроведённые удалять не будем?
4 Amra
 
22.08.11
07:46
(0) Бугага, как думаешь что вернет в твоем случае Выборка.Ссылка в Сообщить?))
5 Тиль
 
22.08.11
07:51
(2)-Реквизит на форме обработки Тип-Мправочник.Организации. Мдя, щас непроведенные доделаю...
(4)-блин, ага, ступил признаю...в цикл воткну поряньше удаления:)
6 Wobland
 
22.08.11
07:53
(5) ЭлементыФормы.ПолеВвода1.Значение
7 Тиль
 
22.08.11
07:58
вот исправил

   Для каждого Документ из Метаданные ["Документы"] Цикл
   Док=Документ.Имя;    
       //выбираем документы по орагнизации
   Выборка=Документы[Док].Выбрать() ;
   Пока Выборка.следующий() Цикл
       Если Выборка.Организация=ПолеВВода1 Тогда//находим документ по реквизиту Организация
           Док=Выборка.ПолучитьОбъект();
           Док.УстановитьПометкуУдаления(Истина);
           Док.Удалить();
           
           //Заканчиваем с пометкой удаления и собственно самим удалением
   
       КонецЕсли;
       КонецЦикла;
   КонецЦикла;


(6)-пучему так? там тип то стооит ссылка везде, у меня и так нормально выбирает
8 Тиль
 
22.08.11
08:16
ап, нормально?
9 Wobland
 
22.08.11
08:19
а что скажет Выборка.Организация, если реквизита Организация у документа не будет?
10 Wobland
 
22.08.11
08:21
и не лучше ли обработкой пометить, а удаление помеченных стандартно сделать потом?
11 Тиль
 
22.08.11
08:22
(9)я так думаю, что этого не будет, ну проверку поставлю на наличие реквизита. Так то код нормальный?
12 Wobland
 
22.08.11
08:27
(11) да как-то юзать выборку вместо запроса некошерно. впрочем, если это разовая обработка, какая разница, нормальный код или нет. отработает себе и ладно ;)
13 Тиль
 
22.08.11
08:33
да, это разовая обработка
14 Wobland
 
22.08.11
08:36
а ещё есть групповая обработка документов, там вообще писать не надо
15 Тиль
 
22.08.11
08:44
да, есть но там не по организации выборка идет а в общем и ставится только пометка на удаление
16 Wobland
 
22.08.11
08:53
(15) да ну? отбирать по многим реквизитам можно. напрямую не удаляет, да, но, может, оно и не надо?
17 Тиль
 
22.08.11
08:54
надо, нам блин базу дали работать а там орагниизаций, котоорые с ней раньше работали куча, только без них объектов, помеченных на удаление больше 300 000
18 Тиль
 
22.08.11
10:52
а как поставить проверку на наличие этого реквизита в документе? например Документ Корректировка записей регистров этого реквизита не имеет
19 Reset
 
22.08.11
10:56
Имхо, базе абзац.
20 Wobland
 
22.08.11
10:57
цитирую ОбщегоНазначения.ЕстьРеквизитДокумента():
Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
21 Reset
 
22.08.11
10:58
(18) Документ.Реквизиты.Найти("Организация")
22 Aleksey
 
22.08.11
10:58
А не проще ле взять готовую обработку. Ведь там кроме документов есть куча справочников (например договора), куча Регистр Сведений?
23 Тиль
 
22.08.11
11:09
Для каждого Документ из Метаданные ["Документы"] Цикл
   Док=Документ.Имя;    
       //выбираем документы по орагнизации
   Выборка=Документы[Док].Выбрать() ;
   ДокументОбъект=Выборка.ПолучитьОбъект();
   МетаданныеДокумента=ДокументОбъект.Метаданные();
   Если МетаданныеДокумента.Реквизиты.Найти("Организация") <> Неопределено тогда
   Пока Выборка.следующий() Цикл
       Если Выборка.Организация=ПолеВВода1 Тогда//находим документ по реквизиту Организация
           Док=Выборка.ПолучитьОбъект();
           Док.УстановитьПометкуУдаления(Истина);
           Док.Удалить();
           
           //Заканчиваем с пометкой удаления и собственно самим удалением
   
       КонецЕсли;
       КонецЦикла;
       КонецЕсли;    
       КонецЦикла;

вот что получилось
24 Wobland
 
22.08.11
11:14
после Выборка=Документы[Док].Выбрать() надо Следующий() делать
25 Тиль
 
22.08.11
11:18
сделал...Значение не является значением объектного типа ПолучитьОбъект()
26 Wobland
 
22.08.11
11:19
(25) плохо сделал
27 Азат
 
22.08.11
11:19
пздц, из копеечной задачи запутали автора в трех соснах...
28 Тиль
 
22.08.11
11:25
(27) можешь подсказать как надо? в чем ошибка?
29 Тиль
 
22.08.11
11:48
Для каждого Документ из Метаданные ["Документы"] Цикл
ИМЯДок=Документ.Имя;
//выбираем документы по орагнизации
Выборка=Документы[ИМЯДок].Выбрать() ;
Если Документ.Реквизиты.Найти("Организация" <> Неопределено тогда
Пока Выборка.следующий() Цикл
Если Выборка.Организация=ПолеВВода1 Тогда//находим документ по реквизиту Организация
Док=Выборка.ПолучитьОбъект();
Док.УстановитьПометкуУдаления(Истина);
Док.Удалить();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;



вот так сделал..вроде нормально..прогоняется
30 Wobland
 
22.08.11
11:49
резервную копию сделал хоть?
31 Азат
 
22.08.11
11:50
Для каждого Документ из Метаданные ["Документы"] Цикл
  ИМЯДок=Документ.Имя;
  //выбираем документы по орагнизации

  Выборка=Документы[ИМЯДок].Выбрать() ;
  Пока Выборка.следующий() Цикл
      Попытка
         Орг = Выборка.Организация;
      Исключение
         Прервать;
      КонецПопытки;
      Если Выборка.Организация=ПолеВВода1 Тогда

          Док=Выборка.ПолучитьОбъект();
          Док.УстановитьПометкуУдаления(Истина);
          Док.Удалить();
       КонецЕсли;
  КонецЦикла;
КонецЦикла;
32 Reset
 
22.08.11
11:52
(31) Писец
Ты бы еще вместо проверки на 0 перед делением, само деление в попытку заключал
33 Reset
 
22.08.11
11:54
(31)
код в (29) на порядок грамотней, чем твой