При программном создании документов поступления (например, при загрузке данных из внешних систем или миграции с предыдущих версий платформы, таких как «1С:Бухгалтерия 7.7») разработчики часто сталкиваются с проблемой: реквизиты входящего документа заполнены, но поля номера и даты входящего счета-фактуры на управляемой форме документа «Поступление (акт, накладная)» остаются пустыми. Разберем архитектурные особенности конфигурации «1С:Бухгалтерия предприятия 3.0» и правильный способ программного создания связанных счетов-фактур на сервере.
Проанализируем, почему прямое присвоение значений реквизитам документа поступления не приводит к заполнению полей счета-фактуры на форме:
НомерВходящегоДокумента и ДатаВходящегоДокумента в объекте Документ.ПоступлениеТоваровУслуг предназначены исключительно для первичного учетного документа контрагента (товарной накладной ТОРГ-12, акта выполненных работ). Они не имеют прямого отношения к счету-фактуре.Документ.СчетФактураПолученный. В отличие от версии 7.7, где данные СФ хранились непосредственно в реквизитах накладной, в версии 8.3 все движения по НДС и записи книги покупок формируются отдельным документом.СчетФактураПолученный, у которого в табличной части ДокументыОснования указана ссылка на текущее поступление. Если подчиненный документ в информационной базе не найден, поля на форме остаются незаполненными.Для корректного отражения счетов-фактур в учете, отображения их на форме документа поступления и попадания в книгу покупок необходимо программно создавать цепочку из двух документов: документа поступления и подчиненного счета-фактуры полученного. Разберем реализацию по шагам.
Документы.СчетФактураПолученный.СоздатьДокумент().Заполнить(), передав ссылку на только что созданный документ поступления. Это автоматически заполнит организацию, контрагента, договор, состав табличной части ДокументыОснования и суммы.Посмотрим на пример серверного кода:
// 1. Создание и запись документа поступления
ДокументПоступление = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
ДокументПоступление.Дата = ДатаДокумента;
ДокументПоступление.Организация = ВыбраннаяОрганизация;
ДокументПоступление.Контрагент = ВыбранныйКонтрагент;
ДокументПоступление.ДоговорКонтрагента = ВыбранныйДоговор;
ДокументПоступление.НомерВходящегоДокумента = НомерПервички;
ДокументПоступление.ДатаВходящегоДокумента = ДатаПервички;
// Заполнение табличной части документа поступления
// ... (заполнение строк номенклатуры, количества, сумм и счетов учета)
ДокументПоступление.Записать(РежимЗаписиДокумента.Проведение);
СсылкаНаПоступление = ДокументПоступление.Ссылка;
// 2. Создание подчиненного счета-фактуры полученного
СчетФактура = Документы.СчетФактураПолученный.СоздатьДокумент();
// Типовое автозаполнение реквизитов и табличной части по основанию
СчетФактура.Заполнить(СсылкаНаПоступление);
// Установка параметров входящего счета-фактуры от поставщика
СчетФактура.НомерВходящегоДокумента = ВходящийНомерСФ;
СчетФактура.ДатаВходящегоДокумента = ВходящаяДатаСФ;
СчетФактура.Получен = ВходящаяДатаСФ;
СчетФактура.КодВидаОперации = "01";
СчетФактура.ОтразитьВычетНДСВКнигеПокупокДатойПолучения = Истина;
// Проведение сформированного счета-фактуры
СчетФактура.Записать(РежимЗаписиДокумента.Проведение);
Рассмотрим важные особенности, которые необходимо учитывать при пакетной обработке и потоковой загрузке данных:
НачатьТранзакцию() и ЗафиксироватьТранзакцию(). Это предотвратит появление в базе поступлений без сформированных счетов-фактур в случае возникновения непредвиденных ошибок при проведении.СчетФактураПолученный необходимо установить признак СчетФактура.УПД = Истина.ОтразитьВычетНДСВКнигеПокупокДатойПолучения = Истина позволяет документу сформировать бухгалтерские проводки по вычету НДС (Дебет 68.02 Кредит 19) и записи в регистр накопления «НДС Покупки» сразу в момент проведения счета-фактуры без необходимости последующего ввода регламентного документа «Формирование записей книги покупок».