Как программно создать платежное поручение исходящее с видом операции «Оплата поставщику» в 1С?

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

При автоматизации загрузки банковских выписок или создании документов из внешних источников часто возникает задача программного формирования документа ПлатежноеПоручениеИсходящее. Для корректного отражения в учете документ должен создаваться сразу с определенным видом операции, а также иметь заполненные реквизиты табличной части. Разберем по шагам, как решить эту задачу в конфигурациях на обычных формах (например, в «Управление производственным предприятием 1.3»).

Шаг 1. Инициализация документа и установка вида операции

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

Посмотрим на пример установки вида операции:


ПлатежноеПоручение = Документы.ПлатежноеПоручениеИсходящее.СоздатьДокумент();
ПлатежноеПоручение.Дата = ТекущаяДата();
ПлатежноеПоручение.ВидОперации = Перечисления.ВидыОперацийППИсходящее.ОплатаПоставщику;

Шаг 2. Заполнение табличной части «Расшифровка платежа» и ставки НДС

В отличие от ручного ввода в пользовательском интерфейсе, при программном создании табличная часть документа изначально пуста. Если мы попытаемся обратиться к первой строке через индекс [0] без предварительного добавления, программа выдаст исключение выхода за границы массива. Поэтому сначала необходимо добавить строку в табличную часть РасшифровкаПлатежа, а затем заполнить ставку НДС через системное перечисление СтавкиНДС.

Разберем пример кода для добавления строки и указания ставки «Без НДС»:


НоваяСтрока = ПлатежноеПоручение.РасшифровкаПлатежа.Добавить();
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;

Шаг 3. Заполнение сумм и валюты документа

Нередко разработчики сталкиваются с ситуацией, когда после программной записи в форме отображается надпись «Сумма <нет валюты>», а значения обнуляются или видны только в режиме «Списком». Выясним причину такого поведения: в конфигурациях на обычных формах видимость табличной части и расчет итогов динамически управляются кодом формы. Для корректной работы требуется синхронно заполнять параметры валюты и все сопутствующие суммы взаиморасчетов.

Рассмотрим, как правильно установить валюту регламентированного учета. Использование поиска по наименованию Справочники.Валюты.НайтиПоНаименованию("Российский рубль") может быть нестабильным из-за возможных расхождений в написании. Надежнее использовать поиск по коду валюты или получить значение напрямую из системных настроек:


ПлатежноеПоручение.ВалютаДокумента = Константы.ВалютаРегламентированногоУчета.Получить();

Если требуется найти валюту в справочнике по коду классификатора, используем метод НайтиПоКоду:

ПлатежноеПоручение.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");

Шаг 4. Устранение проблем с отображением: заполнение сумм взаиморасчетов

В строке табличной части РасшифровкаПлатежа присутствуют независимые реквизиты: сумма платежа и сумма взаиморасчетов. Если реквизит СуммаВзаиморасчетов останется пустым (равным нулю), документ в режиме одной строки покажет нули. Поэтому при заполнении строки обязательно дублируем сумму в оба поля, а также фиксируем общую сумму документа в шапке.

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


ПлатежноеПоручение = Документы.ПлатежноеПоручениеИсходящее.СоздатьДокумент();
ПлатежноеПоручение.Дата = ТекущаяДата();
ПлатежноеПоручение.ВидОперации = Перечисления.ВидыОперацийППИсходящее.ОплатаПоставщику;

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

// Заполнение табличной части
СтрокаТЧ = ПлатежноеПоручение.РасшифровкаПлатежа.Добавить();
СтрокаТЧ.СуммаПлатежа = ПлатежноеПоручение.СуммаДокумента;
СтрокаТЧ.СуммаВзаиморасчетов = ПлатежноеПоручение.СуммаДокумента;
СтрокаТЧ.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
СтрокаТЧ.КурсВзаиморасчетов = 1;
СтрокаТЧ.КратностьВзаиморасчетов = 1;

// Если требуется автоматическое проведение или запись
ПлатежноеПоручение.Записать(РежимЗаписиДокумента.Запись);

Важные нюансы для проведения и выгрузки документа

Для того чтобы созданный документ не просто открывался визуально, но и мог быть проведен или корректно выгружен в клиент-банк, обратите внимание на следующие реквизиты:

  1. Договор контрагента: Для вида операции «Оплата поставщику» аналитика по договорам является обязательной. В строку табличной части необходимо передавать договор, например: СтрокаТЧ.ДоговорКонтрагента = ВыбранныйКонтрагент.ОсновнойДоговорКонтрагента;. Без договора проведение документа по регистрам расчетов завершится ошибкой.
  2. Банковские счета: Для корректной печати и взаимодействия с банком должны быть заполнены реквизиты СчетОрганизации и СчетКонтрагента.
  3. Счета расчетов: При проведении документа в бухгалтерском учете строке требуются счета расчетов (обычно 60.01 для расчетов с поставщиком и 60.02 для авансов), которые можно заполнить явно в коде: СтрокаТЧ.СчетУчетаРасчетовСКонтрагентом и СтрокаТЧ.СчетУчетаРасчетовПоАвансам.
  4. Курсы валют: При рублевых платежах обязательно устанавливайте КурсВзаиморасчетов и КратностьВзаиморасчетов равными 1, чтобы избежать ошибок деления на ноль при проведении документа.
← На главную