В предыдущей статье мы научились выводить табличный документ на печать, применяя при этом команду формы, что, согласитесь, может быть неудобно: мы не можем распечатать документ из списка, мы не можем распечатать несколько документов из того же списка документов, если это нужно. Поэтому, в этой статье я покажу, как реализовать более универсальную возможность печати табличного документа, используя команду объекта. Для этого мы создадим подчиненную нужному объекту команду, при выполнении которой будет показываться один или несколько табличных документов.
С тем, как был создан макет табличного документа (его мы и будем использовать), можете ознакомиться в этой статье:
Создание макета табличного документа в 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 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009
Спасибо большое, очень помогло в разработке печати своего документа в УНФ.