Вывод на печать табличного документа в 1С 8.3. Используем команды объектов

В предыдущей статье мы научились выводить табличный документ на печать, применяя при этом команду формы, что, согласитесь, может быть неудобно: мы не можем распечатать документ из списка, мы не можем распечатать несколько документов из того же списка документов, если это нужно.  Поэтому, в этой статье я покажу, как реализовать более универсальную возможность печати табличного документа, используя команду объекта. Для этого мы создадим подчиненную нужному объекту команду, при выполнении которой будет показываться один или несколько табличных документов.

С тем, как был создан макет табличного документа (его мы и будем использовать), можете ознакомиться в этой статье:

Создание макета табличного документа в 1С 8.3

А как было реализовано заполнение табличного документа, и осуществлен простой способ его вывода можете ознакомиться в этой статье:

Заполнение табличного документа и ввод на печать

И так, создадим подчиненную нашему документу команду печати.

Создание команды печати

После выполнения команды Добавить контекстного меню, будет создана подчиненная документу команда, открыт модуль этой команды, и справа откроется окно палитры свойств вновь созданной команды.

Модуль и палитра свойств команды

Назовем новую команду ПечатьНакладной.

Имя команды объекта

Следующим шагом, нам нужно выбрать группу, в которой эта команда будет отображаться. Поскольку команду должна быть доступна на управляемой форме (или в форме документа, или в форме списка), то и группу нужно выбрать, связанную с формой.  Поэтому выберем группу «Командная панель формы. Важное», если мы так сделаем, то кнопка команды печати будет отображаться в командной панели управляемой формы.

Выбор группы команды

Теперь, необходимо выбрать тип параметра, который будет передан в команду при её выполнении.  Мы выберем ссылку на документ, которому эта команда подчинена.

Выбор типа параметра команды

В следующий параметр — «Режим использование параметра» установим значение  Множественный, чтобы можно было выделить в форме списка несколько документов, и к ним применить команду.

Режим использования параметров

На этом мы закончим настройку свойств команды и перейдем к основной разработке: получению данных документов и заполнение табличного документа этими данными.

Делать всю эту работу мы будет в модуле менеджера документа.  В принципе, всю эту работу можно было сделать и в модуле команды, но мы сделаем в модуле менеджера,  чтобы потенциально этот код можно было применять и в других случаях. В модуле команды мы будем просто выводить табличный документ на просмотр. Поэтому откроем модуль менеджера документа.

Открываем модуль менеджера документа

В этом модуле напишем экспортную функцию, в которую в качестве параметров будет передан массив документов (как мы его будем получать, разберем ниже).

Функция СформироватьПечатныйДокумент(МассивДокументов) Экспорт

КонецФункции

В этой функции первым делом создадим программно табличный документ 1С и получим макет, который был создан ранее в статье.

ТабДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");

О том как этот макет сделан, читайте здесь: Создание макета табличного документа в 1С 8.3

Теперь я сделаю иерархический запрос, в котором в верхнем уровне иерархии будут документы, на детальном уровне данные из табличной части.

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |    ПриходТовара.Проведен КАК Проведен,
               |    ПриходТовара.Номер КАК Номер,
               |    ПриходТовара.Дата КАК Дата,
               |    ПриходТовараСписокТоваров.НомерСтроки КАК НомерСтроки,
               |    ПриходТовараСписокТоваров.Номенклатура.Наименование КАК Номенклатура,
               |    ПриходТовараСписокТоваров.Количество КАК Количество,
               |    ПриходТовараСписокТоваров.Цена КАК Цена,
               |    ПриходТовараСписокТоваров.Сумма КАК Сумма,
               |    ПриходТовара.Ссылка КАК Ссылка
               |ИЗ
               |    Документ.ПриходТовара.СписокТоваров КАК ПриходТовараСписокТоваров
               |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриходТовара КАК ПриходТовара
               |        ПО ПриходТовараСписокТоваров.Ссылка = ПриходТовара.Ссылка
               |ГДЕ
               |    ПриходТовара.Ссылка В(&Массив)
               |ИТОГИ ПО
               |    Ссылка";
Запрос.УстановитьПараметр("Массив",МассивДокументов);

Заметьте, в качестве параметра в запрос был передан массив документов, который был передан в нашу функцию также в качестве параметра.
Теперь получим итоговую выборку по документу, будем обходить эту выборку, а если документ не проведен, то выведем сообщение и ни чего дальше делать не будем.

ВыборкаДокумент = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Ссылка");
ЕстьПечать = Ложь;
Пока ВыборкаДокумент.Следующий() Цикл
    Если Не ВыборкаДокумент.Проведен Тогда
        Сообщить("Документ №" + ВыборкаДокумент.Номер + " от " + ВыборкаДокумент.Дата + " не проведен!");
        Продолжить;
    КонецЕсли;

КонецЦикла;

Если всё нормально, то мы выводим шапку документа и таблицы, как мы это делали в предыдущей статье.

Вывод на печать табличного документа. Простой пример.

Шапка = Макет.ПолучитьОбласть("Шапка");
Шапка.Параметры.НомерДок = ВыборкаДокумент.Номер;
Шапка.Параметры.ДатаДок  = Формат(ВыборкаДокумент.Дата,"ДФ=dd.MM.yyyy");
ТабДокумент.Вывести(Шапка);

ШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ТабДокумент.Вывести(ШапкаТаблицы);

Нам осталось получить выборку табличной части документа, обойти её и заполнить соответствующую область.

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

Получим и выведем подвал, а также выведем горизонтальный разделитель таблиц, чтобы каждый документ печатался на отдельном листе.

ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ТабДокумент.Вывести(ОбластьПодвал);
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();

Закончим работать с циклом и вернем табличный документ, если он заполнился (для проверки этого факта, я создал переменную, которой присваиваю истина, если табличный документ заполняется данными).

ЕстьПечать = ТабДокумент.Области.Количество() > 0;	
Возврат ?(ЕстьПечать, ТабДокумент, Неопределено);

На этом мы закончим работать с функцией в менеджере модуля. Она в целом будет иметь следующий вид.

Функция СформироватьПечатныйДокумент(МассивДокументов) Экспорт 
	
	ТабДокумент = Новый ТабличныйДокумент;
	Макет = ПолучитьМакет("Макет");
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	ПриходТовара.Проведен КАК Проведен,
	               |	ПриходТовара.Номер КАК Номер,
	               |	ПриходТовара.Дата КАК Дата,
	               |	ПриходТовараСписокТоваров.НомерСтроки КАК НомерСтроки,
	               |	ПриходТовараСписокТоваров.Номенклатура.Наименование КАК Номенклатура,
	               |	ПриходТовараСписокТоваров.Количество КАК Количество,
	               |	ПриходТовараСписокТоваров.Цена КАК Цена,
	               |	ПриходТовараСписокТоваров.Сумма КАК Сумма,
	               |	ПриходТовара.Ссылка КАК Ссылка
	               |ИЗ
	               |	Документ.ПриходТовара.СписокТоваров КАК ПриходТовараСписокТоваров
	               |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриходТовара КАК ПриходТовара
	               |		ПО ПриходТовараСписокТоваров.Ссылка = ПриходТовара.Ссылка
	               |ГДЕ
	               |	ПриходТовара.Ссылка В(&Массив)
	               |ИТОГИ ПО
	               |	Ссылка";
	Запрос.УстановитьПараметр("Массив",МассивДокументов);
	
	ВыборкаДокумент = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Ссылка");
	Пока ВыборкаДокумент.Следующий() Цикл 
		Если Не ВыборкаДокумент.Проведен Тогда 
			Сообщить("Документ №" + ВыборкаДокумент.Номер + " от " + ВыборкаДокумент.Дата + " не проведен!");
			Продолжить;
		КонецЕсли;	
		
		Шапка = Макет.ПолучитьОбласть("Шапка");
		Шапка.Параметры.НомерДок = ВыборкаДокумент.Номер;
		Шапка.Параметры.ДатаДок  = Формат(ВыборкаДокумент.Дата,"ДФ=dd.MM.yyyy");
		ТабДокумент.Вывести(Шапка);
		
		ШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
		ТабДокумент.Вывести(ШапкаТаблицы);

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

Откроем модуль команды, которую мы создали ранее.

Открыть модуль команды

В этом модуле уже будет существовать обработка команды в клиентском контексте, которая была образована при создании команды.

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

КонецПроцедуры

Обратите внимание на параметр ПараметрКоманды, в этом параметре и содержится массив документов. Это именно массив, потому что при создании команды мы в свойстве команды «Режим использования данных» указали Множественный. Именно этот массив мы и передадим в функцию, которую создали в модуле менеджера объекта.

Создадим в модуле команды функцию в серверном контексте, которая будет обращаться к ранее созданной функции из модуля менеджера документа и возвращать табличный документ. А если документ заполнен, то выведем его на просмотр.

&НаСервере
Функция ПолучитьТабличныеДокументы(МассивДокументов)
     Возврат Документы.ПриходТовара.СформироватьПечатныйДокумент(МассивДокументов);
КонецФункции

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

Теперь мы можем распечатать сразу несколько документов из формы списка документов.

Команда на форме списка документов

Печать нескольких документов

Для распечатывания нескольких документов, необходимо выделить мышкой нужные документы и выполнить команду печати.

Использование расшифровки табличного документа
Расшифровка в табличном документе 1С 8.3

Вывод табличного документ на управляемой форме
Табличный документ на управляемой форме 1С 8.3

Если Вы всё еще «плаваете» в конструкциях языка запросов, и у Вас вызывают трудности даже самые простые запросы, то рекомендую вам мой курс «Запросы в 1С от новичка до профи». Где эти и многие другие вопросы рассматриваются более подробно.

В чем особенность этого курса:
• Курс рассчитан на тех, кто не знаком с языком запросов в 1С;
• Учебный материал грамотно скомпонован и прост в освоении;
• Несколько десятков уроков;
• Полезные практические примеры;
• Все уроки изложены понятным и простым языком

Для моих читателей, купон на скидку 25%: hrW0rl9Nnx

 

Более подробно и основательно разработка в 1С дается в моей книге: «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

 

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

One Reply to “Вывод на печать табличного документа в 1С 8.3. Используем команды объектов”

  1. Спасибо большое, очень помогло в разработке печати своего документа в УНФ.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *