При создании внешних печатных форм (ВПФ) для Универсального Передаточного Документа (УПД) из документа "Реализация (акты, накладные)" в 1С:Бухгалтерии Предприятия (БП) часто возникает вопрос: откуда система берет данные для формирования этого документа, и как получить сам запрос с этими данными? Рассмотрим подробно этот процесс, учитывая различные сценарии.
В 1С:Бухгалтерии Предприятия УПД не является самостоятельным документом в классическом понимании, а скорее режимом отображения или комплектом печатных форм, который формируется на основе данных проведенной реализации. Ключевым моментом здесь является переключатель "УПД", который появился в документах реализации, начиная с версии 3.0.83 БП. Когда вы устанавливаете этот переключатель в положение "Включено", система автоматически определяет статус УПД и, при необходимости, регистрирует связанный документ "Счет-фактура выданный".
Наша первостепенная задача как разработчиков ВПФ — понять, какой из этих сценариев применяется в конкретном случае, чтобы правильно найти источник данных.
Для случая, когда УПД формируется со статусом 1, нам необходимо сначала получить ссылку на связанный документ "Счет-фактура выданный". Это можно сделать с помощью запроса, который ищет "Счет-фактуру выданную", основанием для которой является наша "Реализация".
Предположим, у нас есть ссылка на документ "Реализация", для которого мы хотим распечатать УПД. Мы можем выполнить следующий код:
Функция ПолучитьСсылкуНаСФВыданнуюПоРеализации(СсылкаНаРеализацию) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| СчетФактураВыданный.Ссылка КАК Ссылка
|ИЗ
| Документ.СчетФактураВыданный КАК СчетФактураВыданный
|ГДЕ
| СчетФактураВыданный.ДокументОснование = &ДокументОснование
| И СчетФактураВыданный.Проведен
|
|УПОРЯДОЧИТЬ ПО
| СчетФактураВыданный.Дата УБЫВ"; // Берем самый свежий, если их несколько
Запрос.УстановитьПараметр("ДокументОснование", СсылкаНаРеализацию);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
// Пример использования:
// Если мы находимся в модуле объекта документа "РеализацияТоваровУслуг"
// СсылкаНаТекущуюРеализацию = ЭтотОбъект.Ссылка;
// Или если у нас есть уже ссылка на документ:
// СсылкаНаТекущуюРеализацию = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("РТ00-000001", Дата("20230101"));
// СсылкаНаСФВыданную = ПолучитьСсылкуНаСФВыданнуюПоРеализации(СсылкаНаТекущуюРеализацию);
// Если СсылкаНаСФВыданную <> Неопределено Тогда
// Сообщить("Найдена связанная Счет-фактура выданная: " + СсылкаНаСФВыданную);
// // Далее используем СФВыданную для получения данных
// Иначе
// Сообщить("Связанная Счет-фактура выданная не найдена. Вероятно, УПД имеет статус 2.");
// // Далее используем саму реализацию для получения данных
// КонецЕсли;
Таким образом, мы программно "отлавливаем" нужный объект, который будет являться основным источником данных для нашей ВПФ.
После того как мы определили, какой объект (либо "Счет-фактура выданный", либо сама "Реализация") будет источником данных, мы можем обратиться к стандартным механизмам конфигурации для получения этих данных.
В этом случае данные для печатной формы, включая запросы, формируются в модуле менеджера документа СчетФактураВыданный. Конкретная процедура, отвечающая за сбор данных для печатной формы счета-фактуры (а значит, и УПД со статусом 1), как правило, называется:
ПолучитьДанныеДляПечатнойФормыСчетФактура в модуле менеджера документа СчетФактураВыданный. Эта процедура вернет структуру или табличный документ с уже подготовленными данными.УчетНДС, процедура ПодготовитьДанныеДляПечатиСчетовФактур. Эта процедура является более общей и может вызываться из разных мест для подготовки данных для печати счетов-фактур. Внутри она, вероятно, обратится к менеджеру документа "Счет-фактура выданный".Для создания собственной ВПФ на основе этих данных, вы можете:
Пример гипотетического вызова:
// Предположим, у нас есть СсылкаНаСФВыданную
Если СсылкаНаСФВыданную <> Неопределено Тогда
// Получаем менеджер объекта для вызова статических методов
МенеджерСФ = Документы.СчетФактураВыданный;
// Вызываем процедуру получения данных.
// Обычно она ожидает массив ссылок или сам объект.
МассивОбъектов = Новый Массив();
МассивОбъектов.Добавить(СсылкаНаСФВыданную);
// Типичный вызов (может отличаться в деталях для вашей версии БП)
СтруктураДанныхДляПечати = МенеджерСФ.ПолучитьДанныеДляПечатнойФормыСчетФактура(МассивОбъектов);
// Теперь СтруктураДанныхДляПечати содержит все необходимые данные
// (например, табличные части, шапку документа)
// и может быть использована для заполнения вашего ТабличногоДокумента.
Иначе
// Обработка случая УПД со статусом 2
КонецЕсли;
В этом сценарии, когда отдельный "Счет-фактура выданный" не формируется, данные для печатной формы УПД берутся непосредственно из документа "Реализация". Процедура для сбора данных может находиться:
РеализацияТоваровУслуг или в связанном с ним общем модуле локализации, например, РеализацияТоваровУслугЛокализация. Сообщение на форуме указывает на процедуру ПолучитьДанныеДляПечатнойФормыУПД в этом модуле.УчетНДС, который может иметь универсальные процедуры для формирования данных УПД независимо от наличия счета-фактуры.Пример гипотетического вызова:
// Если СсылкаНаСФВыданную == Неопределено, значит УПД имеет статус 2.
// В этом случае данные берем из самой реализации.
// Предположим, у нас есть СсылкаНаТекущуюРеализацию
МенеджерРеализации = Документы.РеализацияТоваровУслуг;
// Поиск процедуры в модуле менеджера или локализации
// (название может варьироваться в зависимости от версии БП)
// Например, если есть такая процедура в РеализацияТоваровУслугЛокализация:
СтруктураДанныхДляПечати = РеализацияТоваровУслугЛокализация.ПолучитьДанныеДляПечатнойФормыУПД(СсылкаНаТекущуюРеализацию);
// Или более общий вариант через УчетНДС, если он поддерживает оба статуса
// СтруктураДанныхДляПечати = УчетНДС.ПолучитьДанныеДляПечатиУПД(СсылкаНаТекущуюРеализацию, СтатусУПД_2);
Важно: Всегда анализируйте исходный код типовой конфигурации вашей версии 1С:Бухгалтерии Предприятия. Названия процедур и их параметры могут немного отличаться, но общая логика будет схожей.
Сама печать документов в 1С часто осуществляется через обработку ПечатьОбщихДокументов или специализированные обработки, такие как ПечатьУПД, упомянутая на форуме. Если вы создаете внешнюю печатную форму (ВПФ), она будет регистрироваться в информационной базе и вызываться системой в момент печати. Ваша ВПФ должна:
ПФ_MXL_УниверсальныйПередаточныйДокумент).Печать(), которая принимает массив объектов (ссылок) для печати, макет и другие параметры.Общая схема вызова ВПФ для печати может выглядеть так:
Печать(), которой передается ссылка на документ "Реализация".Печать():
Документ.СчетФактураВыданный, как показано в п.2. Затем вызываете процедуру получения данных из менеджера СчетФактураВыданный (п.3.1).РеализацияТоваровУслугЛокализация или УчетНДС (п.3.2), передавая ссылку на документ "Реализация".ТабличногоДокумента.ТабличныйДокумент возвращается системой и отображается пользователю.Для более глубокого понимания механизма печати, вы можете изучить код стандартных общих модулей, таких как ПечатьДокументов, УчетНДС, а также модулей менеджеров документов СчетФактураВыданный и РеализацияТоваровУслуг. Эти модули содержат весь необходимый функционал по сбору и подготовке данных для различных печатных форм, включая УПД.
Мы видим, что печать УПД из "Реализации" в 1С:БП — это комплексный процесс, который тесно связан с учетом НДС и механизмом создания "Счет-фактур выданных". Понимая эту внутреннюю логику и используя описанные процедуры и объекты, мы сможем эффективно создавать и настраивать собственные печатные формы УПД.