Создание внешних печатных форм для 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 не будет опубликован. Обязательные поля помечены *