Работа с внешними печатными формами в системе 1С:Предприятие 8.2 (особенно в конфигурациях на обычных формах, таких как «Управление торговлей 10.3») часто вызывает вопросы у начинающих разработчиков. Типичная ситуация: вы изменили визуальную часть макета, добавили новые поля или переименовали существующие, но данные в них не появляются или программа выдает ошибку. Давайте разберем подробно, где именно скрыта логика заполнения этих макетов и как правильно внести изменения, чтобы всё заработало.
Прежде всего, проанализируем, где физически находится код. Внешняя печатная форма — это файл с расширением .epf. В рабочей базе 1С эти файлы обычно хранятся не на жестком диске, а внутри самой информационной базы в специальном справочнике. Чтобы отредактировать код, нам нужно сначала извлечь этот файл.
Выполним следующие шаги:
.epf в рабочую папку.Рассмотрим распространенную ошибку: поиск кода в модуле формы. Когда мы открываем сохраненный файл в Конфигураторе, часто первым делом заглядываем в Модуль формы. Там обычно находится стандартный обработчик нажатия кнопки:
Процедура КнопкаВыполнитьНажатие(Кнопка)
// Вставить содержимое обработчика.
Печать();
КонецПроцедуры
Проанализируем эту ситуацию. Если мы видим такой код, это означает, что форма обработки является лишь оболочкой. Настоящая логика формирования печатного листа находится в Модуле объекта. Чтобы попасть в него, в дереве метаданных обработки (в окне конфигуратора) нужно нажать правой кнопкой мыши на корень (название обработки) и выбрать пункт «Открыть модуль объекта».
Именно в модуле объекта внешней печатной формы 1С 8.2 обязательно должна присутствовать экспортная функция или процедура Печать(). Именно её вызывает система, когда пользователь нажимает кнопку печати в документе.
Выясним, как программа понимает, какие данные выводить. В модуле объекта мы увидим структуру, подобную этой:
Функция Печать() Экспорт
ТабДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("ИмяВашегоМакета");
// Получение области шапки
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// Заполнение параметров из реквизитов документа
ОбластьШапка.Параметры.ДатаВыдачи = СсылкаНаОбъект.Дата;
// Вывод области в итоговый документ
ТабДокумент.Вывести(ОбластьШапка);
Возврат ТабДокумент;
КонецФункции
Обратим внимание на важный объект — СсылкаНаОбъект. Это реквизит внешней обработки, в который система автоматически передает ссылку на документ, из которого запущена печать. Через эту ссылку мы можем обратиться к любому полю документа: СсылкаНаОбъект.Номер, СсылкаНаОбъект.Контрагент, СсылкаНаОбъект.СуммаДокумента и так далее.
Рассмотрим ситуацию автора: поле «Дата Выдачи» заменено на «Предполагаемая стоимость». Чтобы данные начали выводиться, выполним следующие действия в модуле объекта:
Область.Параметры.ИмяПараметра = Значение.
Область.Параметры.ДатаВыдачи = СсылкаНаОбъект.Дата;
А теперь вы хотите выводить стоимость, код должен стать таким:
Область.Параметры.ПредполагаемаяСтоимость = СсылкаНаОбъект.СуммаДокумента;
Важный момент: убедитесь, что в макете у соответствующей ячейки в палитре свойств установлено значение Заполнение: Параметр. Если там будет стоять Текст, то программа просто проигнорирует ваши попытки присвоить значение в коде и выведет в печатную форму само слово «ПредполагаемаяСтоимость».
Проанализируем совет из сообщения 8: использование клавиши F12. Если вы находитесь в модуле формы и видите вызов процедуры Печать(), просто установите курсор на это слово и нажмите F12 (Перейти к определению). Конфигуратор сам перекинет вас в модуль объекта прямо к началу нужной функции. Это значительно ускоряет навигацию по незнакомому коду.
После того как мы внесли изменения в код и сохранили файл .epf на диске, работа не закончена. Поскольку 1С использует внутреннюю копию обработки, нам нужно «залить» изменения обратно:
Теперь при нажатии кнопки «Печать» в документе система будет использовать обновленный алгоритм и выводить новые данные в макет. Если вы планируете заниматься разработкой часто, рекомендуем создать в модуле формы кнопку «Тест», которая будет программно заполнять реквизит СсылкаНаОбъект и вызывать Печать().Показать(), чтобы не тратить время на постоянную загрузку файла в базу при каждой мелкой правке.