Работаю с конфигурацией 1с 8.2 «Управление торговлей», редакция 10.3 (10.3.14.5), сам я не программист 1с, но была поставлена задача сделать внешнюю печатную форму «Товарный чек» с значением в строке покупатель «Частное лицо». Печатная форма будет вызываться из документа реализация товаров и услуг по кнопке «Печать». Спасибо статье из http://www.1c-pro.ru/forum66.html, но в каждом варианте есть свои нюансы, вот их то и пришлось решать, действуя по ананлогии.
Для начала создадим пустую внешнюю обработку, только макет создавать не будем —
мы его скопируем для последующего изменения из основной конфигурации. Находим в конфигурации документ «РеализацияТоваровУслуг» копируем макет «Накладная» в обработку из конфигурации — более удобный путь — напрямую перетащить мышкой макет из основной конфигурации в дерево данных нашей
обработки.
Открываем двойным кликом макет в нашей обработке, заходим в свойства «» и в разделе «Макет» для строки «заполнение» меняем «параметр» на «текст», в разделе «Основные» меняем надпись «ПредставлениеПолучателя» на » Частное лицо» все Макет готов.
Что бы не изобретать велосипед — посмотрим, как происходит формирование табличного документа в основной конфигурации: для этого мы зайдём
в модуль документа «РеализацияТоваровУслуг». Найдём в модуле Процедуру Печать, которая выглядит в моем случае (сокращенно) вот так:
Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь) Экспорт
……………………
……………………
// Получить экземпляр документа на печать
Если ИмяМакета =«Накладная» Тогда
ТабДокумент = ПечатьДокумента();
КонецЕсли;
…………………….
…………………….
УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ОбщегоНазначения.СформироватьЗаголовокДокумента(ЭтотОбъект));
КонецПроцедуры // Печать
В нашем случае получается, что для печати накладной в эту функцию передается параметр ИмяМакета равный строковой переменной «Накладная»
если посмотреть на код, мы увидим, что для формирование стандартной накладной используется функция ПечатьДокумента(…);, которую теперь
нам и требуется найти в коде модуля документа. Обычно она расположена чуть выше Процедуры печать(…)
Итак, вот сокращенный текст этой функции в эталонной конфигурации:
Функция Печать(СуммыВРублях = Ложь)
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(«ТекущийДокумент», ЭтотОбъект.Ссылка);
// …код программы…
КонецФункции // ПечатьДокумента()
Копируем эту функцию со всем содержимым в модуль объекта внешней обработки:
Переходим к Модулю объекта внешней обработки: по кнопке «Действия» нажимаем «Открыть модуль объекта» и скопированную функцию вставляем туда
Функция Печать(СуммыВРублях = Ложь) Экспорт
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(«ТекущийДокумент», ЭтотОбъект.Ссылка);
// …код программы…
КонецФункции // ПечатьДокумента()
Добавляем в функцию «Экспорт», Что мы сделали: для работы внешней печатной формы требуется экспортная (т.е. видимая для других объектов конфигурации) функция Печать,
которая должна возвращать в основную программу сформированный табличный документ для предварительно просмотра и последующей печати.
Теперь нужно найти строчку в модуле объекта:
ОбластьМакета.Параметры.ТекстЗаголовка = ОбщегоНазначения.СформироватьЗаголовокДокумента(Шапка, «Расходная накладная»);
И заменить надпись в шапке «Расходная накладная» на «Товарный чек».
Добавляем в нашу внешнюю обработку реквизит Имя «СсылкаНаОбъект»
Синоним «Ссылка на объект»
Тип » ДокументСсылка.РеализацияТоваровУслуг»
И как следствие меняем в модуле объекта нашей внешней обработки все «ЭтотОбъект.Ссылка » на «СсылкаНаОбъект»
После попытки закрыть модуль объекта внешней обработки:
{ВнешняяОбработка.НакладнаяЧЛ.МодульОбъекта(391,64)}: Переменная не определена (мВалютаРегламентированногоУчета)
+ «, на сумму » + ОбщегоНазначения.ФорматСумм(СуммаКПрописи, <>мВалютаРегламентированногоУчета); (Проверка: Толстый клиент (обычное приложение))
{ВнешняяОбработка.НакладнаяЧЛ.МодульОбъекта(392,101)}: Переменная не определена (мВалютаРегламентированногоУчета)
ОбластьМакета.Параметры.СуммаПрописью = ОбщегоНазначения.СформироватьСуммуПрописью(СуммаКПрописи, <>мВалютаРегламентированногоУчета); (Проверка: Толстый клиент (обычное приложение))
Еще раз редактируем код модуля так:
Перем мВалютаРегламентированногоУчета Экспорт;
Функция Печать(СуммыВРублях = Ложь) Экспорт
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(«ТекущийДокумент», ЭтотОбъект.Ссылка);
// …код программы…
КонецФункции // ПечатьДокумента()
мВалютаРегламентированногоУчета = глЗначениеПеременной(«ВалютаРегламентированногоУчета»);
На этом все.
Внешняя печатная форма есть во вложении.




молодец. тебе обучать надо только пришедших
(1) sanja,
ни кого не учу, сам пришедший, и мне просто нужны балы для скачивания одной оработки — Импорт из Excel
Хорошее описание создания внешней печатной формы для новичков. Спасибо и плюс.
Если ты не программист 1С то на кой хер ты взялся за «задание которое тебе дали»? Или ты занимаешься сопровождением 1С?
Смотри, а то работодатель он такой — сможет сесть тебе на шею и будешь программить в 1с 🙂
да и нафига так все через одно место делать, эту обработку можно свободно в гугли найти)))
(2) Не проще и быстрее было купить эти баллы?
Спасибо
(4) echo77, никогда не был против этого. Начинал сисадмином с минимальной ЗП, сейчас ведущий программист с соответствующей ЗП именно благодаря тому, что брался за все что даже меня не касается и разбирался. И если это не оценит этот работодатель, оценит другой, которому разнонаправленные специалисты очень нужны. Автору респект!
(8) kereo,
Респект, мой опыт работы доказывает, что имеено спецалист который берется за все и ценится руководителем. А от руководителя, который не стимулировал мои инициативы, я ушел. И теперь свой опыт системного администратора и применяю на новом месте с более высокой зарплатой, и ни что мне не мешает освоить программирование в 1с.
молодец! ты реально программист..это значит можно сделать из любой печ формы. это хорошо
Отличный урок для начинающих, я сам работал когда-то программистом 1С, однако не освоил программирование даже не этом уровне =D только сегодня искал внешнюю форму ТТН для 8.2, в итоге нашел под 8.1 перебил под 8.2, а зайди сюда чуть раньше, попробовал бы сделать сам) …хотя у ТТН своя форма заполнения перед печатью, не знаю вышло бы там так просто или нет
А если скопировать функцию печати из модуля документа не в модуль обработки, а в модуль её формы, и этой форме установить основной реквизит типа ДокументОбъект.<Нужный документ>, то не надо переименовывать ЭтотОбъект, к тому же доступны реквизиты документа, экспортные переменные и функции модуля 🙂
(12) saiten, но тогда, насколько я понимаю, не будет возможности печати документа без открытия формы, что для пакетной печати и/или печати из журнала документов не подходит.
Поддерживаю и ставлю плюс — сам не программист, а внедренец, но иногда приходится править код и дописывать и кое-что и именно подобные статьи помогают в работе. Последние годы своих пользователей «заставляю» пользоваться типовыми функционалами (да и 1С-ники постепенно радуют по количеству ошибок и недоработок) — потом и с обновлениями проще будет.
Есть мысль (услышанная со стороны и по-своему разумению понята): программистам все меньше и меньше становится работы — многое хороший внедренец может «разрулить» и типовыми функционалами или стандартными обработками. А вот подобные мелочи — очень помогают не обращаться к профессиональным программистам.
(13) В модуле обработки
Функция Печать() Экспорт
Форма = ПолучитьФорму(«Форма»);
Форма.ЭтотОбъект = СсылкаНаОбъект.ПолучитьОбъект();
Возврат Форма.ПечатьДокумента();
КонецФункции
В модуле формы
Функция ПечатьДокумента() Экспорт
<тут формируем табличный документ>
КонецФункции
Усё. А если форму сделать основной, чтоб она открывалась при запуске обработки через файл->открыть, и кинуть на неё поле ввода ссылки на документ, то автоматически решается и проблема отладки.
P.S. А, да, забыл… При этом теряется связь формы с обработкой, т.е. не получится получить макет, определённый в обработке. Чтобы этого избежать форме добавляется ещё один реквизит типа ВнешняяОбработкаОбъект, ну, например, назовём его ЭтаОбработка, который инициализируется при создании формы в модуле обработки: Форма.ЭтаОбработка = ЭтотОбъект. Соответственно, в модуле формы макет будет получаться не через ПолучитьМакет(«Макет»), а через ЭтаОбработка.ПолучитьМакет(«Макет»).
В общем, если интересно — могу дать мой шаблончик внешней обработки, тут, как говорится, проще один раз увидеть)
Все правильно, разбираясь в чужом коде часто можно получить больше знаний, чем пися (пиша?) своё с нуля 🙂
(15) saiten,
«В общем, если интересно — могу дать мой шаблончик внешней обработки, тут, как говорится, проще один раз увидеть) «
а дайте, будьте так любезны 🙂
фи.
(17) Вот. Шаблончик и пример использования для бухгалтерии.
(19) Удивительно, но конфигуратором выдаёт ошибку:
по причине:
Неверный формат хранилища данных ‘file://D:/_ВнешняяПечатнаяФорма.epf’
Причем открываю в 8.2.15.289
(20)Возможно, файл скачался битым. Попробуйте ещё раз скачать.
(19) saiten, спасибище!!!
Вот умничка!
Спасибо! Все получилось.
Спасибо, помогло, но у меня сразу не получилось, 1С сообщало:
Не удалось сформировать внешнюю печатную форму!
Поле объекта не обнаружено (ПредставлениеПолучателя)
Нашел поиском в тексте модуля все строки содержащие строку «ПредставлениеПолучателя», закомментировал их и все заработало.
Это произошло в связи с тем, что мы ввели в обработке «ПредставлениеПолучателя» просто текстом «Частное лицо»
(2) посмотри на эти обработки:
и деньги собирать не нужно…
p.s.
1С:Предприятие 8.2 (8.2.14.540)
«Управление торговлей», редакция 10.3 (10.3.18.4)
Спасибо!
то же не программист)
не хотелось лезть в конфу(замок трогать).
час пыхтения, и сделал как мне надо и не надо ни кого доставать такой мелочью;)
добавил только адрес доставки.
Пользуюсь этой формой, но необходимо удалить строку «НДС».. в товарном чеке у нас ее быть не должно.. подскажите как?
(27) buhfinans,
Привет, ни чего сложного, если не озадачиваться изысканными способами, а именно грубо:
в карточке товара у тебя стоит «Без НДС»?, тогда открывай в конфигураторе файл «Чек на частное лицо.epf» и редактируем:
— в разделе «Макеты» нашей обработки кликаем открывая «Накладная» ищем мешающую нам строку «ИтогоНДС» удаляем ее (навести мышь на «ИтогоНДС» и правой кнопкой мыши вызвать контекстное меню и выбрать «удалить»).
Сахраняем, не забываем в пользовательском приложении, в разделе «внешние печатные формы» загрузить
«Чек на частное лицо.epf» заново. и пробуем открыть в печатную форму и видим:
Не удалось сформировать внешнюю печатную форму!
Ошибка при вызове метода контекста (ПолучитьОбласть): Область не найдена: ИтогоНДС
— начинаем решать:
предполагая что уничтожив строку в Макете «ИтогоНДС» мы оставили в коде программы часть которая обслуживает эту строку, и спасибо производителю находим коммент
// Вывести ИтогоНДС
поэтому сами коментируем часть кода:
Если Шапка.УчитыватьНДС Тогда
ОбластьНомера = Макет.ПолучитьОбласть(«ИтогоНДС|НомерСтроки»);
ОбластьКодов = Макет.ПолучитьОбласть(«ИтогоНДС|КолонкаКодов»);
ОбластьТовар = Макет.ПолучитьОбласть(«ИтогоНДС|Товар»);
ОбластьМест = Макет.ПолучитьОбласть(«ИтогоНДС|Мест»);
ОбластьДанных = Макет.ПолучитьОбласть(«ИтогоНДС|КоличествоЦена»);
ОбластьСкидок = Макет.ПолучитьОбласть(«ИтогоНДС|Скидка»);
ОбластьСуммы = Макет.ПолучитьОбласть(«ИтогоНДС|Сумма»);
ТабДокумент.Вывести(ОбластьНомера);
Если ВыводитьКоды Тогда
ТабДокумент.Присоединить(ОбластьКодов);
КонецЕсли;
ТабДокумент.Присоединить(ОбластьТовар);
Если флВыводитьМест Тогда
ТабДокумент.Присоединить(ОбластьМест);
КонецЕсли;
ОбластьДанных.Параметры.НДС = ?(Шапка.СуммаВключаетНДС, «В том числе НДС:», «Сумма НДС:»);
ТабДокумент.Присоединить(ОбластьДанных);
Если ЕстьСкидки Тогда
ТабДокумент.Присоединить(ОбластьСкидок);
КонецЕсли;
ОбластьСуммы.Параметры.ВсегоНДС = ОбщегоНазначения.ФорматСумм(СуммаНДС);
ТабДокумент.Присоединить(ОбластьСуммы);
КонецЕсли;
И пожалуй все, попробуйте.
впрочем прикрепляю готовый файл.
OK!
Спасибо,AlexxxMksv! Вы мне очень помогли, особенно вот этой штукой:
мВалютаРегламентированногоУчета = глЗначениеПеременной(«ВалютаРегламентированногоУчета»);
спасибо! Теперь с поддержки хоть снимать не надо)
Ну и я скачаю так сказать в познавательных целях
В управляемых все иначе.. Только вроде на эту тему уже куча статей и тут и на соседних форумах.. Сама тоже методом тыка осваивала печатные формы, пока не приноровилась
если не снимать с поддержки можно ли внести какое то изменение в форму, чтобы оно при обновлении не затерлось?
(34) MiB, в бух3.0 можно в пользовательском режиме редактировать макет.. только потом при обновлении очередного макета может возникнуть проблема использования редактируемого макета