|
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.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |