Как программно создать Счет-фактуру на основании реализации в 1С:Бухгалтерия 3.0

Программист 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке обработок загрузки данных (например, из файлов Excel) часто возникает задача не просто создать документ РеализацияТоваровУслуг, но и автоматически «выписать» к нему СчетФактураВыданный. В конфигурации 1С:Бухгалтерия предприятия 3.0 (БП 3.0) этот процесс имеет свои особенности, связанные как с заполнением реквизитов, так и с отображением связи между документами в пользовательском интерфейсе.

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

Способ 1: Использование метода Заполнить()

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


// Предположим, НовыйДокументРеализация — это уже созданная и проведенная ссылка на реализацию
НовыйДокументСчФ = Документы.СчетФактураВыданный.СоздатьДокумент();
НовыйДокументСчФ.Дата = ТекущаяДата(); // Или дата реализации
НовыйДокументСчФ.Заполнить(НовыйДокументРеализация.Ссылка);

// Дополнительно можно уточнить специфические реквизиты, если они не заполнились
НовыйДокументСчФ.Записать(РежимЗаписиДокумента.Проведение);

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

Способ 2: Ручное заполнение реквизитов и табличной части

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

Проанализируем пример кода для ручного формирования связи:


СФ = Документы.СчетФактураВыданный.СоздатьДокумент();
СФ.Дата = ТекущаяДата();
СФ.Организация = СсылкаНаРеализацию.Организация;
СФ.Контрагент = СсылкаНаРеализацию.Контрагент;

// Указываем основной реквизит основания (для совместимости)
СФ.ДокументОснование = СсылкаНаРеализацию;

// Обязательно заполняем табличную часть, иначе связь может не отобразиться в форме
НоваяСтрока = СФ.ДокументыОснования.Добавить();
НоваяСтрока.ДокументОснование = СсылкаНаРеализацию;

// Заполнение кода вида операции (01 — обычная реализация)
СФ.КодВидаОперации = "01";
СФ.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыданного.НаРеализацию;

СФ.Записать(РежимЗаписиДокумента.Проведение);

Важный нюанс: Если вы забудете заполнить табличную часть ДокументыОснования, то в структуре подчиненности документ может быть виден, но алгоритмы учета НДС и некоторые отчеты могут работать некорректно.

Способ 3: Использование специализированных методов менеджера

В современных редакциях БП 3.0 разработчики 1С предусмотрели экспортные методы в менеджерах документов, которые позволяют автоматизировать процесс. Проанализируем возможность вызова функции создания счета-фактуры на основании.

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

Почему счет-фактура не видна в форме реализации?

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

Дело в том, что форма реализации в БП 3.0 — это динамический объект. Если форма была открыта до программного создания счета-фактуры, она не «узнает» о появлении нового связанного документа автоматически. Если же вы программно создаете реализацию и СФ подряд, а потом открываете форму, проблема может заключаться в отсутствии вызова обновления интерфейса.

Для решения этой проблемы в коде обработки после записи Счета-фактуры рекомендуется использовать механизм оповещения:

ОповеститьОбИзменении(Тип("ДокументСсылка.СчетФактураВыданный"));

Эта команда заставляет все открытые формы перечитать данные и обновить связи.

Особенности работы с УПД (Универсальным передаточным документом)

Если ваша задача — не просто выписать счет-фактуру, а обеспечить печать УПД, нужно учитывать следующее. В 1С:Бухгалтерии статус УПД определяется либо реквизитом в самой реализации (флаг «УПД»), либо наличием связанного счета-фактуры с определенными настройками.

Рассмотрим пошагово, что нужно проверить:

  1. Статус документа: Если вы планируете печатать УПД со статусом «1» (счет-фактура + акт/накладная), наличие проведенного документа СчетФактураВыданный обязательно.
  2. Печатные формы: Для формирования печатной формы программно следует использовать общий модуль УправлениеПечатью. Вы можете сформировать массив ссылок, в который войдет ваша реализация, и передать его в менеджер печати.

Рекомендации по заполнению важных реквизитов

Чтобы избежать ошибок при формировании Книги продаж и декларации по НДС, проконтролируйте заполнение следующих полей:

Работа в транзакции

Разберем ситуацию, когда вы загружаете сотни строк из Excel. Мы настоятельно рекомендуем оборачивать создание пары «Реализация + СФ» в транзакцию. Это гарантирует целостность данных: если по какой-то причине счет-фактура не сможет записаться (например, из-за блокировки или неверных данных), реализация также не будет сохранена в базе. Это предотвратит появление «одиноких» реализаций без налоговых документов.


НачатьТранзакцию();
Попытка
    // Создаем реализацию
    ДокРеализация = СоздатьРеализацию(ДанныеЭксель);
    ДокРеализация.Записать(РежимЗаписиДокумента.Проведение);
    
    // Создаем СФ
    ДокСФ = Документы.СчетФактураВыданный.СоздатьДокумент();
    ДокСФ.Заполнить(ДокРеализация.Ссылка);
    ДокСФ.Записать(РежимЗаписиДокумента.Проведение);
    
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ЗаписьЖурналаРегистрации("Ошибка загрузки", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;

Таким образом, мы рассмотрели все основные аспекты программного формирования счетов-фактур. Использование метода Заполнить() является наиболее предпочтительным, так как оно обеспечивает максимальную совместимость с будущими обновлениями конфигурации 1С:Бухгалтерия 3.0.

← На главную