|
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)
я просто не правильно вставил синтаксис возврат,его нужно после функции, и теперь все заработало,если есть налоговая предупреждение об этом сообщает или если нет-создает ее! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |