Внешняя печатная форма получить реквизит формы

внешняя печатная форма и реквизит формы

Я
   маргинал

03.06.10 — 09:30

Как во внешней печатной форме получить значение реквизита формы?

Нужно получить значение реквизита ДатаСведений, на форме элемента справочника «Основные средства» (УПП), через СсылкуНаОбъект не получается, ведь это реквизит формы, а не объекта.

  

Партнерская программа EFSOL Oblako

   lxs

1 — 03.06.10 — 09:35

Форма.ЭлементыФормы.<ЭУ>.Значение

   RomaH

2 — 03.06.10 — 09:37

а как не во внешней получить (в тповой)?

   RomaH

3 — 03.06.10 — 09:37

типовой

   RomaH

4 — 03.06.10 — 09:38

никак

   Defender aka LINN

5 — 03.06.10 — 09:38

(0) На форме он, понятное дело, завелся от сырости и значение берет из хрустального шара…

   Megas

6 — 03.06.10 — 09:39

(5)

=) Забавно!

Действительно посмотри что туда выводится.

   маргинал

7 — 03.06.10 — 09:40

(5)
Процедура ПриОткрытии()    
   ДатаСведений = КонецДня(РабочаяДата);

И чем это помогло? )

   RomaH

8 — 03.06.10 — 09:41

… ну это меняет дело, а если реквизит на форме правиться пользователем вручную?

   Шпиндельная бабка

9 — 03.06.10 — 09:42

КонецДня(РабочаяДата)

   маргинал

10 — 03.06.10 — 09:42

(8)
Именно это он спокойно может делать.

   and2

11 — 03.06.10 — 09:43

(7) дык, тебе текущая дата нужна?

тогда причем здесь форма?

   73

12 — 03.06.10 — 09:44

(7) (8)

ЭтаФорма.ДатаСведений

или просто ДатаСведений

   RomaH

13 — 03.06.10 — 09:46

(12) … нет там «ЭтаФорма» — это вообще ВНЕШНЯЯ О Б Р А Б О Т К А

   маргинал

14 — 03.06.10 — 09:46

(11)
Мне не нужна текущая, мне нужна та, которую на текущий момент выставил пользователь.
(12)
Это внешняя печатная форма. Как мне обратится к форме? Игнорировать ошибку в обработке, что такая переменная не определена?

   73

15 — 03.06.10 — 09:49

(13) ЭтаФорма — есть во всякой форме.

(14) Откуда обратиться? Как ее(форму) создаешь? Создавши имя задаешь?

ИмяФормы.ДатаСведений.

   kotletka

16 — 03.06.10 — 09:51

))))

   RomaH

17 — 03.06.10 — 09:51

(15) ты не в курсе, — хоть одну внешнюю печатную форму создавал?

   kotletka

18 — 03.06.10 — 09:52

прежде чем спрашивать и отвергать надо сначала попробовать

   kotletka

19 — 03.06.10 — 09:52

ЭтаФорма.ИмяРеквизита

   RomaH

20 — 03.06.10 — 09:53

(19) где это писать?

   RomaH

21 — 03.06.10 — 09:53

(18) прежде чем, предлагать и советовать — надо сначала попробовать, или хотя бы теорию подучить

   73

22 — 03.06.10 — 09:54

(20) В модуле формы.

   Megas

23 — 03.06.10 — 09:55

Кривое решение =)

Делай ВводЗначения… нажал юзер на Печать… открылась формочка
«Введите Дату Сведений»

   Megas

24 — 03.06.10 — 09:56

Сделай реквизит формы реквизитом документа…

   hhhh

25 — 03.06.10 — 09:57

(24) тогда зачем внешняя печатная форма? Если из-за нее конфигурацию приходится курочить?

   73

26 — 03.06.10 — 09:58

(21)Еще разок.

Вопрос из (0): <Как во внешней печатной форме получить значение реквизита формы?>

Ответ: Реквизит или ЭтаФорма.Реквизит.

Что не так?

   73

27 — 03.06.10 — 09:59

(26)+

прежде чем отвергать надо вопрос нормально задать.

   RomaH

28 — 03.06.10 — 10:01

(26) — там ниже вторая строчка
читать научись

   Defender aka LINN

29 — 03.06.10 — 10:02

(26) «Что не так?» — ФОРМЫ НЕТ.

(14) «мне нужна та, которую на текущий момент выставил пользователь.» — нахрена, если она все равно нигде не сохраняется?

   kotletka

30 — 03.06.10 — 10:06

(28) читай «значение реквизита ДатаСведений, на форме элемента справочника «Основные средства» (УПП)» что я не так сказал в (19)

   kotletka

31 — 03.06.10 — 10:07

сделать доступной печатнуюю форму тока после записи Основных средств, и все покатит

   zzerro

32 — 03.06.10 — 10:08

(0) наверно как-то получить экземпляр открытой формы, из которой нажимаешь на Печать и уже потом, Форма.ЭлементыФормы.ДатаСведений.Значение

   and2

33 — 03.06.10 — 10:08

(31) ее нет в реквизитах объекта.

переменная экспортная, типа мВалютаРегламнтногоУчета..

   Defender aka LINN

34 — 03.06.10 — 10:09

И эти люди берут деньги за свою работу…

Я в ужасе.

   zzerro

35 — 03.06.10 — 10:13

(29) Видимо печатная форма использует эту дату для отдора данных

   zzerro

36 — 03.06.10 — 10:16

ДатаСведений — это реквизит формы, так что нужно его получать из формы справочника ОсновныеСредства, или брать по умолчанию текущую (рабочую) дату, или перед печатью делать запрос на ввод этой даты

   RomaH

37 — 03.06.10 — 10:22

т.е. возможности получить открытую форму по «ссылкаНаОбъект» нет?

   Defender aka LINN

38 — 03.06.10 — 10:25

(36) Я еще раз объясняю: если этот реквизит ни на что не влияет и нигде не хранится — то он нафиг не нужен, и вместо него можно смело писать рабочую дату, текущую, или какую угодно. Если он хранится в базе, то, это уже проблемы кривых рук и слепых глаз, что нельзя его получить.

   kotletka

39 — 03.06.10 — 10:35

(37) через СсылкаНаОбъект.ПолучитьФорму()?

   Defender aka LINN

40 — 03.06.10 — 10:42

(39) Никаких гарантий.

   маргинал

41 — 03.06.10 — 10:49

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

   kotletka

42 — 03.06.10 — 10:50

с бубном и танцами все можно на 1с-ке

  

маргинал

43 — 03.06.10 — 11:05

СсылкаНаОбъект.ПолучитьФорму().ДатаСведений

Получилось. Спасибо.

Изменение встроенных в типовые конфигурации печатных форм — это, вероятно, одна из наиболее распространенных доработок типовых конфигураций. Чтобы каждый раз не изменять саму конфигурацию, компания «1С» создала механизм внешних печатных форм.

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

Кроме этого, нужно отметить, что создание внешних печатных форм различается для обычного приложения (Бухгалтерия 2.0.*, ЗиУП 2.5.*, УТ 10.3.*) и управляемого приложения (Бухгалтерия 3.0.*, ЗиУП 3.*, УТ 11.*). В статье будут рассмотрены оба варианта.

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

Содержание

  1. Внешняя печатная форма в управляемом приложении
  2. Создание
  3. Подключение
  4. Внешняя печатная форма в обычном приложении
  5. Создание
  6. Подключение

Внешняя печатная форма в управляемом приложении

Начнем с того, что в настоящее время встречается чаще — с управляемого приложения. В тексте ниже будет приведен пример создания и подключения внешней печатной формы для документа «Приходный кассовый ордер» (Бухгалтерия предприятия, редакция 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».

Вкратце повторю основные этапы:

  1. Открываем вкладку «Администрирование» и переходим в раздел «Печатные формы, отчеты и обработки»;
  2. Устанавливаем галку «Дополнительные отчеты и обработки» и переходим в раздел «Дополнительные отчеты и обработки»;
  3. Жмем кнопку «Добавить из файла» и выбираем файл печатной формы;
  4. (Необязательно) Меняем наименование, комментарии, настраиваем видимость, изменяем размещение;
  5. Жмем кнопку «Записать и закрыть».

Внешняя печатная форма в обычном приложении

Теперь рассмотрим создание внешней печатной формы в обычном приложении — создадим печатную форму для  документа «Приходный кассовый ордер» (Бухгалтерия предприятия, редакция 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».

Основные этапы:

  1. Открываем справочник внешних печатных форм (Сервис->Дополнительные отчеты и обработки->Дополнительные внешние печатные формы);
  2. Добавляем новый элемент справочника и указываем файл печатной формы;
  3. Записываем элемент.
  4. (Необязательно) Меняем имеющиеся настройки — представления, отборы, дополнительные параметры и прочее.

На этом все, надеюсь, что эта статья была Вам полезна.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Загрузка…

Рассмотрим написание простейшей внешней печатной формы в 1С 8.3 для управляемого приложения на примере конфигураций Бухгалтерия 3.0 и Управление торговлей 11 (данная печатная форма будет работать в обоих этих конфигурациях).

Например нам требуется написать внешнюю печатную форму к документу Реализация товаров и услуг: вывести основные данные документа, а так же из табличной части Товары: номенклатуру, цену, количество и сумму.

Создание внешней обработки

В конфигураторе 1C Предприятия 8 создаем внешнюю обработку (Файл->Новый->Внешняя обработка), задаем имя, добавляем реквизит Документ с типом ДокументСсылка.РеализацияТоваровУслуг, он не является обязательным для работы печатной формы, но пригодится нам для ее регистрации в базе.

создание пустой обработки в 1С 8.3

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

Добавляем новый макет, тип макета оставляем Табличный документ. На макете создаем три области: Шапка, Данные и Подвал. Сделать это можно выделив нужное количество строк и нажав меню Таблица->Имена->Назначить имя (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

Метки нет (Все метки)


В документе СписаниеЗапасов в пользовательском режиме создаю свой реквизит Исполнитель. Собственно вопрос: как обратиться к этому реквизиту для вставки его в печатную форму?
Использую код:

1C
1
ОбластьСтрокаТЧ.Параметры.Исполнитель = СсылкаНаДокумент.Исполнитель;

но 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

Извините за беспокойство, подсказали:

1C
1
УправлениеСвойствами.ЗначениеСвойства(СсылкаНаДокумент, "Исполнитель");



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

По организации (две первых функции- подсказка (тоже БСП)
По второму вопросу — тоже БСП:

1C
1
2
3
4
5
6
7
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

Цитата
Сообщение от SatanInside
Посмотреть сообщение

БСП — это что?

Библиотека Стандартных Подсистем — подготовленные решения для часто встречающихся задач, встроенные в конфигурцию

1C
1
УправлениеСвойствами.ЗначениеСвойства(СсылкаНаДокумент, "Исполнитель");

Как раз и есть одна из функций БСП. Общий модуль УправлениеСвойствами, функция ЗначениеСвойства

Цитата
Сообщение от SatanInside
Посмотреть сообщение

это вроде как-то циклом делается

Все эти запросы и циклы уже прописаны в функциях БСП
Но можно и без. Инструкция



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

в этой вашей функции написато:

1C
1
2
3
Если Результат.Количество() = 1 Тогда
        Возврат Результат[0].Значение;
    КонецЕсли;

то есть она штото возвращает, если есть значение доп реквизита.
а если его нет — то и вжух.



0



1808 / 1228 / 442

Регистрация: 16.01.2015

Сообщений: 5,396

30.03.2021, 08:30

13

Цитата
Сообщение от SatanInside
Посмотреть сообщение

с Исполнителем прокатило, а с другими параметрами нет

Потому что УправлениеСвойствами.ЗначениеСвойств работает только именно для доп реквизитов, чем и является ваш исполнитель. Остальные реквизиты НЕ дополнительные и получить их этой функцией нельзя.
Ну посмотри примеры приведенные в ссылках, там все ясно изложено
,



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, смотря как вы их получаете
при создании у них указывается имя. в папочке «для разработчиков»
и, если вы его не заполнили, то оно заполняется по умолчанию, тоись типа
допрекwerghewjvhueirg-eg-021-dfsvkjhk-11
и вроде именно так и должны вы его искать



0



1808 / 1228 / 442

Регистрация: 16.01.2015

Сообщений: 5,396

30.03.2021, 10:01

17

Цитата
Сообщение от SatanInside
Посмотреть сообщение

Все эти реквизиты созданы мной в пользовательском режиме.

Да. Это все доп реквизиты и должны получаться так же как и Исполнитель. Значит неверно задаете имя реквизита



0



369 / 173 / 74

Регистрация: 04.03.2020

Сообщений: 659

30.03.2021, 14:11

18

Цитата
Сообщение от polax
Посмотреть сообщение

в БСП есть такая ценная функция

Прошу пардону, что вклиниваюсь, как раз сегодня сегодня пришло на почту в составе еженедельной рассылки инфостарта:
https://infostart.ru/1c/articles/1398340/



1



polax

30.03.2021, 18:22


    Получить реквизит формы

Не по теме:

Scratchsv, Вот за это огромное спасибо. Размести эту ссылку в курилке в Полезные ссылки



0



Понравилась статья? Поделить с друзьями:
  • Влияние финансового рычага на прибыль компании
  • Внешняя среда организации гостиничного бизнеса
  • Вместе с нами по морям встреча в кают компании
  • Внешэкономбанк государственные компании россии
  • Вместо номера телефона название компании в смс