Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обращение в запросе к нескольким документам
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
wmatik
1С Предприятие 7.7(сетевая версия) - 7.70.027,Конф: ПУБ(7.70.010)
Подскажите пожалуйста, как организовать обращение к нескольким документам в запросе с одинаковыми реквизитами. Просто надо вытянуть данные из 4 документов, а именно три реквизита КодДК, СуммаСНДС, ДатаДок. Я сделала обращение только к одному документу, все выдает, как только в запросе я начинаю прописывать реквизит второго документа, к идентификатору добавляется 1. Вот мой код:
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ОбрабатыватьДокументы Проведенные;
    |КодДК = Документ.ПриходнаяНакладнаяЗапасы.КодДК;
    |Закупки = Документ.ПриходнаяНакладнаяЗапасы.Закупки;    
    |СуммаСНДС = Документ.ПриходнаяНакладнаяЗапасы.СуммаСНДС;
    |ДатаДок = Документ.ПриходнаяНакладнаяЗапасы.ДатаДок;
    |Группировка КодДК;
    |"//}}ЗАПРОС
;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл
        // Заполнение полей КодДК
        Если (ПустоеЗначение(ВыбКод) = 0)и((Лев(СокрЛП(Запрос.КодДК),СтрДлина(СокрЛП(ВыбКод))) <> СокрЛП(ВыбКод))или(СтрДлина(СокрЛП(ВыбКод))>СтрДлина(СокрЛП(Запрос.КодДК)))) Тогда
            Продолжить;
        КонецЕсли;
        ТекДок = Запрос.КодДК; // Заполнение полей КодДК
        Закупки = Запрос.Закупки;
        СуммаСНДС = Запрос.СуммаСНДС;
        ДатаДок = Запрос.ДатаДок;
        Таб.ВывестиСекцию("Прих");
    КонецЦикла;
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
-=VJ=-
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ОбрабатыватьДокументы Проведенные;
    |Док = Документ.Документ1.ТекущийДокумент,Документ.Документ2.ТекущийДокумент...;


Аналогичное обращение к реквизитам перечисленных документов.
wmatik
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ОбрабатыватьДокументы Проведенные;
    |Док = Документ.ПриходнаяНакладнаяЗапасы.ТекущийДокумент, Документ.БанковскаяВыписка.ТекущийДокумент;
    |Группировка Док;
    |"//}}ЗАПРОС
;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    //Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);

    БуфКод = "";    
    ПечКод = БуфКод+".00.00.00";
    Спр = СоздатьОбъект("Справочник.КодыПоКлассификатору");
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл  
        Если СокрЛП(Спр.Код) = СокрЛП(ПечКод) Тогда
            ПечНазв = СокрЛП(Спр.КодДК);
        КонецЕсли;
    КонецЦикла;

    //Док = "";
    Пока Запрос.Группировка(1) = 1 Цикл
        Док = Запрос.Док;    
        
        Если (Док.Вид() = "БанковскаяВыписка") ИЛИ
            (Док.Вид() = "ПриходнаяНакладнаяЗапасы") Тогда
            Док.ВыбратьСтроки();
            Сумма = 0;
            Пока Док.ПолучитьСтроку() = 1 Цикл
                Если ПустоеЗначение(Док.КодДК) = 1 Тогда
                    Продолжить;
                КонецЕсли;
                Если (ПустоеЗначение(ВыбКод) = 0)и((Лев(СокрЛП(Док.КодДК),СтрДлина(СокрЛП(ВыбКод))) <> СокрЛП(ВыбКод))или(СтрДлина(СокрЛП(ВыбКод))>СтрДлина(СокрЛП(Док.КодДК)))) Тогда
                    Продолжить;
                КонецЕсли;
                
                //Таб.НоваяСтрока();
                Таб.КодДК = Док.КодДК;
                Сумма = Док.СуммаСНДС;
                Таб.ВывестиСекцию("Строка");
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;        

    Таб.ПрисоединитьСекцию("Строка2");


    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");  
КонецПроцедуры

Пишет вот такую ошибку:
Таб.КодДК = Док.КодДК;
{C:\DOCUMENTS AND SETTINGS\WMATIK\РАБОЧИЙ СТОЛ\РАСШИФРОВКА ФАКТА ПО ЗАКУПКАМ.ERT(56)}: Поле агрегатного объекта не обнаружено (КодДК)
-=VJ=-
Значит у какого-то полученного документа таки нет реквизита КодДК
Используйте Попытку
wmatik
Получилось, только почему то выводит только одну строку. Что не так то, не пойму(
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    //Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
  
    Табл = СоздатьОбъект("ТаблицаЗначений");
    ФорматЧисел = "Ч020.3";

    Табл.НоваяКолонка("КодДК");
    Табл.НоваяКолонка("Закупки");
    Табл.НоваяКолонка("СуммаСНДС");
    Табл.НоваяКолонка("ДатаДок");

    Док = "";
    Пока Запрос.Группировка(1) = 1 Цикл
        Док = Запрос.Док;    
        
        Если (Док.Вид() = "БанковскаяВыписка") ИЛИ
            (Док.Вид() = "ПриходнаяНакладнаяЗапасы") Тогда
            Док.ВыбратьСтроки();
            Сумма = 0;
            Пока Док.ПолучитьСтроку() = 1 Цикл
                Если ПустоеЗначение(Док.КодДК) = 1 Тогда
                    Продолжить;
                КонецЕсли;
                Если (ПустоеЗначение(ВыбКод) = 0)и((Лев(СокрЛП(Док.КодДК),СтрДлина(СокрЛП(ВыбКод))) <> СокрЛП(ВыбКод))или(СтрДлина(СокрЛП(ВыбКод))>СтрДлина(СокрЛП(Док.КодДК)))) Тогда
                    Продолжить;
                КонецЕсли;
                
                Табл.НоваяСтрока();
                Табл.КодДК = Док.КодДК;
                Табл.СуммаСНДС = Док.СуммаСНДС;
                Табл.ДатаДок = Док.ДатаДок;

            КонецЦикла;
        КонецЕсли;
    КонецЦикла;        

    Таб.ВывестиСекцию("Строка");

    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");  
КонецПроцедуры
DartRomanius
Цитата(wmatik @ 25.06.11, 14:08) необходимо зарегистрироваться для просмотра ссылки
Получилось, только почему то выводит только одну строку. Что не так то, не пойму(
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    //Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
  
    Табл = СоздатьОбъект("ТаблицаЗначений");
    ФорматЧисел = "Ч020.3";

    Табл.НоваяКолонка("КодДК");
    Табл.НоваяКолонка("Закупки");
    Табл.НоваяКолонка("СуммаСНДС");
    Табл.НоваяКолонка("ДатаДок");

    Док = "";
    Пока Запрос.Группировка(1) = 1 Цикл
        Док = Запрос.Док;    
        
        Если (Док.Вид() = "БанковскаяВыписка") ИЛИ
            (Док.Вид() = "ПриходнаяНакладнаяЗапасы") Тогда
            Док.ВыбратьСтроки();
            Сумма = 0;
            Пока Док.ПолучитьСтроку() = 1 Цикл
                Если ПустоеЗначение(Док.КодДК) = 1 Тогда
                    Продолжить;
                КонецЕсли;
                Если (ПустоеЗначение(ВыбКод) = 0)и((Лев(СокрЛП(Док.КодДК),СтрДлина(СокрЛП(ВыбКод))) <> СокрЛП(ВыбКод))или(СтрДлина(СокрЛП(ВыбКод))>СтрДлина(СокрЛП(Док.КодДК)))) Тогда
                    Продолжить;
                КонецЕсли;
                
                Табл.НоваяСтрока();
                Табл.КодДК = Док.КодДК;
                Табл.СуммаСНДС = Док.СуммаСНДС;
                Табл.ДатаДок = Док.ДатаДок;

            КонецЦикла;
        КонецЕсли;
    КонецЦикла;        

    Таб.ВывестиСекцию("Строка");

    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");  
КонецПроцедуры


Ну а чего мы хотим если циклом добавляем значения в Таблицу Значений,
а выводим потом таки 1 строку?
5_kopeek
Цитата(wmatik @ 25.06.11, 12:41) необходимо зарегистрироваться для просмотра ссылки
...
    Таб = СоздатьОбъект("Таблица");
...
                Таб.КодДК = Док.КодДК;
...
КонецПроцедуры

Пишет вот такую ошибку:
Таб.КодДК = Док.КодДК;
{C:\DOCUMENTS AND SETTINGS\WMATIK\РАБОЧИЙ СТОЛ\РАСШИФРОВКА ФАКТА ПО ЗАКУПКАМ.ERT(56)}: Поле агрегатного объекта не обнаружено (КодДК)

Это неудивительно, поскольку Таб -- это таблица, а не таблица значений. Возможно, Вы имели ввиду:
КодДК = Док.КодДК;


Ну, почти вовремя...
wmatik
Цитата(DartRomanius @ 25.06.11, 14:10) необходимо зарегистрироваться для просмотра ссылки
Ну а чего мы хотим если циклом добавляем значения в Таблицу Значений,
а выводим потом таки 1 строку?

Подскажите как вывести всю таблицу

Цитата(5_kopeek @ 25.06.11, 14:14) необходимо зарегистрироваться для просмотра ссылки
Это неудивительно, поскольку Таб -- это таблица, а не таблица значений. Возможно, Вы имели ввиду:
КодДК = Док.КодДК;


Ну, почти вовремя...

ага))но все равно спасибо что откликнулись
-=VJ=-
Цитата(wmatik @ 25.06.11, 14:20) необходимо зарегистрироваться для просмотра ссылки
Подскажите как вывести всю таблицу


Таб.ВывестиСекцию("Строка"); нужно вставить в цикл, а не вне него.
wmatik
аа, точно) заработалась))
kalyamov
Цитата(wmatik @ 25.06.11, 13:41) необходимо зарегистрироваться для просмотра ссылки
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Код = Документ.ПриходнаяНакладнаяЗапасы.КодДК,Документ.БанковскаяВыписка.КодДК;
    |СуммаСНДС = Документ.ПриходнаяНакладнаяЗапасы.СуммаСНДС,Документ.БанковскаяВыписка.СуммаСНДС
;
    |Группировка Код;
    |Условие(Код в ВыбКод);
    |"//}}ЗАПРОС
;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл
        // Заполнение полей Код
        Таб.ВывестиСекцию("Код");
    КонецЦикла;
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры


Можно попробовать вот-так. Зачем перебирать документы, потом их строки - если нас интересует конкретный кодДК ?


Старайтесьвсе данные получить запросом, что бы поменьше было условий и переборов в группировках. Тем более, как я понял, Вы их делаете конструктором.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.