gifts2017

Как я создал внешнюю печатную форму из встроенной

Опубликовал Александр (AlexxxMksv) в раздел Программирование - Практика программирования

Сделать это реально даже новичку, сужу по себе.

Работаю с конфигурацией 1с 8.2 "Управление торговлей", редакция 10.3 (10.3.14.5), сам я не программист 1с, но была поставлена задача сделать внешнюю печатную форму "Товарный чек" с значением в строке покупатель "Частное лицо". Печатная форма будет вызываться из документа реализация товаров и услуг по кнопке "Печать".  Спасибо статье из http://www.1c-pro.ru/forum66.html, но в каждом варианте есть свои нюансы, вот их то и пришлось решать, действуя по ананлогии.

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

Открываем двойным кликом макет в нашей обработке, заходим в свойства ""  и в разделе "Макет" для строки "заполнение" меняем "параметр" на "текст", в разделе "Основные" меняем надпись "ПредставлениеПолучателя" на " Частное лицо" все Макет готов.

Что бы не изобретать велосипед - посмотрим, как происходит формирование табличного документа в основной конфигурации: для этого мы зайдём
в модуль документа "РеализацияТоваровУслуг". Найдём в модуле Процедуру  Печать, которая выглядит в моем случае (сокращенно) вот так:

 

Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь) Экспорт
    ........................

    ........................
   // Получить экземпляр документа на печать
   Если ИмяМакета ="Накладная" Тогда

     ТабДокумент = ПечатьДокумента();

   КонецЕсли;
   .........................

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

 

В нашем случае получается, что для печати накладной в эту функцию передается параметр ИмяМакета равный строковой переменной "Накладная"

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

 

Функция Печать(СуммыВРублях = Ложь)


Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);

// ...код программы...

КонецФункции // ПечатьДокумента()
 

 Копируем эту функцию со всем содержимым в модуль объекта внешней обработки:

 

    Переходим к Модулю объекта внешней обработки: по кнопке "Действия" нажимаем "Открыть модуль объекта" и скопированную функцию вставляем туда

 

Функция Печать(СуммыВРублях = Ложь) Экспорт

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);

// ...код программы...

КонецФункции // ПечатьДокумента()

 

Добавляем в функцию "Экспорт", Что мы сделали: для работы внешней печатной формы требуется экспортная (т.е. видимая для других объектов конфигурации) функция Печать,
которая должна возвращать в основную программу сформированный табличный документ для предварительно просмотра и последующей печати.

Теперь нужно найти строчку в модуле объекта:

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

И заменить надпись в шапке "Расходная накладная" на "Товарный чек".

 


Добавляем в нашу внешнюю обработку реквизит Имя             "СсылкаНаОбъект" 

                                                                                  Синоним     "Ссылка на объект"

                                                                                  Тип             " ДокументСсылка.РеализацияТоваровУслуг"

 

И как следствие меняем в модуле объекта нашей внешней обработки все "ЭтотОбъект.Ссылка " на "СсылкаНаОбъект"

После попытки закрыть модуль объекта внешней обработки:

 {ВнешняяОбработка.НакладнаяЧЛ.МодульОбъекта(391,64)}: Переменная не определена (мВалютаРегламентированногоУчета)
  + ", на сумму " + ОбщегоНазначения.ФорматСумм(СуммаКПрописи, <>мВалютаРегламентированногоУчета); (Проверка: Толстый клиент (обычное приложение))
{ВнешняяОбработка.НакладнаяЧЛ.МодульОбъекта(392,101)}: Переменная не определена (мВалютаРегламентированногоУчета)
  ОбластьМакета.Параметры.СуммаПрописью = ОбщегоНазначения.СформироватьСуммуПрописью(СуммаКПрописи, <>мВалютаРегламентированногоУчета); (Проверка: Толстый клиент (обычное приложение))

 

Еще раз редактируем код модуля так:

 

Перем мВалютаРегламентированногоУчета Экспорт;

Функция Печать(СуммыВРублях = Ложь) Экспорт

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);

// ...код программы...

КонецФункции // ПечатьДокумента()

мВалютаРегламентированногоУчета   = глЗначениеПеременной("ВалютаРегламентированногоУчета");

 

На этом все.

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

 

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

Наименование Файл Версия Размер Кол. Скачив.
Чек на частное лицо
.epf 10,63Kb
07.03.12
74
.epf 10,63Kb 74 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Алек4сандр Ершов (sanja) 09.03.12 02:38
молодец. тебе обучать надо только пришедших
2. Александр (AlexxxMksv) 09.03.12 10:24
(1) sanja,
ни кого не учу, сам пришедший, и мне просто нужны балы для скачивания одной оработки - Импорт из Excel
3. Владимир Водин (BalVlad) 09.03.12 15:19
Хорошее описание создания внешней печатной формы для новичков. Спасибо и плюс.
4. Александр Крынецкий (echo77) 09.03.12 15:29
Если ты не программист 1С то на кой хер ты взялся за "задание которое тебе дали"? Или ты занимаешься сопровождением 1С?
Смотри, а то работодатель он такой - сможет сесть тебе на шею и будешь программить в 1с :-)
5. tiko arut (tigrandis) 09.03.12 16:11
да и нафига так все через одно место делать, эту обработку можно свободно в гугли найти)))
6. Сергей Ожерельев (Поручик) 09.03.12 19:30
(2) Не проще и быстрее было купить эти баллы? http://forum.infostart.ru/forum1/topic52290/
7. антон кривец (akril19811) 10.03.12 20:01
8. Игорь Юндин (kereo) 11.03.12 11:33
(4) echo77, никогда не был против этого. Начинал сисадмином с минимальной ЗП, сейчас ведущий программист с соответствующей ЗП именно благодаря тому, что брался за все что даже меня не касается и разбирался. И если это не оценит этот работодатель, оценит другой, которому разнонаправленные специалисты очень нужны. Автору респект!
9. Александр (AlexxxMksv) 12.03.12 12:49
(8) kereo,
Респект, мой опыт работы доказывает, что имеено спецалист который берется за все и ценится руководителем. А от руководителя, который не стимулировал мои инициативы, я ушел. И теперь свой опыт системного администратора и применяю на новом месте с более высокой зарплатой, и ни что мне не мешает освоить программирование в 1с.
10. Айрат Ахметсафин (рибак) 14.03.12 15:50
молодец! ты реально программист..это значит можно сделать из любой печ формы. это хорошо
11. Алексей Меньшиков (zbruy) 14.03.12 16:16
Отличный урок для начинающих, я сам работал когда-то программистом 1С, однако не освоил программирование даже не этом уровне =D только сегодня искал внешнюю форму ТТН для 8.2, в итоге нашел под 8.1 перебил под 8.2, а зайди сюда чуть раньше, попробовал бы сделать сам) ...хотя у ТТН своя форма заполнения перед печатью, не знаю вышло бы там так просто или нет
12. Сергей Самошин (saiten) 14.03.12 16:54
А если скопировать функцию печати из модуля документа не в модуль обработки, а в модуль её формы, и этой форме установить основной реквизит типа ДокументОбъект.<Нужный документ>, то не надо переименовывать ЭтотОбъект, к тому же доступны реквизиты документа, экспортные переменные и функции модуля :)
13. olga pt (pt_olga) 14.03.12 17:56
(12) saiten, но тогда, насколько я понимаю, не будет возможности печати документа без открытия формы, что для пакетной печати и/или печати из журнала документов не подходит.
14. Дмитрий Тапол (DimitrT) 15.03.12 00:16
Поддерживаю и ставлю плюс - сам не программист, а внедренец, но иногда приходится править код и дописывать и кое-что и именно подобные статьи помогают в работе. Последние годы своих пользователей "заставляю" пользоваться типовыми функционалами (да и 1С-ники постепенно радуют по количеству ошибок и недоработок) - потом и с обновлениями проще будет.
Есть мысль (услышанная со стороны и по-своему разумению понята): программистам все меньше и меньше становится работы - многое хороший внедренец может "разрулить" и типовыми функционалами или стандартными обработками. А вот подобные мелочи - очень помогают не обращаться к профессиональным программистам.
15. Сергей Самошин (saiten) 15.03.12 00:20
(13) В модуле обработки
Функция Печать() Экспорт
Форма = ПолучитьФорму("Форма");
Форма.ЭтотОбъект = СсылкаНаОбъект.ПолучитьОбъект();
Возврат Форма.ПечатьДокумента();
КонецФункции

В модуле формы

Функция ПечатьДокумента() Экспорт
<тут формируем табличный документ>
КонецФункции

Усё. А если форму сделать основной, чтоб она открывалась при запуске обработки через файл->открыть, и кинуть на неё поле ввода ссылки на документ, то автоматически решается и проблема отладки.

P.S. А, да, забыл... При этом теряется связь формы с обработкой, т.е. не получится получить макет, определённый в обработке. Чтобы этого избежать форме добавляется ещё один реквизит типа ВнешняяОбработкаОбъект, ну, например, назовём его ЭтаОбработка, который инициализируется при создании формы в модуле обработки: Форма.ЭтаОбработка = ЭтотОбъект. Соответственно, в модуле формы макет будет получаться не через ПолучитьМакет("Макет"), а через ЭтаОбработка.ПолучитьМакет("Макет").
В общем, если интересно - могу дать мой шаблончик внешней обработки, тут, как говорится, проще один раз увидеть)
16. Екатерина Соколова (catena) 15.03.12 09:30
Все правильно, разбираясь в чужом коде часто можно получить больше знаний, чем пися (пиша?) своё с нуля :)
17. olga pt (pt_olga) 15.03.12 10:23
(15) saiten,
"В общем, если интересно - могу дать мой шаблончик внешней обработки, тут, как говорится, проще один раз увидеть) "


а дайте, будьте так любезны :)
18. Александр Медведев (anig99) 15.03.12 12:28
19. Сергей Самошин (saiten) 15.03.12 13:28
(17) Вот. Шаблончик и пример использования для бухгалтерии.
Прикрепленные файлы:
ВПФ_РеализацияТоваровУслуг_ТОРГ12.epf
_ВнешняяПечатнаяФорма.epf
20. cratos2 (CratosX) 16.03.12 15:19
(19) Удивительно, но конфигуратором выдаёт ошибку:

Ошибка при выполнении файловой операции 'D:\_ВнешняяПечатнаяФорма.epf'
по причине:
Неверный формат хранилища данных 'file://D:/_ВнешняяПечатнаяФорма.epf'


Причем открываю в 8.2.15.289
21. Сергей Самошин (saiten) 16.03.12 17:01
(20)Возможно, файл скачался битым. Попробуйте ещё раз скачать.
22. olga pt (pt_olga) 18.03.12 13:55
23. Татьяна Гулак (Gulak) 02.05.12 11:04
24. Надежда Поваляева (Nadi2006) 03.05.12 11:19
Спасибо! Все получилось.
25. Алексей (fgremlin) 01.08.12 18:42
Спасибо, помогло, но у меня сразу не получилось, 1С сообщало:
Не удалось сформировать внешнюю печатную форму!
Поле объекта не обнаружено (ПредставлениеПолучателя)

Нашел поиском в тексте модуля все строки содержащие строку "ПредставлениеПолучателя", закомментировал их и все заработало.

Это произошло в связи с тем, что мы ввели в обработке "ПредставлениеПолучателя" просто текстом "Частное лицо"

(2) AlexxxMksv, посмотри на эти обработки:
http://infostart.ru/public/97416/
http://infostart.ru/public/97415/
и деньги собирать не нужно...

p.s.
1С:Предприятие 8.2 (8.2.14.540)
"Управление торговлей", редакция 10.3 (10.3.18.4)
26. Kosta K (kostyaka) 04.09.12 22:56
Спасибо!
то же не программист)
не хотелось лезть в конфу(замок трогать).
час пыхтения, и сделал как мне надо и не надо ни кого доставать такой мелочью;)
добавил только адрес доставки.
27. Ирина Ивановна (buhfinans) 06.09.12 10:56
Пользуюсь этой формой, но необходимо удалить строку "НДС".. в товарном чеке у нас ее быть не должно.. подскажите как?
28. Александр (AlexxxMksv) 06.09.12 22:14
(27) buhfinans,

Привет, ни чего сложного, если не озадачиваться изысканными способами, а именно грубо:
в карточке товара у тебя стоит "Без НДС"?, тогда открывай в конфигураторе файл "Чек на частное лицо.epf" и редактируем:
- в разделе "Макеты" нашей обработки кликаем открывая "Накладная" ищем мешающую нам строку "ИтогоНДС" удаляем ее (навести мышь на "ИтогоНДС" и правой кнопкой мыши вызвать контекстное меню и выбрать "удалить").
Сахраняем, не забываем в пользовательском приложении, в разделе "внешние печатные формы" загрузить
"Чек на частное лицо.epf" заново. и пробуем открыть в печатную форму и видим:

Не удалось сформировать внешнюю печатную форму!
Ошибка при вызове метода контекста (ПолучитьОбласть): Область не найдена: ИтогоНДС

- начинаем решать:
предполагая что уничтожив строку в Макете "ИтогоНДС" мы оставили в коде программы часть которая обслуживает эту строку, и спасибо производителю находим коммент
// Вывести ИтогоНДС

поэтому сами коментируем часть кода:

Если Шапка.УчитыватьНДС Тогда
ОбластьНомера = Макет.ПолучитьОбласть("ИтогоНДС|НомерСтроки");
ОбластьКодов = Макет.ПолучитьОбласть("ИтогоНДС|КолонкаКодов");
ОбластьТовар = Макет.ПолучитьОбласть("ИтогоНДС|Товар");
ОбластьМест = Макет.ПолучитьОбласть("ИтогоНДС|Мест");
ОбластьДанных = Макет.ПолучитьОбласть("ИтогоНДС|КоличествоЦена");
ОбластьСкидок = Макет.ПолучитьОбласть("ИтогоНДС|Скидка");
ОбластьСуммы = Макет.ПолучитьОбласть("ИтогоНДС|Сумма");

ТабДокумент.Вывести(ОбластьНомера);
Если ВыводитьКоды Тогда
ТабДокумент.Присоединить(ОбластьКодов);
КонецЕсли;
ТабДокумент.Присоединить(ОбластьТовар);
Если флВыводитьМест Тогда
ТабДокумент.Присоединить(ОбластьМест);
КонецЕсли;

ОбластьДанных.Параметры.НДС = ?(Шапка.СуммаВключаетНДС, "В том числе НДС:", "Сумма НДС:");
ТабДокумент.Присоединить(ОбластьДанных);
Если ЕстьСкидки Тогда
ТабДокумент.Присоединить(ОбластьСкидок);
КонецЕсли;
ОбластьСуммы.Параметры.ВсегоНДС = ОбщегоНазначения.ФорматСумм(СуммаНДС);
ТабДокумент.Присоединить(ОбластьСуммы);
КонецЕсли;


И пожалуй все, попробуйте.

впрочем прикрепляю готовый файл.
Прикрепленные файлы:
Чек на частное лицо без НДС.epf
s_pasha07; buhfinans; +2 Ответить
29. Ирина Ивановна (buhfinans) 07.09.12 13:01
30. Светлана Петрова (Nad_ya) 21.11.12 21:44
Спасибо,AlexxxMksv! Вы мне очень помогли, особенно вот этой штукой:
мВалютаРегламентированногоУчета = глЗначениеПеременной("ВалютаРегламентированногоУчета");
31. Павел (sidka89) 24.10.13 13:33
спасибо! Теперь с поддержки хоть снимать не надо)
32. ceramica (ceramica) 04.02.14 03:25
Ну и я скачаю так сказать в познавательных целях
33. Елена Пименова (Bukaska) 04.02.14 15:11
В управляемых все иначе.. Только вроде на эту тему уже куча статей и тут и на соседних форумах.. Сама тоже методом тыка осваивала печатные формы, пока не приноровилась
34. MiB (MiB) 19.08.14 17:54
если не снимать с поддержки можно ли внести какое то изменение в форму, чтобы оно при обновлении не затерлось?
35. Елена Пименова (Bukaska) 20.08.14 10:17
(34) MiB, в бух3.0 можно в пользовательском режиме редактировать макет.. только потом при обновлении очередного макета может возникнуть проблема использования редактируемого макета
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа