Как в УПД в пункте 8 (основание передачи) вывести счет на оплату вместо договора в 1С:Бухгалтерия 3.0?

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

При оформлении отгрузок в программе 1С:Бухгалтерия предприятия 3.0 пользователи часто сталкиваются с необходимостью изменить стандартное заполнение печатных форм. Одной из таких задач является вывод реквизитов счета на оплату в строке [8] «Основание передачи (сдачи)/приемки (получения)» Универсального передаточного документа (УПД). По умолчанию система подтягивает в это поле данные из реквизита Договор, однако бизнес-процессы многих компаний предполагают использование именно счета как основного документа-основания.

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

Законодательный контекст и стандартное поведение

Прежде чем приступать к программированию, давайте выясним, насколько правомерны такие изменения. Согласно рекомендациям ФНС (письмо от 21.10.2013 № ММВ-20-3/96@), строка [8] является необязательной для заполнения, если УПД используется одновременно как счет-фактура и первичный документ (статус «1»). Тем не менее, если она заполняется, в ней допускается указание любых документов, подтверждающих намерения сторон: договоров, доверенностей, нарядов или счетов на оплату. Таким образом, замена договора на счет юридически корректна.

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

Способ 1. Использование механизма расширений

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

Разберем реализацию по шагам:

  1. Создадим новое расширение и добавим в него документ РеализацияТоваровУслуг.
  2. Нам необходимо переопределить метод в модуле менеджера или использовать программный интерфейс печати. В типовой БП 3.0 за формирование данных отвечает процедура ПечатьУПД.
  3. Используем аннотацию &Вместо для функции, подготавливающей данные для печати, или &После, чтобы изменить уже заполненную структуру параметров.

Рассмотрим пример кода, который можно разместить в модуле менеджера документа РеализацияТоваровУслуг внутри расширения:


&Вместо("СформироватьДанныеПечатиУПД")
Функция Расш1_СформироватьДанныеПечатиУПД(ПараметрыПечати, КоллекцияОбъектов, ОбъектыПечати)
    // Вызываем базовый метод для получения стандартных данных
    Результат = ПродолжитьВызов(ПараметрыПечати, КоллекцияОбъектов, ОбъектыПечати);
    
    // Проходим по сформированным данным и меняем Основание
    Для Каждого ДанныеИзРезультата Из Результат Цикл
        ДокументСсылка = ДанныеИзРезультата.Ссылка;
        
        // Проверяем, заполнен ли счет на оплату в документе реализации
        Если ЗначениеЗаполнено(ДокументСсылка.СчетНаОплатуПокупателю) Тогда
            Счет = ДокументСсылка.СчетНаОплатуПокупателю;
            НовоеОснование = "Счет на оплату № " + Счет.Номер + " от " + Формат(Счет.Дата, "ДФ=dd.MM.yyyy");
            ДанныеИзРезультата.Основание = НовоеОснование;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

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

Способ 2. Внешняя печатная форма (ВПФ)

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

Проанализируем алгоритм создания ВПФ:

  1. Скопируйте макет УПД из типовой конфигурации во внешнюю обработку.
  2. Скопируйте в модуль объекта обработки процедуры печати из модуля менеджера РеализацияТоваровУслуг.
  3. В коде формирования области Основание внесите правку. Вместо обращения к Шапка.ДоговорНаименование, пропишите получение данных из документа-основания.

Пример фрагмента кода для ВПФ:


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

Этот метод удобен тем, что вы можете зарегистрировать ВПФ через меню Администрирование — Печатные формы, отчеты и обработки и назначить её только конкретным пользователям или организациям.

Почему редактирование макета через «Пользовательские макеты» не поможет?

В 1С есть стандартный функционал изменения макетов (меню «Макеты печатных форм»). Однако, как справедливо отмечено в обсуждении на форуме, это позволяет изменить лишь внешний вид (шрифты, границы, статический текст). Логика заполнения параметра {Основание} зашита в программном коде. Если вы просто напишете в ячейке макета слово «Счет», оно будет отображаться всегда, но номер и дата счета сами туда не подтянутся без правки кода.

Ручной способ (разовый)

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

Сложные случаи: несколько оснований

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

Резюмируем: наиболее гибким и правильным решением для автоматизации вывода счета в пункт 8 УПД является использование расширения с перехватом функции формирования данных печати. Это сохраняет целостность системы и обеспечивает автоматическое заполнение документов согласно вашим требованиям.

← На главную