При автоматизации загрузки банковских выписок или создании документов из внешних источников часто возникает задача программного формирования документа ПлатежноеПоручениеИсходящее. Для корректного отражения в учете документ должен создаваться сразу с определенным видом операции, а также иметь заполненные реквизиты табличной части. Разберем по шагам, как решить эту задачу в конфигурациях на обычных формах (например, в «Управление производственным предприятием 1.3»).
Создание нового экземпляра документа выполняется стандартной фабрикой СоздатьДокумент(). Чтобы документ сразу инициализировался как расчет с контрагентом, необходимо присвоить реквизиту ВидОперации соответствующее значение из метаданных. Проанализируем типичную ошибку: обращение к несуществующему имени перечисления приводит к ошибке «Поле объекта не обнаружено». В типовых конфигурациях перечисление видов операций называется ВидыОперацийППИсходящее.
Посмотрим на пример установки вида операции:
ПлатежноеПоручение = Документы.ПлатежноеПоручениеИсходящее.СоздатьДокумент();
ПлатежноеПоручение.Дата = ТекущаяДата();
ПлатежноеПоручение.ВидОперации = Перечисления.ВидыОперацийППИсходящее.ОплатаПоставщику;
В отличие от ручного ввода в пользовательском интерфейсе, при программном создании табличная часть документа изначально пуста. Если мы попытаемся обратиться к первой строке через индекс [0] без предварительного добавления, программа выдаст исключение выхода за границы массива. Поэтому сначала необходимо добавить строку в табличную часть РасшифровкаПлатежа, а затем заполнить ставку НДС через системное перечисление СтавкиНДС.
Разберем пример кода для добавления строки и указания ставки «Без НДС»:
НоваяСтрока = ПлатежноеПоручение.РасшифровкаПлатежа.Добавить();
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
Нередко разработчики сталкиваются с ситуацией, когда после программной записи в форме отображается надпись «Сумма <нет валюты>», а значения обнуляются или видны только в режиме «Списком». Выясним причину такого поведения: в конфигурациях на обычных формах видимость табличной части и расчет итогов динамически управляются кодом формы. Для корректной работы требуется синхронно заполнять параметры валюты и все сопутствующие суммы взаиморасчетов.
Рассмотрим, как правильно установить валюту регламентированного учета. Использование поиска по наименованию Справочники.Валюты.НайтиПоНаименованию("Российский рубль") может быть нестабильным из-за возможных расхождений в написании. Надежнее использовать поиск по коду валюты или получить значение напрямую из системных настроек:
ПлатежноеПоручение.ВалютаДокумента = Константы.ВалютаРегламентированногоУчета.Получить();
Если требуется найти валюту в справочнике по коду классификатора, используем метод НайтиПоКоду:
ПлатежноеПоручение.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
В строке табличной части РасшифровкаПлатежа присутствуют независимые реквизиты: сумма платежа и сумма взаиморасчетов. Если реквизит СуммаВзаиморасчетов останется пустым (равным нулю), документ в режиме одной строки покажет нули. Поэтому при заполнении строки обязательно дублируем сумму в оба поля, а также фиксируем общую сумму документа в шапке.
Посмотрим на итоговый пример комплексного создания и заполнения платежного поручения:
ПлатежноеПоручение = Документы.ПлатежноеПоручениеИсходящее.СоздатьДокумент();
ПлатежноеПоручение.Дата = ТекущаяДата();
ПлатежноеПоручение.ВидОперации = Перечисления.ВидыОперацийППИсходящее.ОплатаПоставщику;
// Заполнение шапки документа
ПлатежноеПоручение.Организация = ВыбраннаяОрганизация;
ПлатежноеПоручение.Контрагент = ВыбранныйКонтрагент;
ПлатежноеПоручение.ВалютаДокумента = Константы.ВалютаРегламентированногоУчета.Получить();
ПлатежноеПоручение.СуммаДокумента = 15000;
// Заполнение табличной части
СтрокаТЧ = ПлатежноеПоручение.РасшифровкаПлатежа.Добавить();
СтрокаТЧ.СуммаПлатежа = ПлатежноеПоручение.СуммаДокумента;
СтрокаТЧ.СуммаВзаиморасчетов = ПлатежноеПоручение.СуммаДокумента;
СтрокаТЧ.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
СтрокаТЧ.КурсВзаиморасчетов = 1;
СтрокаТЧ.КратностьВзаиморасчетов = 1;
// Если требуется автоматическое проведение или запись
ПлатежноеПоручение.Записать(РежимЗаписиДокумента.Запись);
Для того чтобы созданный документ не просто открывался визуально, но и мог быть проведен или корректно выгружен в клиент-банк, обратите внимание на следующие реквизиты:
СтрокаТЧ.ДоговорКонтрагента = ВыбранныйКонтрагент.ОсновнойДоговорКонтрагента;. Без договора проведение документа по регистрам расчетов завершится ошибкой.СчетОрганизации и СчетКонтрагента.СтрокаТЧ.СчетУчетаРасчетовСКонтрагентом и СтрокаТЧ.СчетУчетаРасчетовПоАвансам.КурсВзаиморасчетов и КратностьВзаиморасчетов равными 1, чтобы избежать ошибок деления на ноль при проведении документа.