В практике работы с «1С:Бухгалтерия 3.0» часто возникает запрос от пользователей: «Почему я не могу просто нажать кнопку печати УПД в реализации, не создавая лишний документ счета-фактуры?». Эта задача кажется простой только на первый взгляд. На самом деле за кнопкой печати скрывается сложная методология учета НДС и формирования первичных документов. В этой статье мы подробно разберем, почему система ведет себя именно так, и как реализовать пожелание заказчика максимально корректно, не нарушая логику программы.
Прежде чем приступать к доработке кода, давайте проанализируем ситуацию с точки зрения законодательства и методологии 1С. Универсальный передаточный документ (УПД) может функционировать в двух режимах, которые определяются его статусом:
В типовой конфигурации «1С:Бухгалтерия 3.0» печать УПД со статусом «1» жестко завязана на объект СчетФактураВыданный. Это сделано потому, что номер и дата УПД в этом статусе должны соответствовать номеру и дате счета-фактуры в Книге продаж. Если объекта счета-фактуры нет в базе, программе просто негде взять обязательные реквизиты для заполнения «шапки» документа.
Рассмотрим вариант создания внешней печатной формы (ВПФ), которая будет брать номер из Документ.РеализацияТоваровУслуг и подставлять его в макет УПД. На первый взгляд, это решает проблему «лишних» документов. Однако проанализируем последствия:
Если организация работает на УСН (без НДС) или конкретная операция не облагается налогом, мы можем использовать УПД со статусом «2». В этом случае 1С позволяет печатать документ без создания счета-фактуры.
Проанализируем ситуацию: в документе «Реализация товаров и услуг» достаточно убедиться, что НДС равен нулю или выбран соответствующий тип договора. Тогда при выборе печатной формы УПД система автоматически предложит форму со статусом «2», и создание СФ не потребуется.
Наиболее «безболезненный» и методологически верный способ решить задачу клиента — не отказываться от счета-фактуры, а сделать его создание незаметным для пользователя. Мы можем автоматизировать этот процесс при проведении реализации. Рассмотрим подробнее, как это реализовать.
В современных релизах Бухгалтерии 3.0 уже есть встроенный механизм: в нижней части формы реализации имеется переключатель «УПД». Если его активировать, система сама создаст счет-фактуру. Однако, если нужно обеспечить полную автоматизацию (например, при программном создании документов или для специфических групп пользователей), можно воспользоваться следующим подходом в расширении конфигурации.
Разберем пример кода, который можно разместить в модуле менеджера или через механизм подписок на события (ПередЗаписью или ПриЗаписи):
// Пример логики автоматического создания Счета-фактуры
Процедура АвтосозданиеСчетаФактуры(ДокументРеализация)
// Проверяем, не создан ли уже счет-фактура
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СчетФактураВыданный.Ссылка КАК Ссылка
|ИЗ
| Документ.СчетФактураВыданный КАК СчетФактураВыданный
|ГДЕ
| СчетФактураВыданный.ДокументОснование = &Основание
| И НЕ СчетФактураВыданный.ПометкаУдаления";
Запрос.УстановитьПараметр("Основание", ДокументРеализация.Ссылка);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
// Создаем новый объект
НовыйСФ = Документы.СчетФактураВыданный.СоздатьДокумент();
НовыйСФ.Дата = ДокументРеализация.Дата;
НовыйСФ.Организация = ДокументРеализация.Организация;
НовыйСФ.Контрагент = ДокументРеализация.Контрагент;
// Заполнение табличной части и основания
НовоеОснование = НовыйСФ.ДокументыОснования.Добавить();
НовоеОснование.ДокументОснование = ДокументРеализация.Ссылка;
// Заполняем остальные реквизиты по типовой методике
НовыйСФ.Заполнить(ДокументРеализация.Ссылка);
// Устанавливаем номер равным номеру реализации, если это требуется бизнес-логикой
// Внимание: проверьте префиксы и длину номера!
НовыйСФ.Номер = ДокументРеализация.Номер;
НовыйСФ.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецПроцедуры
Важный нюанс: Чтобы номера УПД (которые берутся из СФ) совпадали с номерами реализаций, в настройках программы или через код необходимо синхронизировать нумерацию этих объектов. Посмотрим на пример: если реализация имеет номер «0000-0005», счет-фактура должен получить такой же номер, чтобы в печатной форме УПД клиент видел ожидаемые данные.
Если заказчик категорически против создания новых объектов в базе (например, база сильно раздута или есть жесткие требования к чистоте журнала документов), можно пойти по пути создания ВПФ. В этом случае мы «обманываем» макет, подставляя в него данные реализации вместо данных СФ.
Разберем по шагам, что нужно изменить в коде печати:
ПечатьУниверсальныхДокументов).СчетФактураВыданный.Номер и Дата на обращение к ДокументОснование (вашей реализации).Рассмотрим пример изменения логики заполнения:
// В типовом коде данные берутся так:
// ДанныеПечати.НомерСчетаФактуры = Шапка.Номер;
// В вашей ВПФ для реализации это будет выглядеть так:
ДанныеПечати.НомерСчетаФактуры = ОбщегоНазначенияБПВызовСервера.ПолучитьНомерНаПечать(СсылкаНаРеализацию);
ДанныеПечати.ДатаСчетаФактуры = СсылкаНаРеализацию.Дата;
Предупреждение: Мы крайне не рекомендуем этот метод для рабочих баз организаций, являющихся плательщиками НДС. Это создаст «виртуальные» номера счетов-фактур, которых не существует в системе, что приведет к гарантированным проблемам при первой же встречной налоговой проверке у вашего покупателя.
Зачастую требование «печатать УПД без СФ» продиктовано тем, что менеджеры ленятся делать «лишние клики». В этом случае лучшим выходом будет:
Таким образом, мы сохраняем юридическую чистоту учета (наличие СФ в базе, записи в регистрах НДС, корректная Книга продаж) и при этом полностью удовлетворяем потребность пользователя в быстроте и удобстве работы.
Проанализировав ситуацию, мы пришли к выводу, что наиболее стабильное решение в среде «1С:Предприятие 8.3» — это автоматизация жизненного цикла документов, а не переписывание алгоритмов печати. Помните, что УПД — это не просто картинка, а финансовый документ. Использование типовых механизмов (пусть и автоматизированных программно) гарантирует вам отсутствие проблем при обновлениях конфигурации и сдаче отчетности.