Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Обращение в запросе к нескольким документам          
wmatik Подменю пользователя
сообщение 25.06.11, 11:20
Сообщение #1

Оратор
*****
Группа: Пользователи
Сообщений: 294
Спасибо сказали: 1 раз
Рейтинг: 0

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

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


Signature
1С Предприятие 7.7(сетевая версия) - 7.70.027,Конф: ПУБ(7.70.010)

-=VJ=- Подменю пользователя
сообщение 25.06.11, 11:29
Сообщение #2

Оратор
Иконка группы
Группа: Местный
Сообщений: 402
Из: Киев
Спасибо сказали: 73 раз
Рейтинг: 0

    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ОбрабатыватьДокументы Проведенные;
    |Док = Документ.Документ1.ТекущийДокумент,Документ.Документ2.ТекущийДокумент...;


Аналогичное обращение к реквизитам перечисленных документов.


Signature
Живу на VJ.net.ua.
Спілкуюсь в ЖЖ

wmatik Подменю пользователя
сообщение 25.06.11, 12:41
Сообщение #3

Оратор
*****
Группа: Пользователи
Сообщений: 294
Спасибо сказали: 1 раз
Рейтинг: 0

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

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

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

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

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


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

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


Signature
1С Предприятие 7.7(сетевая версия) - 7.70.027,Конф: ПУБ(7.70.010)

-=VJ=- Подменю пользователя
сообщение 25.06.11, 12:56
Сообщение #4

Оратор
Иконка группы
Группа: Местный
Сообщений: 402
Из: Киев
Спасибо сказали: 73 раз
Рейтинг: 0

Значит у какого-то полученного документа таки нет реквизита КодДК
Используйте Попытку


Signature
Живу на VJ.net.ua.
Спілкуюсь в ЖЖ

wmatik Подменю пользователя
сообщение 25.06.11, 13:08
Сообщение #5

Оратор
*****
Группа: Пользователи
Сообщений: 294
Спасибо сказали: 1 раз
Рейтинг: 0

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

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

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

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

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

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


Signature
1С Предприятие 7.7(сетевая версия) - 7.70.027,Конф: ПУБ(7.70.010)

DartRomanius Подменю пользователя
сообщение 25.06.11, 13:10
Сообщение #6

Ветеран
Иконка группы
Группа: Местный
Сообщений: 824
Из: Запорожье
Спасибо сказали: 145 раз
Рейтинг: 0

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

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

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

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

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

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


Ну а чего мы хотим если циклом добавляем значения в Таблицу Значений,
а выводим потом таки 1 строку?


Signature
-----------------------------------------------------------------------------------
Единственный, интуитивно понятный интерфейс - мамкина сиська!
Всему остальному надо учиться! (с) Не знаю кто....

Спасибо сказали: wmatik,

5_kopeek Подменю пользователя
сообщение 25.06.11, 13:14
Сообщение #7

Ветеран
*******
Женщине-одинэснику
Группа: Пользователи*
Сообщений: 940
Спасибо сказали: 285 раз
Рейтинг: 0

Цитата(wmatik @ 25.06.11, 12:41) *
...
    Таб = СоздатьОбъект("Таблица");
...
                Таб.КодДК = Док.КодДК;
...
КонецПроцедуры

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

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


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

Спасибо сказали: wmatik,

wmatik Подменю пользователя
сообщение 25.06.11, 13:20
Сообщение #8

Оратор
*****
Группа: Пользователи
Сообщений: 294
Спасибо сказали: 1 раз
Рейтинг: 0

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

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

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


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

ага))но все равно спасибо что откликнулись


Signature
1С Предприятие 7.7(сетевая версия) - 7.70.027,Конф: ПУБ(7.70.010)

-=VJ=- Подменю пользователя
сообщение 25.06.11, 13:38
Сообщение #9

Оратор
Иконка группы
Группа: Местный
Сообщений: 402
Из: Киев
Спасибо сказали: 73 раз
Рейтинг: 0

Цитата(wmatik @ 25.06.11, 14:20) *
Подскажите как вывести всю таблицу


Таб.ВывестиСекцию("Строка"); нужно вставить в цикл, а не вне него.


Signature
Живу на VJ.net.ua.
Спілкуюсь в ЖЖ

Спасибо сказали: wmatik,

wmatik Подменю пользователя
сообщение 25.06.11, 13:41
Сообщение #10

Оратор
*****
Группа: Пользователи
Сообщений: 294
Спасибо сказали: 1 раз
Рейтинг: 0

аа, точно) заработалась))


Signature
1С Предприятие 7.7(сетевая версия) - 7.70.027,Конф: ПУБ(7.70.010)

kalyamov Подменю пользователя
сообщение 25.06.11, 14:45
Сообщение #11

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 186
Спасибо сказали: 31 раз
Рейтинг: 0

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

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


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


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

Спасибо сказали: maks_75,

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 29.05.24, 8:21
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!