Имя: Пароль:
1C
1C 7.7
v7: Как найти "кривой" документ
,
0 John83
 
11.01.13
08:33
Комплексная конфа 519 релиз
При проведении проведении документа формирования книги продаж, ругается
ДокПодч.ВыбратьПодчиненныеДокументы(,,ДокДляПроверки);
{Документ.КнигаПродаж.Модуль Документа(47)}: Не выбран документ!
Вроде бы идем в отладчик и смотрим, в чем проблема, но там документы перебираются в цикле

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

и нет волшебной галочки "остановка по ошибке", а сидеть и нажимать F8 неск. тыс. раз, как-то неохота...
Как тут проще поступить?
1 tdm
 
11.01.13
08:42
какая конкретно строка - КнигаПродаж.Модуль Документа(47) ?
2 John83
 
11.01.13
08:43
ой...
вот эта
НайденнаяСФ = ДокПодч.ТекущийДокумент();
3 PuhUfa
 
11.01.13
08:45
Сообщить()
4 John83
 
11.01.13
08:51
(3) эм.. что-то такое смутно припоминаю - может напоминшь? :)
5 John83
 
11.01.13
08:52
PS видать пора спать уже :)
вот модуль

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

и 47ая строка
ДокПодч.ВыбратьПодчиненныеДокументы(,,ДокДляПроверки);
6 evGenius
 
11.01.13
08:54
ДокДляПроверки где присваивается?
7 John83
 
11.01.13
08:56
вот вся функция

Функция ПроверкаСФДокумента(ДокДляПроверки,НайденнаяСФ)
                       
   Если (ДокДляПроверки.Вид() = "ОтчетККМ") Тогда
       НайденнаяСФ = ДокДляПроверки;
       Возврат 1;
   КонецЕсли;
   
   Если ДокДляПроверки.Вид() = "РеализацияРозница" Тогда
       Если ДокДляПроверки.ВидОперации = Перечисление.ВидыОперацийРеализацияРозница.ОтчетПоПродажам Тогда
           НайденнаяСФ = ДокДляПроверки;
           Возврат 1;
       КонецЕсли;        
   КонецЕсли;          
   
   Если ДокДляПроверки.Вид() = "ПКО" Тогда
       Если (ДокДляПроверки.КодОперации = глКО.РозничнаяВыручка) ИЛИ (ДокДляПроверки.КодОперации = глКО.РозничнаяВыручкаЗаПринятые)Тогда
           НайденнаяСФ = ДокДляПроверки;
           Возврат 1;
       КонецЕсли;        
   КонецЕсли;
   
   ДокПодч.ВыбратьПодчиненныеДокументы(,,ДокДляПроверки);
   Пока ДокПодч.ПолучитьДокумент()=1 Цикл
       Если ДокПодч.Вид()="СчетФактураВыданный" Тогда
           Если (ДокПодч.Проведен()=1) или (ДокПодч.ФлагСвертки=1) Тогда
               Если ДокПодч.АвтоКнигаПродаж = 1 Тогда
                   НайденнаяСФ = ДокПодч.ТекущийДокумент();
                   Возврат 1;
               Иначе    
                   Возврат 0;
               КонецЕсли;
           КонецЕсли;
           
       ИначеЕсли ДокПодч.Вид()="СчетФактураПолученный" Тогда
           Если (ДокПодч.Проведен()=1) или (ДокПодч.ФлагСвертки=1) Тогда
               Если ДокПодч.АвтоКнигаПокупок = 1 Тогда
                   НайденнаяСФ = ДокПодч.ТекущийДокумент();
                   Возврат 1;
               Иначе    
                   Возврат 0;
               КонецЕсли;
           КонецЕсли;
           
       КонецЕсли;
   КонецЦикла;  
   
   
   глСообщениеПроведения("На документ "+ДокДляПроверки+" не зарегистрирован счет - фактура!",ДокДляПроверки,, ТекущийДокумент(),1);
   Возврат 0;
   
КонецФункции // ПроверкаСФДокумента()
8 1Сергей
 
11.01.13
08:56
ДокДляПроверки чему равен?
9 evGenius
 
11.01.13
08:57
Так все-таки что же ты передаешь в эту функцию?
10 John83
 
11.01.13
08:58
(8) (9) туда реализации передаются
11 evGenius
 
11.01.13
08:59
(10) код покажи, там у тебя случайно не документ, созданный с помощью СоздатьОбъект()???
12 evGenius
 
11.01.13
08:59
а где
ДокПодч = СоздатьОбъект("Документ");
???
13 1Сергей
 
11.01.13
08:59
(10) с отладчиком знаком?
14 tdm
 
11.01.13
09:00
НайденнаяСФ - это просто переменная модуля или же реквизит документа ? может просто типы не совпадают...да и в 7-ке нет явной объектной модели (ссылка и объект) в эту сторону бы еще покопал...несколько лет конфигуратор 7-ки не открывал к счастью)))
15 1Сергей
 
11.01.13
09:00
(12) кстати +1
16 PuhUfa
 
11.01.13
09:03
(12)(15)
//////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ
//
Перем ДокПодч;
17 John83
 
11.01.13
09:04
(14) та же "проблема" :)
18 evGenius
 
11.01.13
09:05
А если переделать так? Заработает?
ДокПодч.ВыбратьПодчиненныеДокументы(,,ДокДляПроверки.ТекущийДокумент());
19 PuhUfa
 
11.01.13
09:05
+(16) там дальше еще веселее:
//////////////////////////////////////////////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
//
ДокПодч = СоздатьОбъект("Документ");
20 John83
 
11.01.13
09:07
(13) с 7чным давние знакомые
21 PuhUfa
 
11.01.13
09:09
(4)
Сообщить("Проверяем: "+ДокДляПроверки);
ДокПодч.ВыбратьПодчиненныеДокументы(,ДатаДок,ДокДляПроверки);

Дальше смотри из какого запроса ростут ноги так как во все проверки передаются данные запроса:
Если ПроверкаСФДокумента(Запрос.КредДокумент,НайденнаяСФ) = 0 Тогда
   Продолжить;
КонецЕсли;
22 1Сергей
 
11.01.13
09:11
(20) а чего не пользуешься?
23 John83
 
11.01.13
09:11
(21) вот запрос с последующим вызовом функции

   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Период с ДатаНачала "+ ПериодПо+";
   |ФирмаРег        = Регистр.Покупатели.Фирма;
   |ВидДолга        = Регистр.Покупатели.ВидДолга;
   |КредДокумент    = Регистр.Покупатели.КредДокумент;
   |ДокументОплаты = Регистр.Покупатели.ДокументОплаты;
   |ТекДокумент    = Регистр.Покупатели.ТекущийДокумент;
   |СуммаРуб        = Регистр.Покупатели.СуммаРуб;
   |КодОперации    = Регистр.Покупатели.КодОперации;
   |СтавкаНП        = Регистр.Покупатели.СтавкаНП;
   |Функция СуммаРубПриход = Приход(СуммаРуб);
   |Функция СуммаРубОтг    = Приход(СуммаРуб) Когда (КодОперации <> КодОперацииСуммоваяРазница);
   |Функция СуммаРубСР     = Приход(СуммаРуб) Когда (КодОперации =  КодОперацииСуммоваяРазница);
   |Группировка    КредДокумент;
   |Группировка    ВидДолга;
   |Группировка    СтавкаНП;
   |Условие    (ФирмаРег    = Фирма);
   |Условие    (КодОперации    в СписокНужныхКодов);
   |Условие    (ВидДолга        в СписокНужныхВидовДолга);
   |"//}}ЗАПРОС
   ;
   
   Если ФормироватьТолькоПоДокументамОтгрузки = 1 Тогда
       ТекстЗапроса = ТекстЗапроса + "Условие (ТекДокумент = КредДокумент);
   |";
   
   КонецЕсли;
   
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   
   НайденнаяСФ = "";            
   ТИКнигаПродаж = СоздатьОбъект("ТаблицаЗначений");
       
   Пока Запрос.Группировка("КредДокумент") = 1 Цикл
       Если ПроверкаСФДокумента(Запрос.КредДокумент,НайденнаяСФ) = 0 Тогда
           Продолжить;
       КонецЕсли;
24 John83
 
11.01.13
09:12
(22) пытаюсь...
25 John83
 
11.01.13
09:13
+24 рядом эта же база, но конвертированная на 8ку - параллельно сижу в ней, запросами смотрю
26 evGenius
 
11.01.13
09:17
(23) Хм, не заполнено измерение в регистре похоже, пустая ссылка на документ получается
27 Ёпрст
 
11.01.13
09:17
дык проверь регистр, где в КредДок пустая/битая ссылка, делов то.
28 Ёпрст
 
11.01.13
09:17
или воткни в функцию проверку на Выбран()..
29 PuhUfa
 
11.01.13
09:23
(23)
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
 Возврат;
КонецЕсли;
   
НайденнаяСФ = "";            
ТИКнигаПродаж = СоздатьОбъект("ТаблицаЗначений");

Тзапроса = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(Тзапроса);
Тзапроса.ВыбратьСтроку();

Смотришь таблицу результата запроса, анализируешь -)
30 John83
 
11.01.13
09:23
(26) так и оказалось
это выписка банка, только вот не пойму, почему кред. документ не заполняется
31 John83
 
11.01.13
09:24
(28) (29) сейчас уже поздновато - люди начали работать
32 PuhUfa
 
11.01.13
09:25
(31) мы на столько суровы, что делаем все на боевой базе? -)
33 John83
 
11.01.13
09:27
(32) ну а чего мелочиться?
и бэкапы придумал трусы :)
Основная теорема систематики: Новые системы плодят новые проблемы.