7.7 Как добавить в выборку документов?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем Asttoxa, 30 мар 2011.

  1. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Ребят подскажите, как поместить в выборку документов все документы связанные с конкретным...
    С учетом что у всех без исключения документов есть Параметр: "ДокОснование"
    Посмотреть вложение 6867
    Чтобы при "Пока Док.ПолучитьДокумент()=1 Цикл" я перебрал все документы которые на картинке.

    ЗЫ или есть стандартные процедурки для этого?

    Вложения:

  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Обычным перебором... только использовать рекурсию...
  3. sergejk74
    Offline

    sergejk74 Опытный в 1С

    Регистрация:
    15 ноя 2010
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    В Торговля и Склад есть обработка ДеревоДокументов. Куда уж стандартнее
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    ...и не только в ТиС. sergejK74, обрати внимание на скриншот... Как раз эта процедура и отображена. Думаю человек хочет написать свою процедуру обхода связей документов, но не хочет разбираться в коде стандатной))))
  5. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Я именно дерево документов и использовал ... но как сделать, чтобы эта обработка дерева документов кинула именно найденные документы в мою выборку?? Она то кидает их в Таблицу для просмотра. А мне нужно работать с этими доками!
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Что вы конкретно хотите получить в конце и какая стоит задача? Так трудно судить о правильности решения
  7. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Допустим так:

    -----------------------
    Док=СоздатьОбъект("Документ");

    Док=КакаяТоФункция(ТекущийДокумент());

    Пока Док.ПолучитьДокумент()=1 Цикл

    //Работа с документами из дерева

    КонецЦикла;
    -----------------------
    Так вот нужно функция "КакаяТоФункция" присваивала выборку документов только тех которые находятся в том же дереве что и ТекущийДокумент()

    Вот что мне нужно.
  8. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Вот так:
    Код:
    СписДок=КакаяТоФункция(ТекущийДокумент());
    
    Для К=1 По СписДок.РазмерСписка() Цикл
    
    
    будет работать. Как вы ходите - фантастика
    СписДок - СписокЗначений (можно использовать ТаблицуЗначений)
  9. sergejk74
    Offline

    sergejk74 Опытный в 1С

    Регистрация:
    15 ноя 2010
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Картинку то я заметил, просто я не развернуто предложил залезть в обработку, заменить вывод секций на запись допустим в ТЗ, потом ее свернуть и затем возвратить из функции - но был не понят.... :angry:
  10. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Я то вас понял... но не все на форуме телепаты))))
    К тому же исправлять/чистить эту обработку НАМНОГО дольше чем написать функцию обхода дерева заново (1 цикл+проверка оснвания с вызовом рекурсии+1 проверка от зацикливания)
  11. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Или в список засовывает или в таблицу мне без разницы, что обрабатывать главное как это сделать?
    К сожалению не знаю что такое "рекурсия" :(
    То есть таких функций, как я понял, готовых нет. Нужно делать самому.

    Хорошо ... с чего начать? :)
    посмотрел я как работает обработка "дерево документов" Там сначала нужно найти корень доков тоесть тот документ с чего все пошло так?
  12. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Рекурсия - это когда функция для вычисления выражения вызывает саму себя...
    Развивайте мозг. Вот "стартовый" пример...

    Код:
    Функция МояФункция(Док)
    Если ПустоеЗначение(Док.ДокОснование)=0 Тогда
    Спис=МояФункция(Док.ДокОснование);
    КонецЕсли;
    //тут обычный цикл перебора документов по основанию
    //но есть маленькое но... Нужно обезопасить себя от "зацикливания"
    //(бесконечного цикла) - ДУМАЙТЕ
    КонецФункции
    
    
    
  13. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Вот что у меня получилось:
    Код:
    
    //Весь код в глобальном модуле
    
    Перем 	СписокЗащитыОтЗацикливания;
    
    
    //Возвращает Корневой документ в дереве
    Функция глНайтиКорень(Док) 
    
    Если глЕстьРеквизитШапки("ДокОснование", Док.Вид())=1 Тогда
    КореньДок=Док.ДокОснование;
    Иначе
    Возврат 0;
    КонецЕсли;
    
    Если ПустоеЗначение(КореньДок)=1 Тогда
    Возврат Док;
    Иначе
    Возврат глНайтиКорень(КореньДок);
    КонецЕсли;
    КонецФункции
    
    // Функция Перебирает все подчиненные документы и включает их в Список
    Функция глПереборВсехДокументовДерева(Док,Реж=0)   
    Докум=СоздатьОбъект("Документ");
    Если СписокЗащитыОтЗацикливания.НайтиЗначение(Док)=0 Тогда
    СписокЗащитыОтЗацикливания.ДобавитьЗначение(Док);
    КонецЕсли;
    Докум.ВыбратьПодчиненныеДокументы(,,Док);
    Пока Докум.ПолучитьДокумент()=1 Цикл
    Если глЕстьРеквизитШапки("ДокОснование", Докум.Вид())=0 Тогда 
    Продолжить;
    КонецЕсли;
    глПереборВсехДокументовДерева(Докум.ТекущийДокумент()); 
    КонецЦикла;    
    
    Если Реж=1 Тогда
    Возврат СписокЗащитыОтЗацикливания;
    КонецЕсли;
    КонецФункции
    
    
    //Функция возвращает список всех документов в дереве где находится Док
    Функция глДокументыДерева(Док) Экспорт
    Если глЕстьРеквизитШапки("ДокОснование", Док.Вид())=0 Тогда
    Сообщить("У документа отсутствует параметр подчиненности!");
    Возврат "";
    КонецЕсли;
    СписокДок=СоздатьОбъект("СписокЗначений");
    СписокЗащитыОтЗацикливания=СоздатьОбъект("СписокЗначений");
    КореньДок=глНайтиКорень(Док);
    СписокДок=глПереборВсехДокументовДерева(КореньДок,1);
    Возврат СписокДок;    
    КонецФункции
    
    
    Ребят прошу посмотреть ОПЫТНЫМ взглядом, может что-то не правильно или не красиво сделал. Или может упростить можно как то.....
    Но у меня вроде работает. :angry:

    2Бухгалтерский угодник: Как считаете пошевелил мозгами? :D
  14. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Если честно - нет. Как преподаватель влепил бы троечку. Не обижайся))))

    Ты просто передрал чужой код, а не написал свой.
    + без глНайтиКорень можно было и обойтись. У тебя 2 процедуры с рекурсией, а можно было сделать все в одной (это и есть "не красиво"). А так - все правильно.
  15. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    :angry: У кого я передрал код?? Сам все писал. Единственное я посмотрел, как работает это в обработке дерева документа (и то там по другим параметрам выдирает документы, а не по ДокОснование)

    А на что влияет двойная рекурсия? Скорость работы??
  16. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Имена переменных/процедур в точности как в ТиСе)))) Поэтому так и сказал.
    Если не так - извините 1000 раз.

    По поводу 2х процедур - все можно сделать в одной.
    Красивее/Быстрее (не нужно искать корень)/Оптимальнее.

    Тройку беру назад... 4+ (процедур-то две)))))!
  17. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Ууу с этим у меня проблема всегда была. А именно не могу быстро придумать имя переменным так, чтобы оно было коротким и в тоже время отражало приблизительно его содержимое :) Поэтому и взаимствую имена переменных, которые мне приглянулись :)

    :angry: Пасиб

Поделиться этой страницей