При оформлении печатных форм документов, таких как Счет на оплату покупателю, часто возникает необходимость вывести дополнительное поле Основание с указанием наименования договора, его номера и даты. Рассмотрим, как правильно доработать внешнюю или штатную печатную форму в 1С, настроить параметры макета, сформировать запрос и корректно отформатировать дату без отображения времени.
Для того чтобы вывести данные договора в печатную форму, их необходимо предварительно выбрать из базы данных. Обычно выборка шапки документа выполняется с помощью запроса. Проанализируем пример запроса, выбирающего реквизиты договора из документа СчетНаОплатуПокупателю:
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект.Ссылка);
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказПокупателя.Номер КАК Номер,
| ЗаказПокупателя.Дата КАК Дата,
| ЗаказПокупателя.ДоговорКонтрагента КАК ДоговорКонтрагента,
| ЗаказПокупателя.Организация КАК Организация,
| ЗаказПокупателя.Контрагент КАК Покупатель,
| ЕСТЬNULL(ЗаказПокупателя.ДоговорКонтрагента.Представление, """") КАК Основание,
| ЕСТЬNULL(ЗаказПокупателя.ДоговорКонтрагента.Дата, ДАТАВРЕМЯ(1, 1, 1)) КАК ОснованиеДата,
| ЕСТЬNULL(ЗаказПокупателя.ДоговорКонтрагента.Номер, """") КАК ОснованиеНомер
|ИЗ
| Документ.СчетНаОплатуПокупателю КАК ЗаказПокупателя
|ГДЕ
| ЗаказПокупателя.Ссылка = &ТекущийДокумент";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ЗаполнитьЗначенияСвойств(Шапка, Выборка);
КонецЕсли;
Обратите внимание на использование функции ЕСТЬNULL. Она позволяет избежать ошибок при выгрузке данных, если договор у документа не заполнен.
Разберем работу с макетом табличного документа. Чтобы в печатную форму вывелось значение, открываем макет обработки или печатной формы и находим нужную область (например, область Основание или Покупатель).
ОснованиеТекст, НомерДоговора или ДатаДоговора).Распространенная ошибка начинающих разработчиков — обращение к параметрам макета через составные пути вроде ОбластьМакета.Параметры.СсылкаНаОбъект.Договор.... В объекте Параметры области макета находятся только те имена, которые вы прямо указали в свойствах ячеек макета.
Посмотрим, как передать полученные данные из структуры Шапка в параметры области макета. Для вывода даты в строгом формате без времени (например, 15.05.2024) используется функция Формат() с маской ДФ=dd.MM.yyyy.
// Получаем область из макета
ОбластьМакета = Макет.ПолучитьОбласть("Основание");
// Заполняем совпавшие параметры из структуры Шапка
ОбластьМакета.Параметры.Заполнить(Шапка);
// Формируем текстовое представление договора с номером и датой
Если ЗначениеЗаполнено(Шапка.ДоговорКонтрагента) Тогда
// Удаляем время из даты договора с помощью функции Формат
ДатаСтр = Формат(Шапка.ДоговорКонтрагента.Дата, "ДФ=dd.MM.yyyy; ДП=''");
НомерСтр = Шапка.ДоговорКонтрагента.Номер;
// Формируем итоговую строку основание
ТекстОснования = "Договор № " + НомерСтр + " от " + ДатаСтр;
// Передаем значение в параметр макета
ОбластьМакета.Параметры.ОснованиеТекст = ТекстОснования;
Иначе
ОбластьМакета.Параметры.ОснованиеТекст = "Без договора";
КонецЕсли;
// Выводим область в табличный документ
ТабДокумент.Вывести(ОбластьМакета);
Параметр формата ДП='' (длина пустой даты) гарантирует, что если дата договора не заполнена, на печать не выведется ненужная строка 01.01.0001.
Если в счет добавляется дополнительный блок текста (оферта, условия поставки или расширенное основание), проанализируем важный нюанс контроля страниц. Чтобы блок с условиями и подписи не оторвались от таблицы товаров и не ушли на отдельный лист без контекста, проверяйте возможность вывода нескольких областей перед их выгрузкой:
МассивПроверки = Новый Массив;
МассивПроверки.Добавить(ОбластьОснование);
МассивПроверки.Добавить(ОбластьПодвал);
// Если области не помещаются на текущую страницу, переносим их на следующую
Если НЕ ТабДокумент.ПроверитьВывод(МассивПроверки) Тогда
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ТабДокумент.Вывести(ОбластьОснование);
ТабДокумент.Вывести(ОбластьПодвал);
Соблюдение этих правил позволит корректно выводить реквизиты договора в счете на оплату и защитит печатную форму от визуальных ошибок форматирования.