Нужно сформировать отчет по двум запросам.
При формировании отчета, не выводит данные первого запроса, а со вторым всё в порядке. Подскажите пожалуйста, в чем ошибка(В 7.7 работаю не давно, больше опыта в 8)
Код
Табличный документ - переменная "Таб". Перезаписывается, после первого запроса. Она же и выводиться последней.
Таб.ВывестиСекцию("Итого");
...
Таб = СоздатьОбъект("Таблица");
Таб = СоздатьОбъект("ТабличныйДокумент");
//Вывод первого отчета
// Вывод второго отчета
Таб.Показать();
Таб = СоздатьОбъект("ТабличныйДокумент");
Таб.ИсходнаяТаблица("Отчет_1");
// Вывод отчета
Таб.Показать();
Таб = СоздатьОбъект("ТабличныйДокумент");
Таб.ИсходнаяТаблица("Отчет_2");
// Вывод второго отчета в другой шаблон
Таб.Показать();
Flexy @ Сегодня, 14:15
,
Суть в том что в 1 таблице одно условие, во второй таблице другое условие. В этом и проблема
СписокУсловий = СоздатьОбъект("СписокЗначений");
СписокУсловий.Добавить(Расчет1);
СписокУсловий.Добавить(Расчет2);
ТекстЗапроса="
...
|Условие(Расчет В СписокУсловий );
ranis @ Сегодня, 14:17
,
Вот диалоговое окно
Вот так должно сформироваться
Так формируется
! | http://pro1c.org.ua/index.php?act=announce&id=2: 8, в следующий раз картинки удалю |
Актуально
ranis, измените макет таким образом, чтобы у Вас секции Итого1, ДатаДок1, Расчет1 итд были вертикальными.
И при обходе результата второго запроса используйте метод ПрисоединитьСекцию().
Как пишет помощник: "В выражении можно задавать имена двух секций, разделенных знаком ''|''. При этом будет получена область исходной таблицы, являющаяся пересечением первой и второй указанных секций. При этом одна секция может быть горизонтальной (состоять из строк), а другая - вертикальной (состоять из колонок). В результате получится прямоугольная область таблицы."
salton @ Сегодня, 14:03
,
Пробывал присоединяя, тоже пустые строчки выходят. Один запрос не проходит, т.к по одному докменту нужно вывести 2 отчета для сравнения. В одном условие один рассчет, в другом другой. Таблицы с данными должн быть параллельные
Выгрузите результат в тз.
Цикл по первой тз
вторая - получитьстрокупономеру (номер строки первой тз)
выводим первую часть
присоединяем вторую
актуально
во-первых, не понимаю этой формулы:
СкидкаКДоходамДляСтраховыхВзносов-СкидкаКДоходамДляСтраховыхВзносов+Число(Величина)
nysysimara @ Сегодня, 9:54
,
1) Величина тип "Неопределенный", а для суммирование как раз та и нужно сделать.
2) Если делать одним запросом, то я не представляю, как объеденить существующие запросы
3) Я не имею представления как работать с таблицами значений
Таблицы обязательно должны быть параллельные?
Нужны ли строки с итоговыми значениями по Дате и по Расчету?
//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать()
Перем Запрос, ТекстЗапроса, Таб;
//Создание объекта типа Запрос
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.КоличествоКолонок(10);//сколько надо
Запрос3 = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС3(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|ДатаДок = Документ.НачисленияУдержанияСписком.ДатаДок;
|Расчет = Документ.НачисленияУдержанияСписком.Расчет;
|НомерДок = Документ.НачисленияУдержанияСписком.НомерДок;
|Величина = Документ.НачисленияУдержанияСписком.Величина;
|СкидкаКДоходамДляСтраховыхВзносов = Документ.НачисленияУдержанияСписком.СкидкаКДоходамДляСтраховыхВзносов;
|Функция СкидкаКДоходамДляСтраховыхВзносовСумма = Сумма(СкидкаКДоходамДляСтраховыхВзносов-СкидкаКДоходамДляСтраховыхВзносов+Число(Величина));
|Группировка ДатаДок без упорядочивания;
|Группировка Расчет;
|Группировка НомерДок;
|Условие(Расчет = ВыбРасчет);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос3.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Пока Для й=1 по Результат1.КоличествоСтрок() Цикл //1
Если й>ТЗ.КоличествоСтрок() Тогда
//в 1 результате вдруг больше строк чем уже есть в ТЗ
ТЗ.НоваяСтрока();
КонецЕсли;
ТЗ.НоваяСтрока();
ТЗ.УстановитьЗначение(й,1,Итого);
ТЗ.УстановитьЗначение(й,2,Расчет);
ТЗ.УстановитьЗначение(й,3,НомерДок);
ТЗ.УстановитьЗначение(й,4,ДатаДок);
КонецЦикла;
////////////////////////////////////////////////////////2222222
Для й=1 по Результат2.КоличествоСтрок() Цикл //2
Если й>ТЗ.КоличествоСтрок() Тогда
//во 2 результате вдруг больше строк чем уже есть в ТЗ
ТЗ.НоваяСтрока();
КонецЕсли;
ТЗ.УстановитьЗначение(й,1,Итого1);
ТЗ.УстановитьЗначение(й,2,Расчет1);
ТЗ.УстановитьЗначение(й,3,НомерДок1);
ТЗ.УстановитьЗначение(й,4,ДатаДок1);
//и т.д.
//
Запрос1 = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС1(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|ДатаДок1 = Документ.НачисленияУдержанияСписком.ДатаДок;
|Расчет1 = Документ.НачисленияУдержанияСписком.Расчет;
|НомерДок1 = Документ.НачисленияУдержанияСписком.НомерДок;
|Величина1 = Документ.НачисленияУдержанияСписком.Величина;
|СкидкаКДоходамДляСтраховыхВзносов1 = Документ.НачисленияУдержанияСписком.СкидкаКДоходамДляСтраховыхВзносов;
|Функция СкидкаКДоходамДляСтраховыхВзносовСумма1 = Сумма(СкидкаКДоходамДляСтраховыхВзносов1-СкидкаКДоходамДляСтраховыхВзносов1+Число(Величина1));
|Группировка ДатаДок1 без упорядочивания;
|Группировка Расчет1;
|Группировка НомерДок1;
|Условие(Расчет1 = ВыбРасчет1);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос1.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
// Заполнение полей "Заголовок"
Таб.ВывестиСекцию("Заголовок");
Состояние("Заполнение выходной таблицы...");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
Для й=1 по ТЗ.КоличествоСтрок() Цикл
// Заполнение полей ДатаДок
Таб.ВывестиСекцию("ДатаДок");
// Заполнение полей Расчет
Таб.ВывестиСекцию("Расчет");
// Заполнение полей НомерДок
Таб.ВывестиСекцию("НомерДок");
КонецЦикла;
// Заполнение полей "Итого"
Таб.ВывестиСекцию("Итого");
// Вывод заполненной формы
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать", "");
КонецПроцедуры
Вот сейчас код написанный с ТЗ. Только он сейчас на переменные ругаетсяПроцедура Сформировать()
Перем Запрос, ТекстЗапроса, Таб;
//Создание объекта типа Запрос
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.КоличествоКолонок(10);//сколько надо
Запрос3 = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС3(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|ДатаДок = Документ.НачисленияУдержанияСписком.ДатаДок;
|Расчет = Документ.НачисленияУдержанияСписком.Расчет;
|НомерДок = Документ.НачисленияУдержанияСписком.НомерДок;
|Величина = Документ.НачисленияУдержанияСписком.Величина;
|СкидкаКДоходамДляСтраховыхВзносов = Документ.НачисленияУдержанияСписком.СкидкаКДоходамДляСтраховыхВзносов;
|Функция Итого = Сумма(СкидкаКДоходамДляСтраховыхВзносов-СкидкаКДоходамДляСтраховыхВзносов+Число(Величина));
|Группировка ДатаДок без упорядочивания;
|Группировка Расчет;
|Группировка НомерДок;
|Условие(Расчет = ВыбРасчет);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос3.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
; Пока Для й=1 по Запрос3.КоличествоСтрок() Цикл //1
Если й>ТЗ.КоличествоСтрок() Тогда
//в 1 результате вдруг больше строк чем уже есть в ТЗ
ТЗ.НоваяСтрока();
КонецЕсли;
ТЗ.НоваяСтрока();
ТЗ.УстановитьЗначение(й,1,Итого);
ТЗ.УстановитьЗначение(й,2,Расчет);
ТЗ.УстановитьЗначение(й,3,НомерДок);
ТЗ.УстановитьЗначение(й,4,ДатаДок);
КонецЦикла;
////////////////////////////////////////////////////////2222222
//
Запрос1 = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС1(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|ДатаДок1 = Документ.НачисленияУдержанияСписком.ДатаДок;
|Расчет1 = Документ.НачисленияУдержанияСписком.Расчет;
|НомерДок1 = Документ.НачисленияУдержанияСписком.НомерДок;
|Величина1 = Документ.НачисленияУдержанияСписком.Величина;
|СкидкаКДоходамДляСтраховыхВзносов1 = Документ.НачисленияУдержанияСписком.СкидкаКДоходамДляСтраховыхВзносов;
|Функция Итого1 = Сумма(СкидкаКДоходамДляСтраховыхВзносов1-СкидкаКДоходамДляСтраховыхВзносов1+Число(Величина1));
|Группировка ДатаДок1 без упорядочивания;
|Группировка Расчет1;
|Группировка НомерДок1;
|Условие(Расчет1 = ВыбРасчет1);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос1.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Для й=1 по Запрос1.КоличествоСтрок() Цикл //2
Если й>ТЗ.КоличествоСтрок() Тогда
//во 2 результате вдруг больше строк чем уже есть в ТЗ
ТЗ.НоваяСтрока();
КонецЕсли;
ТЗ.УстановитьЗначение(й,1,Итого1);
ТЗ.УстановитьЗначение(й,2,Расчет1);
ТЗ.УстановитьЗначение(й,3,НомерДок1);
ТЗ.УстановитьЗначение(й,4,ДатаДок1);
//и т.д.
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
// Заполнение полей "Заголовок"
Таб.ВывестиСекцию("Заголовок");
Состояние("Заполнение выходной таблицы...");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
Для й=1 по ТЗ.КоличествоСтрок() Цикл
// Заполнение полей ДатаДок
Таб.ВывестиСекцию("ДатаДок");
// Заполнение полей Расчет
Таб.ВывестиСекцию("Расчет");
// Заполнение полей НомерДок
Таб.ВывестиСекцию("НомерДок");
КонецЦикла;
// Заполнение полей "Итого"
Таб.ВывестиСекцию("Итого");
// Вывод заполненной формы
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать", "");
КонецЦикла;
КонецПроцедуры
код
а строка таблицы
<ТабОбщ.ДатаДок>|<ТабОбщ.НомерДок>|<ТабОбщ.Расчет>|<ТабОбщ.СкидкаКДоходамДляСтраховыхВзносов>| |<ТабОбщ.ДатаДок>|<ТабОбщ.НомерДок>|<ТабОбщ.Расчет1>|<ТабОбщ.СкидкаКДоходамДляСтраховыхВзносов1>|
nysysimara @ Сегодня, 15:53
,
Пока ТабОбщ.ПолучитьСтроку() <<?>>Цикл
{C:\USERS\FIN\DESKTOP\ГТОВО2.ERT(88)}: Выражение должно иметь логический тип
Пока ТабОбщ.ПолучитьСтроку()=1 Цикл
ranis @ Сегодня, 15:16
,
в свойствах ячеек с данными нужно указать тип="Выражение"
nysysimara @ Сегодня, 16:21
,
Что то тут явно не то
Вот что за нулевые поля?
ranis @ Сегодня, 15:31
,
взамен
ТабОбщ.Сортировать("ДатаДок,НомерДок");
ТабОбщ.Сортировать("ДатаДок,НомерДок,Расчет,Расчет1");
nysysimara @ Сегодня, 16:49
,
в группировке у меня похоже проблема
logist @ Сегодня, 16:53
,
Я не поднял тему, а просто указал, что проблема не решена. И заранее прошу прощения за ошибки, я не знаю всех правил
"Без Итогов"
в обеих запросах. Если нужен итог - пользуйтесь ТЗ.Итог("ИмяКолонки")
salton @ Сегодня, 9:07
,
Это для итого по всему документу?
nysysimara @ Вчера, 16:49
,
Огромное спасибо за помощь . Теперь я хоть что-то представляю. Задача решена, чуть чуть подкорректировал
И всем остальным, выражаю огромную благодарность
Функция СкидкаКДоходамДляСтраховыхВзносовСумма
, а метод ТабОбщ.Итог("СкидкаКДоходамДляСтраховыхВзносовСумма") вернет вам итог по колонке ТабОбщ.СкидкаКДоходамДляСтраховыхВзносовСумма, который Вы потом сможете поместить в конце табличного документа.СуммаСкидкаКДоходамДляСтраховыхВзносовСумма = ТабОбщ.Итог("СкидкаКДоходамДляСтраховыхВзносовСумма");
СуммаСкидкаКДоходамДляСтраховыхВзносовСумма
как выражение.ТабОбщ.Свернуть("ДатаДок,НомерДок,Расчет,Расчет1","СкидкаКДоходамДляСтраховыхВзносовСумма,СкидкаКДоходамДляСтраховыхВзносовСумма1");
СуммаСкидкаКДоходамДляСтраховыхВзносовСумма = ТабОбщ.Итог("СкидкаКДоходамДляСтраховыхВзносовСумма");
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
Таб.ВывестиСекцию("Заголовок");
ТабОбщ.ВыбратьСтроки();
Пока ТабОбщ.ПолучитьСтроку() Цикл
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.ВывестиСекцию("Подвал");
Таб.Показать("Сформировать", "");
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua