Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 мар 2024, 20:56

Печатная форма Документа не скрывает строки макета с пустыми данными

Автор Dmitriy.Pro, 22 дек 2014, 15:20

0 Пользователей и 1 гость просматривают эту тему.

Dmitriy.Pro

Доброго времени суток, Уважаемые участники форума.
Я начинающий программист 1С на платформе 1С:Предприятие 8.2 (8.2.19.106), кофигурация Зарплата и кадры высшего учебного заведения, редакция 1.0 (1.0.76.2.A1.1.54.1022).
В созданной конфигурации существует "ПриемНаРаботуВОрганизацию", имеется модуль объекта, в котором прописана Функция Печатной формы. При печати выводится список сотрудников, принимающих на работу из сформированного запроса. Макет печати Приказа содержит определенные поля с информацией, и если это поле пусто, то оно должно скрываться программно, но почему то это выполняется только для первой записи, а у остальных всё поля отображаются и пустые тоже. (см.вложение.рис.1). А так же код Функции Печати приказа (вложение 2). Макет имеет "Шапка", "СтрокаСотрудник" и "Подвал". В цикле выводится данные по Сотрудникам, которые принимаются на работу. При выполнении никаких ошибок не возникает. Я даже цветом выделял то, что отрабатывает. Но мне это не помогает. Я не пойму в чём ошибка и как мне это исправить (Макет приказа тоже вложен Макет.jpg). Спасибо!

cska-fanat-kz

ну сделайте каждую строку с параметром отдельной секцией и потом
если НЕ ПустаяСтрока(ВложеннаяВыборка.ТабНомер) Тогда
ТабДокумент.Вывести(ОбластьТабНомер);
конецесли;

Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Dmitriy.Pro

Спасибо за ответ, Cska-fanat-kz! Я что то похожее делал, но поскольку не профи в программировании, я не мог довести эту идею до конца. Вот что я сделал по Вашему совету и какая появилась ошибка:
1. в макете каждый параметр сделал отдельной строкой;

2. код Функции печати меньше гораздо стал, но я не понял как их правильно перечислять с условиями, и как я понимаю для каждого отдельного параметра необходимо проверять своё условие?

Функция ПечатьТ12(ИмяМакета)

   ТабДокумент = Новый ТабличныйДокумент;
   ТабДокумент.ПолеСлева = 0;
   ТабДокумент.ПолеСправа = 0;
   ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ПриемНаРаботуВОрганизацию_Т12";
   ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет; //.Ландшафт;

   // получаем данные для печати
   ВыборкаДляШапки    = СформироватьЗапросДляПечати("ПоРеквизитамДокумента").Выбрать();   
   ВыборкаРаботники    = СформироватьЗапросДляПечати("ПоТабличнойЧастиДокумента").Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   
   // подсчитываем количество страниц документа - для корректного разбиения на страницы
   ВсегоСтрокДокумента = РаботникиОрганизации.Количество();    //кол-во строк сотрудников в приказе
   yy = ВсегоСтрокДокумента;                            //кол-во строк сотрудников в приказе
                                                //Сообщить(ПарКол)                                             //Сообщить(ВсегоСтрокДокумента);
   // запоминаем области макета
   Макет = ПолучитьМакет(ИмяМакета);
   ОбластьМакетаШапка    = Макет.ПолучитьОбласть("Шапка"); // Шапка документа.
   ОбластьМакетаПодвал     = Макет.ПолучитьОбласть("Подвал");// Подвал документа
   ОбластьМакета       = Макет.ПолучитьОбласть("СтрокаРаботник"); // строка работника
   ОбластьМакета2      = Макет.ПолучитьОбласть("ТабНомер");
   ОбластьМакета3      = Макет.ПолучитьОбласть("СтрНомПФП");
   ОбластьМакета4      = Макет.ПолучитьОбласть("ДР");
   ОбластьМакета5      = Макет.ПолучитьОбласть("Адрес");
   ОбластьМакета6      = Макет.ПолучитьОбласть("Паспорт");
   ОбластьМакета7      = Макет.ПолучитьОбласть("ДанныеП");
   ОбластьМакета8      = Макет.ПолучитьОбласть("Должность");
   ОбластьМакета9      = Макет.ПолучитьОбласть("ДатаП");
   ОбластьМакета10      = Макет.ПолучитьОбласть("УслПриема");
   ОбластьМакета11      = Макет.ПолучитьОбласть("Оплата");
   ОбластьМакета12      = Макет.ПолучитьОбласть("ПКГ");
   ОбластьМакета13      = Макет.ПолучитьОбласть("ДопИнфо");
   
   // массив с двумя строками - для разбиения на страницы
   ВыводимыеОбласти    = Новый Массив();
   ВыводимыеОбласти.Добавить(ОбластьМакета);
   //ВыводимыеОбласти.Добавить(ОбластьМакета2);//ВыводимыеОбласти.Добавить(ОбластьМакета3);

   // выводим данные о руководителях организации
   Если ВыборкаДляШапки.Следующий() Тогда
   ОбластьМакетаШапка.Параметры.Заполнить(ВыборкаДляШапки);  // Шапка документа.
   ОбластьМакетаПодвал.Параметры.Заполнить(ВыборкаДляШапки); // Для подвала.
   КонецЕсли;

   // Начинаем формировать выходной документ
   ТабДокумент.Очистить();
   ТабДокумент.Вывести(ОбластьМакетаШапка); // Шапка документа.   //ВыведеноСтрок = 0; //ПарКол = ОбластьМакета.Параметры.Количество();   //Сообщить(ПарКол);   

   //// выводим строки по работникам
   Пока ВыборкаРаботники.Следующий() Цикл

      //ВыборкаРаботники.Следующий();
      ВложеннаяВыборка = ВыборкаРаботники.Выбрать();
      ВложеннаяВыборка.Следующий();
      ОбластьМакета.Параметры.Заполнить(ВложеннаяВыборка);

      РезультатСклонения = "";
      Если УниверсальныеМеханизмы.Просклонять(глЗначениеПеременной("глКомпонентаСклоненияФИО"), ВложеннаяВыборка.Работник, 4,ВложеннаяВыборка.ФизЛицоПол, РезультатСклонения) Тогда
         ОбластьМакета.Параметры.Работник   = РезультатСклонения
      КонецЕсли;         
      
      Если Не ПустаяСтрока(ВложеннаяВыборка) Тогда
         ТабДокумент.Вывести(ОбластьМакета);      
      КонецЕсли;


КонецЦикла;
      
   ТабДокумент.Вывести(ОбластьМакетаПодвал);
   
   Возврат ТабДокумент;

КонецФункции // ПечатьТ12()

Я не понял, как В условиях "Не ПустаяСтрока(ВложеннаяВыборка)" ВложеннаяВыборка.ТабНомер? это что за такое свойство "ТабНомер" у объекта "ВложеннаяВыборка"? Система ругается что не понимает что это такое...
А вот, если написать так, как я написал в Условиях, то система ругается:
"{Документ.ПриемНаРаботуВОрганизацию.МодульОбъекта(1100)}: Преобразование значения к типу Строка не может быть выполнено
      Если Не ПустаяСтрока(ВложеннаяВыборка) Тогда "

Или я что то не понимаю в условиях, например система так же не понимает, что такое ОбластьТабНомер в :
ТабДокумент.Вывести(ОбластьТабНомер)? ... ведь область записывается в "", например:
ТабДокумент.Вывести("ТабНомер").

Спасибо!

cska-fanat-kz

1. каждую область назовите осмысленно а не ОбластьМакетаN - черт ногу сломит потом отлаживать!
2. ну параметр у вас называется например ТабельныйНомер или СтраховойНомерПФР. Соответственно проверяйте на заполненность не целиком ВложеннаяВыборка (смысла с этом ваще нет), а ВложеннаяВыборка.ТабельныйНомер или ВложеннаяВыборка.СтраховойНомерПФР...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Dmitriy.Pro

Уважаемый, Cska-fanat-kz!
А в условиях проверки самой ВложеннаяВыборка.??? там что надо правильно писать то? Имя поля в выборке, или имя Псевдонима?

Если Не ПустаяСтрока(ВложеннаяВыборка.???) Тогда
    ТабДокумент.Вывести("Работник");      
КонецЕсли;

И при выводе ТабДокумент.Вывести(???), насколько я понимаю правильно должно быть имя параметра или области? В моем макете получается что одна область-один параметр. В чём разница тогда, вывода области или конкретного параметра?

cska-fanat-kz

Цитата: Dmitriy.Pro от 23 дек 2014, 10:36
Уважаемый, Cska-fanat-kz!
А в условиях проверки самой ВложеннаяВыборка.??? там что надо правильно писать то? Имя поля в выборке, или имя Псевдонима?

Если Не ПустаяСтрока(ВложеннаяВыборка.???) Тогда
    ТабДокумент.Вывести("Работник");      
КонецЕсли;

И при выводе ТабДокумент.Вывести(???), насколько я понимаю правильно должно быть имя параметра или области? В моем макете получается что одна область-один параметр. В чём разница тогда, вывода области или конкретного параметра?

у вас имена полей выборки совпадают с именами параметров макета, иначе не было бы изначально
"ОбластьМакета.Параметры.Заполнить(ВложеннаяВыборка);"

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

Dmitriy.Pro

ООО, прогресс! Получилось, да, я понял суть! Система понимает и выводит только те параметры, которые действительно не пустые, но значения этих непустых параметров не показывает на экране, почему? А вот если заменить "ПустаяСтрока" на "ЗначениеЗаполнено", система вообще не выводит параметры :).
Для четырех параметров я написал код следующий:
Если Не ПустаяСтрока(ВложеннаяВыборка.Работник) Тогда
           ТабДокумент.Вывести(ОбластьМакета);
      КонецЕсли;    
      Если Не ПустаяСтрока(ВложеннаяВыборка.ТабельныйНомер) Тогда
           ТабДокумент.Вывести(омТабНомер);
      КонецЕсли;
      Если Не ПустаяСтрока(ВложеннаяВыборка.СтраховойНомерПФР) Тогда
           ТабДокумент.Вывести(омСтрНомПФП);
      КонецЕсли; 
       Если Не ПустаяСтрока(ВложеннаяВыборка.ДатаРождения) Тогда
           ТабДокумент.Вывести(омДР);
      КонецЕсли;

а вот результат во вложении.

И Параметры в Макете я прописал следующим образом:
// запоминаем области макета
   Макет = ПолучитьМакет(ИмяМакета);
   ОбластьМакетаШапка    = Макет.ПолучитьОбласть("Шапка"); // Шапка документа.
   ОбластьМакетаПодвал = Макет.ПолучитьОбласть("Подвал");// Подвал документа
   ОбластьМакета       = Макет.ПолучитьОбласть("СтрокаРаботник"); // строка работника
   омТабНомер         = Макет.ПолучитьОбласть("ТабНомер");
   омСтрНомПФП         = Макет.ПолучитьОбласть("СтрНомПФП");
   омДР            = Макет.ПолучитьОбласть("ДР");
   омАдрес            = Макет.ПолучитьОбласть("Адрес");
   омПаспорт         = Макет.ПолучитьОбласть("Паспорт");
   омДанныеП         = Макет.ПолучитьОбласть("ДанныеП");
   омДолжность         = Макет.ПолучитьОбласть("Должность");
   омДатаП            = Макет.ПолучитьОбласть("ДатаП");
   омУслПриема         = Макет.ПолучитьОбласть("УслПриема");
   омОплата         = Макет.ПолучитьОбласть("Оплата");
   омПКГ            = Макет.ПолучитьОбласть("ПКГ");
   омДопИнфо         = Макет.ПолучитьОбласть("ДопИнфо");
Добавлено: 23 дек 2014, 12:01


Спасибо еще раз Cska-fanat-kz за ответы и помощь!
На мой вопрос Вы верно ответили и главное, что получилось так как и должно было быть!
А вот, что не показывает непустую информацию - это уже другой вопрос, полазаю в инете и справках, обязательно что нить найду!

Спасибо еще раз!

Решение, было всего то в правильной записи условия для одного параметра макета:
Если Не ПустаяСтрока(ВложеннаяВыборка.ТабельныйНомер) Тогда
  ТабДокумент.Вывести(омТабНомер);
КонецЕсли;

Еще раз Спасибо!

cska-fanat-kz

я бы для таких однотипных кусков как

Если Не ПустаяСтрока(ВложеннаяВыборка.ТабельныйНомер) Тогда
ОбластьМакета = Макет.ПолучитьОбласть("ТабНомер");
ОбластьМакета.Параметры.Заполнить(ВложеннаяВыборка);
           ТабДокумент.Вывести(ОбластьМакета);
      КонецЕсли;

сделал бы отдельную процедуру, например так:
Процедура ВывестиОбластьДанныхСотрудника(ТабДокумент, Макет, ИмяПараметра, Выборка)
    Если Не ЗначениеЗаполнено(Выборка[ИмяПараметра]) Тогда
        ОбластьМакета = Макет.ПолучитьОбласть("Область"+ИмяПараметра);
        ОбластьМакета.Параметры.Заполнить(Выборка);
        ТабДокумент.Вывести(ОбластьМакета);
    КонецЕсли;
КонецПроцедуры

Соответственно для табельного номера вызов будет выглядеть как:
ВывестиОбластьДанныхСотрудника(ТабДокумент, Макет, "ТабельныйНомер", ВложеннаяВыборка);

ну и по образу и подобию размножить...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

cska-fanat-kz

Цитата: Dmitriy.Pro от 23 дек 2014, 11:20А вот, что не показывает непустую информацию

ясное дело почему не показывает. см. выше...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

cska-fanat-kz

Цитата: Dmitriy.Pro от 23 дек 2014, 11:20Если Не ПустаяСтрока(ВложеннаяВыборка.ДатаРождения) Тогда

я же писал, что условие зависит от типа параметра. прослушали (
лучше тогда поменяйте на универсальное "НЕ ЗначениеЗаполнено(...)"
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск