Создание внешних печатных форм для 1С 8.1 на основе типовых. (Через подмену контекста).

Есть стандартный способ: Скопировать процедуры и функции в обработку, добавить "СсылкаНаОбъект" ко всем "Дата", "Номер", добавить объявление "мВалютаРегламентированногоУчета", заменить "ЭтотОбъект()" и проч. А можно заменить контекст формы и большинство кода просто скопировать. Не скажу, что это легче или быстрей, но у этого метода есть свои последователи 🙂

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

1. Внешние печатные формы в восьмерке
2. Внешние печатные формы в восьмерке II 
3. Обработка для тестирования внешних печатных форм в восьмерке

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


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

Мы проделаем такую работу:

1. Создадим внешнюю печатную форму, повторяющую типовую.

2. Заменим в печати в поле грузоотправителя «он же» на данные организации.

3. Немного изменим макет.

Начнем 🙂

 


Начало ничем не отличается от создания обыной внешней печатной формы.

 

1. Создаем внешнюю обработку.

2. Назавем ее «ВнешнийСчетФактураВыданный».

3. Добавим реквизит «СсылкаНаОбъект» с типом «ДокументСсылка.СчетФактураВыданный».

4. В модуле обработки создадим экспортную функцию «Печать».

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

Процедура КнопкаВыполнитьНажатие(Кнопка)
   
Печать().Показать();
КонецПроцедуры

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

6. Скопируем макет счета фактуры в нашу обработку. Так как этих макетов полно, скопируем все. На всякий случай.

Пока все как обычно. Результат — см рисунок 1.

А вот теперь, начинается «Магия».

7. Создаем еще одну форму. Назовем ее «ФормаСчетаФактуры».

8. Изменим основной реквизит второй формы («ФормаСчетаФактуры»): Поменяем наименование с «ОбработкаОбъект» на «ДокументОбъект», а тип с «ВнешняяОбработка.ВнешнийСчетФактураВыданный» на «ДокументОбъект.СчетФактураВыданный». Обращаю ваше внимание, именно ДокументОбъект!

9. В модуле формы объявим экпортную переменную «ВнОбработка». Она будет содержать объект нашей внешней обработки для доступа к макетам. Почему не реквизит? Потому что при использовании реквизита, она (обработка) оставалась в активной в предприятии, даже после закрытия всех окон.

10. В модуле обработки в функции «Печать» добавим код:

Функция Печать() Экспорт
   
СчетФактураОбъект = СсылкаНаОбъект.ПолучитьОбъект();

    ФормаСчетаФактуры = ПолучитьФорму(«ФормаСчетаФактуры»);
   
ФормаСчетаФактуры.ДокументОбъект = СчетФактураОбъект;
   
ФормаСчетаФактуры.ВнОбработка    = ЭтотОбъект;
   
ТабДок = ФормаСчетаФактуры.ПечатьВнешнейФормы();

    Возврат(ТабДок);
КонецФункции

Стоит немного отвлечься и объяснить. Итак. При вызове функции «Печать()» из СсылкаНаОбъект мы получаем объект документа СчетаФактуры. Значение этого объект мы используем для передачи его в основной реквизит формы «ФормаСчетаФактуры». Как только мы это сделали, форма «ФормаСчетаФактуры» ничем не отличается от формы, созданной в дереве метаданных в документе «СчетФактураВыданный». То есть, после этого форма «думает» что она — форма документа «СчетФактураВыданный», и ей доступен весь контекст объекта по прямому обращению. И все экспортные переменные, функции и процедуры, реквизиты и табличные части.

Дело за малым:

11. Переносим (методом копировать/вставить) из модуля Документа в модуль формы «ФормаСчетаФактуры» все необходимые процедуры. А их надо сказать у Счета-фактуры много:

  • ИнициализацияТаблицыСтрок
  • СобратьДанныеПоОтчетКомитентуОПродажах
  • СобратьДанныеПоОтчетКомиссионераОПродажах
  • СобратьДанныеПоРеализацияТоваровУслуг
  • СобратьДанныеПоВозвратТоваровПоставщику
  • СобратьДанныеПоПКО
  • СобратьДанныеПоСВП
  • СобратьДанныеПоПлатежномуОрдеру
  • СобратьДанныеПоАкту
  • СобратьДанныеПоПередачеОС
  • СобратьДанныеПоПередачеНМАОрганизаций
  • СобратьДанныеПоОтражениюРеализацииТоваровИУслуг
  • СобратьДанныеПоРеализацияУслугПоПереработке
  • СобратьДанныеПоПринятиюКУчетуОС
  • СобратьДанныеПоМодернизацииОС
  • СобратьДанныеПоНачислениеНДСпоСМРхозспособом
  • СобратьДанныеСФнаАвансИСуммовуюРазницу
  • ПроставитьПрочеркиВПустыеПоля
  • ПерезаполнитьСуммыПоУЕвРублях
  • ПечатьСчетаФактуры

Но пусть вас не пугает их количество. Как видите большинство из них это «СобратьДанные…». И служебные для печати. Также есть функция «ПечатьСчетаФактуры».

Стоит заметить что все они не экспортные. Именно из-за этого мы их и копировали.

Отдельный разговор по переносу процедуры Печать(…) из модуля документа.

Это самый сложный момент.

Переименуем ее в ПечатьВнешнейФормы. Но мало того, переделаем ее в функцию. Для этого заменим все «Возврат» на Возврат (Неопределено).

А вызов процедуры в конце модуля процедуры

УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ОбщегоНазначения.СформироватьЗаголовокДокумента(ЭтотОбъект, ЭтотОбъект.Метаданные().Представление()), НепосредственнаяПечать);

заменим на

Возврат(ТабДокумент);

Также теперь нам не нужны параметры: КоличествоЭкземпляров, НаПринтер, НепосредственнаяПечать.

Да и параметр «ИмяМакета» нам неактуален. Просто зададим его значение в теле функции:

ИмяМакета = «СчетФактура»;

убрав его из параметров.

12. Осталось заменить вызов общих Макетов на макеты из обработки. Меняем строки вида

Макет = ПолучитьОбщийМакет(«…») и Макет = ПолучитьМакет(«…»)

заменим на

Макет = ВнОбработка.ПолучитьМакет(«…»);

ВСЁ! (практически)

У нас есть внешняя печатная форма Счета-Фактуры, с перенесенными в неё функциями и процедурами формирования и макетами.

Сохраняем. Ага — ругается на «мНадписьПредоплата». Смотрим в модуле документа — это переменная модуля объекта. Объявляем в нашей форме и присваеваем значение(как в модуле документа).

Перем ВнОбработка Экспорт;
Перем
мНадписьПредоплата;

//… (все процедуры и функции)

мНадписьПредоплата = «Предварительная оплата»;

Октрываем в 1С предприятие и тестируем!).

 


Заменяем Грузоотправитель.

В функции ПечатьВнешнейФормы после строк

Если ДанныеДляПечати = Неопределено или ТипЗнч(ДанныеДляПечати) = Тип(«Соответствие») Тогда
    Продолжить;
КонецЕсли

Вставляем

// Заменяем в печати «он же» на Организацию
Если ДанныеДляПечати.Грузоотправитель = «он же» тогда
   
ДанныеДляПечати.Грузоотправитель = ДанныеДляПечати.Организация;
КонецЕсли;

А вот теперь вообще всё! Меняем как хотим макеты, получение данных, формирование печатных форм.

 

PS. Обработку см во вложении.

Дополнение1. Рассмотрен «сложный» пример. Счет на оплату, накладная и проч печатаются еще легче, но принцип тот же. Критика и замечания приветствуются.

Дополнение2. Работает только на релизе платформы старше 8.1.11.

Дополнение3. Долго думал над картинками. Так и не придумал.

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

Дополнение5. Для тестирования и отладки внешней печатной формы вместо создания спецформы в КАЖДОЙ обработке можно воспользоваться инструментом от poppy //infostart.ru/public/14686/ (с) artbear

Дополнение6. Шаблоны для создания внешних печатных форм и примеры внешних печатных форм http://www.infostart.ru/public/67060/ (с) alexk-is

72 Comments

  1. wirg

    ну ты крут за 10 минут столько операций сделать

    Reply ↓
  2. Поручик

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

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

    Собственно, это я у себя и сделал, заместив почти все штатные формы подключаемыми. Цель: быстрая доработка или исправление в случае необходимости.

    Reply ↓
  3. yku

    (1) Хм. Это просто кажется, что долго делается. На самом деле, когда этим способом создашь несколько печатных форм для разных документов время приближается к этому значению. Тем более, что набор от клиента к клиенту не блещет разнообразностью: счет на оплату, накладная, акт оказания услуг, счет-фактура. Это покрывает 80% просьб изменения печатных форм. Набор этих четырех печатных форм я делаю за 20-25 минут (без внесения изменений).

    Так что ваш сарказм напрасен :).

    Reply ↓
  4. yku

    (2) Спасибо за отзыв и замечание :). Одной из причин написания статьи как раз и явились проблемы с обновлением типовых конфигураций снятых с поддержки только лишь по причине изменения печатных форм. И ведь изменят еще черт знает как!

    Reply ↓
  5. Поручик

    (4) Спасибо за упоминание моей скромной персоны.

    Ещё совет по оформлению: раскрась фрагменты программного кода. Разукрашка есть на этом сайте.

    Reply ↓
  6. АнатолийСтриж

    Спасибо. Там еще неразрешимые ссылки — реквизиты Документа СчетФактураВыданный полезли, но это легко устраняется. Буду эту идею тиражировать. Вот не могу включиться в проблему: Печать().Показать();

    Печать() — все хорошо, а .Показать() уже ругается.

    Reply ↓
  7. yku

    (6) Хм. У меня все отлично. Без всяких неразрешимых ссылок.

    Reply ↓
  8. yku

    (5) Вот убей не пойму как включить разукрашку. Или надо «тупо» выделил — назначил цвет, выделил — цвет? Научите 🙂

    Reply ↓
  9. Поручик

    (8) Разукрашка

    http://infostart.ru/public/19856/

    Reply ↓
  10. yku

    (9) Спасибо 🙂 Буду знать.

    Reply ↓
  11. anig99

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

    Reply ↓
  12. artbear

    1. Автор слукавил в п.11 и далее — откуда в общем случае можно узнать, какие процедуры нужно копировать из модуля документа в модуль обработки?

    только из изучения кода печати — основного метода Печать.

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

    2. Метод все-таки неудобен — нужно делать кучу копирований и замен кода и типов данных.

    ИМХО намного проще тупо скопировать код из модуля формы, поправить все недостающие реквизиты в полученном коде и т.п.

    а отладку выполнять не в спец.форме КАЖДОЙ обработки, а спец.обработкой от poppy.

    Reply ↓
  13. yku

    (12) Спасибо за развернутый отзыв! 🙂

    1. Хы. Но что хорошо в конфигурациях от 1С так это то, что в них есть кое-какой порядок. И как правило это 1-2 процедуры/функции. Счет-фактура — исключение. Но в целом вы правы, действительно никак не узнать. Но узнавать нужно в любом случае (хоть моим способом, хоть копированием). Либо писать эти процедуры с нуля.

    Если не хочется думать — скопировать все, что не экспортное. + переделать процедуру печати на функцию.

    2. Про копирование — согласен. Много. Про замен кода (5 шт) и типов данных (1-2 шт в зависимости от того что считать заменой типов данных) — не согласен.

    3. Спец обработку от poppy я пробовал. Вещь хорошая, но, видимо, каждому своё. И от случая зависит. Стоит упомянуть в статье 🙂

    Насчет простоты — осмелюсь не согласиться 🙂 Для примера: Нужно заменить в печатной форме СчетаФактуры выданного поля «ИтогоСуммаНДС» и «ИтогоВсего» сделать жирными и с размером шрифта 9. Если вы сможете это сделать имея только базу за сравнимое вермя — тогда прошу научить 🙂 (я без сарказма).

    Reply ↓
  14. artbear

    (13) Обычная схема создания внешней печатной формы вполне подойдет.

    задача простая.

    Обычно как раз и тратится 10-15 минут, не больше 🙂

    Reply ↓
  15. yku

    (14) Я уже и расписал факты «подтверждающие» преимущества способа «через форму» (не осмелюсь называть этот метод «своим»), но решил проверить. Проверил, протестировал. И пришел к выводу что, действительно, вы полностью правы! Нет у моего способа выраженных преимуществ. Видимо, дело привычки, так как мне метод «через форму» все равно кажется менее «вниманиеёмким» 🙂

    Поменяю-ка я описание статьи 🙂

    Reply ↓
  16. alexk-is

    По материалам статьи написал шаблон. На основе шаблона провел замеры по созданию «типовых» внешних печатных форм. Получил следующие результаты:

    Счет — 4 минуты

    ТОРГ12 — 4 минуты

    Думаю, что если потренироваться, то можно довести до 2 минут 🙂

    Reply ↓
  17. artbear

    (16) Выкладывай 🙂

    Reply ↓
  18. IP43

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

    Reply ↓
  19. yku

    (16) ого! скоростной Вы 🙂 Я шаблон тож думал создать, но подумав, решил, что мне легче его заново сделать, чем искать где он хранится 🙂

    Reply ↓
  20. yku

    (18) Хы. Признаюсь, очень приятно, когда твоя собственная статья приносит пользу кому-то 🙂

    Reply ↓
  21. alexk-is
  22. IP43

    Реально здорово 🙂 на базе формы Т-1 за 15 минут (засекал время) сделал внешнюю печатную форму Т-6.

    Reply ↓
  23. wolder

    Пасиб, класс! 😎

    Reply ↓
  24. Bold Enough

    Благодарю, очень доходчиво написано! 😎

    Reply ↓
  25. Strannik99

    Спасибо, получилось сделать ВПФ Акта вып. работ для ут 10.3. Оказалось не сложно, кто может подсказать как в Акт добавить печать ИНН исполнителя , заказчика. В типовом нету Как такие данные выдёргивать в ПФ, может где доходчиво описано ?

    Reply ↓
  26. pantera190

    Спасибо.Пригодилось.

    Reply ↓
  27. Соня

    Спасибо огромное! Всегда этим способом теперь пользуюсь. Удобно, потому, что без отладчика никак, очень удобно, что если делать так — то на точках останова стопается!

    Reply ↓
  28. Victor_62

    Нормально работает.

    Reply ↓
  29. Boroda

    Неплохое пособие для обучения созданию печатных форм, да и вооще отчётов. Во всяком случае, на первоначальных этапах обучения программированию в 8-ке очень пригодится. Спасибо!

    Reply ↓
  30. LarisaSG

    Спасибо! Очень пригодилось. Но проблема такая : если печать идет из формы «формаПрямойПечати», то на предварительном просмотре ориентация печати = ландшафт, если печать из формы «ФормаСчетафактуры»(т.е из документа), то на просмотре ориентация = портрет и надо обязательно устанавливать перед печатью ландшафт, хотя в модуле формы стоит : ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт.

    Reply ↓
  31. yku

    (30)(29) и другие. Этот способ создания внешних печатных форм — альтернативный!

    Стандартный способ см Повышение удобства разработки в среде 1С:Предприятие 8 Пункт 2.5 (раньше был 2.4)

    Reply ↓
  32. vodyanoi

    Спасибо. пригодилось для объяснений обучающимся сотрудникам

    Reply ↓
  33. feit

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

    Reply ↓
  34. Mshaydurov

    круто чо. учиться, учиться и еще раз учиться!

    Reply ↓
  35. jirafff

    на первое время пригодилось

    Reply ↓
  36. Craig

    Спасибо, на основе вашей статьи подготовил счет-фактуры адаптированные на платформе 1С:Предприятие 8.2 (8.2.14.540) для конфигурации Бухгалтерия предприятия, редакция 2.0 (2.0.30.8) http://infostart.ru/public/103687/

    Reply ↓
  37. Гость

    Спaсибо! Очень пригодилось. Но проблемa такaя : если печaть идет из формы «формаПрямойПечaти», то нa предварительном просмотре ориентация печати = ландшафт, если печaть из формы «ФормаСчетaфактуры»(т.е из документ), то на просмотре ориентация = портрет и надо обязaтельно устанавливать перед печатью ландшaфт, хотя в модуле формы стоит : ТaбДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшaфт.

    Reply ↓
  38. bekas1977

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

    Reply ↓
  39. Styvi

    Спасибо за статью, очень полезное чтиво…

    Reply ↓
  40. Styvi

    (ту 1) Без тренировки действительно столько операций не сделать, но на втором шаблоне — уже без подсказок получилось сделать внешнюю печать минут за 15…

    А вот отладить и отредактировать — согласен, чуть больше времени потребуется…

    Ещё раз выражаю автору большую благодарность…

    Reply ↓
  41. erdos

    отличная статья

    Reply ↓
  42. dagovich

    а у меня в КА 1.1 вообще в модуле документа нет перечисленных процедур и функций у счет-фактуры! С ног сбился их искать.

    Reply ↓
  43. X-morph

    Спасибо, искал именно внешнюю счет фактуру. Будем учиться на ее примере делать собственные внешние печатные формы.

    Reply ↓
  44. BalVlad

    Буду пробовать на основе этой статьи учиться создавать ВПФ для 8.2. Вопрос большие различия между созданием ВПФ под 8.1 и 8.2?

    Reply ↓
  45. fonomo0

    выражаю автору большую благодарность… Как раз то что мне сейчас надо!

    Reply ↓
  46. kmar

    Очень ценный пост! Благодарен автору!

    Reply ↓
  47. Valdemar87

    Отличные обработки, автору спасибо за шаблоны

    Reply ↓
  48. evg300183

    спасибо — помогло — оооогромное

    Reply ↓
  49. winsloow

    Хорошая статья для тех кто только начинает программировать в 1с .

    Написано доступно и понятно автору спасибо за труд.

    Reply ↓
  50. vladir

    Спасибо за статью, очень пригодилась.

    Reply ↓
  51. olsy

    Спасибо, пригодилось!

    Reply ↓
  52. AlexO

    (31)

    Стандартный способ см Повышение удобства разработки в среде 1С:Предприятие 8 Пункт 2.4

    пункт 2.5:

    «Довольно часто приходится создавать печатные формы к различным объектам конфигураций…»

    а вообще сравнение методов создания ВПФ есть? я насчитал 3 метода, но достоинства и недостатки каждого явно не выражены.

    Reply ↓
  53. yku

    (53) AlexO,

    Не совсем понял о каких трёх методах речь.

    Я знаю только два:

    1. Стандартный. Создаем обработку, и пишем код с нуля или копируем его из базы и модифицируем.

    2. Альтернатива стандартному (мой). Пишем спец. код для подмены контекста и создаем спец. форму, копируем код из базы и немного его редактируем.

    А какой третий?

    Что же касается первых двух — что их сравнивать? достаточно попробовать самому каждый из них. Тогда уже станет понятно, что и когда применять. Я же лично был изначально за мой метод, так как к нему привык, да и он мой. Как по мне так, он лёгок для обновления печатных форм при существенном изменении печатных форм и алгоритмов их заполнения в самой базе.

    Сейчас же, многие печатные формы формируются вызовом процедур из модуля менеджера передачей ему массива ссылок. И мой метод становится излишним усложнением. А пользоваться разными методами для одного и того же — не есть путь джедая. Так что в любом случае я рекомендую делать ВПФ используя методичку poppy, указанную по ссылке выше и в самой статье.

    Reply ↓
  54. luksiar

    Попробовал сделать ВПФ Счет-фактура полученный, но выдает такую ошибку в модуле объекта:

    Ошибка при вызове метода контекста (ПолучитьОбъект)

    СчетФактураОбъект = СсылкаНаОбъект.ПолучитьОбъект();

    по причине:

    Элемент не выбран!

    Вроде все сделал по пунктам и перепроверил.

    Reply ↓
  55. Amras
    СчетФактураОбъект = СсылкаНаОбъект.ПолучитьОбъект();

    <СсылкаНаОбъект> — как реквизит ВПФ? Тип установлен?

    Да и если это ВПФ, добавлена в конфу как «Дополнительная внешняя печатная форма» и там установлен тип документа, то получать объект не нужно.

    Reply ↓
  56. luksiar

    СсылкаНаОбъект установлена.

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

    Reply ↓
  57. Amras

    Но в некоторых случаях объект получать надо.

    Например:

    СсылкаНаОбъект >> Тип: ДокументСсылка >> надо определить новый документ или нет <… Если СчетФактураОбъект.ЭтоНовый() Тогда …> (работает с объектами, но не ссылками)

    П.С.

    Тип: ДокументСсылка.<Документ> или ДокументОбъект.<Документ>

    Reply ↓
  58. yku

    (58) Amras,

    Но в некоторых случаях объект получать надо.

    Например:

    СсылкаНаОбъект >> Тип: ДокументСсылка >> надо определить новый документ или нет <… Если СчетФактураОбъект.ЭтоНовый() Тогда …> (работает с объектами, но не ссылками)

    Если ссылка получена из базы, то СчетФактураОбъект.ЭтоНовый() всегда Ложь.

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

    Reply ↓
  59. Amras

    (59)

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

    Вот и возникает вопрос. Зачем в типовых печатных формах реализована эта проверка? А народ не задумываясь, порой, берет код и корректирует только несколько строчек, оставляя исходный.

    Reply ↓
  60. yku

    (60) Amras,

    Вот и возникает вопрос. Зачем в типовых печатных формах реализована эта проверка?

    А у меня не возникает.

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

    Народ вообще редко думает. Только чья ж в этом проблема?

    Reply ↓
  61. Amras

    (61)

    А у меня не возникает.

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

    В код мы вставляем <СчетФактураОбъект = СсылкаНаОбъект.ПолучитьОбъект();>, а зачем нам его получать? Ведь все можно проще сделать. И на сколько я понял, данная обработка вызывается путем вызова команды «Открыть».

    Я же делал немножко не так:

    — Брал необходимы процедуры для формирования печатной формы;

    — Для формы тестирования-отладки писал тот же код, что описан выше:

    Процедура КнопкаВыполнитьНажатие(Кнопка)

    Печать().Показать();

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

    — А вот для использования как внешняя печатная форма, другим путем (никаких объектов не получал, ну не встретил я пока случая, чтобы это было реально необходимо):

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

    Запрос = Новый Запрос;

    …

    Возврат Запрос.Выполнить();

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

    Функция Печать() Экспорт

    ТабДокумент = Новый ТабличныйДокумент;

    …

    Выборка = СформироватьЗапросДляПечати().Выбрать();

    Макет = ЭтотОбъект.ПолучитьМакет(«МакетФормы»);

    …

    Пока Выборка.Следующий() Цикл

    Макет.Параметры.Заполнить(Выборка);

    …

    ТабДокумент.Вывести(Макет);

    КонецЦикла;

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

    Reply ↓
  62. yku

    (62) Amras,

    Вот и возникает вопрос. Зачем в типовых печатных формах реализована эта проверка?

    В код мы вставляем <СчетФактураОбъект = СсылкаНаОбъект.ПолучитьОбъект();>, а зачем нам его получать? Ведь все можно проще сделать.

    Вопрос был задан по типовым печатным формам. Вот именно по типовым у меня вопросов как правило не возникает.

    В код мы вставляем <СчетФактураОбъект = СсылкаНаОбъект.ПолучитьОбъект();>, а зачем нам его получать?

    А статью читали? Или заголовок? Вот прям в заголовке написано, цитирую:»…(через подмену контекста).» Вот для того, чтобы подменить контекст формы нам и нужно получить объект.

    Ведь все можно проще сделать.

    Опять же процитирую себя же

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

    И на сколько я понял, данная обработка вызывается путем вызова команды «Открыть».

    Нет, не правильно поняли.

    В общем, насколько я понял ситуацию, вы на начале пути освоения 1С. Если так то, эту обработку можно смело не смотреть и не разбирать. Она в обычном приложении-то имела сомнительный смысл, а в управляемом так вообще потеряла свой… ну короче, неактуальная она.

    Если что, прошу прощения за свой тон. Уж очень сегодня день тяжелый выдался.

    Reply ↓
  63. yku

    (62) Amras,

    Еще попишу.

    Вот раньше (сейчас всё реже) в типовых печатных формах часто любили использовать конструкции типа

    Если ВалютаДокумента = мВалютаРегламентированногоУчета Тогда…

    … = ПредставлениеОрганизаций(Организация)

    Это сейчас реквизиты документа в 95% случаев получают запросом по ссылке, а раньше сами же 1С любили напрямую к реквизитам обращаться. А еще любили к процедурам и функциям обращаться, которые используют помимо переданных им параметров значения реквизитов и переменных объекта. Что уж говорить о нетиповых конфигурациях. Так вот, мой способ как раз позволяет для таких вот юродивых типовых печатных форм создать внешнюю, тупо скопировав большинство процедур и функций из модуля объекта.

    Reply ↓
  64. Amras

    (63)

    То что в управляемом не актуальна, это понятно.

    Тон нормальный. Зато все по полочкам раскладывается.

    Про начало пути — не верное представление. Но это сугубо личное мнение.

    Я все равно не люблю использовать исключительно подстановку типового контекста, т.к. там очень много мусора.

    Стоит немного отвлечься и объяснить. Итак. При вызове функции «Печать()» из СсылкаНаОбъект мы получаем объект документа СчетаФактуры. Значение этого объект мы используем для передачи его в основной реквизит формы «ФормаСчетаФактуры». Как только мы это сделали, форма «ФормаСчетаФактуры» ничем не отличается от формы, созданной в дереве метаданных в документе «СчетФактураВыданный». То есть, после этого форма «думает» что она — форма документа «СчетФактураВыданный», и ей доступен весь контекст объекта по прямому обращению. И все экспортные переменные, функции и процедуры, реквизиты и табличные части.

    Не внимательно я читал. Теперь понятно зачем вы идете эдаким путем. И если внимательно прочитать мой пост выше, я описал там свой путь, правда я так уже давно не пишу, это писалось году эдак в 2007.

    Reply ↓
  65. yku

    (65) Amras,

    Я все равно не люблю использовать исключительно подстановку типового контекста, т.к. там очень много мусора.

    Я сейчас её(подстановку контекста) вообще не использую. Но считаю, что сам по себе метод интересен с теоретической точки зрения, а раньше его применение в больших количествах помогало сократить время создания ВПФ. Но такая печатная форма медленней работала, да и как-то некрасиво.

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

    Не внимательно я читал. Теперь понятно зачем вы идете эдаким путем. И если внимательно прочитать мой пост выше, я описал там свой путь, правда я так уже давно не пишу, это писалось году эдак в 2007.

    А вот это интересно. А сейчас как? Или в старом фишка в функции «СформироватьЗапросДляПечати»?

    К слову сейчас я просто копирую функцию/процедуру из модуля менеджера объекта, и присваиваю значения необходимых параметров типа:

    Ссылка = СсылкаНаОбъект;

    Неужто можно проще?

    Reply ↓
  66. Veduin

    Отличная статья со своими минусами но ВСЕ ЖЕ, автору спасибо

    Reply ↓
  67. AlexO

    (0) слишком все замуторно описано.

    Простые операции, можно было намного проще описать.

    И в результате — по этой статье сложно научиться денлать ВПФ, а только — СчетФактуру.

    Нет четкого алгоритма и представления.

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

    Reply ↓
  68. yku

    (68) AlexO,

    Спасибо за критику.

    слишком все замуторно описано.

    Простые операции, можно было намного проще описать.

    И в результате — по этой статье сложно научиться денлать ВПФ, а только — СчетФактуру.

    Нет четкого алгоритма и представления.

    Согласен. С каждым предложением.

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

    А вот с этим не согласен в корне. Вторая форма — она вовсе не для проверки, а для подмены контекста. Форма проверки, о которой вы говорите, она в 5ом пункте. Возможно, взглянув на статью еще раз, вы поменяете мнение о статье. Не говорю о диаметральном, а о лежащем в совсем другой «плоскости», если так говорят о мнении.

    PS. Я уже давно осознал, что нужно поменять и название статьи и саму статью, но всё никак не соберусь. Сейчас я вижу эту статью не как инструкцию о печати ВПФ, а как описание способа подмены контекста с демонстрацией использования на примере создания ВПФ типовых конфигураций старых релизов. Во как. Сразу и не выговоришь!

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

    Reply ↓
  69. AlexO

    (69)

    Вторая форма — она вовсе не для проверки, а для подмены контекста.

    помните, я спрашивал вас —

    а вообще сравнение методов создания ВПФ есть?

    так вот, в сравнении с обычныч способом создания ВПФ — в чем преимущество подмены контекста при создании ВПФ? пока кроме как теоретического смысла я не нашел 🙂

    а как описание способа подмены контекста с демонстрацией использования

    ну, если осилите — то давайте, ждем.

    только чтоб не там сумбурно, как эта статья — а кратко, по делу и последовательно по пунктам 🙂

    Reply ↓
  70. yku

    (70)

    помните, я спрашивал вас —

    а вообще сравнение методов создания ВПФ есть?

    а помните, что я вам ответил

    Что же касается первых двух — что их сравнивать? достаточно попробовать самому каждый из них. Тогда уже станет понятно, что и когда применять. …

    Сейчас же, многие печатные формы формируются вызовом процедур из модуля менеджера передачей ему массива ссылок. И мой метод становится излишним усложнением. А пользоваться разными методами для одного и того же — не есть путь джедая. Так что в любом случае я рекомендую делать ВПФ используя методичку poppy, указанную по ссылке выше и в самой статье.

    кроме как теоретического смысла я не нашел 🙂

    опять процитирую себя же:

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

    Раньше был смысл. Когда в самых потаённых уголках формирования печатных форм обращались к данными не через передаваемую ссылку, а напрямую — к реквизиту объекта. И чтобы не исправлять все такие использования на СсылкаНаОбъект.%ИмяРеквизита%, и заново не переопределять переменные модуля объекта, достаточно было подменить контекст.

    Reply ↓
  71. AlexO

    (71)

    т.е. присвоение

    ЭтотОбъект = СсылкаНаОбъект.ПолучитьОбъект() вы назвали «подмена контекста»? 🙂

    Reply ↓
  72. yku

    (72) именно.

    Reply ↓

Leave a Comment

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