Как программно создать счет-фактуру полученный на основании поступления в 1С

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

При разработке пакетных загрузок накладных из внешних источников (DBF, Excel, XML, API) перед разработчиком часто встает задача: не просто провести документ поступления, но и сразу зарегистрировать входящий счет-фактуру. Однако стандартный вызов метода Заполнить(ДокументОснование.Ссылка), привычный по другим объектам конфигурации, для документа СчетФактураПолученный в современных конфигурациях (таких как 1С:Управление торговлей 11, 1С:Комплексная автоматизация и 1С:ERP) создает пустой документ без основания. Выясним причину такого поведения платформы и разберем корректные способы решения задачи.

Почему не работает стандартный метод Заполнить со ссылкой на поступление

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

Кроме того, в прикладных решениях на базе ERP/УТ связь счета-фактуры с документами поставки реализована через табличную часть ДокументыОснования, так как один входящий счет-фактура может закрывать сразу несколько накладных.

Способ 1. Заполнение документа через структуру параметров

Разберем рабочий вариант, при котором мы формируем структуру параметров, ожидаемую обработчиком заполнения счета-фактуры. Посмотрим на пример кода:


// Предполагается, что документ поступления уже проведен
ДокПоступление = ДокументПоступленияСсылка.ПолучитьОбъект();

СФПолученный = Документы.СчетФактураПолученный.СоздатьДокумент();

ПараметрыСФ = Новый Структура;
ПараметрыСФ.Вставить("Исправление", Ложь);
ПараметрыСФ.Вставить("Корректировочный", Ложь);
ПараметрыСФ.Вставить("Организация", ДокПоступление.Организация);
ПараметрыСФ.Вставить("ДокументОснование", ДокПоступление.Ссылка);
ПараметрыСФ.Вставить("Контрагент", ДокПоступление.Контрагент);

СФПолученный.Заполнить(ПараметрыСФ);

// Входящие реквизиты поставщика
СФПолученный.НомерВходящегоДокумента = СтрокаДанных.НомерСФПоставщика;
СФПолученный.ДатаВходящегоДокумента = СтрокаДанных.ДатаСФПоставщика;

// Заполнение обязательных реквизитов для учета НДС
СФПолученный.КодВидаОперации = "01";
СФПолученный.ВидСчетаФактуры = Перечисления.ВидыСчетовФактурПолученных.НаПоступление;

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

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

Способ 2. Использование типовых процедур общего модуля ЗакупкиСервер

В типовых конфигурациях линейки УТ 11, КА 2 и ERP для интерактивной и программной регистрации счетов-фактур предусмотрен единый сервисный механизм. Рассмотрим вызов функций общего модуля ЗакупкиСервер:


ДанныеСчетаФактуры = ЗакупкиСервер.ДанныеСчетаФактурыСтруктурой(
    ДокПоступление.Ссылка,
    ДокПоступление.Организация,
    ДокПоступление.Контрагент,
    СтрокаДанных.НомерСФПоставщика,
    СтрокаДанных.ДатаСФПоставщика,
    ДокПоступление.Договор.ВалютаВзаиморасчетов,
    ТекущаяДатаСеанса()
);

НеТребуетсяВводСчетаФактуры = Ложь;
НовыйСчетФактураПолученный = Неопределено;

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

Данный подход является наиболее надежным при обновлении конфигурации, так как полностью повторяет логику работы типовой кнопки «Зарегистрировать счет-фактуру» из формы документа закупки.

Способ 3. Прямое заполнение реквизитов и табличной части

Если требуется полностью изолировать алгоритм от типовых модулей (например, при переносе логики во внешнюю обработку со сложными условиями), заполним документ вручную:


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

// Реквизиты поставщика
СФПолученный.НомерВходящегоДокумента = СтрокаДанных.НомерСФПоставщика;
СФПолученный.ДатаВходящегоДокумента = СтрокаДанных.ДатаСФПоставщика;

// Параметры классификации
СФПолученный.ВидСчетаФактуры = Перечисления.ВидыСчетовФактурПолученных.НаПоступление;
СФПолученный.КодВидаОперации = "01";
СФПолученный.ОтразитьВКнигеПокупок = Истина;

// Добавление строки в табличную часть оснований
СтрокаОснования = СФПолученный.ДокументыОснования.Добавить();
СтрокаОснования.ДокументОснование = ДокПоступление.Ссылка;

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

Типичные ошибки при программном создании счетов-фактур

Разберем ключевые грабли, с которыми сталкиваются разработчики:

  1. Перезапись реквизитов Номер и Дата вместо входящих данных. Реквизиты Номер и Дата в объекте 1С — это внутренний номер регистрации и дата записи документа в базе. Номер и дата продавца должны записываться исключительно в реквизиты НомерВходящегоДокумента и ДатаВходящегоДокумента. Иначе собьется внутренняя нумерация документов, а в декларацию по НДС и книгу покупок не попадут реальные реквизиты поставщика.
  2. Попытка использовать методы формы на сервере. Вызовы методов ПолучитьФорму() и ЗаписатьВФорме() работают только в контексте тонкого клиента. При автоматической загрузке данных (в фоновом задании, регламентной процедуре или на сервере) формы не существуют, поэтому запись должна выполняться исключительно через объектную модель СФПолученный.Записать(РежимЗаписиДокумента.Проведение).
  3. Отсутствие проверки на дубли. При повторном запуске процедуры загрузки система создаст второй счет-фактуру на ту же накладную, что приведет к задвоению записей книги покупок. Всегда выполняйте поиск уже зарегистрированного счета-фактуры запросом к табличной части Документы.СчетФактураПолученный.ДокументыОснования по ссылке накладной перед созданием нового документа.
← На главную