Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 15:51

Как Запросом выбрать данные Документа-Основания?

Автор Nail2010, 28 фев 2011, 10:45

0 Пользователей и 1 гость просматривают эту тему.

Nail2010


Nail2010

И снова здравствуйте!
На этот раз задачка посложнее.
Вот процедуры, делающая основной отбор в обработке "Структура подчиненности":


Процедура ВывестиРодительскиеДокументы(ДокументСсылка)
   МетаданныеДокумента = ДокументСсылка.Метаданные();
   СписокРеквизитов = Новый СписокЗначений;
   
   Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл
      ТипыРеквизита = Реквизит.Тип.Типы();
      Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
         МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
               
         Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита)
             И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
            Попытка
               ЗначениеРеквизита = ДокументСсылка[Реквизит.Имя];
            Исключение
               Прервать;
            КонецПопытки;
            ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая() И ТипЗнч(ЗначениеРеквизита) = ТекущийТип
                И мУжеВСписке[ЗначениеРеквизита] = Неопределено И СписокРеквизитов.НайтиПоЗначению(ДокументСсылка[Реквизит.Имя]) = Неопределено Тогда
               СписокРеквизитов.Добавить(ДокументСсылка[Реквизит.Имя]);
            КонецЕсли;
         КонецЕсли;         
         
      КонецЦикла;
   КонецЦикла;
   
   Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
      СтрРеквизитов = "";
      
      Попытка
         СодержимоеТЧ = ДокументСсылка[ТЧ.Имя].Выгрузить();
      Исключение
         Прервать;
      КонецПопытки;
      
      Для Каждого Реквизит ИЗ ТЧ.Реквизиты Цикл
         ТипыРеквизита = Реквизит.Тип.Типы();
         Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
            МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);            
            Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита)
               И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
               СтрРеквизитов = СтрРеквизитов + ?(СтрРеквизитов = "", "", ", ") + Реквизит.Имя;
               Прервать;
            КонецЕсли;                  
         КонецЦикла;
      КонецЦикла;
      
      СодержимоеТЧ.Свернуть(СтрРеквизитов);
      Для Каждого КолонкаТЧ ИЗ СодержимоеТЧ.Колонки Цикл
         Для Каждого СтрокаТЧ ИЗ СодержимоеТЧ Цикл
            Попытка
               ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя];
            Исключение
               Продолжить;
            КонецПопытки;
            МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеРеквизита));
            Если МетаданныеЗначения = Неопределено Тогда
               // базовый тип
               Продолжить;
            КонецЕсли;
            
            ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая()
                И Метаданные.Документы.Содержит(МетаданныеЗначения)
                И мУжеВСписке[ЗначениеРеквизита] = Неопределено Тогда
               Если СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда
                  СписокРеквизитов.Добавить(ЗначениеРеквизита);
               КонецЕсли;
            КонецЕсли;
         КонецЦикла;
      КонецЦикла;      
   КонецЦикла;
   
   мУжеВСписке.Вставить(ДокументСсылка, Истина);
   
   Если СписокРеквизитов.Количество() = 1 Тогда
      ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);
   ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
      ВывестиБезРодителей(СписокРеквизитов);      
   КонецЕсли;

   
   СтрокаДерева = мДерево.Строки.Добавить();
   Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, Представление, """ + МетаданныеДокумента.Имя + """ КАК Метаданные
                     | ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
                     
   Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
   Выборка  = Запрос.Выполнить().Выбрать();
   ЕСли Выборка.Следующий() Тогда      
      СтрокаДерева.Ссылка= Выборка.Ссылка;
      СтрокаДерева.Проведен = Выборка.Проведен;
      СтрокаДерева.ПометкаУдаления = Выборка.ПометкаУдаления;
      СтрокаДерева.ДокументПредставление = Выборка.Представление;
      СтрокаДерева.ВидДокумента = Выборка.Метаданные;            
   Иначе
      СтрокаДерева.Ссылка= ДокументСсылка;
      СтрокаДерева.ДокументПредставление = Строка(ДокументСсылка);
   КонецЕсли;
   
   мДерево = СтрокаДерева;
      
КонецПроцедуры


Задача:
Необходимо вывести все документы "РеализацияТоваровУслуг", отобранные таким образом в этой обработке, в одном дереве с Приходно-кассовым ордером.
Как это можно сделать?????

Nail2010

Не понял, ограничение окна по количеству символов??

Nail2010

Процедура ВывестиРодительскиеДокументы(ДокументСсылка)
   МетаданныеДокумента = ДокументСсылка.Метаданные();
   СписокРеквизитов = Новый СписокЗначений;
   
   Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл
      ТипыРеквизита = Реквизит.Тип.Типы();
      Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
         МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
               
         Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита)
             И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
            Попытка
               ЗначениеРеквизита = ДокументСсылка[Реквизит.Имя];
            Исключение
               Прервать;
            КонецПопытки;
            ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая() И ТипЗнч(ЗначениеРеквизита) = ТекущийТип
                И мУжеВСписке[ЗначениеРеквизита] = Неопределено И СписокРеквизитов.НайтиПоЗначению(ДокументСсылка[Реквизит.Имя]) = Неопределено Тогда
               СписокРеквизитов.Добавить(ДокументСсылка[Реквизит.Имя]);
            КонецЕсли;
         КонецЕсли;         
         
      КонецЦикла;
   КонецЦикла;
   
   Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
      СтрРеквизитов = "";
      
      Попытка
         СодержимоеТЧ = ДокументСсылка[ТЧ.Имя].Выгрузить();
      Исключение
         Прервать;
      КонецПопытки;
      
      Для Каждого Реквизит ИЗ ТЧ.Реквизиты Цикл
         ТипыРеквизита = Реквизит.Тип.Типы();
         Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
            МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);            
            Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита)
               И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
               СтрРеквизитов = СтрРеквизитов + ?(СтрРеквизитов = "", "", ", ") + Реквизит.Имя;
               Прервать;
            КонецЕсли;                  
         КонецЦикла;
      КонецЦикла;
      
      СодержимоеТЧ.Свернуть(СтрРеквизитов);
      Для Каждого КолонкаТЧ ИЗ СодержимоеТЧ.Колонки Цикл
         Для Каждого СтрокаТЧ ИЗ СодержимоеТЧ Цикл
            Попытка
               ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя];
            Исключение
               Продолжить;
            КонецПопытки;
            МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеРеквизита));
            Если МетаданныеЗначения = Неопределено Тогда
               // базовый тип
               Продолжить;
            КонецЕсли;
            
            ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая()
                И Метаданные.Документы.Содержит(МетаданныеЗначения)
                И мУжеВСписке[ЗначениеРеквизита] = Неопределено Тогда
               Если СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда
                  СписокРеквизитов.Добавить(ЗначениеРеквизита);
               КонецЕсли;
            КонецЕсли;
         КонецЦикла;
      КонецЦикла;      
   КонецЦикла;
   
   мУжеВСписке.Вставить(ДокументСсылка, Истина);
   
   Если СписокРеквизитов.Количество() = 1 Тогда
      ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);
   ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
      ВывестиБезРодителей(СписокРеквизитов);      
   КонецЕсли;

   
   СтрокаДерева = мДерево.Строки.Добавить();
   Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, Представление, """ + МетаданныеДокумента.Имя + """ КАК Метаданные
                     | ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
                     
   Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
   Выборка  = Запрос.Выполнить().Выбрать();
   ЕСли Выборка.Следующий() Тогда      
      СтрокаДерева.Ссылка= Выборка.Ссылка;
      СтрокаДерева.Проведен = Выборка.Проведен;
      СтрокаДерева.ПометкаУдаления = Выборка.ПометкаУдаления;
      СтрокаДерева.ДокументПредставление = Выборка.Представление;
      СтрокаДерева.ВидДокумента = Выборка.Метаданные;            
   Иначе
      СтрокаДерева.Ссылка= ДокументСсылка;
      СтрокаДерева.ДокументПредставление = Строка(ДокументСсылка);
   КонецЕсли;
   
   мДерево = СтрокаДерева;
      
КонецПроцедуры

Nail2010

Н-да. В общем, если кто-0то имео дело со стандартной обработкой "Структура подчиненности", ответьте плиз.

progmikon


Nail2010

Суть в следующем.
Обработка отображает ввиде дерева документы, введенные на основании "ЗаказПокупателей", причем без реквизита ДокументОснование. (В конфигурации критерий отбора для отображения подчиненных документов отсутствует вообще). Как отловить ту часть кода. которая выявляет эти документы и отображает? Это нужно для отсортировки только одного документа из этого дерева.
И еще - хотел отправить скрин, но пишет - недоступна папка....

progmikon

Весь код, если я не ошибаюсь находится в общей форме "ФормаСтруктурыПодчиненности".

progmikon

Посмотрите процедуры "ВывестиПодчиненныеДокументы" и "ВывестиРодительскиеДокументы". Это кстати, для 8.1 бух

Nail2010

Спасибо, я понял, что в этих процедурах дело. Скорее всего, в процедуре "Подчиненные документы" нужно смотреть. Только что именно?

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск