Имя: Пароль:
1C
1C 7.7
v7: Не могу удалить документ, Удалить(0)
0 america2013
 
14.01.14
15:23
Рад приветствовать Вас уважаемые!!! И с праздником! : )

Прошу о помощи, подскажите, почему не работает метод?

Имею таблицу значений, в которой перечислены номера документов, номера отсортированы, в таблице есть строки, где номера повторяются. Задача найти такие номера и по ним найти документ с таким номером, пометить на удаление.

Имею код:

        Для  Позиция = 2 По СписокИнициаторов.КоличествоСтрок() Цикл
            
            СписокИнициаторов.ПолучитьСтрокуПоНомеру(Позиция-1);
            Номер1 = СписокИнициаторов.Инициатор;
            СписокИнициаторов.ПолучитьСтрокуПоНомеру(Позиция);
            Номер2 = СписокИнициаторов.Инициатор;
            
            //Сообщить(Номер1);
            //Сообщить(Номер2);
            
            Если Номер1 = Номер2 Тогда
                Сообщить("Номер совпадает!!!    " + Номер1);
                
                ДокДляУдаления.НайтиПоНомеру(Номер1, НачДата);
                                          
                Если ДокДляУдаления.Выбран() = 1 Тогда
                    
                    УдалитьДок = ДокДляУдаления.ТекущийДокумент();
                    
                    Сообщить("Удаляется...");
                    УдалитьДок.Удалить(0);
                    
                КонецЕсли;
                
                
            КонецЕсли;
            
            Прогрессор("Процесс выполнения",КолДок,Позиция);
        КонецЦикла;



При выполнении ошибка:

УдалитьДок.Удалить(0);
{..........ВЫБОРКИ.ERT(291)}: Не выбран документ!

Разве документ не выбран? Он ведь переходит на эту строку после выполнения условия.
1 Ёпрст
 
14.01.14
15:26
(0)

              //ДокДляУдаления.НайтиПоНомеру(Номер1, НачДата);
              //                            
              //  Если ДокДляУдаления.Выбран() = 1 Тогда
              //      
              //      УдалитьДок = ДокДляУдаления.ТекущийДокумент();
              //      
              //      Сообщить("Удаляется...");
              //      УдалитьДок.Удалить(0);
              //      
              //  КонецЕсли;

             Если ДокДляУдаления.НайтиПоНомеру(Номер1, НачДата)=1 Тогда
                    Сообщить("Удаляется...");
                    ДокДляУдаления.Удалить(0);
             КонецЕсли;
2 mdocs
 
14.01.14
15:29
Док=СоздатьОбъект("Документ");
Док.НайтиДокумент(УдалитьДок);
Док.Удалить(0);
3 america2013
 
14.01.14
15:29
Ошибки не выдает, но и отметку удаления не ставит...
4 Ёпрст
 
14.01.14
15:33
(3) значит не находит документов
5 america2013
 
14.01.14
15:36
(4)                Если ДокДляУдаления.НайтиПоНомеру(Номер1, НачДата) = 1 Тогда;
                                          
                    Сообщить("Удаляется..." + ДокДляУдаления.НомерДок);
                    ДокДляУдаления.Удалить(0);
                    
                КонецЕсли;

Сообщить("Удаляется..." + ДокДляУдаления.НомерДок);  - выводится номер документа... я так понимаю, найденного?
6 dedmoroz777
 
14.01.14
15:39
(5) А "НачДата" это что у тебя?
7 america2013
 
14.01.14
15:40
(6) реквизит на форме, тип "Дата", в процессе присваивается некоторой датой.
8 Ёпрст
 
14.01.14
15:42
(5) вот после Тогда ставит оператор ;  не надо, если че..
9 america2013
 
14.01.14
15:43
(8) это опечатка была, извините : )
10 Ёпрст
 
14.01.14
15:43
А так, видать код еще в транзакции, в незакрытой, да ?
11 america2013
 
14.01.14
15:45
(10) поясните пожалуйста, как это - в транзакции?
12 america2013
 
14.01.14
15:47
Код в обработке, обработка запускается пользователем, база файловая.
13 Ёпрст
 
14.01.14
15:48
Это значит, что в коде есть НачатьТранзакцию() и нету ЗавершитьТранзакцию()
14 Ёпрст
 
14.01.14
15:48
точнее, ЗафиксироватьТранзакцию
15 america2013
 
14.01.14
15:48
Нет, такой конструкции в коде нет, а нужно?
16 Ёпрст
 
14.01.14
15:49
Тогда, как проверяешь, что документ не пометился на удаление ?
17 ЧеловекДуши
 
14.01.14
15:50
(0) Он же написал, документ не выбран, следовательно вы пытаетесь удалять не сам Объект, а его ссылку.
У ссылки нет такой возможности, как удалить :)
18 ЧеловекДуши
 
14.01.14
15:51
(15) Не стоит, в вашем случаи, лучше не стоит :)
19 america2013
 
14.01.14
15:51
(16) Так ведь захожу в журнал с документами и вижу, что он не проведен.

(17) И как выбрать документ?
20 Ёпрст
 
14.01.14
15:52
(19) супер!
Удалить(0), что по твоему делает ?
21 ЧеловекДуши
 
14.01.14
15:53
(19) Пиши так...

Док = СоздатьОбъект("Документ");
Док.НайтиДокумент(ТвойДокумент);

//Далее удаляешь... по коду из (0)
Док.Удалить(0);
22 dedmoroz777
 
14.01.14
15:54
(19) если в "Если" заходит, значит выбран. Может док не в том периоде? или, вообще, другой вид документа?
Напиши: Сообщить(ДокДляУдаления);
23 america2013
 
14.01.14
15:55
(20) Увидел из справки параметр: <Режим> -: 1 - непосредственное удаление, 0 - пометка на удаление (необязателен, по умолчанию - 1).
24 america2013
 
14.01.14
15:56
(22) У  меня в (5) так и сообщает.
25 dedmoroz777
 
14.01.14
15:58
(24) нет, не так
26 america2013
 
14.01.14
15:58
С начала у меня идет:

    ДокДляУдаления = СоздатьОбъект("Документ.СчетФактураПоставщика");

только потом:

                Если ДокДляУдаления.НайтиПоНомеру(Номер1, НачДата) = 1 Тогда
                                          
                    Сообщить("Удаляется..." + ДокДляУдаления.НомерДок);
                    ДокДляУдаления.Удалить(0);
                    
                КонецЕсли;
27 ЧеловекДуши
 
14.01.14
15:58
(24) Сообщает, что?
Что, что-то удалилось, а ты покажи, что именно ты удалял :)
К примеру допиши в сообщить:

глПредставлениеДокумента(ТвойДокумент);
28 dedmoroz777
 
14.01.14
15:59
Сообщить("Удаляется..." + ДокДляУдаления);
Что пишет?
29 ЧеловекДуши
 
14.01.14
16:00
(26) А зачем тебе искать документ по номеру?
Да еще с начала, какой либо Даты, до конца журнала :)
30 america2013
 
14.01.14
16:01
Сообщить("Удаляется..." + ДокДляУдаления);


Удаляется...Счет-фактура полученный А140004116 (10.05.13)

------------------------

Сообщить("Удаляется..." + глПредставлениеДокумента(ДокДляУдаления));


Удаляется...<...>
31 america2013
 
14.01.14
16:04
(29) Есть список документов с определенными номерами, которые повторяются, один надо удалить.
32 dedmoroz777
 
14.01.14
16:08
(31) Значит у тебя несколько одинаковых документов. Один из которых и удаляется. Поищи повнимательней
33 america2013
 
14.01.14
16:10
(31) Да, документов оказалось несколько, увидел это в журнале поиском по номеру, но ни один не помечен на удаление.
34 dedmoroz777
 
14.01.14
16:12
а если так?
Сообщить("Удаляется..." + ДокДляУдаления);
сообщить(ДокДляУдаления.ПометкаУдаления());
35 america2013
 
15.01.14
07:33
(34) Номер совпадает!!!    А140004116
Удаляется...
Дата документа: 10.05.13
Пометка удаления: 1

Вы были правы. Таких документов несколько. Один из них находится в 05 месяце. А так как я смотрел в журнале период 07 месяц, поэтому и не нашел(((

Когда я писал в коде:

ДокДляУдаления.НайтиПоНомеру(Номер1, НАЧДАТА)

то был уверен, что найдет именно в этом диапазоне, ведь:

<Дата> - дата из диапазона, в котором нужно искать документ.

а у меня:

НАЧДАТА = 27.07.13

Но как мне найти и удалить документ, зная его номер, в конкретном периоде (в 07 месяце, а не в 05) ?
36 ЧеловекДуши
 
15.01.14
07:44
(31) А ты в курсе, что по твоему Алгоритму всегда удалится первый документ :)

Т.е. их у тебя несколько...
Документ № 1 от 10.01.14
Документ № 1 от 20.01.14
Документ № 1 от 22.01.14

У тебя их несколько, но когда ты ищешь документ по номеру, то ты всегда будешь находить только первый..

Для решения этой задачи, тебе сперва нужно Получить некий Список Значений, где бы содержались ссылки на нужные тебе документы, и Желательно только дубли :)

А дальше, попросту перебираешь свой список и по ссылке удаляешь нужный (лишний) документ :)
37 ЧеловекДуши
 
15.01.14
07:45
(34) Да он всегда удаляет только первый документ, а тупо смотри на последний :)
И считает, что 1С это колдовство :)
38 ЧеловекДуши
 
15.01.14
07:46
(35) Запросом получить список всех этих документов с этим номером :)
39 ЧеловекДуши
 
15.01.14
07:47
40 ЧеловекДуши
 
15.01.14
07:51
Основываясь на этой обработке, можешь посмотреть код, как нужно искать дубли :)

http://infostart.ru/public/14948/
41 ЧеловекДуши
 
15.01.14
07:51
+ Инфо деньги можно получить за флуд на форуме ;)
42 ЧеловекДуши
 
15.01.14
07:52
43 america2013
 
15.01.14
08:56
Благодарю за крайне исчерпывающую информацию!!!!

У меня получился такой вариант:

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

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

    ТЗ.Свернуть("Номер, Дата", "Кол");
    ТЗ.Сортировать("Дата,Номер");
    
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку() = 1 Цикл
        Если (ТЗ.Кол>1) Тогда
            Сообщить("Док. Номер: "+ТЗ.Номер + ", Дата: " + ТЗ.Дата);
            Сообщить("Удаляется..." + ЧтоТоДелатьСДокументом(ТЗ.Номер, ТЗ.Дата));
            Сообщить("------------------------------------------------------------------------");
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
44 ЧеловекДуши
 
15.01.14
09:02
(43) Если у тебя за период не набирается до 1 000 000 документов, то пойдет и так :)
В конечном итоге, все дело во времени и в ресурсах системы, планку 2 Гб для приложения 1С 7.7 еще никто не отменял :)
45 ЧеловекДуши
 
15.01.14
09:04
+(43) Строка... "Сообщить("Удаляется..." + ЧтоТоДелатьСДокументом(ТЗ.Номер, ТЗ.Дата));"

Это случаем не то, что я подумал?
Ты все еще тупо пытаешься удалять документы по принципу из (0)?
Так нечего и не понял? "жаль" :)
46 ЧеловекДуши
 
15.01.14
09:06
+(43) Если у тебя документ с одним и тем же номером может и в одном дне быть, то твой алгоритм не взлетит :)
47 dedmoroz777
 
15.01.14
09:12
(46) тогда это документ другого поставщика
48 ЧеловекДуши
 
15.01.14
09:12
+(43) Вот, держи, от сердца отрываю, код по ссылке из (40)...


//По найденным ошибкам обращаться:
//[email protected]
//© Вадимко, 2007

Процедура Сформировать()
    Запрос = СоздатьОбъект("ODBCRecordSet");
    
    СчТр = 0;
    НачатьТранзакцию();
    
    Для Сч = 1 to Метаданные.Документ() Цикл
                
        ВидДока            = Метаданные.Документ(Сч).Идентификатор;
        Периодичность    = Метаданные.Документ(Сч).ПериодичностьНомера;
        Если Периодичность = "Все" Тогда
            СтрокаГруппировки = "GROUP BY DOCNO, IDDOCDEF";
            СтрокаВыборки        = "SELECT DOCNO НомерДок, Count(*) Колво";
            СтрокаПеребора        = "";
        ИначеЕсли Периодичность = "Год" Тогда    
            СтрокаГруппировки    = "GROUP BY DOCNO, Left(Date_Time_IDDOC,4), IDDOCDEF";
            СтрокаВыборки        = "SELECT DOCNO НомерДок, LEFT(Date_Time_IDDOC,4) ДатаДок, Count(*) Колво";
            СтрокаПеребора        = " AND LEFT(Date_Time_IDDOC,4) = :ДатаДок";
        ИначеЕсли Периодичность = "Месяц" Тогда    
            СтрокаГруппировки = "GROUP BY DOCNO, Left(Date_Time_IDDOC,6), IDDOCDEF";
            СтрокаВыборки        = "SELECT DOCNO НомерДок, LEFT(Date_Time_IDDOC,6) ДатаДок, Count(*) Колво";
            СтрокаПеребора        = " AND LEFT(Date_Time_IDDOC,6) = :ДатаДок";
        ИначеЕсли Периодичность = "День" Тогда    
            СтрокаГруппировки = "GROUP BY DOCNO, Left(Date_Time_IDDOC,8), IDDOCDEF";
            СтрокаВыборки        = "SELECT DOCNO НомерДок, LEFT(Date_Time_IDDOC,8) ДатаДок, Count(*) Колво";
            СтрокаПеребора        = " AND LEFT(Date_Time_IDDOC,8) = :ДатаДок";
        Иначе
            Сообщить("Неизвестная периодичность, вид " + ВидДока + " пропущен, извините :)", "!");
        КонецЕсли;    
        
        Состояние("Документ: " + ВидДока);
        
        ТекстЗапроса = СтрокаВыборки + " FROM _1SJOURN (NoLock) ";
        ТекстЗапроса = ТекстЗапроса + СтрокаГруппировки;
        ТекстЗапроса = ТекстЗапроса + "
        |HAVING Count(*) > 1 AND
        |IDDOCDEF = $ВидДокумента." + ВидДока + "
        |";
        
        ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
        
        Если ТЗ.КоличествоСтрок() = 0 Тогда
            Сообщить("Все в порядке с документами, номера уникальные :)");
            Возврат;
        КонецЕсли;    
                
        ТЗ.ВыбратьСтроки();
        Пока ТЗ.ПолучитьСтроку() = 1 Цикл
            
            КолвоДоков = ТЗ.Колво - 1;    
            
            ТекстЗапроса = "
            |SELECT TOP " + КолвоДоков + " IDDOC [Документ $Документ." + ВидДока + "]
            |FROM _1SJOURN (NoLock)
            |WHERE DOCNO = :НомерДок
            |";
            
            ТекстЗапроса = ТекстЗапроса + СтрокаПеребора;
            
            Запрос.УстановитьТекстовыйПараметр("НомерДок",    ТЗ.НомерДок);
            Запрос.УстановитьТекстовыйПараметр("ДатаДок",    ТЗ.ДатаДок);
            
            ТЗДок = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);    
                        
            ТЗДок.ВыбратьСтроки();
            Пока ТЗДок.ПолучитьСтроку() = 1 Цикл
                
                ТекДок = ТЗДок.Документ;
                
                Док = СоздатьОбъект("Документ." + ВидДока);
                Док.Новый();
                Док.ДатаДок    = ТекДок.ДатаДок;
                //Док.УстановитьНовыйНомер(СокрЛП(Константа.ПрефиксИБ) + СокрЛП(ТекДок.ЮрЛицо.ПрефиксНомеровДокументов));
                Док.УстановитьНовыйНомер();
                
                НовыйНомер = Док.НомерДок;
                
                Док.НайтиДокумент(ТекДок);
                
                //УДаить Этот документ!!!
                Док.Удалить(0); //<Режим> -: 1 - непосредственное удаление, 0 - пометка на удаление (необязателен, по умолчанию - 1).
                
                СчТр = СчТр + 1;
                Если СчТр % 100 = 0 Тогда
                    ЗафиксироватьТранзакцию();
                    НачатьТранзакцию();
                КонецЕсли;    
                
                Сообщить("Документу КЕРДЫК!!! " + ТекДок + " вместо номера " + СтарыйНомер + " назначен новый номер " + НовыйНомер);
            КонецЦикла;
            
        КонецЦикла;    
    КонецЦикла;
    
    ЗафиксироватьТранзакцию();
КонецПроцедуры


ЗагрузитьВнешнююКомпоненту("1cpp.dll");
49 ЧеловекДуши
 
15.01.14
09:13
(47) Мне все ровно... лучше все же через прямые запросы :)
50 ЧеловекДуши
 
15.01.14
09:15
+(48) Строчку... за комментируй...
Вот эту...

//Док.УстановитьНовыйНомер();
НовыйНомер = Док.НомерДок;
51 ЧеловекДуши
 
15.01.14
09:18
+(50) Да и в сущности создание нового документа тоже :)

Вот так лучше будет...


//По найденным ошибкам обращаться:
//[email protected]
//© Вадимко, 2007

Процедура Сформировать()
    Запрос = СоздатьОбъект("ODBCRecordSet");
    
    Док = СоздатьОбъект("Документ");
    
    СчТр = 0;
    //НачатьТранзакцию();
    
    Для Сч = 1 to Метаданные.Документ() Цикл
                
        ВидДока            = Метаданные.Документ(Сч).Идентификатор;
        Периодичность    = Метаданные.Документ(Сч).ПериодичностьНомера;
        Если Периодичность = "Все" Тогда
            СтрокаГруппировки = "GROUP BY DOCNO, IDDOCDEF";
            СтрокаВыборки        = "SELECT DOCNO НомерДок, Count(*) Колво";
            СтрокаПеребора        = "";
        ИначеЕсли Периодичность = "Год" Тогда    
            СтрокаГруппировки    = "GROUP BY DOCNO, Left(Date_Time_IDDOC,4), IDDOCDEF";
            СтрокаВыборки        = "SELECT DOCNO НомерДок, LEFT(Date_Time_IDDOC,4) ДатаДок, Count(*) Колво";
            СтрокаПеребора        = " AND LEFT(Date_Time_IDDOC,4) = :ДатаДок";
        ИначеЕсли Периодичность = "Месяц" Тогда    
            СтрокаГруппировки = "GROUP BY DOCNO, Left(Date_Time_IDDOC,6), IDDOCDEF";
            СтрокаВыборки        = "SELECT DOCNO НомерДок, LEFT(Date_Time_IDDOC,6) ДатаДок, Count(*) Колво";
            СтрокаПеребора        = " AND LEFT(Date_Time_IDDOC,6) = :ДатаДок";
        ИначеЕсли Периодичность = "День" Тогда    
            СтрокаГруппировки = "GROUP BY DOCNO, Left(Date_Time_IDDOC,8), IDDOCDEF";
            СтрокаВыборки        = "SELECT DOCNO НомерДок, LEFT(Date_Time_IDDOC,8) ДатаДок, Count(*) Колво";
            СтрокаПеребора        = " AND LEFT(Date_Time_IDDOC,8) = :ДатаДок";
        Иначе
            Сообщить("Неизвестная периодичность, вид " + ВидДока + " пропущен, извините :)", "!");
        КонецЕсли;    
        
        Состояние("Документ: " + ВидДока);
        
        ТекстЗапроса = СтрокаВыборки + " FROM _1SJOURN (NoLock) ";
        ТекстЗапроса = ТекстЗапроса + СтрокаГруппировки;
        ТекстЗапроса = ТекстЗапроса + "
        |HAVING Count(*) > 1 AND
        |IDDOCDEF = $ВидДокумента." + ВидДока + "
        |";
        
        ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
        
        Если ТЗ.КоличествоСтрок() = 0 Тогда
            Сообщить("Все в порядке с документами, номера уникальные :)");
            Возврат;
        КонецЕсли;    
                
        ТЗ.ВыбратьСтроки();
        Пока ТЗ.ПолучитьСтроку() = 1 Цикл
            
            КолвоДоков = ТЗ.Колво - 1;    
            
            ТекстЗапроса = "
            |SELECT TOP " + КолвоДоков + " IDDOC [Документ $Документ." + ВидДока + "]
            |FROM _1SJOURN (NoLock)
            |WHERE DOCNO = :НомерДок
            |";
            
            ТекстЗапроса = ТекстЗапроса + СтрокаПеребора;
            
            Запрос.УстановитьТекстовыйПараметр("НомерДок",    ТЗ.НомерДок);
            Запрос.УстановитьТекстовыйПараметр("ДатаДок",    ТЗ.ДатаДок);
            
            ТЗДок = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);    
                        
            ТЗДок.ВыбратьСтроки();
            Пока ТЗДок.ПолучитьСтроку() = 1 Цикл
                
                ТекДок = ТЗДок.Документ;
                
                Док.НайтиДокумент(ТекДок);
                
                //УДаить Этот документ!!!
                Док.Удалить(0); //<Режим> -: 1 - непосредственное удаление, 0 - пометка на удаление (необязателен, по умолчанию - 1).
                
                //СчТр = СчТр + 1;
                //Если СчТр % 100 = 0 Тогда
                //    ЗафиксироватьТранзакцию();
                //    НачатьТранзакцию();
                //КонецЕсли;    
                
                Сообщить("Документу КЕРДЫК!!!" + ТекДок);
            КонецЦикла;
            
        КонецЦикла;    
    КонецЦикла;
    
    //ЗафиксироватьТранзакцию();
КонецПроцедуры


ЗагрузитьВнешнююКомпоненту("1cpp.dll");
52 dedmoroz777
 
15.01.14
09:19
горшочек, не вари...