Почему во внешней печатной форме УПД не выводятся платежно-расчетные документы в УТ 10.3 и как это исправить?

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

При разработке и кастомизации внешних печатных форм (ВПФ) для документа Универсальный передаточный документ (УПД) в конфигурации «Управление торговлей 10.3» разработчики часто сталкиваются с неприятной проблемой. В печатной форме в строке 7 («К платежно-расчетному документу №») вместо реального номера и даты платежного поручения выводятся прочерки или пустые значения. При этом в типовой (встроенной) печатной форме всё отображается корректно.

В этой статье мы подробно разберем, почему возникает данное поведение, как быстро и удобно отлаживать внешние печатные формы на обычных формах, и напишем программный код, который решит проблему получения данных об оплате, даже если печать запускается из документа реализации.

Выясняем причину: почему данные «теряются» во внешней форме

Для начала проанализируем, как типовая конфигурация формирует данные для печати УПД. Процесс вывода информации делегирован общему модулю УчетНДС, а именно экспортной процедуре ВывестиСчетФактуруВТабличныйДокумент. Этот метод принимает структуру параметров ДанныеДляПечати.

Внутри процедуры выполняется проверка наличия таблицы с датами оплат:


Если ДанныеДляПечати.Свойство("ТаблицаДатОплат") Тогда
    Для каждого ПараметрыДокументаОплаты Из ДанныеДляПечати.ТаблицаДатОплат Цикл
        // Здесь происходит формирование строки платежного документа...
    КонецЕсли;
КонецЕсли;

Если печать запускается стандартным образом из проведенного документа СчетФактураВыданный, система автоматически собирает эти данные и передает их в структуру. Однако, если мы используем ВПФ и запускаем печать из документа РеализацияТоваровУслуг, свойство ТаблицаДатОплат в структуре ДанныеДляПечати оказывается неопределенным или отсутствует. Из-за этого алгоритм перескакивает заполнение строки и выводит пустые прочерки.

Чтобы решить эту задачу, нам необходимо самостоятельно получить таблицу документов оплаты и передать ее в структуру параметров печати.

Как легко отлаживать ВПФ в УТ 10.3 (обычные формы)

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

  1. Откройте вашу внешнюю печатную форму (файл .epf) в режиме Конфигуратора.
  2. Перейдите на вкладку Формы и добавьте новую основную форму обработки (это будет обычная, неуправляемая форма).
  3. Добавьте на форму реквизит с именем СсылкаНаОбъект. Тип данных этого реквизита должен строго соответствовать типу документа, для которого создается печать (например, ДокументСсылка.РеализацияТоваровУслуг или ДокументСсылка.СчетФактураВыданный). Вынесите это поле на рабочую область формы.
  4. Добавьте на форму кнопку (например, с именем «Выполнить») и назначьте ей обработчик нажатия.
  5. В модуле формы вставьте следующий простой код:

Процедура КнопкаВыполнитьНажатие(Кнопка)
    ТабДок = ЭтотОбъект.Печать(); // Вызываем экспортную функцию печати из модуля объекта ВПФ
    ТабДок.Показать(); // Отображаем результат
КонецПроцедуры

Теперь запустите сеанс «1С:Предприятие» под отладкой из Конфигуратора. Откройте вашу обработку через стандартное меню Файл -> Открыть (Ctrl + O). Выберите конкретный документ в поле ввода и нажмите кнопку «Выполнить». В этот момент управление полностью передается в Конфигуратор, и вы можете ставить точки останова в любом месте модуля вашей ВПФ и пошагово отслеживать значения переменных.

Решение проблемы: связываем Реализацию со Счетом-фактурой

Вернемся к программной логике. Нам необходимо заполнить таблицу дат оплат. Главная сложность состоит в том, что когда печать вызывается из документа РеализацияТоваровУслуг, переменная СсылкаНаОбъект ссылается на реализацию, в то время как платежные документы хранятся в подчиненном документе СчетФактураВыданный в табличной части ДатаНомерДокументовОплаты.

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

Рассмотрим готовое решение, которое нужно внедрить в модуль объекта внешней печатной формы перед вызовом процедуры печати общего модуля:


// 1. Инициализируем пустую таблицу дат оплат на случай, если СФ не будет найден
ТаблицаДатОплат = Новый ТаблицаЗначений;

// 2. Ищем связанный и непроверенный на удаление счет-фактуру
Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
	|	СчетФактура.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.СчетФактураВыданный КАК СчетФактура
	|ГДЕ
	|	(СчетФактура.ДокументОснование = &СсылкаНаОбъект
	|		ИЛИ СчетФактура.Ссылка В
	|			(ВЫБРАТЬ
	|				ТЧ.Ссылка
	|			ИЗ
	|				Документ.СчетФактураВыданный.ДокументыОснования КАК ТЧ
	|			ГДЕ
	|				ТЧ.ДокументОснование = &СсылкаНаОбъект))
	|	И НЕ СчетФактура.ПометкаУдаления";

Запрос.УстановитьПараметр("СсылкаНаОбъект", СсылкаНаОбъект);
РезультатЗапроса = Запрос.Выполнить();

Если Не РезультатЗапроса.Пустой() Тогда
	Выборка = РезультатЗапроса.Выбрать();
	Выборка.Next(); // Переходим к найденной записи
	СчетФактураОбъект = Выборка.Ссылка.ПолучитьОбъект();
	
	// Выгружаем накопленные данные об оплате из документа Счет-Фактура
	ТаблицаДатОплат = СчетФактураОбъект.ДатаНомерДокументовОплаты.Выгрузить();
КонецЕсли;

// 3. Сворачиваем таблицу по ключевым полям, чтобы избежать дублирования строк
ТаблицаДатОплат.Свернуть("ДатаПлатежноРасчетногоДокумента, НомерПлатежноРасчетногоДокумента");

// 4. Очищаем строки, где нет ни номера, ни даты оплаты
СтрокиКУдалению = Новый Массив;
Для каждого СтрокаОплат Из ТаблицаДатОплат Цикл
	Если НЕ ЗначениеЗаполнено(СтрокаОплат.ДатаПлатежноРасчетногоДокумента) 
	   И ПустаяСтрока(СтрокаОплат.НомерПлатежноРасчетногоДокумента) Тогда
		СтрокиКУдалению.Добавить(СтрокаОплат);
	КонецЕсли;
КонецЦикла;

Для каждого СтрокаИз Списка Из СтрокиКУдалению Цикл
	ТаблицаДатОплат.Удалить(СтрокаИз);
КонецЦикла;

// 5. Помещаем готовую таблицу в структуру параметров для общего модуля
ДанныеДляПечати.Вставить("ТаблицаДатОплат", ТаблицаДатОплат);

Альтернативный вариант: получение данных напрямую из Реализации

Что делать, если бухгалтер печатает УПД со статусом «1» непосредственно из документа реализации, но сам документ СчетФактураВыданный еще физически не создан в базе данных? В такой ситуации наш запрос вернет пустой результат.

Для решения этой проблемы мы можем обратиться к механизму предоплаты в самой реализации. Если в документе реализации заполнена табличная часть ДокументыРасчетовСКонтрагентом (вкладка «Предоплата»), мы можем извлечь платежные реквизиты напрямую из этих документов расчетов (например, из документов ПлатежноеПоручениеВходящее или ПриходныйКассовыйОрдер).

Проанализируем пример кода, который решает эту задачу при отсутствии счета-фактуры:


Если ТаблицаДатОплат.Количество() = 0 Тогда
    // Если счет-фактура не найден, пробуем прочитать оплаты из ТЧ предоплаты реализации
    Если СсылкаНаОбъект.Метаданные().ТабличныеЧасти.Найти("ДокументыРасчетовСКонтрагентом") <> Неопределено Тогда
        Для каждого СтрокаДок Из СсылкаНаОбъект.ДокументыРасчетовСКонтрагентом Цикл
            Если ЗначениеЗаполнено(СтрокаДок.ДокументРасчетов) Тогда
                НоваяСтрока = ТаблицаДатОплат.Добавить();
                // Получаем реквизиты входящего документа оплаты
                НоваяСтрока.НомерПлатежноРасчетногоДокумента = СтрокаДок.ДокументРасчетов.НомерВходящегоДокумента;
                НоваяСтрока.ДатаПлатежноРасчетногоДокумента = СтрокаДок.ДокументРасчетов.ДатаВходящегоДокумента;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецЕсли;

Использование этого комбинированного подхода гарантирует, что строка 7 в УПД будет корректно заполнена всегда: и при наличии проведенного счета-фактуры в базе данных, и при его отсутствии (на основании зафиксированных платежных документов в самой реализации).

← На главную