Имя: Пароль:
1C
1С v8
Внешнюю печатная форма. Не получилось разрыв страницы и печать непроведенных док-ов! КАК?
0 koketka
 
26.02.19
23:34
Написала внешнюю печатную форму не получилось реализовать 2 задачи:
1) Сделать разрыв страницы если не умещается последняя строка, итоги и подвал на одном листе (вроде все написала, по мне все так - но не работает!!!)
2) Не дает печатать документ если он не проведен.
3) Скажите по коду если что кому не нравится (Критика по делу приветствуется)
Спасибо)
Функция СведенияОВнешнейОбработке()Экспорт
    
    ПараметрыРегистрации = Новый Структура;
    
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.Премия"); //Указываем документ к которому делаем внешнюю печ. форму
    
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //может быть - ПечатнаяФорма, ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов...
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Ведомость по премиям"); //имя под которым обработка будет зарегестрирована в справочнике внешних обработок
    ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ);
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("Информация", "Внешний отчет по премиям");
    
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(ТаблицаКоманд, "Ведомость по премиям", "ВедомостьПоПремиям", "ВызовСерверногоМетода", Истина, "Печать");
    
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    Возврат ПараметрыРегистрации;
    
КонецФункции


Функция ПолучитьТаблицуКоманд()
    
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));//как будет выглядеть описание печ.формы для пользователя
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); //имя макета печ.формы
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); //ВызовСерверногоМетода
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    
    Возврат Команды;
    
КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = Ложь;
    НоваяКоманда.Модификатор = Модификатор;
    
КонецПроцедуры

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "ВедомостьПоПремиям", "Ведомость по премиям", СформироватьПечатнуюФорму(МассивОбъектов[0], ОбъектыПечати));
    
КонецПроцедуры // Печать()

Функция СформироватьПечатнуюФорму(СсылкаНаДокумент, ОбъектыПечати)
    
    ТабличныйДокумент = Новый ТабличныйДокумент;
    
    ТабличныйДокумент.АвтоМасштаб = Истина;
    ТабличныйДокумент.ПолеСверху  = 10;
    ТабличныйДокумент.ПолеСнизу   = 10;
    ТабличныйДокумент.ПолеСлева   = 0;
    ТабличныйДокумент.ПолеСправа  = 0;
    ТабличныйДокумент.ОриентацияСтраницы  = ОриентацияСтраницы.Ландшафт;
    ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ВедомостьНаПремии";
    
    МакетОбработки = ПолучитьМакет("ВедомостьПремия");
    
    Сз = Новый СписокЗначений;
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000104"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000205"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000106"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000111"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000116"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000119"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000201"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000225"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000633"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000624"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000629"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000630"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000631"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000617"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000040040"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000050050"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000053000"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000984"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000983"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("400001103"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000035"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("400001081"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000093"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000010096"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000090"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("400000997"));
    Сз.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоКоду("400001011"));
    
    Запрос = Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ
    |    ПремияНачисления.Ссылка.ВидПремии КАК ВидПремии,
    |    ПремияНачисления.Сотрудник КАК Сотрудник,
    |    КадроваяИсторияСотрудниковСрезПоследних.ДолжностьПоШтатномуРасписанию КАК ДолжностьПоШтатномуРасписанию,
    |    ДОБАВИТЬКДАТЕ(ПремияНачисления.Ссылка.ПериодРегистрации, МЕСЯЦ, -1) КАК ПериодРегистрации,
    |    ПремияНачисления.ИдентификаторСтрокиВидаРасчета КАК ИдНомер,
    |    ПремияНачисления.Результат КАК Результат,
    |    ТарифныеСеткиДополнительныеРеквизиты.Значение КАК Категория,
    |    ПремияНачисления.Подразделение КАК Подразделение
    |ИЗ
    |    Документ.Премия.Начисления КАК ПремияНачисления
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&ДатаДокумента, ) КАК КадроваяИсторияСотрудниковСрезПоследних
    |        ПО ПремияНачисления.Сотрудник = КадроваяИсторияСотрудниковСрезПоследних.Сотрудник
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ТарифныеСетки.ДополнительныеРеквизиты КАК ТарифныеСеткиДополнительныеРеквизиты
    |        ПО (ТарифныеСеткиДополнительныеРеквизиты.Ссылка = КадроваяИсторияСотрудниковСрезПоследних.ДолжностьПоШтатномуРасписанию.ТарифнаяСетка)
    |            И (ТарифныеСеткиДополнительныеРеквизиты.Свойство = &Свойство)
    |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |            ПодразделенияОрганизаций.Ссылка КАК ПодразделениеДляВедомости
    |        ИЗ
    |            Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
    |        ГДЕ
    |            ПодразделенияОрганизаций.Ссылка В(&СЗ)) КАК ВложенныйЗапрос
    |        ПО (ПремияНачисления.Подразделение.Родитель = ВложенныйЗапрос.ПодразделениеДляВедомости
    |                ИЛИ ПремияНачисления.Подразделение.Родитель.Родитель = ВложенныйЗапрос.ПодразделениеДляВедомости
    |                ИЛИ ПремияНачисления.Подразделение.Родитель.Родитель.Родитель = ВложенныйЗапрос.ПодразделениеДляВедомости
    |                ИЛИ ПремияНачисления.Подразделение.Ссылка = ВложенныйЗапрос.ПодразделениеДляВедомости)
    |ГДЕ
    |    ПремияНачисления.Ссылка = &ТекДокумент
    |    И ВЫБОР
    |            КОГДА ВложенныйЗапрос.ПодразделениеДляВедомости = &ОсобыйСклад
    |                ТОГДА НЕ ПремияНачисления.Подразделение В ИЕРАРХИИ (&ДопСклад)
    |            ИНАЧЕ ПремияНачисления.Подразделение В ИЕРАРХИИ (&СЗ)
    |        КОНЕЦ
    |ИТОГИ ПО
    |    ВложенныйЗапрос.ПодразделениеДляВедомости,
    |    Подразделение";
    
    Запрос.УстановитьПараметр("Свойство",ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Категория"));
    Запрос.УстановитьПараметр("ДатаДокумента",СсылкаНаДокументПремия.Дата);
    Запрос.УстановитьПараметр("ТекДокумент", СсылкаНаДокумент);
    Запрос.УстановитьПараметр("ОсобыйСклад", Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000983"));
    Запрос.УстановитьПараметр("ДопСклад", Справочники.ПодразделенияОрганизаций.НайтиПоКоду("400001103"));
    Запрос.УстановитьПараметр("СЗ",сз);
    
    Результат = Запрос.Выполнить();
    ВыбПодр = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    Пока ВыбПодр.Следующий() Цикл
        
        ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        ОбластьЗаголовок = МакетОбработки.ПолучитьОбласть("Заголовок");
        
        Если СсылкаНаДокумент.ВидПремии.Наименование = "Премия рабочим на повременной оплате труда" Тогда
            ОбластьЗаголовок.Параметры.ДопИнформация = "вспомогательных рабочих за ";
        ИначеЕсли СсылкаНаДокумент.ВидПремии.Наименование = "Премия рабочим на сдельной оплате труда процентом" Тогда
            ОбластьЗаголовок.Параметры.ДопИнформация = "рабочих сдельщиков за ";
        ИначеЕсли СсылкаНаДокумент.ВидПремии.Наименование = "Премия специалистам" Тогда
            ОбластьЗаголовок.Параметры.ДопИнформация = "руководителей, специалистов,служащих за ";
        Конецесли;    
        ОбластьЗаголовок.Параметры.ПериодРегистрации = Формат(ДобавитьМесяц(СсылкаНаДокумент.ПериодРегистрации,-1),"ДФ='MMMM yyyy'");
        ТабличныйДокумент.Вывести(ОбластьЗаголовок);
        
        ИтогоОбщееПремия = 0;
        ИтогоОбщееРасчетнаяБаза = 0;
        Под = 0; Стр = 0;
        ОбластьШапка = МакетОбработки.ПолучитьОбласть("Шапка");
        ТабличныйДокумент.Вывести(ОбластьШапка);
        
        ОбластьСтроки = МакетОбработки.ПолучитьОбласть("Строка");
        ОбластьИтоги = МакетОбработки.ПолучитьОбласть("Итоги");
        ОбластьПодвал = МакетОбработки.ПолучитьОбласть("Подвал");
        
        
        Выб = ВыбПодр.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        Пока Выб.Следующий() Цикл
            Под = Под + 1;
            ОбластьПодразделение = МакетОбработки.ПолучитьОбласть("ПодразделениеНазвание");
            ОбластьПодразделение.Параметры.Подразделение = Выб.Подразделение;
            ТабличныйДокумент.Вывести(ОбластьПодразделение);
            
            Выборка = Выб.Выбрать();
            Пока Выборка.Следующий() Цикл
                Стр = Стр + 1;
                СписокЗн = Новый СписокЗначений;
                СписокЗн.Добавить(Справочники.ПоказателиРасчетаЗарплаты.РасчетнаяБаза);
                СписокЗн.Добавить(Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Процент прогрессивки"));
                СписокЗн.Добавить(Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Процент прогрессивки рабочим"));
                СписокЗн.Добавить(Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Процент прогрессивки вспомогательным рабочим"));
                ОбластьСтроки = МакетОбработки.ПолучитьОбласть("Строка");
                
                ДопЗапрос =Новый Запрос;
                ДопЗапрос.Текст =
                
                "ВЫБРАТЬ
                |    ПремияПоказатели.Показатель КАК Показатель,
                |    ПремияПоказатели.Значение КАК Значение
                |ИЗ
                |    Документ.Премия.Показатели КАК ПремияПоказатели
                |ГДЕ
                |    ПремияПоказатели.ИдентификаторСтрокиВидаРасчета = &ИдНомер
                |    И ПремияПоказатели.Показатель В(&СпискеЗН)
                |    И ПремияПоказатели.Ссылка.Ссылка = &ТекДокумент";
                
                ДопЗапрос.УстановитьПараметр("ИдНомер",Выборка.ИдНомер);
                ДопЗапрос.УстановитьПараметр("СпискеЗН",СписокЗн);
                ДопЗапрос.УстановитьПараметр("ТекДокумент",СсылкаНаДокумент);
                
                ДопРезультат = ДопЗапрос.Выполнить();
                ДопВыборка = ДопРезультат.Выбрать();
                
                ОбластьСтроки.Параметры.ПроцентПремии = 0;
                ОбластьСтроки.Параметры.СуммаПремии   = 0;
                ОбластьСтроки.Параметры.РасчетнаяБаза = 0;
                ОбластьСтроки.Параметры.Категория = "";
                ОбластьСтроки.Параметры.Сотрудник = "";
                ОбластьСтроки.Параметры.Должность = "";
                
                
                Пока ДопВыборка.Следующий()Цикл
                    
                    Если ДопВыборка.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Процент прогрессивки") или
                        ДопВыборка.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Процент прогрессивки рабочим")или
                        ДопВыборка.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Процент прогрессивки вспомогательным рабочим") Тогда
                        ОбластьСтроки.Параметры.ПроцентПремии = ДопВыборка.Значение;
                    ИначеЕсли ДопВыборка.Показатель = Справочники.ПоказателиРасчетаЗарплаты.РасчетнаяБаза Тогда
                        
                        ОбластьСтроки.Параметры.РасчетнаяБаза = ДопВыборка.Значение;
                        ИтогоОбщееРасчетнаяБаза = ИтогоОбщееРасчетнаяБаза + ДопВыборка.Значение;
                    КонецЕсли;    
                    
                КонецЦикла;
                
                ОбластьСтроки.Параметры.ВидОплаты = Выборка.ВидПремии;
                ОбластьСтроки.Параметры.Категория = Выборка.Категория;
                ОбластьСтроки.Параметры.Сотрудник = Выборка.Сотрудник;
                ОбластьСтроки.Параметры.Должность = Выборка.ДолжностьПоШтатномуРасписанию;
                //    ОбластьСтроки.Параметры.ПериодРегистрации = Выборка.ПериодРегистрации;
                ОбластьСтроки.Параметры.СуммаПремии = Выборка.Результат;
                
                ИтогоОбщееПремия = ИтогоОбщееПремия + Выборка.Результат;
                Если Под = Выб.Количество() и Стр = Выборка.Количество() Тогда
                    Сообщить("прывет");

                    МассивВ = Новый Массив;
                    МассивВ.Очистить();
                    МассивВ.Добавить(ОбластьСтроки);
                    МассивВ.Добавить(ОбластьИтоги);
                    МассивВ.Добавить(ОбластьПодвал);
                    Сообщить(МассивВ);
                    Если  не ТабличныйДокумент.ПроверитьВывод(МассивВ) Тогда
                        ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
                        Сообщить("ура");
                        ТабличныйДокумент.Вывести(ОбластьСтроки);
                        
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
            
        КонецЦикла;
        
        ОбластьИтоги.Параметры.ИтогоСуммаПремии = ИтогоОбщееПремия;
        Областьитоги.Параметры.ИтогоРасчетнаяБаза = ИтогоОбщееРасчетнаяБаза;
        ТабличныйДокумент.Вывести(ОбластьИтоги);
        ТабличныйДокумент.Вывести(ОбластьПодвал);
    КонецЦикла;    
    
    
    Возврат ТабличныйДокумент;
    
КонецФункции
1 koketka
 
27.02.19
00:26
и тишина!
2 Йохохо
 
27.02.19
00:57
Под Выб Стр Брр
для читаемости вот это всё Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000104") и СписокЗн можно вынести в соответствие, инициализируемое функцией. И потом в коде тСтруктураПараметров.Получить("МассивПодразделений) тСтруктураПараметров.Получить("ДопРеквизит_Категория")
разрыв вроде должен работать но не по Выб
3 AlvlSpb
 
27.02.19
00:58
(0) "Не дает печатать документ если он не проведен." Это нормально, попробуйте напечатать непроведенный док не впф, получите то же самое.
"Сделать разрыв страницы если не умещается последняя строка"
Смотри метод ПроверитьВывод() и ВывестиГоризонтальныйРазделительСтраниц
4 koketka
 
27.02.19
01:14
изначально был такой код и он не работал!!!
МассивВ = Новый Массив;
МассивВ.Добавить(ОбластьСтроки);
МассивВ.Добавить(ОбластьИтоги);
МассивВ.Добавить(ОбластьПодвал);
Если  не ТабличныйДокумент.ПроверитьВывод(МассивВ) Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
   ТабличныйДокумент.Вывести(ОбластьСтроки);
5 koketka
 
27.02.19
01:14
(3) посмотрела! так я и делала не работатет и все!
6 koketka
 
27.02.19
01:25
Вот что нашла
ТабличныйДокументСтрока = Новый ТабличныйДокумент;
ТабличныйДокументСтрока.Вывести(ОбластьСтроки);          
ТабличныйДокументСтрока.Вывести(ОбластьИтоги);
ТабличныйДокументСтрока.Вывести(ОбластьПодвал);
Если  не ТабличныйДокумент.ПроверитьВывод(ТабличныйДокументСтрока ) Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
7 koketka
 
27.02.19
01:25
Если честно не знаю как это поможет (((
8 koketka
 
27.02.19
01:32
ТабличныйДокументСтрока.ТекущаяОбласть.СоздатьФорматСтрок();          
ТабличныйДокументСтрока.АвтоМасштаб = Истина;
9 Йохохо
 
27.02.19
02:06
(4) и (7) оба допустимые варианты, (8) не про то
Пока не ТабличныйДокумент.ПроверитьВывод(МассивВ) Цикл
МассивВ.Добавить(ОбластьСтроки);
КонецЦикла;
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
Сообщить("ура");
10 Йохохо
 
27.02.19
02:06
просто для теста
11 catena
 
27.02.19
07:28
Ни "не работает", а "не умею готовить".
Не совсем понятно, конечно, как выглядит ваше "не работает", но по приведенному коду вижу два тонких места: заполнение области после проверки, проверка не переде каждым выводом.
12 Мимохожий Однако
 
27.02.19
08:04
Добавь после каждой строчки вывода секции
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
Порадуйся, что вывод работает.
Потом убери лишние