Как программно создать документ «Счет-фактура полученный» на основании поступления в 1С:Бухгалтерия 3.0

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

В практике автоматизации учета на базе 1С:Бухгалтерия предприятия 3.0 часто возникает задача пакетного создания документов. Типичный сценарий: внешняя обработка загружает данные из стороннего источника (например, TXT, Excel или XML) и формирует документы Поступление (акт, накладная, УПД). Однако для корректного формирования книги покупок и предъявления НДС к вычету необходимо также создать связанный документ Счет-фактура полученный.

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

Метод 1. Использование типовых механизмов (БСП)

Разберем наиболее надежный способ. В конфигурации «Бухгалтерия предприятия» предусмотрены специальные экспортные методы в общих модулях, которые инкапсулируют логику заполнения реквизитов. Проанализируем возможности модуля УчетНДСФормированиеДокументов. Вместо ручного заполнения каждого поля, мы можем вызвать метод, который создаст объект на основании уже записанного поступления.

Рассмотрим пример кода, который можно использовать во внешней обработке:


// Предположим, СсылкаНаПоступление — это ссылка на уже созданный и записанный документ ПоступлениеТоваровУслуг
ДокументОснование = СсылкаНаПоступление;

// Используем типовой метод для создания объекта
НовыйСФ = УчетНДСФормированиеДокументов.СоздатьСчетФактуруПолученныйНаОснованииДокумента(ДокументОснование);

// Дозаполняем данные, полученные из внешнего файла (TXT)
НовыйСФ.НомерВходящегоДокумента = НомерИзФайла;
НовыйСФ.ДатаВходящегоДокумента  = ДатаИзФайла;

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

Этот метод хорош тем, что он автоматически переносит Организацию, Контрагента, Договор и суммы НДС. Если в будущем фирма 1С изменит логику заполнения счетов-фактур, ваш код с высокой вероятностью останется работоспособным.

Метод 2. Программное заполнение с нуля и работа с реквизитами

Если по каким-то причинам использование типового метода невозможно или требуется тонкая настройка, проанализируем процесс ручного создания объекта. Здесь критически важно заполнить специфические реквизиты, без которых документ не попадет в налоговую отчетность.

Выделим ключевые поля, которые необходимо заполнить:

  1. ДокументОснование — это технический реквизит, куда передается ссылка на поступление.
  2. НомерВходящегоДокумента и ДатаВходящегоДокумента — именно эти значения (из вашего TXT-файла) будут отображаться в Книге покупок. Не путайте их с внутренним номером документа 1С.
  3. КодВидаОперации — для стандартного поступления товаров/услуг всегда устанавливаем значение "01".
  4. ОтразитьВычетНДСВКнигеПокупокДатойПринятияКУчету — этот флаг (тип Булево) определяет, будет ли программа делать движения по регистру накопления «НДС Покупки» сразу при проведении счета-фактуры.

Посмотрим на пример реализации такого подхода:


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

// Заполнение документа-основания (это табличная часть или реквизит в зависимости от версии)
// В современных версиях БП 3.0 это табличная часть ДокументыОснования
НоваяСтрокаОснования = СФОбъект.ДокументыОснования.Добавить();
НоваяСтрокаОснования.ДокументОснование = СсылкаНаПоступление;

// Настройка связи
СФОбъект.НомерВходящегоДокумента = ДанныеИзФайла.Номер;
СФОбъект.ДатаВходящегоДокумента = ДанныеИзФайла.Дата;
СФОбъект.КодВидаОперации = "01";
СФОбъект.ОтразитьВычетНДСВКнигеПокупокДатойПринятияКУчету = Истина;

// Заполнение валют и сумм из основания
СФОбъект.ВалютаДокумента = СсылкаНаПоступление.ВалютаДокумента;
СФОбъект.СуммаДокумента = СсылкаНаПоступление.СуммаДокумента;

СФОбъект.Записать(РежимЗаписиДокумента.Проведение);

Проверка на дубликаты: важный этап автоматизации

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

Выясним, как это сделать оптимально. Наилучший способ — поиск по реквизиту ДокументОснование. Поскольку один счет-фактура обычно привязан к одному поступлению, мы можем использовать менеджер документа:


Функция НайтиСуществующийСФ(ДокументПоступления)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |	СчетФактураПолученный.Ссылка КАК Ссылка
        |ИЗ
        |	Документ.СчетФактураПолученный КАК СчетФактураПолученный
        |ГДЕ
        |	СчетФактураПолученный.ДокументыОснования.ДокументОснование = &Основание
        |	И НЕ СчетФактураПолученный.ПометкаУдаления";
    
    Запрос.УстановитьПараметр("Основание", ДокументПоступления);
    Результат = Запрос.Выполнить();
    
    Если НЕ Результат.Пустой() Тогда
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Ссылка;
    КонецЕсли;
    
    Возврат Справочники.СчетФактураПолученный.ПустаяСсылка(); // Ошибка в типе, правильно Документы
КонецФункции

Примечание: В примере выше обратите внимание на структуру хранения оснований. В БП 3.0 основания хранятся в табличной части ДокументыОснования, поэтому поиск через запрос надежнее, чем метод НайтиПоРеквизиту.

Особенности работы с УПД

Проанализируем современный формат документооборота. Часто поставщики присылают Универсальный передаточный документ (УПД). В 1С:Бухгалтерии для УПД не создается отдельный документ СчетФактураПолученный. Вместо этого в самом Поступлении устанавливается переключатель в положение УПД.

Если ваша обработка определила, что загружаемый документ является УПД, алгоритм должен быть другим:

  1. Найдите или создайте объект Поступление (акт, накладная, УПД).
  2. Установите реквизит УПД = Истина.
  3. Заполните входящий номер и дату непосредственно в объекте поступления.
  4. При записи система автоматически сформирует движения по НДС, как если бы был создан счет-фактура.

Работа в Базовой версии конфигурации

Как справедливо отмечено в обсуждении, базовая версия накладывает жесткие ограничения: нельзя менять конфигурацию. Это значит, что любые попытки внедрить подписки на события или изменить модули приведут к тому, что конфигурация потребует перехода на версию ПРОФ, что часто неприемлемо для клиента.

Однако использование внешней обработки (файл с расширением .epf) полностью решает эту проблему. Внешняя обработка запускается в контексте конфигурации и имеет полный доступ ко всем методам и объектам базы данных. Таким образом, реализовав логику создания счета-фактуры внутри кнопки «Загрузить» вашей обработки, вы сохраняете типовую поддержку и обеспечиваете корректность учета.

Подведем итог: для программного создания счета-фактуры полученного в 1С:Бухгалтерия 3.0 необходимо сначала убедиться в отсутствии дублей, затем воспользоваться методом УчетНДСФормированиеДокументов.СоздатьСчетФактуруПолученныйНаОснованииДокумента, заполнить входящие данные из файла и провести документ. Это обеспечит чистоту кода и корректность налоговых регистров.

← На главную