Что делать, если в 1С:Бухгалтерия 3.0 не проводится документ с ошибкой "Не задана кратность валюты"?

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

При работе в программе 1С:Бухгалтерия 3.0 пользователи и программисты могут столкнуться с ситуацией, когда стандартный документ, например "Поступление наличных", отказывается проводиться. Система выдает сообщение: "Документ ... не может быть проведен. Не задана кратность валюты на дату ...". На первый взгляд, проблема кажется простой, но иногда ее решение требует более глубокого анализа. Разберем по шагам, как диагностировать и устранить эту ошибку, пройдя путь от простых проверок до анализа кода конфигурации.

Первоначальная диагностика: проверяем регистр сведений "Курсы валют"

Первый и самый главный вопрос, который возникает: где именно в программе хранится эта "кратность"? Ошибка может ввести в заблуждение, так как интуитивно хочется искать реквизит "Кратность" непосредственно в справочнике "Валюты". Однако это неверно. Все исторические данные о курсах и кратностях валют хранятся в специальном объекте — регистре сведений "Курсы валют".

Рассмотрим, что нужно проверить в первую очередь:

  1. Доступ к регистру. В пользовательском режиме перейдите в раздел "Справочники" -> "Валюты". Найдите в списке валюту, с которой возникает проблема (в нашем случае — российский рубль, код 643). Откройте карточку этой валюты и перейдите по гиперссылке "Курсы валют".
  2. Наличие записи на дату. В открывшемся списке курсов убедитесь, что на дату документа (или на более раннюю дату) существует запись. Для российского рубля на любую дату курс должен быть равен 1 и, что самое важное, кратность тоже должна быть равна 1. Если записи нет, система не сможет получить данные и выдаст ошибку.
  3. Проверка на дубли. Распространенной причиной подобных ошибок является задвоение элементов в справочнике "Валюты". Например, в системе могут существовать две валюты "Российский рубль". При этом курсы могут быть заданы для одной, а в документе выбрана другая, "пустая". Внимательно просмотрите справочник на наличие дублей, так как некорректный обмен часто приводит к задвоению объектов.

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

Программное решение: установка кратности с помощью обработки

Иногда, особенно если в базе много проблемных периодов, проще и быстрее установить курс и кратность программно. Это также помогает убедиться, что запись в регистр действительно создается. Рассмотрим пример простой обработки, которая устанавливает курс и кратность для рубля на определенную дату (для массовой правки движений также удобно использовать универсальный редактор регистров).


&НаКлиенте
Процедура УстКратность(Команда)
    СервУстКратность();
    Сообщить("Кратность валюты рубль установлена!");
КонецПроцедуры

&НаСервере
Процедура СервУстКратность()
    // Создаем менеджер записи для регистра сведений "КурсыВалют"
    РегистрКурсыВалют = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
    
    // Устанавливаем ключевые поля (измерения)
    РегистрКурсыВалют.Период  = Дата(2022, 01, 01); // Дата, на которую устанавливаем курс
    РегистрКурсыВалют.Валюта  = Справочники.Валюты.НайтиПоКоду("643"); // Находим рубль по коду
    
    // Устанавливаем значения ресурсов
    РегистрКурсыВалют.Курс      = 1;
    РегистрКурсыВалют.Кратность = 1;
    
    // Записываем изменения в базу данных
    РегистрКурсыВалют.Записать();
КонецПроцедуры

Важное замечание: этот код добавляет запись в РегистрыСведений.КурсыВалют. Он не меняет сам справочник Справочники.Валюты, так как у справочника нет реквизитов "Курс" и "Кратность". После выполнения такой обработки можно проверить наличие записи в регистре, например, с помощью "Консоли запросов", чтобы убедиться, что данные успешно сохранены.

Глубокий анализ: ищем причину в коде с помощью отладчика

Самая сложная ситуация — когда данные в регистре есть, дублей нет, а ошибка не исчезает. Это верный признак того, что нужно обратиться к отладчику и посмотреть, что происходит "под капотом" в момент проведения документа.

Проанализируем алгоритм поиска проблемы:

  1. Настройка отладчика. Запустите 1С в режиме отладки и настройте остановку по ошибке. Попробуйте провести проблемный документ. Отладчик, скорее всего, не остановится на тексте сообщения, так как оно формируется программно.
  2. Поиск по конфигурации. Если остановка по ошибке не сработала, воспользуйтесь глобальным поиском по конфигурации (Ctrl + Shift + F). Искать нужно не полный текст ошибки, а ключевую, уникальную его часть, например, "Не задана кратность валюты".
  3. Анализ найденного кода. Поиск приведет нас к конкретному участку кода, который отвечает за проверку. В типовой конфигурации "Бухгалтерия предприятия 3.0" это может быть следующий фрагмент:

// ... код в модуле проведения документа ...
СтруктураКурсаДокумента = РаботаСКурсамиВалют.ПолучитьКурсВалюты(Реквизиты.ВалютаДокумента, Реквизиты.Дата);
        
Если СтруктураКурсаДокумента.Кратность = 0 Тогда
    Отказ = Истина;
    ШаблонСообщения = НСтр("ru = 'Документ %1 не может быть проведен.
        |Не задана кратность валюты %2 на дату %3'");
    // ... дальнейшая обработка и вывод сообщения ...
КонецЕсли;

// ... код в общем модуле РаботаСКурсамиВалют ...
Функция ПолучитьКурсВалюты(Валюта, ДатаКурса) Экспорт
    Результат = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ДатаКурса, Новый Структура("Валюта", Валюта));
    
    Результат.Вставить("Валюта", Валюта);
    Результат.Вставить("ДатаКурса", ДатаКурса);
    
    Возврат Результат;
КонецФункции

Рассмотрим, что здесь происходит. Система вызывает функцию ПолучитьКурсВалюты, передавая в нее валюту и дату из документа. Внутри этой функции используется метод РегистрыСведений.КурсыВалют.ПолучитьПоследнее(). Этот метод ищет в регистре самую последнюю запись на указанную дату (ДатаКурса) или раньше нее. Если запись найдена, метод возвращает структуру с ее данными. Если не найдена — возвращается структура с нулевыми значениями для ресурсов, в том числе и для кратности.

Таким образом, условие СтруктураКурсаДокумента.Кратность = 0 становится истинным в двух случаях:

Итоги и финальные рекомендации

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

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

Таким образом, полный алгоритм решения проблемы выглядит так:

  1. Проверьте данные в пользовательском режиме: убедитесь в наличии корректной записи в регистре сведений "Курсы валют" и отсутствии дублей в справочнике "Валюты".
  2. Используйте отладчик: если простая проверка не помогла, найдите в коде место проверки кратности.
  3. Проанализируйте переменные: поставьте точку останова и изучите, какая именно валюта и дата передаются в функцию получения курса. Это укажет на источник проблемы.
  4. Исправьте данные: замените некорректную валюту в документе на правильную или создайте недостающую запись о курсе.

Следуя этим шагам, вы сможете не только быстро исправить ошибку "Не задана кратность валюты", но и глубже понять механизмы работы с валютами в 1С.

← На главную