внешняя печатная форма и реквизит формы |
Я |
03.06.10 — 09:30
Как во внешней печатной форме получить значение реквизита формы?
Нужно получить значение реквизита ДатаСведений, на форме элемента справочника «Основные средства» (УПП), через СсылкуНаОбъект не получается, ведь это реквизит формы, а не объекта.
1 — 03.06.10 — 09:35
Форма.ЭлементыФормы.<ЭУ>.Значение
2 — 03.06.10 — 09:37
а как не во внешней получить (в тповой)?
3 — 03.06.10 — 09:37
типовой
4 — 03.06.10 — 09:38
никак
5 — 03.06.10 — 09:38
(0) На форме он, понятное дело, завелся от сырости и значение берет из хрустального шара…
6 — 03.06.10 — 09:39
(5)
=) Забавно!
Действительно посмотри что туда выводится.
7 — 03.06.10 — 09:40
(5)
Процедура ПриОткрытии()
ДатаСведений = КонецДня(РабочаяДата);
И чем это помогло? )
8 — 03.06.10 — 09:41
… ну это меняет дело, а если реквизит на форме правиться пользователем вручную?
9 — 03.06.10 — 09:42
КонецДня(РабочаяДата)
10 — 03.06.10 — 09:42
(8)
Именно это он спокойно может делать.
11 — 03.06.10 — 09:43
(7) дык, тебе текущая дата нужна?
тогда причем здесь форма?
12 — 03.06.10 — 09:44
(7) (8)
ЭтаФорма.ДатаСведений
или просто ДатаСведений
13 — 03.06.10 — 09:46
(12) … нет там «ЭтаФорма» — это вообще ВНЕШНЯЯ О Б Р А Б О Т К А
14 — 03.06.10 — 09:46
(11)
Мне не нужна текущая, мне нужна та, которую на текущий момент выставил пользователь.
(12)
Это внешняя печатная форма. Как мне обратится к форме? Игнорировать ошибку в обработке, что такая переменная не определена?
15 — 03.06.10 — 09:49
(13) ЭтаФорма — есть во всякой форме.
(14) Откуда обратиться? Как ее(форму) создаешь? Создавши имя задаешь?
ИмяФормы.ДатаСведений.
16 — 03.06.10 — 09:51
))))
17 — 03.06.10 — 09:51
(15) ты не в курсе, — хоть одну внешнюю печатную форму создавал?
18 — 03.06.10 — 09:52
прежде чем спрашивать и отвергать надо сначала попробовать
19 — 03.06.10 — 09:52
ЭтаФорма.ИмяРеквизита
20 — 03.06.10 — 09:53
(19) где это писать?
21 — 03.06.10 — 09:53
(18) прежде чем, предлагать и советовать — надо сначала попробовать, или хотя бы теорию подучить
22 — 03.06.10 — 09:54
(20) В модуле формы.
23 — 03.06.10 — 09:55
Кривое решение =)
Делай ВводЗначения… нажал юзер на Печать… открылась формочка
«Введите Дату Сведений»
24 — 03.06.10 — 09:56
Сделай реквизит формы реквизитом документа…
25 — 03.06.10 — 09:57
(24) тогда зачем внешняя печатная форма? Если из-за нее конфигурацию приходится курочить?
26 — 03.06.10 — 09:58
(21)Еще разок.
Вопрос из (0): <Как во внешней печатной форме получить значение реквизита формы?>
Ответ: Реквизит или ЭтаФорма.Реквизит.
Что не так?
27 — 03.06.10 — 09:59
(26)+
прежде чем отвергать надо вопрос нормально задать.
28 — 03.06.10 — 10:01
(26) — там ниже вторая строчка
читать научись
29 — 03.06.10 — 10:02
(26) «Что не так?» — ФОРМЫ НЕТ.
(14) «мне нужна та, которую на текущий момент выставил пользователь.» — нахрена, если она все равно нигде не сохраняется?
30 — 03.06.10 — 10:06
(28) читай «значение реквизита ДатаСведений, на форме элемента справочника «Основные средства» (УПП)» что я не так сказал в (19)
31 — 03.06.10 — 10:07
сделать доступной печатнуюю форму тока после записи Основных средств, и все покатит
32 — 03.06.10 — 10:08
(0) наверно как-то получить экземпляр открытой формы, из которой нажимаешь на Печать и уже потом, Форма.ЭлементыФормы.ДатаСведений.Значение
33 — 03.06.10 — 10:08
(31) ее нет в реквизитах объекта.
переменная экспортная, типа мВалютаРегламнтногоУчета..
34 — 03.06.10 — 10:09
И эти люди берут деньги за свою работу…
Я в ужасе.
35 — 03.06.10 — 10:13
(29) Видимо печатная форма использует эту дату для отдора данных
36 — 03.06.10 — 10:16
ДатаСведений — это реквизит формы, так что нужно его получать из формы справочника ОсновныеСредства, или брать по умолчанию текущую (рабочую) дату, или перед печатью делать запрос на ввод этой даты
37 — 03.06.10 — 10:22
т.е. возможности получить открытую форму по «ссылкаНаОбъект» нет?
38 — 03.06.10 — 10:25
(36) Я еще раз объясняю: если этот реквизит ни на что не влияет и нигде не хранится — то он нафиг не нужен, и вместо него можно смело писать рабочую дату, текущую, или какую угодно. Если он хранится в базе, то, это уже проблемы кривых рук и слепых глаз, что нельзя его получить.
39 — 03.06.10 — 10:35
(37) через СсылкаНаОбъект.ПолучитьФорму()?
40 — 03.06.10 — 10:42
(39) Никаких гарантий.
41 — 03.06.10 — 10:49
(29)
Вопрос задавался больше на будущее, возможно ли такое в принципе и как сделать, что бы не изменять конфигурацию.
В моём конкретном случае, она и не нужна при печати. Использую рабочую дату.
Пример приведён, где столкнулся, что бы нагляднее было посмотреть при желании.
42 — 03.06.10 — 10:50
с бубном и танцами все можно на 1с-ке
маргинал
43 — 03.06.10 — 11:05
СсылкаНаОбъект.ПолучитьФорму().ДатаСведений
Получилось. Спасибо.
Изменение встроенных в типовые конфигурации печатных форм — это, вероятно, одна из наиболее распространенных доработок типовых конфигураций. Чтобы каждый раз не изменять саму конфигурацию, компания «1С» создала механизм внешних печатных форм.
Внешняя печатная форма — это обычная внешняя обработка, соответствующая определенным требованиям. Такую обработку можно подключить к какой-либо типовой конфигурации и тем самым добавить новую печатную форму и/или заменить существующую.
Кроме этого, нужно отметить, что создание внешних печатных форм различается для обычного приложения (Бухгалтерия 2.0.*, ЗиУП 2.5.*, УТ 10.3.*) и управляемого приложения (Бухгалтерия 3.0.*, ЗиУП 3.*, УТ 11.*). В статье будут рассмотрены оба варианта.
Также нужно сказать, что вопросы отладки внешних печатных форм и для управляемого и для обычного приложения рассматриваются в отдельной статье.
Содержание
- Внешняя печатная форма в управляемом приложении
- Создание
- Подключение
- Внешняя печатная форма в обычном приложении
- Создание
- Подключение
Внешняя печатная форма в управляемом приложении
Начнем с того, что в настоящее время встречается чаще — с управляемого приложения. В тексте ниже будет приведен пример создания и подключения внешней печатной формы для документа «Приходный кассовый ордер» (Бухгалтерия предприятия, редакция 3.0).
Создание
Как уже было сказано выше, внешняя печатная форма — это просто-напросто внешняя обработка соответствующая некоторым требованиям. Первым требованием является реализация в модуле печатной формы экспортной функции СведенияОВнешнейОбработке().
Итак, создаем новую внешнюю обработку и в модуле объекта этой обработки размещаем примерно такой код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = Новый Структура; //указываем сведения о внешней печатной форме ПараметрыРегистрации.Вставить(«Вид», «ПечатнаяФорма»); ПараметрыРегистрации.Вставить(«Версия», «1.2»); ПараметрыРегистрации.Вставить(«ВерсияБСП», «3.0.1.287»); ПараметрыРегистрации.Вставить(«Наименование», «Печатная форма для ПКО»); ПараметрыРегистрации.Вставить(«Информация», «Внешняя печатная форма для документов»); //используем безопасный режим, это накладывает некоторые ограничения ПараметрыРегистрации.Вставить(«БезопасныйРежим», Истина); //определим документы и/или справочники //в которых будет использоваться эта печатная форма ПараметрыРегистрации.Вставить(«Назначение», Новый Массив); ПараметрыРегистрации.Назначение.Добавить(«Документ.ПриходныйКассовыйОрдер»); //используется для дополнительных отчетов //подключенных к подсистеме «Варианты отчетов» ПараметрыРегистрации.Вставить(«ОпределитьНастройкиФормы», Ложь); //если требуются исключения из безопасного режима, их можно запросить ПараметрыРегистрации.Вставить(«Разрешения», Новый Массив); ПараметрыРегистрации.Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(«https»,»yandex.ru»,80,»очень надо»)); //определяем таблицу команд ПараметрыРегистрации.Вставить(«Команды», ПолучитьТаблицуКоманд()); //добавляем команду Команда = ПараметрыРегистрации.Команды.Добавить(); Команда.Представление = «Печатная форма для ПКО (внешняя)»; Команда.Идентификатор = «ПечатнаяФормаДляПКО»; Команда.Использование = «ВызовСерверногоМетода»; Команда.ПоказыватьОповещение = Истина; Команда.Модификатор = «ПечатьMXL»; Возврат ПараметрыРегистрации; КонецФункции Функция ПолучитьТаблицуКоманд() Команды = Новый ТаблицаЗначений; Команды.Колонки.Добавить(«Представление», Новый ОписаниеТипов(«Строка»)); Команды.Колонки.Добавить(«Идентификатор», Новый ОписаниеТипов(«Строка»)); Команды.Колонки.Добавить(«Использование», Новый ОписаниеТипов(«Строка»)); Команды.Колонки.Добавить(«ПоказыватьОповещение», Новый ОписаниеТипов(«Булево»)); Команды.Колонки.Добавить(«Модификатор», Новый ОписаниеТипов(«Строка»)); Команды.Колонки.Добавить(«ЗаменяемыеКоманды», Новый ОписаниеТипов(«Строка»)); Возврат Команды; КонецФункции |
Код в основном прокомментирован, но некоторые моменты нужно обговорить отдельно. Функция СведенияОВнешнейОбработке() является общей для всех внешних объектов. Вид внешнего объекта указывается в параметре «Вид» (у нас указана «ПечатнаяФорма»).
Большинство параметров не являются обязательными для заполнения. В нашем случае обязательно указать параметры «Вид», «Версия» и «Команды» — это обязательные параметры для всех видов внешних объектов («Команды» необязательны для отчетов). Кроме этого будет полезно указать параметры «Назначение». Но вообще, желательно указывать как можно больше информации — это поможет не запутаться как Вашим клиентам так и Вам самим.
Параметр «БезопасныйРежим» со значением «Истина» накладывает следующие ограничения:
- игнорируется привилегированный режим;
- запрещена работа с COM;
- запрещена загрузка внешних компонент;
- запрещен запуск внешних приложений и команд ОС;
- запрещен доступ к файловой системе (кроме временных файлов);
- запрещен доступ к интернету.
Параметру «БезопасныйРежим» рекомендуется присваивать значение «Истина». Если необходима какая-либо функциональность, запрещаемая безопасным режимом, то можно получить дополнительное разрешения на эту функциональность (как в примере выше).
Кроме функции СведенияОВнешнейОбработке() необходимо реализовать еще одну экспортную функцию — Печать(). Эта функция должна иметь следующие параметры:
- МассивОбъектов — массив ссылок на объекты, для которых требуется сформировать табличные документы;
- КоллекцияПечатныхФорм — служебная таблица значений, через нее передаются имена макетов для которых могут быть сформированы табличные документы, а также возвращаются синонимы (представления) макетов, сформированные табличные документы и другая информация;
- ОбъектыПечати — список значений, к котором устанавливается соответствие между объектами и именами областей печати табличного документа (нужно для возможности печати комплектов документов);
- ПараметрыВывода — структура с предопределенными ключами, через которую можно вернуть некоторые параметры.
Пример реализации функции Печать():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, «ПечатнаяФормаДляПКО»); Если ПечатнаяФорма <> Неопределено Тогда ПечатнаяФорма.ТабличныйДокумент = СформироватьТабличныйДокумент(МассивОбъектов, ОбъектыПечати); ПечатнаяФорма.СинонимМакета = «Печатная форма для ПКО»; КонецЕсли; КонецПроцедуры Функция СформироватьТабличныйДокумент(МассивОбъектов, ОбъектыПечати) ТабДок = Новый ТабличныйДокумент; Макет = ЭтотОбъект.ПолучитьМакет(«Макет»); ОбластьСтрока = Макет.ПолучитьОбласть(«Строка»); ПервыйДокумент = Истина; Для Каждого ОбъектСсылка Из МассивОбъектов Цикл Если Не ПервыйДокумент Тогда //выводим документы на разных страницах ТабДок.ВывестиГоризонтальныйРазделительСтраниц(); КонецЕсли; ПервыйДокумент = Ложь; НомерСтрокиНачало = ТабДок.ВысотаТаблицы + 1; ОбластьСтрока.Параметры.Документ = ОбъектСсылка; ТабДок.Вывести(ОбластьСтрока); //зададим область печати объекта в табличном документе УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДок, НомерСтрокиНачало, ОбъектыПечати, ОбъектСсылка); КонецЦикла; Возврат ТабДок; КонецФункции |
В коде выше мы находим нашу печатную форму по идентификатору и формируем для нее табличный документ.
Подключение
Подключение нашей внешней печатной формы на примере «Бухгалтерии предприятия, редакция 3.0».
Вкратце повторю основные этапы:
- Открываем вкладку «Администрирование» и переходим в раздел «Печатные формы, отчеты и обработки»;
- Устанавливаем галку «Дополнительные отчеты и обработки» и переходим в раздел «Дополнительные отчеты и обработки»;
- Жмем кнопку «Добавить из файла» и выбираем файл печатной формы;
- (Необязательно) Меняем наименование, комментарии, настраиваем видимость, изменяем размещение;
- Жмем кнопку «Записать и закрыть».
Внешняя печатная форма в обычном приложении
Теперь рассмотрим создание внешней печатной формы в обычном приложении — создадим печатную форму для документа «Приходный кассовый ордер» (Бухгалтерия предприятия, редакция 2.0). Несмотря на то, что задача та же, решается она по другому.
Создание
Внешняя печатная форма в обычном приложении — это внешняя обработка, в которой имеется реквизит «СсылкаНаОбъект» произвольного типа, в который будет передана ссылка на объект, для которого требуется выполнить печать, и экспортной функции Печать() в модуле объекта, которая вызывается без параметров и возвращает табличный документ.
Кроме этого может присутствовать реквизит «ДополнительныеПараметры» произвольного типа, через который, в виде структуры, будут передаваться дополнительные параметры примитивного типа.
Также во внешней печатной форме может присутствовать макет с названием «Параметры_Авторегистрации» в первой колонке которого можно перечислить объекты метаданных, к которым принадлежит печатная форма. Используется этот макет для автоматического заполнения принадлежности печатной формы.
Такой же макет (но с указанием табличной части) используется во внешних обработках табличных частей, о которых имеется отдельная статья.
Пример реализации функции Печать():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Функция Печать() Экспорт ТабДок = Новый ТабличныйДокумент; Макет = ЭтотОбъект.ПолучитьМакет(«Макет»); ОбластьСтрока = Макет.ПолучитьОбласть(«Строка»); ОбластьСтрока.Параметры.Документ = СсылкаНаОбъект; ТабДок.Вывести(ОбластьСтрока); //обращение к дополнительным параметрам рекомендуется снабдить //соответствующими проверками Если ЗначениеЗаполнено(ДополнительныеПараметры) Тогда Если ДополнительныеПараметры.Свойство(«ТестПараметр») Тогда ОбластьСтрока.Параметры.Документ = ДополнительныеПараметры.ТестПараметр; ТабДок.Вывести(ОбластьСтрока); КонецЕсли; КонецЕсли; Возврат ТабДок; КонецФункции |
Подключение
Подключим нашу внешнюю печатную форму на примере «Бухгалтерии предприятия, редакция 2.0».
Основные этапы:
- Открываем справочник внешних печатных форм (Сервис->Дополнительные отчеты и обработки->Дополнительные внешние печатные формы);
- Добавляем новый элемент справочника и указываем файл печатной формы;
- Записываем элемент.
- (Необязательно) Меняем имеющиеся настройки — представления, отборы, дополнительные параметры и прочее.
На этом все, надеюсь, что эта статья была Вам полезна.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Загрузка…
Рассмотрим написание простейшей внешней печатной формы в 1С 8.3 для управляемого приложения на примере конфигураций Бухгалтерия 3.0 и Управление торговлей 11 (данная печатная форма будет работать в обоих этих конфигурациях).
Например нам требуется написать внешнюю печатную форму к документу Реализация товаров и услуг: вывести основные данные документа, а так же из табличной части Товары: номенклатуру, цену, количество и сумму.
Создание внешней обработки
В конфигураторе 1C Предприятия 8 создаем внешнюю обработку (Файл->Новый->Внешняя обработка), задаем имя, добавляем реквизит Документ с типом ДокументСсылка.РеализацияТоваровУслуг, он не является обязательным для работы печатной формы, но пригодится нам для ее регистрации в базе.
Создание макета печатной формы
Добавляем новый макет, тип макета оставляем Табличный документ. На макете создаем три области: Шапка, Данные и Подвал. Сделать это можно выделив нужное количество строк и нажав меню Таблица->Имена->Назначить имя (Ctrl+Shift+N).
Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.
Связаться с нами можно по телефону +7 499 350 29 00.
Услуги и цены можно увидеть по ссылке.
Будем рады помочь Вам!
После этого начинаем располагать в областях текст и параметры. В шапку выведем название печатной формы, номер документа и организацию, а также нарисуем границы шапки таблицы и напишем имена колонок. При создании параметра в свойствах ячейки, на закладке макет следует установить свойство Заполнение в значение Параметр.
В области Данные создадим параметры для вывода строк табличной части(Номенклатура, цена и т.д.), а в области Подвал для итогов по количеству и сумме.
Программирование
Зайдем в модуль объекта печатной формы Действия->Открыть модуль объекта.
Теперь в модуле объекта следует создать обязательную функцию СведенияОВнешнейОбработке(). Она необходима для регистрации печатной формы в справочнике ДополнительныеОтчетыИОбработки, в ней собирается структура с данными для подключения формы. Эта функция, а также ряд сопутствующих ей, практически одинаковы для всех печатных форм, поэтому их можно просто копировать в новую печатную форму ничего не меняя.
Рассмотрим содержание функции СведенияОВнешнейОбработке(). Для начала создадим ее в модуле:
Функция СведенияОВнешнейОбработке() Экспорт КонецФункции
Создадим структуру ПараметрыРегистрации в которой и будут храниться все данные необходимые для регистрации.
ПараметрыРегистрации = Новый Структура;
Создадим массив МассивНазначений в котором будут храниться наименования документов и справочников из которых будет производиться печать.
МассивНазначений = Новый Массив;
Наименование нашей печатной формы запишем в переменную Наименование, для того что бы не прописывать его в ручную вынесем получение наименования в отдельную функцию, которая будет получать его из представления внешней обработки.
Функция УказатьНаименованиеВнешнейПечатнойФормы() Наименование = ЭтотОбъект.Метаданные().Представление(); Возврат Наименование; КонецФункции
А теперь заполним переменную.
Наименование = УказатьНаименованиеВнешнейПечатнойФормы();
Заполним МассивНазначений используя реквизит внешней обработки Документ. Также вынесем получение элемента массива в отдельную функцию.
Функция ПолучитьМетаданныеДокументаПечати() ПолноеИмя = Документ.Метаданные().ПолноеИмя(); Возврат ПолноеИмя; КонецФункции
А теперь добавим полученные данные в массив.
МассивНазначений.Добавить(ПолучитьМетаданныеДокументаПечати());
Конечно этот метод не является правильным для случая, когда у вас несколько назначений, но для одного вполне годится.
Приступим к заполнению структуры ПараметрыРегистрации.
Вид внешней обработки, может быть: ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов, ПечатнаяФорма и т.д.
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
Назначение заполним уже полученным массивом:
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
Наименование из уже заполненной переменной:
ПараметрыРегистрации.Вставить("Наименование", Наименование);
Номер версии можно поставить любой по желанию:
ПараметрыРегистрации.Вставить("Версия", "1.1");
Безопасный режим не даст печатной форме вносить изменения в базу данных. Но она у нас вполне безобидна =), поэтому ставим значение Ложь.
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
В поле Информация вносим описание печатной формы для пользователя. Запишем туда Наименование.
ПараметрыРегистрации.Вставить("Информация", Наименование);
Приступим к созданию команды, которая необходима для вывода на печать нашей печатной формы. Опишем колонки ТаблицыКоманд, вынеся это в отдельную функцию.
Функция ПолучитьТаблицуКоманд() Команды = Новый ТаблицаЗначений; //как будет выглядеть описание печ.формы для пользователя Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); //имя макета печ.формы Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); //ВызовСерверногоМетода Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка")); Возврат Команды; КонецФункции
Вызовем сознанную функцию.
ТаблицаКоманд = ПолучитьТаблицуКоманд();
Добавим команду печати, вынеся этот процесс в отдельную функцию:
Функция ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "") НоваяКоманда = ТаблицаКоманд.Добавить(); НоваяКоманда. Представление = Представление; НоваяКоманда. Идентификатор= Идентификатор; НоваяКоманда. Использование= Использование; НоваяКоманда. ПоказыватьОповещение= ПоказыватьОповещение; НоваяКоманда. Модификатор= Модификатор; КонецФункции
Параметры функции ДобавитьКоманду:
- ТаблицаКоманд — созданная в предыдущей функции Таблица значений с типовым набором полей;
- Представление — передадим в параметр Наименование печатной формы;
- Идентификатор — передадим в параметр полное наименование внешней обработки. Вынесем процесс получения в отдельную функцию:
Функция УказатьНаименованиеКомандыПечати() Наименование = ЭтотОбъект.Метаданные().ПолноеИмя(); Возврат Наименование; КонецФункции
- Использование * — здесь возможны два значения:
- ВызовСерверногоМетода — если обязательная функция Печать() будет находиться в модуле объекта печатной формы и выполняться на стороне сервера(в нашем примере будем использовать именно это значение);
- ВызовКлиентскогоМетода — если обязательная функция Печать() будет находиться в модуле основной формы внешней обработки и выполняться на стороне клиента;
- ПоказыватьОповещение — параметр отвечает за вывод оповещения о печати;
- Модификатор — для печатных форм используется значение ПечатьMXL.
Вызов функции выглядит так:
ДобавитьКоманду(ТаблицаКоманд, Наименование, УказатьНаименованиеКомандыПечати(), "ВызовСерверногоМетода", Истина, "ПечатьMXL");
Осталось передать заполненную таблицу команд в ПараметрыРегистрации:
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
И возвратить их из функции:
Возврат ПараметрыРегистрации;
На этом создание функции СведенияОВнешнейОбработке() завершено, все параметры необходимые для регистрации печатной формы собраны. Вот полный код этой и сопутствующих функций:
Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = Новый Структура; МассивНазначений = Новый Массив; Наименование = УказатьНаименованиеВнешнейПечатнойФормы(); МассивНазначений.Добавить(ПолучитьМетаданныеДокументаПечати()); //может быть - ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов... ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); ПараметрыРегистрации.Вставить("Назначение", МассивНазначений); //имя под которым обработка будет зарегестрирована в справочнике внешних обработок ПараметрыРегистрации.Вставить("Наименование", Наименование); ПараметрыРегистрации.Вставить("Версия", "1.1"); ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); //так будет выглядеть описание печ.формы для пользователя ПараметрыРегистрации.Вставить("Информация", Наименование); ТаблицаКоманд = ПолучитьТаблицуКоманд(); ДобавитьКоманду(ТаблицаКоманд, Наименование, УказатьНаименованиеКомандыПечати(), "ВызовСерверногоМетода", Истина, "ПечатьMXL"); ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); Возврат ПараметрыРегистрации; КонецФункции Функция ПолучитьТаблицуКоманд() Команды = Новый ТаблицаЗначений; //как будет выглядеть описание печ.формы для пользователя Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); //имя макета печ.формы Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); //ВызовСерверногоМетода Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка")); Возврат Команды; КонецФункции Функция УказатьНаименованиеВнешнейПечатнойФормы() Наименование = ЭтотОбъект.Метаданные().Представление(); Возврат Наименование; КонецФункции Функция УказатьНаименованиеКомандыПечати() Наименование = ЭтотОбъект.Метаданные().ПолноеИмя(); Возврат Наименование; КонецФункции Функция ПолучитьМетаданныеДокументаПечати() ПолноеИмя = Документ.Метаданные().ПолноеИмя(); Возврат ПолноеИмя; КонецФункции Функция ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "") НоваяКоманда = ТаблицаКоманд.Добавить(); НоваяКоманда. Представление = Представление; НоваяКоманда. Идентификатор= Идентификатор; НоваяКоманда. Использование= Использование; НоваяКоманда. ПоказыватьОповещение= ПоказыватьОповещение; НоваяКоманда. Модификатор= Модификатор; КонецФункции
Приступим к написанию кода, который будет формировать нашу печатную форму. Так как при создании команды печати мы использовали параметр ВызовСерверногоМетода, то в модуле объекта создаем обязательную серверную процедуру Печать(если использовать ВызовКлиентскогоМетода, то процедура Печать должна быть клиентской и располагаться в модуле основной формы обработки).
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт КонецПроцедуры
- МассивОбъектов — массив содержащий ссылки на печатаемые документы или справочники(аналог СсылкаНаОбъект в обычном приложении);
- КоллекцияПечатныхФорм — таблица значений содержащая сформированные табличные документы;
- ОбъектыПечати — строковой параметр, в котором передаются имена макетов печатных форм перечисленные через запятую;
- ПараметрыВывода – параметры вывода табличных документов на печать.
В процедуре Печать нам следует сформировать табличный документ с данными нашей печатной формы и добавить его в Коллекцию печатных форм. Для заполнения табличного документа создадим в модуле объекта серверную функцию ПечатьФормы, передадим в параметр массив со ссылками на печатаемые документы(МассивОбъектов).
Функция ПечатьФормы(МассивОбъектов) КонецФункции
В функции создадим переменную для табличного документа, в который будет выводится печатная форма, получим макет и области макета.
ТабДок = новый ТабличныйДокумент; Макет = ПолучитьМакет("Макет"); ОбластьШапки = Макет.ПолучитьОбласть("Шапка"); ОбластьДанные = Макет.ПолучитьОбласть("Данные"); ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
Для того чтобы получить строки табличной части Товары всех печатаемых документов используем запрос.
Запрос = новый запрос; Запрос.УстановитьПараметр("МассивОбъектов",МассивОбъектов); Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровУслугТовары.Номенклатура, | РеализацияТоваровУслугТовары.Сумма, | РеализацияТоваровУслугТовары.Цена, | РеализацияТоваровУслугТовары.Количество, | РеализацияТоваровУслугТовары.Ссылка |ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары |ГДЕ | РеализацияТоваровУслугТовары.Ссылка В(&МассивОбъектов)";
В параметр запроса передаем МассивОбъектов, что бы указать в условии ГДЕ, что нам нужны данные только тех документов из которых выводим печатную форму. Чтобы получить выборку запроса, сначала выполняем его, а затем выгружаем.
ОбщаяВыборка = Запрос.Выполнить().Выгрузить();
Теперь при помощи цикла обойдем все ссылки из массива объектов и в одном табличном документесформируем печатные формы для всех выбранных документов.
Для Каждого СсылкаНаОбъект из МассивОбъектов Цикл КонецЦикла;
В данном цикле начнем формирование печатных форм каждого из документов.
Заполним параметры шапки и выведем ее в табличный документ.
ОбластьШапки.Параметры.ТекстЗаголовка = "Печатная форма "+СсылкаНаОбъект.Номер; ОбластьШапки.Параметры.Организация = СсылкаНаОбъект.Организация; ТабДок.Вывести(ОбластьШапки);
Из полученной запросом таблицы значений ОбщаяВыборка выберем строки только по текущему документу, для этого сформируем структуру отбора. Поле структуры должно называться также, как и поле таблицы по которому осуществляется поиск.
Отбор = Новый Структура; Отбор.Вставить("Ссылка",СсылкаНаОбъект);
Теперь отберем нужные строки используя метод НайтиСтроки(<Структура отбора>) и получим выборку по документу.
Выборка = ОбщаяВыборка.НайтиСтроки(Отбор);
Далее в цикле заполняем параметры области Данные для каждой строки выборки документа и выводим их в табличный документ. Также в цикле считаем итоговые значения количества и суммы. Заполнять каждый параметр в отдельности мы не будем, а используем процедуру ЗаполнитьЗначенияСвойств((<Приемник>, <Источник>) из глобального контекста, она копирует значения свойств <Источника> в свойства <Приемника>. Сопоставление производится по именам свойств. Подробнее об этом можно прочитать в синтаксис-помощнике 1С Предприятия 8.
ИтогоСумма = 0; ИтогоКоличество = 0; Для Каждого Стр из Выборка Цикл ЗаполнитьЗначенияСвойств(ОбластьДанные.Параметры,Стр); ИтогоСумма = ИтогоСумма + Стр.Сумма; ИтогоКоличество = ИтогоКоличество + Стр.Количество; ТабДок.Вывести(ОбластьДанные); КонецЦикла;
Заполним и выведем область Подвал.
ОбластьПодвал.Параметры.ИтогоКоличество = ИтогоКоличество; ОбластьПодвал.Параметры.ИтогоСумма = ИтогоСумма; ТабДок.Вывести(ОбластьПодвал);
Для того что бы печатная форма каждого документа выводилась на отдельном листе, поставим горизонтальный разделитель.
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
Возвращаем заполненный табличный документ из функции ПечатьФормы.
Возврат ТабДок;
Код функции ПечатьФормы целиком:
Функция ПечатьФормы(МассивОбъектов) Экспорт ТабДок = новый ТабличныйДокумент; Макет = ПолучитьМакет("Макет"); ОбластьШапки = Макет.ПолучитьОбласть("Шапка"); ОбластьДанные = Макет.ПолучитьОбласть("Данные"); ОбластьПодвал = Макет.ПолучитьОбласть("Подвал"); Запрос = новый запрос; Запрос.УстановитьПараметр("МассивОбъектов",МассивОбъектов); Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровУслугТовары.Номенклатура, | РеализацияТоваровУслугТовары.Сумма, | РеализацияТоваровУслугТовары.Цена, | РеализацияТоваровУслугТовары.Количество, | РеализацияТоваровУслугТовары.Ссылка |ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары |ГДЕ | РеализацияТоваровУслугТовары.Ссылка В(&МассивОбъектов)"; ОбщаяВыборка = Запрос.Выполнить().Выгрузить(); Для Каждого СсылкаНаОбъект из МассивОбъектов Цикл ОбластьШапки.Параметры.ТекстЗаголовка = "Печатная форма "+СсылкаНаОбъект.Номер; ОбластьШапки.Параметры.Организация = СсылкаНаОбъект.Организация; ТабДок.Вывести(ОбластьШапки); Отбор = Новый Структура; Отбор.Вставить("Ссылка",СсылкаНаОбъект); Выборка = ОбщаяВыборка.НайтиСтроки(Отбор); ИтогоСумма = 0; ИтогоКоличество = 0; Для Каждого Стр из Выборка Цикл ЗаполнитьЗначенияСвойств(ОбластьДанные.Параметры,Стр); ИтогоСумма = ИтогоСумма + Стр.Сумма; ИтогоКоличество = ИтогоКоличество + Стр.Количество; ТабДок.Вывести(ОбластьДанные); КонецЦикла; ОбластьПодвал.Параметры.ИтогоКоличество = ИтогоКоличество; ОбластьПодвал.Параметры.ИтогоСумма = ИтогоСумма; ТабДок.Вывести(ОбластьПодвал); ТабДок.ВывестиГоризонтальныйРазделительСтраниц(); КонецЦикла; возврат ТабДок; КонецФункции
Теперь осталось добавить сформированный табличный документ Коллекцию печатных форм. Для добавления табличного документа в коллекцию можно воспользоваться типовой процедурой ВывестиТабличныйДокументВКоллекцию из модуля УправлениеПечатью(процедура есть и в Бухгалтерии 3.0и в Управление торговлей 11). В параметры этой процедуры необходимо передать:
- КоллекцияПечатныхФорм — таблица значений содержащая сформированные табличные документы;;
- ИмяМакета — наименование команды печати;
- СинонимМакета — наименование печатной формы;
- ТабличныйДокумент — заполненный табличный документ.
Для параметров ИмяМакета и СинонимМакета используем уже созданные нами процедуры, которые использовались для заполнения сведений о внешней обработки. Таким образом процедура Печать будет выглядеть следующим образом:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию( КоллекцияПечатныхФорм, УказатьНаименованиеКомандыПечати(), УказатьНаименованиеВнешнейПечатнойФормы(), ПечатьФормы(МассивОбъектов)); КонецПроцедуры
Обратите внимание, что для заполнения параметра ТабличныйДокумент вызывается функция ПечатьФормы, которая описана выше.
На этом создание печатной формы в управляемом приложении завершено, файл с ней доступен можно скачать по ссылке. О том, как подключить печатную форму к документу будет рассказано в следующей статье.
Продолжение следует…
Смотрите видео по созданию внешней печатной формы для управляемого приложения:
SatanInside 0 / 0 / 0 Регистрация: 05.08.2018 Сообщений: 110 |
||||
1 |
||||
Получить реквизит формы29.03.2021, 23:09. Показов 4207. Ответов 18 Метки нет (Все метки)
В документе СписаниеЗапасов в пользовательском режиме создаю свой реквизит Исполнитель. Собственно вопрос: как обратиться к этому реквизиту для вставки его в печатную форму?
но 1С ругается на отсутствие поля, хотя номер и дату документа вставляет без вопросов.
0 |
1808 / 1228 / 442 Регистрация: 16.01.2015 Сообщений: 5,396 |
|
29.03.2021, 23:34 |
2 |
Это как добавлять реквизит в пользовательском режиме? Может Доп реквизит? Так тогда и обращайтесь не к реквизиту формы а к доп реквизиту. Или что-то не так изложили в вопросе
0 |
SatanInside 0 / 0 / 0 Регистрация: 05.08.2018 Сообщений: 110 |
||||
29.03.2021, 23:47 [ТС] |
3 |
|||
Извините за беспокойство, подсказали:
0 |
1808 / 1228 / 442 Регистрация: 16.01.2015 Сообщений: 5,396 |
|
29.03.2021, 23:56 |
4 |
SatanInside, Теперь ясно. Вы добавили Дополнительный реквизит. А точно всего два параметра передается? Работает? Потому что проверил в БСП — там 4 параметра.
0 |
0 / 0 / 0 Регистрация: 05.08.2018 Сообщений: 110 |
|
29.03.2021, 23:57 [ТС] |
5 |
да, с одним параметром сработало. сейчас на другие повесил, хочу проверить. у меня просто долго поднимается.
0 |
polax |
29.03.2021, 23:58
|
Не по теме: Век живи, век учись. Понятия не имел, что в БСП есть такая ценная функция. Сам бы просто обратился к доп реквизитам через ПВХ
0 |
0 / 0 / 0 Регистрация: 05.08.2018 Сообщений: 110 |
|
30.03.2021, 00:09 [ТС] |
7 |
а вот мне бы реквизиты организации получить в печатную форму и заполнить таблицу в печатной форме, заполнив её значениями из таблицы документа. не подскажите как сделать?
0 |
polax 1808 / 1228 / 442 Регистрация: 16.01.2015 Сообщений: 5,396 |
||||
30.03.2021, 00:30 |
8 |
|||
По организации (две первых функции- подсказка (тоже БСП)
Добавлено через 1 минуту
0 |
0 / 0 / 0 Регистрация: 05.08.2018 Сообщений: 110 |
|
30.03.2021, 00:35 [ТС] |
9 |
БСП — это что? Добавлено через 4 минуты
0 |
polax 1808 / 1228 / 442 Регистрация: 16.01.2015 Сообщений: 5,396 |
||||
30.03.2021, 00:48 |
10 |
|||
БСП — это что? Библиотека Стандартных Подсистем — подготовленные решения для часто встречающихся задач, встроенные в конфигурцию
Как раз и есть одна из функций БСП. Общий модуль УправлениеСвойствами, функция ЗначениеСвойства
это вроде как-то циклом делается Все эти запросы и циклы уже прописаны в функциях БСП
0 |
0 / 0 / 0 Регистрация: 05.08.2018 Сообщений: 110 |
|
30.03.2021, 00:49 [ТС] |
11 |
блин, с Исполнителем прокатило, а с другими параметрами нет. Выясняю причину
0 |
Yulunga 1142 / 689 / 203 Регистрация: 22.04.2013 Сообщений: 5,160 Записей в блоге: 1 |
||||
30.03.2021, 07:11 |
12 |
|||
в этой вашей функции написато:
то есть она штото возвращает, если есть значение доп реквизита.
0 |
1808 / 1228 / 442 Регистрация: 16.01.2015 Сообщений: 5,396 |
|
30.03.2021, 08:30 |
13 |
с Исполнителем прокатило, а с другими параметрами нет Потому что УправлениеСвойствами.ЗначениеСвойств работает только именно для доп реквизитов, чем и является ваш исполнитель. Остальные реквизиты НЕ дополнительные и получить их этой функцией нельзя.
0 |
0 / 0 / 0 Регистрация: 05.08.2018 Сообщений: 110 |
|
30.03.2021, 08:36 [ТС] |
14 |
То есть если я _вручную_ создаю реквизиты, то они НЕ являются дополнительными? Миниатюры
0 |
0 / 0 / 0 Регистрация: 05.08.2018 Сообщений: 110 |
|
30.03.2021, 08:37 [ТС] |
15 |
Посмотрите, на картинку. Все эти реквизиты созданы мной в пользовательском режиме.
0 |
1142 / 689 / 203 Регистрация: 22.04.2013 Сообщений: 5,160 Записей в блоге: 1 |
|
30.03.2021, 09:46 |
16 |
SatanInside, смотря как вы их получаете
0 |
1808 / 1228 / 442 Регистрация: 16.01.2015 Сообщений: 5,396 |
|
30.03.2021, 10:01 |
17 |
Все эти реквизиты созданы мной в пользовательском режиме. Да. Это все доп реквизиты и должны получаться так же как и Исполнитель. Значит неверно задаете имя реквизита
0 |
369 / 173 / 74 Регистрация: 04.03.2020 Сообщений: 659 |
|
30.03.2021, 14:11 |
18 |
в БСП есть такая ценная функция Прошу пардону, что вклиниваюсь, как раз сегодня сегодня пришло на почту в составе еженедельной рассылки инфостарта:
1 |
polax |
30.03.2021, 18:22
|
Не по теме: Scratchsv, Вот за это огромное спасибо. Размести эту ссылку в курилке в Полезные ссылки
0 |