В процессе автоматизации учета в конфигурации «1С:Бухгалтерия предприятия 3.0» (БП 3.0) разработчики часто сталкиваются с задачей пакетного или автоматического создания сопутствующих документов. Одним из наиболее частых сценариев является автоматическая генерация документа Счет-фактура выданный (СФ) сразу после создания и проведения документа Реализация товаров и услуг (РТиУ или РТиС). Это критически важно при интеграции 1С с внешними системами (CRM, интернет-магазинами, маркетплейсами) или при написании собственных обработок загрузки данных.
В этой статье мы подробно разберем, как решить эту задачу программным путем. Мы проанализируем различные подходы — от простейшего платформенного метода «в одну строку» до более надежного использования механизмов типовой конфигурации 1С, учитывающего современные требования ведения учета НДС.
---
Прежде чем переходить к написанию кода, давайте кратко рассмотрим, какие штатные инструменты автоматизации создания счетов-фактур уже заложены в БП 3.0. Это поможет вам сориентироваться, действительно ли в вашем случае нужна разработка «с нуля».
---
Самый простой и быстрый способ создать счет-фактуру на основании реализации — использовать стандартный механизм платформы 1С:Предприятие 8. Метод Заполнить() или метод менеджера СоздатьДокументНаОсновании() автоматически запускает обработчик заполнения, который прописан в модуле объекта документа СчетФактураВыданный.
Давайте посмотрим на классический пример программного создания СФ:
// Предположим, у нас уже есть ссылка на проведенный документ реализации
ДокументОснованиеСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("0000-000001", ТекущаяДата());
Если ЗначениеЗаполнено(ДокументОснованиеСсылка) Тогда
// Проверим, проведен ли документ-основание. СФ нельзя выписать к непроведенной реализации.
Если Не ДокументОснованиеСсылка.Проведен Тогда
ВызыватьИсключение "Документ-основание должен быть проведен для выписки счета-фактуры!";
КонецЕсли;
// Создаем новый документ "Счет-фактура выданный"
НовыйСФ = Документы.СчетФактураВыданный.СоздатьДокумент();
// Используем встроенный механизм заполнения по основанию
НовыйСФ.Заполнить(ДокументОснованиеСсылка);
// Устанавливаем дату СФ равной дате реализации (или текущей дате)
НовыйСФ.Дата = ДокументОснованиеСсылка.Дата;
// Попытаемся записать и провести документ
Попытка
НовыйСФ.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Счет-фактура успешно создан и проведен: " + НовыйСФ.Ссылка);
Исключение
Сообщить("Не удалось провести счет-фактуру: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Также разработчики часто используют метод менеджера объекта, упомянутый в обсуждении на форуме (Сообщение 17):
НовыйСФ = Документы.СчетФактураВыданный.СоздатьДокументНаОсновании(ДокументОснованиеСсылка);
НовыйСФ.Записать(РежимЗаписиДокумента.Проведение);
Преимущества этого способа: минимумом строк кода мы получаем готовый документ. Платформа сама перенесет организацию, контрагента, договор, состав ставки НДС и итоговые суммы.
---
Если вы решите писать код создания счетов-фактур «с нуля», крайне важно учитывать архитектурные изменения современных версий «1С:Бухгалтерия предприятия 3.0».
В старых версиях БП связь между реализацией и счетом-фактурой определялась простым реквизитом ДокументОснование в шапке СФ. Однако уже на протяжении длительного времени в БП 3.0 один счет-фактура может быть выписан сразу на основании нескольких документов реализации (так называемый сводный или многодокументный счет-фактура).
Для реализации этой возможности разработчики 1С перенесли логику связи в табличную часть ДокументыОснования документа СчетФактураВыданный. Старый реквизит ДокументОснование по-прежнему присутствует в конфигурации для обеспечения обратной совместимости, но логика проведения, заполнения и отображения на формах завязана именно на табличную часть.
Если вы просто вручную заполните реквизит шапки ДокументОснование и запишете документ, вы рискуете получить некорректно заполненный СФ: при открытии формы поля могут визуально выглядеть пустыми, а движения по регистрам НДС могут сформироваться некорректно, что приведет к ошибкам при сдаче декларации по НДС.
---
Чтобы избежать ошибок заполнения связанных табличных частей и гарантировать корректность учета НДС, правильнее всего использовать готовые процедуры и функции общих модулей БП 3.0. Конфигурация содержит специализированные методы, которые берут на себя всю рутину по подготовке структуры данных, проверке дублей и заполнению реквизитов.
Проанализируем пример корректного создания СФ с использованием методов общего модуля УчетНДСПереопределяемый и сопутствующих серверных механизмов:
// Функция программного создания СФ через вызов типового функционала БП 3.0
Функция СоздатьСФНаОснованииРеализации(ДокументРеализацииСсылка) Экспорт
// 1. Проверяем валидность переданной ссылки
Если Не ЗначениеЗаполнено(ДокументРеализацииСсылка) Тогда
Возврат Неопределено;
КонецЕсли;
// 2. Проверяем, не был ли счет-фактура создан ранее для этой реализации.
// Это критически важно, чтобы избежать задвоения документов при повторном запуске вашего кода.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| СФДокументыОснования.Ссылка КАК Ссылка
|ИЗ
| Документ.СчетФактураВыданный.ДокументыОснования КАК СФДокументыОснования
|ГДЕ
| СФДокументыОснования.ДокументОснование = &ДокументОснование
| И НЕ СФДокументыОснования.Ссылка.ПометкаУдаления";
Запрос.УстановитьПараметр("ДокументОснование", ДокументРеализацииСсылка);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// СФ уже существует, возвращаем ссылку на него
Возврат Выборка.Ссылка;
КонецЕсли;
// 3. Создаем документ с помощью общего модуля конфигурации
// Данный метод гарантирует заполнение как реквизитов шапки, так и табличной части "ДокументыОснования"
НовыйСФ = Документы.СчетФактураВыданный.СоздатьДокументНаОсновании(ДокументРеализацииСсылка);
// Заполняем обязательные реквизиты, которые не всегда заполняются автоматически
НовыйСФ.Дата = ДокументРеализацииСсылка.Дата;
НовыйСФ.КодВидаОперации = "01"; // Код "01" используется для стандартных операций реализации товаров и услуг
// Некоторые конфигурации требуют явного указания способа выставления
НовыйСФ.СпособВыставления = Перечисления.СпособыВыставленияСчетовФактур.НаБумажномНосителе;
Попытка
// Проводим документ
НовыйСФ.Записать(РежимЗаписиДокумента.Проведение);
Возврат НовыйСФ.Ссылка;
Исключение
// Записываем ошибку в Журнал регистрации для последующего анализа администратором
ЗаписьЖурналаРегистрации("ПрограммноеСозданиеСФ",
УровеньЖурналаРегистрации.Ошибка,
Метаданные.Документы.СчетФактураВыданный,
НовыйСФ.Ссылка,
"Ошибка проведения СФ для документа " + Строка(ДокументРеализацииСсылка) + ": " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
---
Давайте подробно разберем, почему наш алгоритм построен именно таким образом:
ДокументыОснования на наличие связи с исходной реализацией. Если СФ уже найден, функция просто возвращает существующий документ, предотвращая создание копий.СоздатьДокументНаОсновании(). Данный метод внутри конфигурации БП 3.0 перенаправляет вызов на специальный модуль обработки заполнения, который корректно заполняет всю структуру подчиненности, включая ТЧ ДокументыОснования, ставки НДС и реквизиты платежно-расчетных документов (если они были указаны в реализации).КодВидаОперации всегда должно быть присвоено строковое значение "01". Если вы реализуете специфические сценарии (например, корректировочные счета-фактуры или возвраты), КВО может отличаться (например, "18" или "02"). Обращайте на это внимание при доработке кода под специфику вашего бизнеса.Попытка ... Исключение с последующей записью в Журнал регистрации позволяет вашему программному коду работать стабильно даже в случае возникновения ошибок проведения (например, если период заблокирован или не заполнены обязательные аналитические разрезы).Используя предложенные методы, вы сможете настроить надежное и стабильное автоматическое создание счетов-фактур выданных, которое не вызовет сбоев при подготовке отчетности по НДС и сохранит целостность базы данных вашей конфигурации.