При разработке пакетных загрузок накладных из внешних источников (DBF, Excel, XML, API) перед разработчиком часто встает задача: не просто провести документ поступления, но и сразу зарегистрировать входящий счет-фактуру. Однако стандартный вызов метода Заполнить(ДокументОснование.Ссылка), привычный по другим объектам конфигурации, для документа СчетФактураПолученный в современных конфигурациях (таких как 1С:Управление торговлей 11, 1С:Комплексная автоматизация и 1С:ERP) создает пустой документ без основания. Выясним причину такого поведения платформы и разберем корректные способы решения задачи.
Проанализируем логику типовой конфигурации. В процедуре ОбработкаЗаполнения модуля объекта СчетФактураПолученный логика инициализации отличается от классической. Конфигурация ожидает на входе не просто ссылку на документ поступления, а специальную структуру параметров заполнения. Если передать в метод Заполнить() обычную ссылку на ДокументСсылка.ПриобретениеТоваровУслуг (или ПоступлениеТоваровУслуг), алгоритм не распознает переданные данные, и документ остается незаполненным.
Кроме того, в прикладных решениях на базе ERP/УТ связь счета-фактуры с документами поставки реализована через табличную часть ДокументыОснования, так как один входящий счет-фактура может закрывать сразу несколько накладных.
Разберем рабочий вариант, при котором мы формируем структуру параметров, ожидаемую обработчиком заполнения счета-фактуры. Посмотрим на пример кода:
// Предполагается, что документ поступления уже проведен
ДокПоступление = ДокументПоступленияСсылка.ПолучитьОбъект();
СФПолученный = Документы.СчетФактураПолученный.СоздатьДокумент();
ПараметрыСФ = Новый Структура;
ПараметрыСФ.Вставить("Исправление", Ложь);
ПараметрыСФ.Вставить("Корректировочный", Ложь);
ПараметрыСФ.Вставить("Организация", ДокПоступление.Организация);
ПараметрыСФ.Вставить("ДокументОснование", ДокПоступление.Ссылка);
ПараметрыСФ.Вставить("Контрагент", ДокПоступление.Контрагент);
СФПолученный.Заполнить(ПараметрыСФ);
// Входящие реквизиты поставщика
СФПолученный.НомерВходящегоДокумента = СтрокаДанных.НомерСФПоставщика;
СФПолученный.ДатаВходящегоДокумента = СтрокаДанных.ДатаСФПоставщика;
// Заполнение обязательных реквизитов для учета НДС
СФПолученный.КодВидаОперации = "01";
СФПолученный.ВидСчетаФактуры = Перечисления.ВидыСчетовФактурПолученных.НаПоступление;
СФПолученный.Записать(РежимЗаписиДокумента.Проведение);
В этом варианте процедура ОбработкаЗаполнения корректно подхватывает данные основания, рассчитывает суммы и заполняет табличную часть связей.
В типовых конфигурациях линейки УТ 11, КА 2 и ERP для интерактивной и программной регистрации счетов-фактур предусмотрен единый сервисный механизм. Рассмотрим вызов функций общего модуля ЗакупкиСервер:
ДанныеСчетаФактуры = ЗакупкиСервер.ДанныеСчетаФактурыСтруктурой(
ДокПоступление.Ссылка,
ДокПоступление.Организация,
ДокПоступление.Контрагент,
СтрокаДанных.НомерСФПоставщика,
СтрокаДанных.ДатаСФПоставщика,
ДокПоступление.Договор.ВалютаВзаиморасчетов,
ТекущаяДатаСеанса()
);
НеТребуетсяВводСчетаФактуры = Ложь;
НовыйСчетФактураПолученный = Неопределено;
ПараметрыПредставления = ЗакупкиСервер.ВвестиСчетФактуру(
ДанныеСчетаФактуры,
Истина, // Проводить документ
НеТребуетсяВводСчетаФактуры,
НовыйСчетФактураПолученный
);
Данный подход является наиболее надежным при обновлении конфигурации, так как полностью повторяет логику работы типовой кнопки «Зарегистрировать счет-фактуру» из формы документа закупки.
Если требуется полностью изолировать алгоритм от типовых модулей (например, при переносе логики во внешнюю обработку со сложными условиями), заполним документ вручную:
СФПолученный = Документы.СчетФактураПолученный.СоздатьДокумент();
СФПолученный.Дата = ТекущаяДатаСеанса();
СФПолученный.Организация = ДокПоступление.Организация;
СФПолученный.Контрагент = ДокПоступление.Контрагент;
// Реквизиты поставщика
СФПолученный.НомерВходящегоДокумента = СтрокаДанных.НомерСФПоставщика;
СФПолученный.ДатаВходящегоДокумента = СтрокаДанных.ДатаСФПоставщика;
// Параметры классификации
СФПолученный.ВидСчетаФактуры = Перечисления.ВидыСчетовФактурПолученных.НаПоступление;
СФПолученный.КодВидаОперации = "01";
СФПолученный.ОтразитьВКнигеПокупок = Истина;
// Добавление строки в табличную часть оснований
СтрокаОснования = СФПолученный.ДокументыОснования.Добавить();
СтрокаОснования.ДокументОснование = ДокПоступление.Ссылка;
СФПолученный.Записать(РежимЗаписиДокумента.Проведение);
Разберем ключевые грабли, с которыми сталкиваются разработчики:
Номер и Дата в объекте 1С — это внутренний номер регистрации и дата записи документа в базе. Номер и дата продавца должны записываться исключительно в реквизиты НомерВходящегоДокумента и ДатаВходящегоДокумента. Иначе собьется внутренняя нумерация документов, а в декларацию по НДС и книгу покупок не попадут реальные реквизиты поставщика.ПолучитьФорму() и ЗаписатьВФорме() работают только в контексте тонкого клиента. При автоматической загрузке данных (в фоновом задании, регламентной процедуре или на сервере) формы не существуют, поэтому запись должна выполняться исключительно через объектную модель СФПолученный.Записать(РежимЗаписиДокумента.Проведение).Документы.СчетФактураПолученный.ДокументыОснования по ссылке накладной перед созданием нового документа.