Имя: Пароль:
1C
1С v8
Создание отчета на основании табличного документа
, , ,
0 Иванов Иван Иваныч
 
18.07.19
07:34
Доброго всем дня! Подскажите пожалуйста, а то я в этом вообще не шарю) Получается создаю отчет на основании табдока. https://ibb.co/LtrHhxk (сам табдок) и https://ibb.co/HHqbbF8 (ТЗ). МесяцГод это период отчета (например с 1 по 31 мая 2019 или просто май 2019), Контрагент должен быть в столбик, Заявлено - кол-во товара из док-та СчетНаОплатуПокупателю, Отпущено - кол-во товара из док-та РеализацияТоваровУслуг, где основанием является СчетНаОплатуПокупателю, ну и НомерСтроки - соответственно номер строки. Пока в форме отчета я имею такой код:

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

&НаСервере
Функция ПолучитьМакетНаСервере()
    ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
    Макет = ОтчетОбъект.ПолучитьМакет("Макет");
    Возврат Макет;
КонецФункции

&НаКлиенте
Процедура СформироватьОтчет(Команда)
    СформироватьОтчетНаСервере();
КонецПроцедуры


Правильно ли я делаю и как дальше правильно прописать циклы для выгрузки данных в макет?
1 Лефмихалыч
 
18.07.19
07:46
тут нечем помогать
2 Иванов Иван Иваныч
 
18.07.19
07:55
(1) сарказм?
3 НичегоНе Понятно
 
18.07.19
08:07
(2)Нет. Просто неправильно вообще все.
1. Запрос вернет вообще все счета. Без ограничений по дате, также туда попадут проведенные и не проведенные.
2. В Товары и Товары1 у тебя будет таблица с табличной частью этих документов, это бессмысленно в данном случае.

>>Правильно ли я делаю
нет

>>и как дальше правильно прописать циклы для выгрузки данных в макет?
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий Цикл
    //здесь установить параметры макета
КонецЦикла;
4 Иванов Иван Иваныч
 
18.07.19
08:23
(3) счет в условии не задается, выборка идет с табличной части "Товары", т.е. все что там, должно быть и в результате, как сделать ограничение периодом пока не разобрался, а второй пункт не понял, можете объяснить?
5 catena
 
18.07.19
08:38
"все что там, должно быть и в результате" - со всех документов за все время существования базы?

"как сделать ограничение периодом пока не разобрался" - судя по .Товары.( вы запрос собираете конструктором, там есть закладка, которая так и называется: "Условия".

"второй пункт не понял" - конструкция .Товары.( вернет таблицу значений. Т.е., в результате запроса будет таблица в таблице. Если в задании у вас выбирать из табличной части, то и нужно выбирать из табличной части "Выбрать * из Документ.РеализацияТоваровУслуг.Товары"
6 craxx
 
18.07.19
08:45
(0) позовите программиста
7 dezss
 
18.07.19
09:02
На заре освоения 1с тоже так тупил.
Таб. часть - это отдельная таблица и к ней надо обращаться отдельно, а не из самого документа.
8 Джо-джо
 
18.07.19
09:06
(0) Нет, не правильно. Создание отчета на основании табличного документа это моветон
9 bootini
 
18.07.19
09:14
Как то так, но вряд ли это вас спасет ))    

//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |   ЗаказКлиентаТовары.Ссылка.Партнер КАК Партнер,
        |   ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
        |   ЗаказКлиентаТовары.Количество КАК КоличествоЗаказ,
        |   РеализацияТоваровУслугТовары.Количество КАК КоличествоРеализация
        |ИЗ
        |   Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
        |       ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        |       ПО ЗаказКлиентаТовары.Ссылка = РеализацияТоваровУслугТовары.ЗаказКлиента
        |           И ЗаказКлиентаТовары.Номенклатура = РеализацияТоваровУслугТовары.Номенклатура
        |ГДЕ
        |   ЗаказКлиентаТовары.Ссылка МЕЖДУ &ДатаНачала И &ДатаОкончания
        |   И ЗаказКлиентаТовары.Ссылка.Партнер = &Партнер";
    
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
    Запрос.УстановитьПараметр("Партнер", Партнер);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Партнер = ВыборкаДетальныеЗаписи.Партнер;
        Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
        и т.д.
    КонецЦикла;
    
    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
10 НичегоНе Понятно
 
18.07.19
09:38
(8) +1, но куда деваться, это бы освоить
11 СтоКатов
 
18.07.19
09:39
(10) Лучше осваивать всё-таки с методической литературой, а не методом проб и ошибок, натыкаясь на всевозможные грабли. Возьмите книгу Хрусталёвой, освойте язык запросов и потренируйтесь на кошках, взяв за пример несколько готовых несложных отчётов из типовых конф.
12 Джо-джо
 
18.07.19
09:41
(10) Накуа это осваивать? Намного проще подтянуть данные из регистров и не париться над тем проведён ли документ, отменены ли эти строки и вообще в каком он статусе: надо всем этим уже подумал вендор при проведении документа
13 СтоКатов
 
18.07.19
09:49
(12) ТС явно ещё до регистров не дошёл.
14 Бишбармак
 
18.07.19
10:28
ВЫБРАТЬ
    0 КАК Заявлено,
    РеализацияТоваровУслугТовары.Количество КАК Отпущено,
    РеализацияТоваровУслугТовары.Ссылка.Контрагент,
    РеализацияТоваровУслугТовары.Номенклатура КАК Продукция
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    СчетНаОплатуПокупателюТовары.Количество,
    0,
    СчетНаОплатуПокупателюТовары.Ссылка.Контрагент,
    СчетНаОплатуПокупателюТовары.Номенклатура
ИЗ
    Документ.СчетНаОплатуПокупателю.Товары КАК СчетНаОплатуПокупателюТовары
15 НичегоНе Понятно
 
18.07.19
18:50
(11)(12)Это все понятно. Но человеку отчет нужен здесь и сейчас. А СКД будет позже.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.