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