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

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

В практике разработчика 1С часто возникает задача автоматизации создания связанных документов. Одной из самых востребованных операций является формирование полного комплекта документов по заказу или программное формирование документа Счет-фактура выданный на основании проведенного документа Реализация товаров и услуг — для этого подойдёт обработка для пакетного формирования документов продажи. Рассмотрим подробно, как реализовать этот механизм, разберем программный код и проанализируем особенности работы в различных конфигурациях.

Метод 1: Использование стандартного механизма «Заполнить»

Наиболее правильным и универсальным способом создания подчиненного документа в 1С является использование метода Заполнить(). Этот метод инициирует событие ОбработкаЗаполнения (поможет универсальный обработчик событий для 1С без изменения метаданных) в модуле объекта создаваемого документа, где разработчиками конфигурации уже прописана логика копирования данных из основания. Подобные принципы используются и в решениях, автоматизирующих ввод поступления товаров и услуг из реализации для различных конфигураций.

Разберем по шагам процесс создания документа:

  1. Создаем новый объект документа нужного типа.
  2. Вызываем метод Заполнить(), передавая в качестве параметра ссылку на документ-основание.
  3. Устанавливаем специфические реквизиты, если они не заполнились автоматически — для этого есть инструмент автоматического заполнения реквизитов в 1С.
  4. Записываем и проводим документ.

Проанализируем пример кода, который выполняет эти действия:


// Определим ссылку на документ-основание (Реализация)
СсылкаНаОснование = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("00000001", ТекущаяДата());

Если СсылкаНаОснование.Пустая() Тогда
    Возврат;
КонецЕсли;

// Создаем новый объект счета-фактуры
НовыйСФ = Документы.СчетФактураВыданный.СоздатьДокумент();

// Используем стандартный механизм заполнения на основании
НовыйСФ.Заполнить(СсылкаНаОснование);

// Дополнительная проверка: если дата СФ должна совпадать с реализацией
НовыйСФ.Дата = СсылкаНаОснование.Дата;

Попытка
    // Записываем документ с режимом проведения
    НовыйСФ.Записать(РежимЗаписиДокумента.Проведение);
    Сообщить("Счет-фактура успешно создан и проведен: " + НовыйСФ.Ссылка);
Исключение
    Инфо = ИнформацияОбОшибке();
    Сообщить("Ошибка при проведении: " + Инфо.Описание);
КонецПопытки;

Метод 2: Особенности для конфигураций на базе БСП (ERP, КА, УТ 11)

В современных конфигурациях, таких как 1С:ERP Управление предприятием или Управление торговлей 11, логика создания счетов-фактур часто вынесена в специализированные общие модули. Использование прямого метода Заполнить() может быть недостаточно, так как система требует соблюдения множества условий. Схожие особенности наблюдаются, когда требуется создание счета на оплату на основании реализации в 1С:ERP или КА версий 2.5.22 и выше, где учитывается специфика детализации расчетов — для этой задачи есть настройка создания связанных документов по собственным правилам.

Рассмотрим, как программно вызвать формирование счета-фактуры через типовой механизм. Часто для этого используется метод менеджера документа или функции общих модулей типа СчетаФактурыВыданныеСервер.

Проанализируем пример вызова типовой функции, которая проверяет существование СФ и создает его при отсутствии:


// В современных версиях УТ 11/ERP используется следующий подход:
ПараметрыДокумента = Новый Структура;
ПараметрыДокумента.Вставить("ДокументОснование", СсылкаНаРеализацию);
ПараметрыДокумента.Вставить("Дата", СсылкаНаРеализацию.Дата);

// Вызов процедуры из общего модуля (названия могут отличаться в зависимости от версии БСП)
// Обычно это функции формирования документов по правилам конфигурации
СчетаФактурыВыданныеСервер.СформироватьСчетаФактуры(ПараметрыДокумента);

Разбор критически важных реквизитов

Выясним причину, по которой документ может не проводиться или заполняться некорректно. При программном создании СчетФактураВыданный необходимо обратить внимание на следующие реквизиты:

Посмотрим на пример ручного дозаполнения, если Заполнить() не отработал полностью в самописной конфигурации:


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

// Для СФ на реализацию важно указать вид
НовыйСФ.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыданного.НаРеализацию;

// Заполнение табличной части Состав, если это требуется структурой документа
НоваяСтрока = НовыйСФ.ДокументыОснования.Добавить();
НоваяСтрока.ДокументОснование = СсылкаНаРеализацию;

Обработка ошибок и проверка на дубли

Проанализируем ситуацию, когда код запускается повторно. Чтобы не создавать несколько счетов-фактур на одну и ту же реализацию, необходимо предварительно проверить наличие уже существующего документа. Выясним, как это сделать с помощью запроса.


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	СчетФактураВыданный.Ссылка КАК Ссылка
    |ИЗ
    |	Документ.СчетФактураВыданный КАК СчетФактураВыданный
    |ГДЕ
    |	СчетФактураВыданный.ДокументОснование = &Основание
    |	И НЕ СчетФактураВыданный.ПометкаУдаления";

Запрос.УстановитьПараметр("Основание", СсылкаНаРеализацию);
РезультатЗапроса = Запрос.Выполнить();

Если НЕ РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    Сообщить("Счет-фактура уже существует: " + Выборка.Ссылка);
    Возврат;
КонецЕсли;

Заключение

Мы рассмотрели основные способы программного создания счета-фактуры. Подведем итоги: для типовых конфигураций 1С (БП 3.0, УТ 11, ERP) предпочтительным является использование встроенных механизмов заполнения или функций общих модулей, так как они учитывают все нюансы законодательства и учетной политики. Для простых или кастомизированных систем подходит использование метода Заполнить().

Важно помнить, что перед созданием счета-фактуры документ-основание (реализация) обязательно должен быть записан в базу данных, а для успешного проведения СФ — реализация должна быть проведена. Всегда используйте блоки Попытка...Исключение при вызове метода Записа(), чтобы корректно обрабатывать ошибки прав доступа или логические ошибки заполнения.

← На главную