Как правильно программно создать и провести документ Платежное поручение в 1С:Бухгалтерия 3.0

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

При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда документ, созданный программно, визуально выглядит заполненным, но наотрез отказывается проводиться или выводить печатную форму. Одной из самых коварных в этом плане является конфигурация «Бухгалтерия предприятия 3.0» (БП 3.0), а именно процесс создания документа ПлатежноеПоручение. Проблема заключается в том, что в этой конфигурации документ хранит информацию не только в виде ссылок на справочники, но и в виде дублирующих текстовых реквизитов, которые критически важны для банковских стандартов.

В этой статье мы подробно разберем, как избежать ошибок при программном создании платежек, почему система «ругается» на отсутствие ИНН при выбранном контрагенте и как правильно использовать методы типовых общих модулей для автоматизации заполнения.

Разбор основной проблемы: Почему ссылок недостаточно?

Рассмотрим ситуацию: мы создали новый объект документа, указали Организация, Контрагент, БанковскийСчет и Сумма. Однако при попытке записи или проведения система выдает ошибки: «Не указано наименование получателя» или «Поле ИНН плательщика не заполнено». Проанализируем причину. В документе ПлатежноеПоручение существуют скрытые (или вынесенные в отдельные секции) строковые реквизиты:

  1. ТекстПлательщика
  2. ТекстПолучателя
  3. ИННПлательщика / ИННПолучателя
  4. КПППлательщика / КПППолучателя

Эти поля используются для формирования банковского файла выгрузки и печатной формы. В пользовательском интерфейсе они заполняются автоматически при выборе контрагента обработчиками событий формы. Но когда мы работаем на уровне сервера через СоздатьДокумент(), эти обработчики не срабатывают. Нам необходимо вызвать их принудительно или заполнить поля вручную.

Шаг 1: Правильное создание объекта и установка ссылочных реквизитов

Для начала создадим объект документа и заполним основные поля. Важный момент: всегда старайтесь избегать метода НайтиПоКоду(), так как коды в базе могут измениться. Лучше использовать поиск по ИНН или предопределенные значения, но в рамках обучающего примера мы сохраним общую структуру.


НовыйДок = Документы.ПлатежноеПоручение.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
НовыйДок.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701010101");
НовыйДок.ВидОперации = Перечисления.ВидыОперацийСписаниеДенежныхСредств.ОплатаПоставщику;
// Установка вида операции обязательна в самом начале, так как от нее зависит логика заполнения
НовыйДок.СчетОрганизации = Справочники.БанковскиеСчета.НайтиПоНаименованию("Основной");
НовыйДок.Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7702020202");
НовыйДок.СчетКонтрагента = Справочники.БанковскиеСчета.НайтиПоНаименованию("Расчетный");
НовыйДок.СуммаДокумента = 5000;
НовыйДок.НазначениеПлатежа = "Оплата по договору №1 от 01.01.2023";

Шаг 2: Использование типового механизма заполнения реквизитов

Чтобы не заполнять текстовые поля ТекстПлательщика и ТекстПолучателя вручную, проанализируем возможности общего модуля УчетДенежныхСредствБП. В типовых решениях существует функция, которая собирает данные об организации и контрагенте и формирует правильную строку для банка (включая скобки, ИНН и КПП).

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


НовыйДок.ПеречислениеВБюджет = Ложь; // Или Истина, если это налоги

// Вызываем типовой метод для формирования текстов для банка
АвтоЗначения = УчетДенежныхСредствБП.СформироватьАвтоЗначенияРеквизитовПлательщикаПолучателя(
    НовыйДок.Организация, 
    НовыйДок.СчетОрганизации, 
    НовыйДок.Контрагент, 
    НовыйДок.СчетКонтрагента, 
    НовыйДок.ПеречислениеВБюджет, 
    НовыйДок.Дата
);

// Присваиваем полученные значения объекту
НовыйДок.ТекстПлательщика = АвтоЗначения.ТекстПлательщика;
НовыйДок.ТекстПолучателя = АвтоЗначения.ТекстПолучателя;
НовыйДок.ИННПлательщика = НовыйДок.Организация.ИНН;
НовыйДок.КПППлательщика = НовыйДок.Организация.КПП;

// Для получателя логика аналогична, учитываем тип (Контрагент или ФизЛицо)
Если ТипЗнч(НовыйДок.Контрагент) = Тип("СправочникСсылка.Контрагенты") Тогда
    НовыйДок.ИННПолучателя = НовыйДок.Контрагент.ИНН;
    НовыйДок.КПППолучателя = НовыйДок.Контрагент.КПП;
КонецЕсли;

Шаг 3: Работа с составным типом реквизита «Контрагент»

Как мы заметили в обсуждении, реквизит Контрагент может иметь составной тип (например, ссылаться на справочник Контрагенты или ФизическиеЛица). При программной установке 1С автоматически определяет тип, если вы передаете ссылку. Однако при проверках в коде полезно использовать оператор ТипЗнч.

Если вы создаете платежку физическому лицу, убедитесь, что у него заполнены паспортные данные или ИНН, иначе банковский контроль не пропустит документ. Проанализируем пример проверки:


Если ТипЗнч(НовыйДок.Контрагент) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
    // Логика заполнения для физлица (КПП обычно пустое)
    НовыйДок.ИННПолучателя = НовыйДок.Контрагент.ИНН;
КонецЕсли;

Шаг 4: Бюджетные платежи и дополнительные реквизиты

Если ваша задача — создать платежное поручение на уплату налогов, установите НовыйДок.ПеречислениеВБюджет = Истина. В этом случае обязательными становятся следующие поля:

Без этих данных документ не будет считаться корректно заполненным для целей казначейства, даже если все суммы указаны верно.

Шаг 5: Программный вызов «Заполнить»

Рассмотрим еще один эффективный метод. В конфигурациях на базе БСП (Библиотека стандартных подсистем) часто реализован метод Заполнить() в модуле объекта. Если у вас есть документ-основание (например, СчетНаОплатуПоставщика), процедура создания упрощается в разы:


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

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

Заключение и рекомендации

Мы выяснили, что основная причина ошибок при создании Платежного поручения — это игнорирование текстовых реквизитов, дублирующих данные справочников. Для стабильной работы вашего кода всегда:

  1. Устанавливайте ВидОперации перед заполнением других полей.
  2. Используйте функции общих модулей (например, УчетДенежныхСредствБП) для формирования строк плательщика и получателя.
  3. Проверяйте заполненность ИНН и КПП, так как они критичны для проведения.
  4. Если документ создается на основе другого документа, используйте метод Заполнить().

Следуя этим правилам, вы обеспечите корректное формирование документов, которые не только проведутся в системе, но и будут успешно приняты банком без дополнительных ручных правок со стороны бухгалтера.

← На главную