Как добавить договор, его номер и дату в печатную форму счета на оплату в 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При оформлении печатных форм документов, таких как Счет на оплату покупателю, часто возникает необходимость вывести дополнительное поле Основание с указанием наименования договора, его номера и даты. Рассмотрим, как правильно доработать внешнюю или штатную печатную форму в 1С, настроить параметры макета, сформировать запрос и корректно отформатировать дату без отображения времени.

Шаг 1. Получение данных договора в запросе

Для того чтобы вывести данные договора в печатную форму, их необходимо предварительно выбрать из базы данных. Обычно выборка шапки документа выполняется с помощью запроса. Проанализируем пример запроса, выбирающего реквизиты договора из документа СчетНаОплатуПокупателю:


Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект.Ссылка);
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЗаказПокупателя.Номер КАК Номер,
    |	ЗаказПокупателя.Дата КАК Дата,
    |	ЗаказПокупателя.ДоговорКонтрагента КАК ДоговорКонтрагента,
    |	ЗаказПокупателя.Организация КАК Организация,
    |	ЗаказПокупателя.Контрагент КАК Покупатель,
    |	ЕСТЬNULL(ЗаказПокупателя.ДоговорКонтрагента.Представление, """") КАК Основание,
    |	ЕСТЬNULL(ЗаказПокупателя.ДоговорКонтрагента.Дата, ДАТАВРЕМЯ(1, 1, 1)) КАК ОснованиеДата,
    |	ЕСТЬNULL(ЗаказПокупателя.ДоговорКонтрагента.Номер, """") КАК ОснованиеНомер
    |ИЗ
    |	Документ.СчетНаОплатуПокупателю КАК ЗаказПокупателя
    |ГДЕ
    |	ЗаказПокупателя.Ссылка = &ТекущийДокумент";

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    ЗаполнитьЗначенияСвойств(Шапка, Выборка);
КонецЕсли;

Обратите внимание на использование функции ЕСТЬNULL. Она позволяет избежать ошибок при выгрузке данных, если договор у документа не заполнен.

Шаг 2. Настройка макета печатной формы

Разберем работу с макетом табличного документа. Чтобы в печатную форму вывелось значение, открываем макет обработки или печатной формы и находим нужную область (например, область Основание или Покупатель).

  1. Выделяем ячейку, в которую должен выводиться текст с договором.
  2. В палитре свойств ячейки устанавливаем параметр Заполнение в значение Параметр.
  3. Задаем имя параметра в свойстве Параметр (например, ОснованиеТекст, НомерДоговора или ДатаДоговора).

Распространенная ошибка начинающих разработчиков — обращение к параметрам макета через составные пути вроде ОбластьМакета.Параметры.СсылкаНаОбъект.Договор.... В объекте Параметры области макета находятся только те имена, которые вы прямо указали в свойствах ячеек макета.

Шаг 3. Заполнение параметров и форматирование даты в коде

Посмотрим, как передать полученные данные из структуры Шапка в параметры области макета. Для вывода даты в строгом формате без времени (например, 15.05.2024) используется функция Формат() с маской ДФ=dd.MM.yyyy.


// Получаем область из макета
ОбластьМакета = Макет.ПолучитьОбласть("Основание");

// Заполняем совпавшие параметры из структуры Шапка
ОбластьМакета.Параметры.Заполнить(Шапка);

// Формируем текстовое представление договора с номером и датой
Если ЗначениеЗаполнено(Шапка.ДоговорКонтрагента) Тогда
    
    // Удаляем время из даты договора с помощью функции Формат
    ДатаСтр = Формат(Шапка.ДоговорКонтрагента.Дата, "ДФ=dd.MM.yyyy; ДП=''");
    НомерСтр = Шапка.ДоговорКонтрагента.Номер;
    
    // Формируем итоговую строку основание
    ТекстОснования = "Договор № " + НомерСтр + " от " + ДатаСтр;
    
    // Передаем значение в параметр макета
    ОбластьМакета.Параметры.ОснованиеТекст = ТекстОснования;
Иначе
    ОбластьМакета.Параметры.ОснованиеТекст = "Без договора";
КонецЕсли;

// Выводим область в табличный документ
ТабДокумент.Вывести(ОбластьМакета);

Параметр формата ДП='' (длина пустой даты) гарантирует, что если дата договора не заполнена, на печать не выведется ненужная строка 01.01.0001.

Рекомендации по выводу подвала и оферты

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


МассивПроверки = Новый Массив;
МассивПроверки.Добавить(ОбластьОснование);
МассивПроверки.Добавить(ОбластьПодвал);

// Если области не помещаются на текущую страницу, переносим их на следующую
Если НЕ ТабДокумент.ПроверитьВывод(МассивПроверки) Тогда
    ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;

ТабДокумент.Вывести(ОбластьОснование);
ТабДокумент.Вывести(ОбластьПодвал);

Соблюдение этих правил позволит корректно выводить реквизиты договора в счете на оплату и защитит печатную форму от визуальных ошибок форматирования.

← На главную