1. На работе просто в параметрах принтера поставил 2 страницы на листе и все отлично выводит
2. вот идея алгоритма:
Код 1C v 8.х Макет = ВнешнийОтчетОбъект.ПолучитьМакет("Отчет");
Запрос = Новый Запрос;
ТекстЗ =
"ВЫБРАТЬ
| РеестрНДФЛ.Подразделение КАК Подразделение,
| РеестрНДФЛ.ФизЛицо КАК ФизЛицо,
| ГОД(РеестрНДФЛ.Период) КАК ГодВ,
| МЕСЯЦ(РеестрНДФЛ.Период) КАК МесяцВ,
| РеестрНДФЛ.СтатьиЗатрат КАК СтатьиЗатрат,
| РеестрНДФЛ.Регистратор,
| ВЫБОР
| КОГДА РеестрНДФЛ.ВидДвижения =ВидДвиж
| ТОГДА "" -""
| ИНАЧЕ РеестрНДФЛ.Документ
| КОНЕЦ КАК РеестрНачисленияНДФЛ,
| ВЫБОР
| КОГДА РеестрНДФЛ.ВидДвижения =ВидДвиж
| ТОГДА РеестрНДФЛ.СуммаНДФЛ
| ИНАЧЕ -1 * РеестрНДФЛ.СуммаНДФЛ
| КОНЕЦ КАК НДФЛ,
| ВЫБОР
| КОГДА (НЕ РеестрНДФЛ.ВидДвижения =ВидДвиж)
| ТОГДА РеестрНДФЛ.ВалютнаяСумма
| ИНАЧЕ 0
| КОНЕЦ КАК УдержаноВВалюте,
| РеестрНДФЛ.Период КАК ДатаДокум,
| РеестрНДФЛ.РублевоеПокрытие КАК РублевоеПокрытие
|ИЗ
| РегистрНакопления.РеестрНДФЛ КАК РеестрНДФЛ
|ГДЕ
| РеестрНДФЛ.СуммаНДФЛ <> 0
| И РеестрНДФЛ.Период МЕЖДУПериодН ИПериодК";
Если НЕ ФизЛицо.Пустая() Тогда
ТекстЗ = ТекстЗ + " И РеестрНДФЛ.ФизЛицо =ФизЛицо";
КонецЕсли;
Если НЕ Подразделение.Пустая() Тогда
ТекстЗ = ТекстЗ + " И РеестрНДФЛ.Подразделение В ИЕРАРХИИ(&Подразделение)";
КонецЕсли;
ТекстЗ = ТекстЗ + "
|УПОРЯДОЧИТЬ ПО
| Подразделение,
| ФизЛицо,
| ГодВ,
| МесяцВ,
| СтатьиЗатрат,
| ДатаДокум
|ИТОГИ
| СУММА(НДФЛ),
| СУММА(УдержаноВВалюте),
| СУММА(РублевоеПокрытие)
|ПО
| Подразделение,
| ФизЛицо,
| ГодВ,
| МесяцВ,
| СтатьиЗатрат
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.Текст = ТекстЗ;
Запрос.УстановитьПараметр("ВидДвиж", ВидДвиженияНакопления.Приход);
Запрос.УстановитьПараметр("ПериодК", ПериодК);
Запрос.УстановитьПараметр("ПериодН", ПериодН);
Запрос.УстановитьПараметр("ФизЛицо", ФизЛицо);
Запрос.УстановитьПараметр("Подразделение", Подразделение);
Результат = Запрос.Выполнить();
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьПодразделение = Макет.ПолучитьОбласть("Подразделение");
ОбластьФизЛицо = Макет.ПолучитьОбласть("ФизЛицо");
ОбластьМесяц = Макет.ПолучитьОбласть("Месяц");
ОбластьСтатьиЗатрат = Макет.ПолучитьОбласть("СтатьиЗатрат");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
ОбластьКонИтог = Макет.ПолучитьОбласть("КонИтог");
ОбластьСчет20 = Макет.ПолучитьОбласть("Счет20");
ОбластьСчет68 = Макет.ПолучитьОбласть("Счет68");
ОбластьСчет = Макет.ПолучитьОбласть("Счет");
ИТОГБАЗА = 0;
ИТОГНДФЛНач = 0;
ИТОГНДФЛУд = 0;
ИТОГНДФЛУдР = 0;
ИТОГНДФЛУдВ = 0;
ТабДок.Очистить();
ВыборкаПодразделение = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
//Создадим ТЗ для расчета документов
ТЗдок = Новый ТаблицаЗначений;
ТЗдок.Колонки.Добавить("Реестр");
ТЗдок.Колонки.Добавить("База");
ТЗдок.Колонки.Добавить("НДФЛ");
ТЗдок.Колонки.Добавить("Удержание");
ТЗдок.Колонки.Добавить("Рубли");
ТЗдок.Колонки.Добавить("Валюта");
Пока ВыборкаПодразделение.Следующий() Цикл
ОбластьПодразделение.Параметры.Заполнить(ВыборкаПодразделение);
ТабДок.Вывести(ОбластьПодразделение, ВыборкаПодразделение.Уровень());
ВыборкаФизЛицо = ВыборкаПодразделение.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаФизЛицо.Следующий() Цикл
ОбластьФизЛицо.Параметры.Заполнить(ВыборкаФизЛицо);
ТабДок.Вывести(ОбластьФизЛицо, ВыборкаФизЛицо.Уровень());
//Год
ВыборкаГод = ВыборкаФизЛицо.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаГод.Следующий() Цикл
//месяц
ВыборкаМесяц = ВыборкаГод.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ФизЛицоОтб = ВыборкаФизЛицо.ФизЛицо;
Пока ВыборкаМесяц.Следующий() Цикл
//Обнулим итоги по месяцу
БазаИТ=0;
НДФЛИТ=0;
РублиИТ=0;
ВалютаИТ=0;
ЗапКурс=0;
ОбластьМесяц.Параметры.Месяц = МесяцПрописью(ВыборкаМесяц.МесяцВ)+" "+Формат(ВыборкаГод.ГодВ,"ЧГ=0")+" г.";
//получим курс
ДатаОтч=Дата(Формат(ВыборкаГод.ГодВ,"ЧГ=0"),ВыборкаМесяц.МесяцВ,1);
ДатаUSD=КонецМесяца(ДатаОтч-86400);
ВалютДол =Справочники.Валюты.НайтиПоНаименованию("USD");
Запись = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ДатаUSD, Новый Структура("Валюта", ВалютДол));
ЗапКурс = Запись.Курс / Запись.Кратность;
ОбластьМесяц.Параметры.Курс = ЗапКурс;
ТабДок.Вывести(ОбластьМесяц, ВыборкаМесяц.Уровень());
ВыборкаСтатьиЗатрат = ВыборкаМесяц.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСтатьиЗатрат.Следующий() Цикл
ОбластьСтатьиЗатрат.Параметры.Заполнить(ВыборкаСтатьиЗатрат);
ТабДок.Вывести(ОбластьСтатьиЗатрат, ВыборкаСтатьиЗатрат.Уровень());
ВыборкаДетали = ВыборкаСтатьиЗатрат.Выбрать();
//Вывод документов
ТЗдок.Очистить();
Р=0;
У=0;
Пока ВыборкаДетали.Следующий() Цикл
//Определим дату
ВыбДата=ВыборкаДетали.ДатаДокум;
//Так было до 141010 - НО НЕПРАВИЛЬНО ОТОБРАЖАЛИСЬ ВОЗВРАТЫ
//Если ВыборкаДетали.НДФЛ > 0 Тогда //это реестр
Если Лев(ВыборкаДетали.Регистратор.Метаданные().Имя,6) = "Реестр" Тогда //это реестр
Попытка
новстр = ТЗдок.Получить(Р);
Исключение
новстр = ТЗдок.Добавить();
КонецПопытки;
//новстр = ТЗдок.Вставить(Р);
новстр.Реестр = ВыборкаДетали.Регистратор;
новстр.База = ВыборкаДетали.РублевоеПокрытие;
новстр.НДФЛ = ВыборкаДетали.НДФЛ;
Р=Р+1;
Иначе // это удержание
Попытка
новстр = ТЗдок.Получить(У);
Исключение
новстр = ТЗдок.Добавить();
КонецПопытки;
новстр.Удержание = ВыборкаДетали.Регистратор;
Если ВыборкаДетали.УдержаноВВалюте > 0 тогда
новстр.Рубли = 0;
Иначе
новстр.Рубли = ВыборкаДетали.НДФЛ *(-1);
КонецЕсли;
новстр.Валюта = ВыборкаДетали.УдержаноВВалюте;
У=У+1;
КонецЕсли;
//ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
//ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
КонецЦикла;
//Теперь выведем документы
Для Каждого стр из ТЗдок Цикл
ОбластьДетальныхЗаписей.Параметры.Реестр = СтрЗаменить(Лев(стр.Реестр,СтрДлина(стр.Реестр)-8), "00000","");
ОбластьДетальныхЗаписей.Параметры.База = стр.База;
ОбластьДетальныхЗаписей.Параметры.НДФЛ = стр.НДФЛ;
ОбластьДетальныхЗаписей.Параметры.Удержание = СтрЗаменить(Лев(стр.Удержание,СтрДлина(стр.Удержание)-8), "00000","");
ОбластьДетальныхЗаписей.Параметры.Рубли = стр.Рубли;
ОбластьДетальныхЗаписей.Параметры.Валюта = стр.Валюта;
ТабДок.Вывести(ОбластьДетальныхЗаписей);
КонецЦикла;
//Вывели, теперь итог посчитаем
БазаИТ = БазаИТ + ТЗдок.Итог("База");
НДФЛИТ = НДФЛИТ + ТЗдок.Итог("НДФЛ");
РублиИТ = РублиИТ + ТЗдок.Итог("Рубли");
ВалютаИТ = ВалютаИТ + ТЗдок.Итог("Валюта");
КонецЦикла;
ОбластьПодвалТаблицы.Параметры.БазаИТ = БазаИТ;
ОбластьПодвалТаблицы.Параметры.НДФЛИТ = НДФЛИТ;
ОбластьПодвалТаблицы.Параметры.РублиИТ = РублиИТ;
ОбластьПодвалТаблицы.Параметры.ВалютаИТ = ВалютаИТ;
ИТОГБАЗА = ИТОГБАЗА + БазаИТ;
ИТОГНДФЛНач = ИТОГНДФЛНач + НДФЛИТ;
ИТОГНДФЛУд = ИТОГНДФЛУд + РублиИТ+(ВалютаИТ*ЗапКурс);
ИТОГНДФЛУдР = ИТОГНДФЛУдР + РублиИТ; ИТОГНДФЛУдВ = ИТОГНДФЛУдВ + ВалютаИТ;
Фильтр = Новый Структура;
Фильтр.Вставить("ФизЛицо",ФизЛицоОтб);
НаНачалоМес=0;
НаКонецМес=0;
Попытка
НаНачалоМес=РегистрыНакопления.РеестрНДФЛ.Остатки(НачалоМесяца(ВыбДата),Фильтр,"ФизЛицо","СуммаНДФЛ").Получить(0).СуммаНДФЛ;
Исключение
НаНачалоМес=0;
КонецПопытки;
Попытка
НаКонецМес=РегистрыНакопления.РеестрНДФЛ.Остатки(КонецМесяца(ВыбДата),Фильтр,"ФизЛицо","СуммаНДФЛ").Получить(0).СуммаНДФЛ;
Исключение
НаКонецМес=0;
КонецПопытки;
ОбластьПодвалТаблицы.Параметры.НаНачало = ?(НаНачалоМес>=0," Долг за работником на начало месяца: "+Формат(НаНачалоМес,"ЧДЦ=2"), " Долг за организацией на начало месяца: "+Формат(НаНачалоМес,"ЧДЦ=2"));
ОбластьПодвалТаблицы.Параметры.НаКонец = ?(НаКонецМес>=0," Долг за работником на конец месяца: "+Формат(НаКонецМес,"ЧДЦ=2"), " Долг за организацией на конец месяца: "+Формат(НаКонецМес,"ЧДЦ=2"));
ТабДок.Вывести(ОбластьПодвалТаблицы);
КонецЦикла;//Месяц
КонецЦикла;//Год
КонецЦикла;
КонецЦикла;
НачПериода = ПериодН;
Пока НачалоМесяца(НачПериода)<=НачалоМесяца(ПериодК) Цикл
СтруктураПечати = Новый Структура;
СтруктураПечати.Вставить("DatN",НачалоМесяца(НачПериода));
СтруктураПечати.Вставить("DatK",?(НачалоМесяца(НачПериода)=НачалоМесяца(ПериодК),КонецДня(ПериодК),КонецМесяца(НачПериода)));
СтруктураПечати.Вставить("ОбластьМесяц",Макет.ПолучитьОбласть("Месяц"));
СтруктураПечати.Вставить("ОбластьПодвал",Макет.ПолучитьОбласть("Подвал"));
СтруктураПечати.Вставить("ОбластьСчет",Макет.ПолучитьОбласть("Счет"));
СтруктураПечати.Вставить("ОбластьСчет20",Макет.ПолучитьОбласть("Счет20"));
СтруктураПечати.Вставить("ОбластьСчет68",Макет.ПолучитьОбласть("Счет68"));
Печать7303(СтруктураПечати,ТабДок,ИТОГБАЗА,ИТОГНДФЛНач,ИТОГНДФЛУд,ИТОГНДФЛУдР);
НачПериода = КонецМесяца(НачПериода)+1;
КонецЦикла;
ОбластьКонИтог.Параметры.ИТОГБАЗА = ИТОГБАЗА;
ОбластьКонИтог.Параметры.ИТОГНДФЛНач = ИТОГНДФЛНач;
ОбластьКонИтог.Параметры.ИТОГНДФЛУд = ИТОГНДФЛУд;
ОбластьКонИтог.Параметры.ИТОГНДФЛУдР= ИТОГНДФЛУдР;
ОбластьКонИтог.Параметры.ИТОГНДФЛУдВ = ИТОГНДФЛУдВ;
ТабДок.Вывести(ОбластьКонИтог);
ТабДок.АвтоМасштаб=Истина;
В результате лист поделен на две части в который выводятся данные из ТЗ
Слева:
ТЗдок.Колонки.Добавить("Реестр");
ТЗдок.Колонки.Добавить("База");
ТЗдок.Колонки.Добавить("НДФЛ");
Справа:
ТЗдок.Колонки.Добавить("Удержание");
ТЗдок.Колонки.Добавить("Рубли");
ТЗдок.Колонки.Добавить("Валюта");