При разработке внешних печатных форм (ВПФ) для конфигурации «Управление торговлей 10.3», особенно для таких сложных документов, как Универсальный передаточный документ (УПД), разработчики часто сталкиваются с тем, что стандартные механизмы получения данных из общих модулей не отрабатывают в контексте внешней обработки так же, как в типовом коде. Одной из наиболее распространенных проблем является отсутствие данных в строке «К платежно-расчетному документу» (строка 5 счета-фактуры или строка 7 в контексте УПД). Рассмотрим подробно, почему это происходит и как правильно подготовить данные для печати.
В типовой конфигурации УТ 10.3 печать УПД и счетов-фактур реализована через общий модуль УчетНДС. Функция ВывестиСчетФактуруВТабличныйДокумент принимает на вход структуру ДанныеДляПечати. Проанализируем фрагмент кода, отвечающий за вывод платежных документов:
Если ДанныеДляПечати.Свойство("ТаблицаДатОплат") Тогда
Для каждого ПараметрыДокументаОплаты Из ДанныеДляПечати.ТаблицаДатОплат Цикл
// Проверка заполнения и формирование строки...
СтрокаПоДокументу = СтрокаПоДокументу
+ ?(ПустаяСтрока(СтрокаПоДокументу), ?(ЭтоПечатьУПД, "", "К платежно-расчетному документу № "),", ")
+ ПараметрыДокументаОплаты.НомерПлатежноРасчетногоДокумента
+ " от " + Формат(ПараметрыДокументаОплаты.ДатаПлатежноРасчетногоДокумента, "ДФ=dd.MM.yyyy") + " г.";
КонецЦикла;
КонецЕсли;
Проблема заключается в том, что когда мы вызываем печать из внешней обработки, свойство ТаблицаДатОплат в структуре ДанныеДляПечати часто оказывается не заполненным или вовсе отсутствует. Это происходит потому, что во внешних печатных формах мы часто передаем ссылку на основной документ (например, РеализацияТоваровУслуг), в то время как данные о платежах хранятся в подчиненном документе СчетФактураВыданный. Система не может автоматически «догадаться», откуда взять эти сведения, если мы не подготовили их заранее.
Прежде чем приступать к исправлению кода, разберем, как эффективно отлаживать внешнюю печатную форму в УТ 10.3, так как обычная установка точек останова в модуле объекта обработки при запуске из интерфейса «Дополнительные внешние печатные формы» часто не срабатывает. Выполним следующие действия:
СсылкаНаДокумент с типом ДокументСсылка.РеализацияТоваровУслуг (или другой документ-основание).Пример кода для кнопки на форме отладки:
Процедура КнопкаВыполнитьНажатие(Кнопка)
// Устанавливаем ссылку, как это делает механизм ВПФ
ЭтотОбъект.СсылкаНаОбъект = СсылкаНаДокумент;
// Вызываем экспортную функцию Печать
ТабДок = Печать();
// Показываем результат
Если ТабДок <> Неопределено Тогда
ТабДок.Показать("Отладка УПД");
КонецЕсли;
КонецПроцедуры
Теперь мы можем просто открывать обработку через меню «Файл — Открыть», выбирать документ и нажимать кнопку. Точки останова в модуле объекта будут работать стабильно.
Выясним, как получить доступ к таблице оплат. В УТ 10.3 сведения о платежах содержатся в табличной части ДокументыОплаты документа СчетФактураВыданный. Если наша ВПФ привязана к реализации, нам сначала нужно найти этот счет-фактуру. Проанализируем ситуацию и напишем запрос:
// СсылкаНаОбъект - это наша РеализацияТоваровУслуг
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| СчетФактураВыданный.Ссылка КАК СФ
|ИЗ
| Документ.СчетФактураВыданный КАК СчетФактураВыданный
|ГДЕ
| СчетФактураВыданный.ДокументОснование = &ДокументОснование
| И СчетФактураВыданный.Проведен
| И НЕ СчетФактураВыданный.ПометкаУдаления";
Запрос.УстановитьПараметр("ДокументОснование", СсылкаНаОбъект);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
СчетФактураСсылка = Выборка.СФ;
Иначе
СчетФактураСсылка = Неопределено;
КонецЕсли;
Теперь, когда у нас есть ссылка на счет-фактуру, мы должны извлечь данные из его табличной части и привести их к формату, который ожидает общий модуль УчетНДС. Важно помнить, что имена колонок в табличной части документа и в структуре для печати могут отличаться. Разберем процесс подготовки таблицы:
Если ЗначениеЗаполнено(СчетФактураСсылка) Тогда
// Выгружаем ТЧ ДокументыОплаты
ТаблицаДатОплат = СчетФактураСсылка.ДокументыОплаты.Выгрузить();
// Переименовываем колонки под требования общего модуля, если необходимо
// В УТ 10.3 в ТЧ колонки: ДатаОплаты, НомерОплаты
// В коде УчетНДС ожидаются: ДатаПлатежноРасчетногоДокумента, НомерПлатежноРасчетногоДокумента
ТаблицаДатОплат.Колонки.ДатаОплаты.Имя = "ДатаПлатежноРасчетногоДокумента";
ТаблицаДатОплат.Колонки.НомерОплаты.Имя = "НомерПлатежноРасчетногоДокумента";
// Сворачиваем для удаления дублей
ТаблицаДатОплат.Свернуть("ДатаПлатежноРасчетногоДокумента, НомерПлатежноРасчетногоДокумента");
// Удаляем пустые строки, чтобы не выводились лишние разделители
Индекс = 0;
Пока Индекс < ТаблицаДатОплат.Количество() Цикл
СтрокаОплат = ТаблицаДатОплат[Индекс];
Если НЕ ЗначениеЗаполнено(СтрокаОплат.ДатаПлатежноРасчетногоДокумента)
И ПустаяСтрока(СтрокаОплат.НомерПлатежноРасчетногоДокумента) Тогда
ТаблицаДатОплат.Удалить(СтрокаОплат);
Иначе
Индекс = Индекс + 1;
КонецЕсли;
КонецЦикла;
// Вставляем таблицу в структуру данных для печати
ДанныеДляПечати.Вставить("ТаблицаДатОплат", ТаблицаДатОплат);
КонецЕсли;
Важным моментом при печати УПД является его «Статус». Если в ДанныеДляПечати установлен СтатусУПД = 2, то согласно правилам заполнения, в строке платежных документов должны стоять прочерки, даже если оплаты были. Проанализируем этот участок кода в общем модуле:
Важно: Если вы хотите, чтобы данные выводились, убедитесь, что в вашей структуре СтатусУПД равен 1 (Счет-фактура и передаточный документ). Если же вы печатаете только передаточный документ (статус 2), прочерки в строке 7 — это корректное поведение по закону.
Если ЭтоПечатьУПД И ДанныеДляПечати.СтатусУПД = 2 Тогда
// В УПД в статусе 2 ставятся прочерки в показатели для счета-фактуры
СтрокаПоДокументу = "--";
КонецЕсли;
Рассмотрим краткий чеклист для исправления проблемы в вашей ВПФ:
ВывестиСчетФактуруВТабличныйДокумент убедитесь, что вы выполнили ДанныеДляПечати.Вставить("ТаблицаДатОплат", ВашаТаблица). Даже если таблица пустая, само свойство должно быть в структуре, чтобы цикл обхода сработал.НомерПлатежноРасчетногоДокумента и ДатаПлатежноРасчетногоДокумента.ДанныеДляПечати — это структура. Если вы копируете типовой код, убедитесь, что все переменные, используемые внутри (например, ЭтоПечатьУПД), определены и имеют правильное булево значение.Следуя этим шагам, вы сможете корректно настроить вывод платежно-расчетных документов в любой внешней печатной форме для 1С:Управление торговлей 10.3, обеспечив соответствие печатной формы требованиям законодательства.