gifts2017

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

Опубликовал Александр Гладких (yku) в раздел Печать - Печатные формы документов

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

Предисловие: Этот способ является лишь альтернативой стандартному, который вы можете почерпнуть из цикла статей  от 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 http://infostart.ru/public/14686/ (с) artbear

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

Скачать файлы

Наименование Файл Версия Размер
ВнешнийСчетФактураВыданный.epf 769
.epf 34,41Kb
19.04.12
769
.epf 34,41Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Евгений (wirg) 03.03.10 19:50
ну ты крут за 10 минут столько операций сделать
2. Сергей Ожерельев (Поручик) 03.03.10 22:23
Полезная статья. Для чайников, которые недолго думая, будут курочить конфу.
Я бы ещё добавил в статью слова о том, что полученной внешней формой можно заместить штатную, дабы не напрягать юзеров выбором в диалоге. Ведь не все догадаются нажать кнопку "По умолчанию".
Собственно, это я у себя и сделал, заместив почти все штатные формы подключаемыми. Цель: быстрая доработка или исправление в случае необходимости.
Strannik99; +1 Ответить 1
3. Александр Гладких (yku) 03.03.10 22:43
(1) Хм. Это просто кажется, что долго делается. На самом деле, когда этим способом создашь несколько печатных форм для разных документов время приближается к этому значению. Тем более, что набор от клиента к клиенту не блещет разнообразностью: счет на оплату, накладная, акт оказания услуг, счет-фактура. Это покрывает 80% просьб изменения печатных форм. Набор этих четырех печатных форм я делаю за 20-25 минут (без внесения изменений).

Так что ваш сарказм напрасен :).
Strannik99; +1 Ответить
4. Александр Гладких (yku) 03.03.10 22:51
(2) Спасибо за отзыв и замечание :). Одной из причин написания статьи как раз и явились проблемы с обновлением типовых конфигураций снятых с поддержки только лишь по причине изменения печатных форм. И ведь изменят еще черт знает как!
5. Сергей Ожерельев (Поручик) 03.03.10 23:51
(4) Спасибо за упоминание моей скромной персоны.
Ещё совет по оформлению: раскрась фрагменты программного кода. Разукрашка есть на этом сайте.
6. Анатолий Стрижак (АнатолийСтриж) 04.03.10 00:09
Спасибо. Там еще неразрешимые ссылки - реквизиты Документа СчетФактураВыданный полезли, но это легко устраняется. Буду эту идею тиражировать. Вот не могу включиться в проблему: Печать().Показать();
Печать() - все хорошо, а .Показать() уже ругается.
7. Александр Гладких (yku) 04.03.10 00:37
(6) Хм. У меня все отлично. Без всяких неразрешимых ссылок.
8. Александр Гладких (yku) 04.03.10 00:39
(5) Вот убей не пойму как включить разукрашку. Или надо "тупо" выделил - назначил цвет, выделил - цвет? Научите :)
9. Сергей Ожерельев (Поручик) 04.03.10 11:17
10. Александр Гладких (yku) 04.03.10 12:45
11. Александр Медведев (anig99) 04.03.10 16:21
Мой виртуальный минус с вами
12. Артур Аюханов (artbear) 04.03.10 21:08
1. Автор слукавил в п.11 и далее - откуда в общем случае можно узнать, какие процедуры нужно копировать из модуля документа в модуль обработки?
только из изучения кода печати - основного метода Печать.
т.е. сначала нужно скопировать печать к себе, а уж потом по ошибкам синтаксиса найти недостающие процедуры
2. Метод все-таки неудобен - нужно делать кучу копирований и замен кода и типов данных.

ИМХО намного проще тупо скопировать код из модуля формы, поправить все недостающие реквизиты в полученном коде и т.п.
а отладку выполнять не в спец.форме КАЖДОЙ обработки, а спец.обработкой от poppy.
13. Александр Гладких (yku) 04.03.10 21:42
(12) Спасибо за развернутый отзыв! :)

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

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

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

Насчет простоты - осмелюсь не согласиться :) Для примера: Нужно заменить в печатной форме СчетаФактуры выданного поля "ИтогоСуммаНДС" и "ИтогоВсего" сделать жирными и с размером шрифта 9. Если вы сможете это сделать имея только базу за сравнимое вермя - тогда прошу научить :) (я без сарказма).
14. Артур Аюханов (artbear) 04.03.10 21:49
(13) Обычная схема создания внешней печатной формы вполне подойдет.
задача простая.
Обычно как раз и тратится 10-15 минут, не больше :)
15. Александр Гладких (yku) 05.03.10 11:44
(14) Я уже и расписал факты "подтверждающие" преимущества способа "через форму" (не осмелюсь называть этот метод "своим"), но решил проверить. Проверил, протестировал. И пришел к выводу что, действительно, вы полностью правы! Нет у моего способа выраженных преимуществ. Видимо, дело привычки, так как мне метод "через форму" все равно кажется менее "вниманиеёмким" :)

Поменяю-ка я описание статьи :)
16. Алексей Константинов (alexk-is) 11.03.10 14:35
По материалам статьи написал шаблон. На основе шаблона провел замеры по созданию "типовых" внешних печатных форм. Получил следующие результаты:
Счет - 4 минуты
ТОРГ12 - 4 минуты

Думаю, что если потренироваться, то можно довести до 2 минут :)
17. Артур Аюханов (artbear) 11.03.10 17:11
18. IP43 (IP43) 11.03.10 20:17
Помогло разобраться с созданием внешних печатных форм, написал шаблон для Приказа о приеме на работу Т-1. завтра попробую тиражнуть на все Т-ХХ. посмотрим скорость.
19. Александр Гладких (yku) 11.03.10 21:51
(16) ого! скоростной Вы :) Я шаблон тож думал создать, но подумав, решил, что мне легче его заново сделать, чем искать где он хранится :)
20. Александр Гладких (yku) 11.03.10 21:53
(18) Хы. Признаюсь, очень приятно, когда твоя собственная статья приносит пользу кому-то :)
21. Алексей Константинов (alexk-is) 12.03.10 08:20
22. IP43 (IP43) 13.03.10 10:53
Реально здорово :) на базе формы Т-1 за 15 минут (засекал время) сделал внешнюю печатную форму Т-6.
23. Виктор Шестаков (wolder) 18.08.10 16:25
24. Bold Enough (Bold Enough) 08.02.11 13:00
Благодарю, очень доходчиво написано! 8-)
25. Vyacheslav L (Strannik99) 27.02.11 22:37
Спасибо, получилось сделать ВПФ Акта вып. работ для ут 10.3. Оказалось не сложно, кто может подсказать как в Акт добавить печать ИНН исполнителя , заказчика. В типовом нету Как такие данные выдёргивать в ПФ, может где доходчиво описано ?
26. София (pantera190) 23.09.11 13:11
27. Светлана (Соня) 27.09.11 15:40
Спасибо огромное! Всегда этим способом теперь пользуюсь. Удобно, потому, что без отладчика никак, очень удобно, что если делать так - то на точках останова стопается!
28. Victor Victorov (Victor_62) 10.10.11 14:05
29. Vladimir (Boroda) 12.10.11 00:03
Неплохое пособие для обучения созданию печатных форм, да и вооще отчётов. Во всяком случае, на первоначальных этапах обучения программированию в 8-ке очень пригодится. Спасибо!
30. Лариса Горячева (LarisaSG) 09.11.11 15:52
Спасибо! Очень пригодилось. Но проблема такая : если печать идет из формы "формаПрямойПечати", то на предварительном просмотре ориентация печати = ландшафт, если печать из формы "ФормаСчетафактуры"(т.е из документа), то на просмотре ориентация = портрет и надо обязательно устанавливать перед печатью ландшафт, хотя в модуле формы стоит : ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт.
31. Александр Гладких (yku) 09.11.11 16:02
(30)(29) и другие. Этот способ создания внешних печатных форм - альтернативный!

Стандартный способ см Повышение удобства разработки в среде 1С:Предприятие 8 Пункт 2.5 (раньше был 2.4)
32. Алексей Горбунов (vodyanoi) 25.11.11 08:23
Спасибо. пригодилось для объяснений обучающимся сотрудникам
34. Feit Feit (feit) 16.12.11 16:30
Спасибо. Помогло разобраться с основами. Сделал несколько внешних печатных форм, такие небольшие руководства с примерами помогают быстрее освоить и понять работу системы.
35. Михаил Шайдуров (Mshaydurov) 23.12.11 10:34
круто чо. учиться, учиться и еще раз учиться!
36. Юрий Александрович (jirafff) 25.12.11 15:52
на первое время пригодилось
37. Айрат (Craig) 05.01.12 21:18
Спасибо, на основе вашей статьи подготовил счет-фактуры адаптированные на платформе 1С:Предприятие 8.2 (8.2.14.540) для конфигурации Бухгалтерия предприятия, редакция 2.0 (2.0.30.8) http://infostart.ru/public/103687/
38. Гость 06.01.12 13:21
Спaсибо! Очень пригодилось. Но проблемa такaя : если печaть идет из формы "формаПрямойПечaти", то нa предварительном просмотре ориентация печати = ландшафт, если печaть из формы "ФормаСчетaфактуры"(т.е из документ), то на просмотре ориентация = портрет и надо обязaтельно устанавливать перед печатью ландшaфт, хотя в модуле формы стоит : ТaбДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшaфт.
39. Oleg Sinicyn (bekas1977) 11.01.12 00:33
Здравствуйте! Если есть возможность помогите сделать внешнюю печатную форму счета на оплату покупателю. Задача такая - в 1с заведены три организации - необходимо для каждой из них "вставлять" разные печать и подпись руководителя (как картинки). Скачал шаблоны - подключаю в самом 1с (не в конфигураторе) на выходе - чистый лист, как туда вставть информацию не могу понять.
40. Степашка Никулин (Styvi) 11.01.12 13:51
Спасибо за статью, очень полезное чтиво...
41. Степашка Никулин (Styvi) 11.01.12 17:53
(ту 1) Без тренировки действительно столько операций не сделать, но на втором шаблоне - уже без подсказок получилось сделать внешнюю печать минут за 15...
А вот отладить и отредактировать - согласен, чуть больше времени потребуется...
Ещё раз выражаю автору большую благодарность...
42. Erdos Temirzhanov (erdos) 13.01.12 09:18
43. Андрей Дегтярев (dagovich) 13.01.12 10:40
а у меня в КА 1.1 вообще в модуле документа нет перечисленных процедур и функций у счет-фактуры! С ног сбился их искать.
44. Леха Гордеев (X-morph) 16.01.12 12:02
Спасибо, искал именно внешнюю счет фактуру. Будем учиться на ее примере делать собственные внешние печатные формы.
45. Владимир Водин (BalVlad) 18.01.12 19:45
Буду пробовать на основе этой статьи учиться создавать ВПФ для 8.2. Вопрос большие различия между созданием ВПФ под 8.1 и 8.2?
46. Андрей Мальцев (fonomo0) 23.01.12 09:46
выражаю автору большую благодарность... Как раз то что мне сейчас надо!
47. koka mrkv (kmar) 01.02.12 08:59
Очень ценный пост! Благодарен автору!
48. Владимир Александрович (Valdemar87) 16.02.12 17:55
Отличные обработки, автору спасибо за шаблоны
49. Евген (evg300183) 17.02.12 14:08
спасибо - помогло - оооогромное
50. Виктор - (winsloow) 19.02.12 15:22
Хорошая статья для тех кто только начинает программировать в 1с .
Написано доступно и понятно автору спасибо за труд.
51. Владимир (vladir) 06.03.12 17:52
Спасибо за статью, очень пригодилась.
52. Oleg Sys (olsy) 18.04.12 07:06
53. Алекс Ю (AlexO) 31.05.12 17:30
(31) yku,
Стандартный способ см Повышение удобства разработки в среде 1С:Предприятие 8 Пункт 2.4

пункт 2.5:
"Довольно часто приходится создавать печатные формы к различным объектам конфигураций..."
а вообще сравнение методов создания ВПФ есть? я насчитал 3 метода, но достоинства и недостатки каждого явно не выражены.
54. Александр Гладких (yku) 01.06.12 14:09
(53) AlexO,
Не совсем понял о каких трёх методах речь.
Я знаю только два:
1. Стандартный. Создаем обработку, и пишем код с нуля или копируем его из базы и модифицируем.
2. Альтернатива стандартному (мой). Пишем спец. код для подмены контекста и создаем спец. форму, копируем код из базы и немного его редактируем.
А какой третий?

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

Сейчас же, многие печатные формы формируются вызовом процедур из модуля менеджера передачей ему массива ссылок. И мой метод становится излишним усложнением. А пользоваться разными методами для одного и того же - не есть путь джедая. Так что в любом случае я рекомендую делать ВПФ используя методичку poppy, указанную по ссылке выше и в самой статье.
55. Дмитрий Захаров (luksiar) 08.06.12 08:58
Попробовал сделать ВПФ Счет-фактура полученный, но выдает такую ошибку в модуле объекта:
Ошибка при вызове метода контекста (ПолучитьОбъект)
СчетФактураОбъект = СсылкаНаОбъект.ПолучитьОбъект();
по причине:
Элемент не выбран!

Вроде все сделал по пунктам и перепроверил.
56. Андрей А. (Amras) 08.06.12 09:09
СчетФактураОбъект = СсылкаНаОбъект.ПолучитьОбъект();


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

Да и если это ВПФ, добавлена в конфу как "Дополнительная внешняя печатная форма" и там установлен тип документа, то получать объект не нужно.
57. Дмитрий Захаров (luksiar) 08.06.12 09:21
СсылкаНаОбъект установлена.
Да я добавил как дополнительную внешнюю печатную форму, сейчас поправлю. Спасибо.
58. Андрей А. (Amras) 08.06.12 09:54
Но в некоторых случаях объект получать надо.

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

П.С.
Тип: ДокументСсылка.<Документ> или ДокументОбъект.<Документ>
59. Александр Гладких (yku) 08.06.12 12:05
(58) Amras,
Но в некоторых случаях объект получать надо.

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

Если ссылка получена из базы, то СчетФактураОбъект.ЭтоНовый() всегда Ложь.
Если нам не нужно записывать документ, то можно обойтись без получения объекта.
60. Андрей А. (Amras) 08.06.12 13:06
(59) yku,

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


Вот и возникает вопрос. Зачем в типовых печатных формах реализована эта проверка? А народ не задумываясь, порой, берет код и корректирует только несколько строчек, оставляя исходный.
61. Александр Гладких (yku) 08.06.12 13:31
(60) Amras,
Вот и возникает вопрос. Зачем в типовых печатных формах реализована эта проверка?

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

Народ вообще редко думает. Только чья ж в этом проблема?
62. Андрей А. (Amras) 08.06.12 16:06
(61) yku,

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


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

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

Я же делал немножко не так:
- Брал необходимы процедуры для формирования печатной формы;
- Для формы тестирования-отладки писал тот же код, что описан выше:

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

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

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

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


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

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

ТабДокумент = Новый ТабличныйДокумент;
...
Выборка = СформироватьЗапросДляПечати().Выбрать();
Макет = ЭтотОбъект.ПолучитьМакет("МакетФормы");
...
Пока Выборка.Следующий() Цикл
Макет.Параметры.Заполнить(Выборка);
...
ТабДокумент.Вывести(Макет);
КонецЦикла;


КонецФункции
63. Александр Гладких (yku) 08.06.12 16:56
(62) Amras,
Вот и возникает вопрос. Зачем в типовых печатных формах реализована эта проверка?

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

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

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

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

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

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

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

Если что, прошу прощения за свой тон. Уж очень сегодня день тяжелый выдался.
64. Александр Гладких (yku) 08.06.12 17:12
(62) Amras,
Еще попишу.
Вот раньше (сейчас всё реже) в типовых печатных формах часто любили использовать конструкции типа
Если ВалютаДокумента = мВалютаРегламентированногоУчета Тогда...

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

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

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

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

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

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

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


Не внимательно я читал. Теперь понятно зачем вы идете эдаким путем. И если внимательно прочитать мой пост выше, я описал там свой путь, правда я так уже давно не пишу, это писалось году эдак в 2007.
66. Александр Гладких (yku) 10.06.12 23:37
(65) Amras,
Я все равно не люблю использовать исключительно подстановку типового контекста, т.к. там очень много мусора.

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

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

А вот это интересно. А сейчас как? Или в старом фишка в функции "СформироватьЗапросДляПечати"?
К слову сейчас я просто копирую функцию/процедуру из модуля менеджера объекта, и присваиваю значения необходимых параметров типа:
Ссылка = СсылкаНаОбъект;
Неужто можно проще?
67. Дмитрий Веселов (Veduin) 19.06.12 10:51
Отличная статья со своими минусами но ВСЕ ЖЕ, автору спасибо
68. Алекс Ю (AlexO) 15.10.12 18:05
(0) слишком все замуторно описано.
Простые операции, можно было намного проще описать.
И в результате - по этой статье сложно научиться денлать ВПФ, а только - СчетФактуру.
Нет четкого алгоритма и представления.
И удобнее проверять через обработку poppy - тем более, второстепенные к теме разъяснения по поводу второй формы перегружают статью и слишком громоздки.
69. Александр Гладких (yku) 15.10.12 18:54
(68) AlexO,
Спасибо за критику.
слишком все замуторно описано.
Простые операции, можно было намного проще описать.
И в результате - по этой статье сложно научиться денлать ВПФ, а только - СчетФактуру.
Нет четкого алгоритма и представления.

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

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

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

PS. Я уже давно осознал, что нужно поменять и название статьи и саму статью, но всё никак не соберусь. Сейчас я вижу эту статью не как инструкцию о печати ВПФ, а как описание способа подмены контекста с демонстрацией использования на примере создания ВПФ типовых конфигураций старых релизов. Во как. Сразу и не выговоришь!
К слову, способ на данный момент представляет из себя чисто теоретический интерес. Практического смысла я в нем не вижу. Я не применял его уже, наверное, года полтора.
70. Алекс Ю (AlexO) 16.10.12 09:36
(69) yku,
Вторая форма - она вовсе не для проверки, а для подмены контекста.

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

так вот, в сравнении с обычныч способом создания ВПФ - в чем преимущество подмены контекста при создании ВПФ? пока кроме как теоретического смысла я не нашел :)
а как описание способа подмены контекста с демонстрацией использования

ну, если осилите - то давайте, ждем.
только чтоб не там сумбурно, как эта статья - а кратко, по делу и последовательно по пунктам :)
71. Александр Гладких (yku) 16.10.12 12:46
(70)
помните, я спрашивал вас -
а вообще сравнение методов создания ВПФ есть?

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

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


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

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

Раньше был смысл. Когда в самых потаённых уголках формирования печатных форм обращались к данными не через передаваемую ссылку, а напрямую - к реквизиту объекта. И чтобы не исправлять все такие использования на СсылкаНаОбъект.%ИмяРеквизита%, и заново не переопределять переменные модуля объекта, достаточно было подменить контекст.
72. Алекс Ю (AlexO) 16.10.12 13:13
(71) yku,
т.е. присвоение
ЭтотОбъект = СсылкаНаОбъект.ПолучитьОбъект() вы назвали "подмена контекста"? :)
73. Александр Гладких (yku) 16.10.12 13:39