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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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


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

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

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

Заключение

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

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

← На главную