Имя: Пароль:
1C
1C 7.7
v7: Выборка подчиненного документа
0 balak05
 
06.11.13
14:57
Здравствуйте. Есть документ "Счет". Ему подчинены несколько документов, в том числе документ "РасходнаяБН". Нужно чтобы если у "Счета" нету подчиненного документа "РасходняБН" выполнялись определенные действия один раз. Именно поэтому метод "ВыбратьПодчиненныеДокументы" не использую. Есть ли какой нибудь метод, который позволит выбрать определенный документ, подчиненный данному?
1 ДенисЧ
 
06.11.13
14:57
запрос не предлагать?
2 balak05
 
06.11.13
15:01
(1) В смысле запрос? По идее метод "ВыбратьПодчиненныеДокументы" и есть запрос, потом открывается    цикл и перебираются документы. А мне нужно выполнить действие один раз, если документ не встречается, и не выполнять никаких действий, если домент есть
3 ДенисЧ
 
06.11.13
15:04
ну так и сделай....
4 oslokot
 
06.11.13
15:04
(2) в запросе можно твое условие влепить. В методе выборки - нет.
Но ты и выборкой можешь воспользоваться, я не возражаю
5 Ork
 
06.11.13
15:05
(2) Вообще если почитать (хотя бы в СП) за метод ВыбратьПодчиненныеДокументы - можно увидеть одну особенность. Еще до метода ПолучитьДокумент уже известь они есть или их нету.
6 Ork
 
06.11.13
15:07
+(5) Для осиливших программу изучения букваря :

Возвращает:
1 - если действие выполнено и в выборке есть хотя бы один документ;
0 - если действие не выполнено или в выборке нет ни одного документа.
7 dk
 
06.11.13
15:18
(0) что за бред про "выполнить один раз"?
(5) там не только расходные в подчинении
8 Ork
 
06.11.13
15:22
(7) Кто мешает пробежаться по выборке и определить нужна обработка / не нужна?
9 balak05
 
06.11.13
15:22
Сч=СоздатьОбъект("Документ.Счет");
ТекДок = Сч.ТекущийДокумент();
РН = СоздатьОбъект("Документ.РасходнаяБН");
Если (РН.ВыбратьПодчиненныеДокументы(,,ТекДок)=0) И (ТекДок.Услуга = Перечисление.Услуга.Нет) Тогда

И тут возникает ошибка
Если (РН.ВыбратьПодчиненныеДокументы(,,ТекДок)=0) И (ТекДок.Услуга = Перечисление.Услуга.Нет) Тогда            
{Документ.ДвижениеДенежныхСредств.Модуль Документа(112)}: Объект - документ определенного вида!
так как вместо РН = СоздатьОбъект("Документ.РасходнаяБН"); должно быть РН = СоздатьОбъект("Документ");
Далее идет перебор всех подчиненных документов
Пока РН.ПолучитьДокумент()=1 Цикл
и перебираются все документы, которые подчинены данному.
если поставить условие
"Если РН.Вид() <> "РасходнаяБН" Тогда" тогда цикл будет выполняться несколько раз, а необходимо только один раз.
10 ДенисЧ
 
06.11.13
15:23
идиотизм развитой, классический.
11 Voronve
 
06.11.13
15:26
(9) Колись, почему только один раз ?
12 dk
 
06.11.13
15:26
РН = СоздатьОбъект("Документ");
----------
Сч=СоздатьОбъект("Документ.Счет");
ТекДок = Сч.ТекущийДокумент();
Это просто бред - иди читать желтокрасный букварь по 1с
13 balak05
 
06.11.13
15:27
(10) при чем здесь идиотизм? Написать больше нечего?
14 balak05
 
06.11.13
15:27
(11) потому что несколько документов подчинены данному
15 ДенисЧ
 
06.11.13
15:28
(13) Потому что идиотизм.
либо задача такая, либо рассказчик
16 Ork
 
06.11.13
15:30
(14) О да!!! Это все объясняет.
Если одному документу подчинено несколько никакая обработка не может выполняться более одного раза. Это вшито в платформу.
17 balak05
 
06.11.13
15:38
(15) Может меня неправильно поняли просто. Объясню саму задачу: есть документ "счет". Есть несколько документов, ему подчиненных. Среди них есть документ "РасходнаяБН". Сейчас работаю в другом документе, подчиненному "счету" - "ДвижениеДС". В этом документе выбрал документ "счет" и теперь необходимо если у этого счета есть подчиненный "РасходнаяБН" не выполнять никаких действий, если же его нет- необходимо совершать эти самые действия.
18 ДенисЧ
 
06.11.13
15:43
(17) ПриВыборе()
Если ЕстьПодчиненныеБН(счет) = 1 Тогда
//ничего не делать
Иначе
  СделатьЭтиСамыеДействия();
КонецЕсли;

Функция ЕстьПодчиненныеБН(счет)
  док = СоздатьОбъект("Документ");
  док.ВыбратьПодчиненныеДокументы(,,счет);
  Пока док.Следующий() = 1 Цикл
   Если док.Вид() = "РасходнаяБН" Тогда
    Возврат 1;
   КОнеЕсли;
  КОнецЦикла;
  Возврат 0;
КонецФункции
19 dk
 
06.11.13
15:43
ну и что мешает в цикле перебрать подчиненные документы и проверить есть ли там расходная?
20 Ork
 
06.11.13
15:44
(17) Без приколов примерно так :

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

//в твоем коде :
Если ЕстьРасходная(НапримерТекущийДокумент) = 0 Тогда
    Обрабатываем();
КонецЕсли;

Примерно так.
21 Cthulhu
 
06.11.13
15:52
(14): ключевое слово "несколько".
что соответствует быстрой выборке и быстрому перебору.
если тебе так уж припекло белать это одним оператором - оформи и вызывай функцию Функция ЕстьЛиХотяБыОдинПодчиненныйДокументУказанногоВида(тДокРодитель,ПодчДокВид="РасходнаяБН",прТолькоНеПомеченныеНаУдалениеИлиТолькоПроведенные=0)
    Перем ПодчДок;
    ПодчДок=СоздатьОбъект("Документ"); ПодчДок.ВыбратьПодчиненныеДокументы(,,тДокРодитель);
    Пока ПодчДок.ПолучитьДокумент()<>0 Цикл Если ПодчДок.Вид()=ПодчДокВид
    Тогда Если 1-ПодчДок.ПометкаУдаления()+ПодчДок.Проведен()>=прТолькоНеПомеченныеНаУдалениеИлиТолькоПроведенные
    Тогда Прервать КонецЕсли КонецЕсли КонецЦикла; Возврат (ПодчДок.Выбран());
КонецФункции //ЕстьЛиХотяБыОдинПодчиненныйДокументУказанногоВида
22 balak05
 
06.11.13
16:27
(18) (20) (21) Спасибо вам. Сделал так
    Кк=0;
Если ТекДок.Услуга = Перечисление.Услуга.Нет Тогда                
РН = СоздатьОбъект("Документ");                
Если РН.ВыбратьПодчиненныеДокументы(,,ТекДок)=1 Тогда
    Пока РН.ПолучитьДокумент()=1 Цикл
        Если РН.Вид() ="РасходнаяБН" Тогда
             Кк =1;
             Прервать;
        КонецЕсли;        
    КонецЦикла;
Если Кк=0 Тогда    
// далее операции
Вроде все работает.
23 Cthulhu
 
06.11.13
17:43
(22): зачем плодить лишние сущности?..
скрип...эээ, "кк" не нужен. просто "прервать" и всё, а проверка условия наличия такого подч.документа - "Если РН.Выбран()<>1 Тогда ..." (прим.: кто-то говорил, что сравнение на больше-меньше отрабатывает ощутимо быстрее чем сравнение на равно)
24 balak05
 
06.11.13
17:54
(23) А если допустим первый подчиненный документ не равен "РасходнаяБН", а второй равен - то метод выбран() нам вернет 1  ? Так как прерывание произошло только на втором витке цикла. Или я ошибаюсь?
25 Cthulhu
 
07.11.13
16:12
(24): ошибаешься. в смысле что во-первых это и требуется, а во-вторых твой код в "кк" в такой ситуации тоже равно 1.
Программист всегда исправляет последнюю ошибку.