Имя: Пароль:
1C
1C 7.7
v7: Подчиненные документы
0 prog-Igor
 
19.12.13
01:15
Подскажите как правильно найти подчиненный документ
вот примерно:
    Док=СоздатьОбъект("Документ.НалоговаяНакладная");
  
   РН=СоздатьОбъект("Документ");                      
   Рн.ИспользоватьЖурнал("РасходныеНакладные");
   ТекСтрока=1;
        
    ТЗ.ВыбратьСтроки();  
    
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
    Если ТЗ.Отметка = 1 ТОгда  
        РН.НайтиДокумент(ТЗ.Документ);
          
        РН.ВыбратьПодчиненныеДокументы(,,Док);
     Пока Рн.Следующий() = 1 Цикл
         Если Док.Вид() = "НалоговаяНакладная" Тогда
             Возврат ;    
      
        КонецЕсли;    
    КонецЦикла;
1 Klesk666
 
19.12.13
01:27
рекурсия
2 Klesk666
 
19.12.13
01:32
ми обработку "дерево документов" или "структура подчиненности", точно не помню
3 Klesk666
 
19.12.13
01:32
ми=смотри
4 prog-Igor
 
19.12.13
01:52
сама суть обработки создает на основание РН - налоговые,я хочу чтобы перед созданием она проверяли есть ли уже для этой РН налоговая...
5 uno-group
 
19.12.13
02:13
Док.Выбратьподчиненыедокументы(,,РН.текущийдокумент)
6 1Сергей
 
19.12.13
07:42
Уже сколько одинесю, а всё нуб нубом. Что за функция "ИспользоватьЖурнал"?

PS Семерки под рукой нет
7 ЧеловекДуши
 
19.12.13
07:48
Вот так надо :)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Проведен: 1 - отберать по проведенным,
//            0 - не учитывать (если ""БезУдаленых = 0"", то отбераются все документы)
//БезУдаленых:  1 - отбераются не помеченные на удаления,
//                2 - отбираются только помеченные на удаления, 0 - не учитывать
//Параметры "Проведен" и "БезУдаленых", при не нулевом значении, отрабатывают совместно по принципу "ИЛИ".
//
//Порядок: 0 - Сортровать по возрастанию, 1 - Сортировать по Убыванию.
//
//ВремяДатаТайм: 0 - Отбирать документ, как Дату и время (ИД документа не учитывается)... 1 - Учитывается еще и ИД документа
Функция глВыбратьПодчиненныеДокументы(ДатаНач,ДатаКон,Док,ТипДок="",Проведен=0,БезУдаленых=0,Порядок=0,ВремяДатаТайм=1) Экспорт
    Перем Рез;
    Перем ТЗЗапрос, СкульЗапрос;
    Перем СтрокаДляЗапроса, НомСимв, КолСимв, СтрокПоиск,СтрокПолуч;
    Перем МетаНомер, ЧтоЭто;
    
    //Для локального применения
    //глRecord1С = СоздатьОбъект("ODBCRecordSet");
    //глMeta1С = СоздатьОбъект("MetaDataWork");
    
    Если ТипЗначенияСтр(глRecord1С) <> "ODBCRecordSet" Тогда
        глRecord1С = 0;
        глRecord1С = СоздатьОбъект("ODBCRecordSet");
    КонецЕсли;
    
    Если ТипЗначенияСтр(глMeta1С) <> "MetaDataWork" Тогда
        глMeta1С = 0;
        глMeta1С = СоздатьОбъект("MetaDataWork");
    КонецЕсли;
    
    Рез = 0; //Ошибка в запросе!
    Если ТипЗначения(Док) <> 12 Тогда //12 - агрегатный тип данных 'Документ';
        Возврат Рез;
    ИначеЕсли ПустоеЗначение(Док) = 1 Тогда
        Рез = СоздатьОбъект("ТаблицаЗначений");
        Рез.НоваяКолонка("Док","Документ");
        Возврат Рез;
    КонецЕсли;
    
    Если глОтладкаSQL = 1 Тогда
        глRecord1С.Отладка(1);
    КонецЕсли;
    
    СкульЗапрос="
    |SET NOCOUNT ON
    //|set LANGUAGE russian
    |
    |SELECT
    | dbo.sp_tohex(TabJ.IDDOCDEF,4)+TabJ.IDDOC [Док $Документ]
    |FROM
    | _1SCRDOC As TabRod(NOLOCK)
    |INNER JOIN
    | _1SJOURN As TabJ(NOLOCK) ON (TabRod.CHILDID = TabJ.IDDOC)
    |WHERE
    | TabRod.MDID = 0 -- только документы, без граф отбора
    | AND TabRod.PARENTVAL = '"+глMeta1С.ЗначениеВСамуюДлиннуюСтрокуБД(Док.ТекущийДокумент())+"'
    |";
    Если ПустоеЗначение(ДатаНач)=0 Тогда
        МетаНомер = "";
        Если ТипЗначения(ДатаНач) = 12 Тогда //Документ
            Если ВремяДатаТайм = 0 Тогда
                МетаНомер = ""+глMeta1С.ПолучитьДатуВремяИдДок(ДатаНач.ПолучитьПозицию());
            Иначе
                МетаНомер = ""+глMeta1С.ПолучитьДатуВремяИдДок(ДатаНач.ПолучитьПозицию())+глMeta1С.ЗначениеВСтрокуБД(ДатаНач.ТекущийДокумент());
            КонецЕсли;
        ИначеЕсли ТипЗначения(ДатаНач) = 3 Тогда //3 - тип данных Дата;
            МетаНомер = ""+глMeta1С.ПолучитьСтрИзДаты(ДатаНач);
        ИначеЕсли ПустоеЗначение(Дата(ДатаНач)) = 0 Тогда
            МетаНомер = ""+глMeta1С.ПолучитьСтрИзДаты(Дата(ДатаНач));
        КонецЕсли;
        Если ПустоеЗначение(МетаНомер) = 0 Тогда
               СкульЗапрос=СкульЗапрос+"
               |and TabJ.DATE_TIME_IDDOC>='"+МетаНомер+"'
            |";
        КонецЕсли;
    КонецЕсли;
    Если ПустоеЗначение(ДатаКон)=0 Тогда
        МетаНомер = "";
        Если ТипЗначения(ДатаКон) = 12 Тогда //Документ
            Если ВремяДатаТайм = 0 Тогда
                МетаНомер = ""+глMeta1С.ПолучитьДатуВремяИдДок(ДатаКон.ПолучитьПозицию())+"Z";
            Иначе
                МетаНомер = ""+глMeta1С.ПолучитьДатуВремяИдДок(ДатаКон.ПолучитьПозицию())+глMeta1С.ЗначениеВСтрокуБД(ДатаКон.ТекущийДокумент());
            КонецЕсли;
        ИначеЕсли ТипЗначения(ДатаНач) = 3 Тогда //3 - тип данных Дата;
            МетаНомер = ""+глMeta1С.ПолучитьСтрИзДаты(ДатаКон)+"Z";
        ИначеЕсли ПустоеЗначение(Дата(ДатаНач)) = 0 Тогда
            МетаНомер = ""+глMeta1С.ПолучитьСтрИзДаты(Дата(ДатаНач))+"Z";
        КонецЕсли;
        Если ПустоеЗначение(МетаНомер) = 0 Тогда
               СкульЗапрос=СкульЗапрос+"
               |and TabJ.DATE_TIME_IDDOC<='"+МетаНомер+"'
            |";
        КонецЕсли;
    КонецЕсли;
    Если ПустоеЗначение(СокрЛП(ТипДок)) = 0 Тогда
        СтрокПоиск = СокрЛП(ТипДок);
        КолСимв       = СтрЧислоВхождений(СтрокПоиск,",");
        Если КолСимв <> 0 Тогда
            КолСимв = КолСимв + 1;
            СтрокаДляЗапроса = "";
            Пока КолСимв <> 0 Цикл
                
                Если КолСимв = 1 Тогда //Он один
                    СтрокПолуч = СокрЛП(СтрокПоиск);
                Иначе
                    НомСимв       = Найти(СтрокПоиск,",");
                    Если НомСимв = 0 Тогда
                        Сообщить("Ошибка в разборе команды: "+ТипДок);
                    КонецЕсли;
                    СтрокПолуч = СокрЛП(Сред(СтрокПоиск,1,НомСимв-1));
                    СтрокПоиск = СокрЛП(Сред(СтрокПоиск,НомСимв+1));
                КонецЕсли;
                
                Если ПустоеЗначение(СтрокПолуч) = 0 Тогда
                    ЧтоЭто = ЭтоЧисло(СтрокПолуч);
                    Если СуществуетТакойВидДок(ЧтоЭто) = 1 Тогда
                        МетаНомер = глMeta1С.ИДДокумента(ЧтоЭто);
                        СтрокаДляЗапроса = СтрокаДляЗапроса + ?(ПустоеЗначение(СтрокаДляЗапроса)=1,"",",") + "'"+МетаНомер+"'";
                    КонецЕсли;
                КонецЕсли;
                
                КолСимв = КолСимв - 1;
            КонецЦикла;
            Если ПустоеЗначение(СтрокаДляЗапроса) = 0 Тогда
                СкульЗапрос=СкульЗапрос+"
                |and TabJ.IDDOCDEF in ("+СтрокаДляЗапроса+")
                |";  // '"+глMeta1С.ИДДокумента(ТипДок)+"'
            КонецЕсли;
        Иначе
            МетаНомер  = "";
            СтрокПолуч = СокрЛП(ТипДок);
            
            Если ПустоеЗначение(СтрокПолуч) = 0 Тогда
                ЧтоЭто = ЭтоЧисло(СтрокПолуч);
                Если СуществуетТакойВидДок(ЧтоЭто) = 1 Тогда
                    МетаНомер = глMeta1С.ИДДокумента(ЧтоЭто);
                    СтрокаДляЗапроса = СтрокаДляЗапроса + ?(ПустоеЗначение(СтрокаДляЗапроса)=1,"",",") + "'"+МетаНомер+"'";
                КонецЕсли;
            КонецЕсли;
            
            Если ПустоеЗначение(МетаНомер) = 0 Тогда
                СкульЗапрос=СкульЗапрос+"
                |and TabJ.IDDOCDEF='"+МетаНомер+"'
                |";
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    Если Проведен = 1 Тогда
        Если БезУдаленых = 1 Тогда
            СкульЗапрос=СкульЗапрос+"
            |and (((TabJ.CLOSED & 1) = 1) or (TabJ.IsMark = 0))
            |";
        ИначеЕсли БезУдаленых = 2 Тогда
            СкульЗапрос=СкульЗапрос+"
            |and (((TabJ.CLOSED & 1) = 1) or (TabJ.IsMark <> 0))
            |";
        Иначе
            СкульЗапрос=СкульЗапрос+"
            |and ((TabJ.CLOSED & 1) = 1)
            |";
        КонецЕсли;
    Иначе
        Если БезУдаленых = 1 Тогда
            СкульЗапрос=СкульЗапрос+"
            |and (TabJ.IsMark = 0)
            |";
        ИначеЕсли БезУдаленых = 2 Тогда
            СкульЗапрос=СкульЗапрос+"
            |and (TabJ.IsMark <> 0)
            |";
        КонецЕсли;
    КонецЕсли;
    СкульЗапрос=СкульЗапрос+"
    |ORDER BY
    |TabRod.CHILD_DATE_TIME_IDDOC "+?(Порядок=0,"ASC","DESC")+"
    |";
    
    Если глRecord1С.Подготовить(СкульЗапрос)=0 Тогда
        Сообщить("Запрос не прошел "+глRecord1С.ПолучитьОписаниеОшибки()+"
        |"+СкульЗапрос,"!");
        Возврат Рез;
    КонецЕсли;
    
    ТЗЗапрос = 0;
    ТЗЗапрос = СоздатьОбъект("ТаблицаЗначений");
    Попытка
        ЗначСпс = глRecord1С.ВыполнитьИнструкцию(,ТЗЗапрос,1);
    Исключение
        Сообщить("ВыполнитьИнструкцию: "+ОписаниеОшибки());
    КонецПопытки;
    
    Попытка
        глRecord1С.Закрыть();
    Исключение
        Сообщить("Закрыть SQL запрос: "+ОписаниеОшибки());
    КонецПопытки;
    
    Если ТипЗначенияСтр(ТЗЗапрос) <> "ТаблицаЗначений" Тогда
        Сообщить("Нет нужного параметра!","!");
    ИначеЕсли ТЗЗапрос.КоличествоКолонок() = 0 Тогда
        ТЗЗапрос.НоваяКолонка("Док","Документ");
        Сообщить("Запрос не выполнен:
        |"+СкульЗапрос,"!");
    Иначе
        Рез = ТЗЗапрос;
    КонецЕсли;
    
    Возврат Рез;
КонецФункции
8 Мэс33
 
19.12.13
07:50
От души ответ.
9 1Сергей
 
19.12.13
07:50
(0) нужно найти подчиненный чему? ТЗ.Документ?
10 ЧеловекДуши
 
19.12.13
07:50
+ Или вот

    Докум = СоздатьОбъект("Документ");
    Докум.ВыбратьПодчиненныеДокументы(<Дата1>,<Дата2>,<Докум>);
    Пока Докум.ПолучитьДокумент() = 1 Цикл
        
    КонецЦикла;
11 prog-Igor
 
19.12.13
12:10
спасибо!
12 prog-Igor
 
27.12.13
01:18
Проверка теперь работает, но как теперь, когда нет налоговой чтобы создавалась она:
Процедура ПроверкаНН()
    Док=СоздатьОбъект("Документ.НалоговаяНакладная");
   // РН=СоздатьОбъект("Документ.РасходнаяНакладная");
   РН=СоздатьОбъект("Документ");                      
//  Рн.ИспользоватьЖурнал("РасходныеНакладные");
   ТекСтрока=1;
    ТЗ.ВыбратьСтроки();  
    
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
    Если ТЗ.Отметка = 1 ТОгда
     РН.НайтиДокумент(ТЗ.Документ);
     РН.ВыбратьПодчиненныеДокументы(НачДата,КонДата,РН);
   Пока Рн.ПолучитьДокумент() = 1 Цикл
         Если Док.Вид() = "НалоговаяНакладная" Тогда
    Предупреждение("По даной расходной уже создана налоговая накладная"+РН.ТекущийДокумент());
             Возврат ;
         Иначе
             Выполнить();
         КонецЕсли;
КонецЦикла;  
КонецЕсли
КонецЦикла;
   КонецПроцедуры

Процедура Выполнить()
    
    Док=СоздатьОбъект("Документ.НалоговаяНакладная");
    РН=СоздатьОбъект("Документ.РасходнаяНакладная");

   ТекСтрока=1;
    ТЗ.ВыбратьСтроки();  
    
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
    Если ТЗ.Отметка = 1 ТОгда
     РН.НайтиДокумент(ТЗ.Документ);

        Док.Новый();
        Док.Фирма=Константа.ОсновнаяФирма;
        Док.ДатаДок=РН.ДатаДок;
...
13 prog-Igor
 
27.12.13
01:26
все,уже разобрался,всем спасибо!
14 acanta
 
27.12.13
01:27
Народ! А давайте на бис! Любимая тема..
15 dedmoroz777
 
27.12.13
01:35
(13) Нет уж, теперь выкладывай полностью!!! Интересно ведь)
16 varelchik
 
27.12.13
16:52
(7) ЖЕСТЬ!
17 prog-Igor
 
28.12.13
22:35
(12)
я просто не правильно вставил синтаксис возврат,его нужно после функции, и теперь все заработало,если есть налоговая предупреждение об этом сообщает или если нет-создает ее!
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.