Как отладить внешние печатных формы в 1С 8.3 управляемом приложении
Многие сталкиваются с проблемой отладки внешних печатных форм в 1С 8.3 (8.2) в режиме управляемых форм (да порой и в обычном тоже). Связано это в первую очередь с тем, что, запуская такую форму, система создает временный файл, и точки останова не срабатывают.
Можно, конечно, использовать готовые обработки для целей отладки, благо, найти их не составляет проблемы. Например: http://infostart.ru/public/73691/.
Но есть недостатки большинства таких решений:
- часто не подходят для новых релизов, приходится «допиливать/перепиливать» (фирма 1С постоянно что-то меняет в свежих релизах);
- в основном подходят для внешних печатных форм, созданных с помощью библиотеки стандартных подсистем;
- на практике бывает быстрее и проще сделать свою небольшую обработку, чем найти готовую, а потом еще с ней и разобраться.
Рассмотрим пример разработки собственной внешней печатной формы с возможностью отладки.
Создание внешней обработки для отладки печатных форм на управляемом приложении 1С
Суть разработки заключается в том, что мы создадим обычную внешнюю обработку с макетом и процедурой печати, а в форму обработки будем передавать нужный объект.
Итак, создаем новую внешнюю обработку. Назовите ее как угодно.
Добавим в обработку реквизит «СсылкаНаОбъект». Тип реквизита может быть составным и зависеть от конфигурации. Я выбрал тип – документ «РеализацияТоваровУслуг». Такой документ есть и в торговле, и в бухгалтерии.
Также добавим форму с единственным полем «Ссылка» и кнопкой «Печать». Кнопку добавим позже, когда создадим команду. Еще добавим макет, в который будем выводить данные документа.
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Команду назовем «ПечатьОбъекта» с одноименным действием на клиенте:
Создадим простой Макет:
Выборку данных из объекта будем производить запросом, поэтому вызовем функцию на сервере. В функцию передадим нашу ссылку на объект, которая будет использоваться в качестве параметра в запросе. Функция будет возвращать заполненный табличный документ, так как показ его возможен только на клиенте:
&НаКлиенте Процедура ПечатьОбъекта(Команда) ТаблДокум = Новый ТабличныйДокумент; ТаблДокум = ПечатьНаСервере(Объект.СсылкаНаДок, ТаблДокум); ТаблДокум.Показать("Печать документа"); КонецПроцедуры
Пример функции на сервере:
&НаСервере Функция ПечатьНаСервере(СсылкаНаДок, ТаблДокум) Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровУслугТовары.Ссылка.Ссылка, | РеализацияТоваровУслугТовары.Ссылка.Номер, | РеализацияТоваровУслугТовары.Ссылка.Дата, | РеализацияТоваровУслугТовары.Ссылка.Организация, | РеализацияТоваровУслугТовары.Ссылка.Склад, | РеализацияТоваровУслугТовары.Ссылка.Контрагент, | РеализацияТоваровУслугТовары.Номенклатура, | РеализацияТоваровУслугТовары.Количество, | РеализацияТоваровУслугТовары.Цена, | РеализацияТоваровУслугТовары.Сумма, | РеализацияТоваровУслугТовары.Номенклатура.ЕдиницаИзмерения, | РеализацияТоваровУслугТовары.НомерСтроки |ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары |ГДЕ | РеализацияТоваровУслугТовары.Ссылка = &СсылкаНаОбъект"; Запрос.УстановитьПараметр("СсылкаНаОбъект", СсылкаНаДок); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетЗап = РезультатЗапроса.Выбрать(); ТаблДокум.Очистить(); ОбластьШапка = Макет.ПолучитьОбласть("Шапка"); ОбластьШапкаТабЧасти = Макет.ПолучитьОбласть("ШапкаТабЧасти"); ОблДеталиТаблЧасти = Макет.ПолучитьОбласть("ДеталиТаблЧасти"); ТаблДокум.НачатьАвтогруппировкуСтрок(); Пока ВыборкаДетЗап.Следующий() Цикл Если ВыборкаДетЗап.НомерСтроки = 1 Тогда ОбластьШапка.Параметры.НомерДок = ВыборкаДетЗап.Номер; ОбластьШапка.Параметры.ДатаДок = ВыборкаДетЗап.Дата; ОбластьШапка.Параметры.Организация = ВыборкаДетЗап.Организация; ОбластьШапка.Параметры.Склад = ВыборкаДетЗап.Склад; ОбластьШапка.Параметры.Контрагент = ВыборкаДетЗап.Контрагент; ТаблДокум.Вывести(ОбластьШапка); ТаблДокум.Вывести(ОбластьШапкаТабЧасти); КонецЕсли; ОблДеталиТаблЧасти.Параметры.НомерСтроки = ВыборкаДетЗап.НомерСтроки; ОблДеталиТаблЧасти.Параметры.Номенклатура = ВыборкаДетЗап.Номенклатура; ОблДеталиТаблЧасти.Параметры.Количество = ВыборкаДетЗап.Количество; ОблДеталиТаблЧасти.Параметры.НоменклатураЕдиницаИзмерения = ВыборкаДетЗап.НоменклатураЕдиницаИзмерения; ОблДеталиТаблЧасти.Параметры.Цена = ВыборкаДетЗап.Цена; ОблДеталиТаблЧасти.Параметры.Сумма = ВыборкаДетЗап.Сумма; ТаблДокум.Вывести(ОблДеталиТаблЧасти, ВыборкаДетЗап.Уровень()); КонецЦикла; ТаблДокум.ЗакончитьАвтогруппировкуСтрок(); ТаблДокум.АвтоМасштаб = Истина; ТаблДокум.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; ТаблДокум.ПолеСлева = 5; ТаблДокум.ПолеСправа = 5; Возврат ТаблДокум; КонецФункции
Для отладки ставим точку останова в нужном нам месте и запускаем обработку в режиме предприятия.
Скачать получившуюся обработку для примера можно по ссылке — ОтладкаВнешнихПечатныхФорм. Обработку можно использовать как шаблон.
Важно: Если база данных находится на сервере, для отладки на сервере нужно запустить с параметром «-debug».
После отладки макет и код процедуры и функции можно вставить в нужный объект и пользоваться.
Создание внешних печатных форм в 1С 8.3 (Управляемое приложение) с нуля:
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
СПРОСИТЕ в комментариях!
Ольга:
Здравствуйте! Как сделать, чтобы эта внешняя печатная форма работала в отладчике?
Н:
так никто и не ответил…. какой-то косяк в платформе… кнопка «Режим отладки» во внешних печ формах есть, а отладить нельзя…..
Елена:
Здравствуйте!
Есть ли в 8.3 механизм разбиения слова по ячейкам в макете?
Алексей:
В возможностях платформы такого нет.
Но можно сделать функцию, которая из входящей строки будет выдавать массив символов в строке. А потом циклом по этому массиву можно устанавливать текст в ячейках по их адресу. Адрес ячейки можно формировать, опираясь на индекс значения массива.
Дмитрий:
Если надо протестировать, как работает печать нескольких выбранных документов, на что надо заменить реквизит СсылкаНаОбъект? Вопрос актуальный, в типовых чаще параметром печати выступает МассивОбъектов.
Аноним:
Делай список значений ни форме. А в запросе параметр указывай ссылка в (&твойсписокзнаяей)
Аноним:
Огромное Вам спасибо за «Отладку внешних печатных форм». Очень облегчила жизнь.
Аноним:
Название не соответствует содержимому…
Аноним:
бред