Почему при программном проведении документа Поступление на расчетный счет возникает ошибка Не задана кратность валюты на дату?

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

При программном создании банковских расчетных документов во внешних обработках разработчики часто сталкиваются с ошибкой проведения: «Не задана кратность валюты на дату...». При этом интерактивное перевыбирание расчетного счета в форме документа решает проблему. Разберем по шагам причины такого поведения платформы и рассмотрим правильные варианты заполнения реквизитов документа.

Анализ проблемы и механизма возникновения ошибки

Рассмотрим типовую ситуацию. При создании объекта Документы.ПоступлениеНаРасчетныйСчет программно заполняются организация, контрагент, банковский счет, сумма и строки табличной части РасшифровкаПлатежа (включая курс и кратность взаиморасчетов):


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

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

При попытке проведения такого документа платформа генерирует исключение. Выясним причину ошибки:

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

Способ 1. Явная установка валюты документа

Самое быстрое и надежное исправление — явно инициализировать реквизит ВалютаДокумента на основании выбранного банковского счета организации:


НовыйДокумент.СчетОрганизации = БанковскийСчет;
НовыйДокумент.ВалютаДокумента = БанковскийСчет.ВалютаДенежныхСредств;

Если счет рублевый, валютой документа станет рубль (или валюта регламентированного учета). При наличии валютных договоров курс и кратность взаиморасчетов в табличной части также будут рассчитаны корректно относительно валюты документа.

Способ 2. Получение курса и кратности через типовые функции

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


СтруктураКурса = РаботаСКурсамиВалют.ПолучитьКурсВалюты(Выборка.Договор.ВалютаВзаиморасчетов, НовыйДокумент.Дата);

НоваяСтрока.КурсВзаиморасчетов = СтруктураКурса.Курс;
НоваяСтрока.КратностьВзаиморасчетов = СтруктураКурса.Кратность;

Это исключит ошибки при расчетах с иностранными контрагентами или при оплатах по договорам в условных единицах.

Способ 3. Использование стандартной обработки заполнения

Чтобы избежать пропуска обязательных реквизитов при программном создании документов, рекомендуется вызывать стандартную процедуру Заполнить() перед ручной установкой остальных полей:


НовыйДокумент = Документы.ПоступлениеНаРасчетныйСчет.СоздатьДокумент();

// Инициализация реквизитов по умолчанию
СтруктураЗаполнения = Новый Структура;
СтруктураЗаполнения.Вставить("Организация", Выборка.Организация);
СтруктураЗаполнения.Вставить("Контрагент", Выборка.Контрагент);
СтруктураЗаполнения.Вставить("СчетОрганизации", БанковскийСчет);
НовыйДокумент.Заполнить(СтруктураЗаполнения);

// Дозаполнение даты и табличной части
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.ВалютаДокумента = БанковскийСчет.ВалютаДенежныхСредств;

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

← На главную