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