Как исправить ошибку «деление на 0» из-за отсутствия кратности валюты в 1С:Бухгалтерии 3.0?

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

При работе в 1С:Бухгалтерия Предприятия 3.0 (особенно в версии ПРОФ) пользователи и программисты часто сталкиваются с неприятной ситуацией: при проведении документов (чаще всего это ОтчетОРозничныхПродажах) система выдает критическую ошибку «деление на 0». Проблема осложняется тем, что при визуальном осмотре справочника Валюты для рубля невозможно найти реквизиты «Курс» или «Кратность», так как интерфейс программы их скрывает. Рассмотрим подробно, почему возникает эта ошибка и как её исправить несколькими способами.

Почему возникает ошибка «деление на 0»?

Разберем первопричину. В современных конфигурациях на базе БСП (Библиотека стандартных подсистем), к которым относится и БП 3.0, данные о курсах и кратности валют хранятся не в самом справочнике Валюты, а в независимом регистре сведений КурсыВалют. Проанализируем ситуацию, когда база создается из файла конфигурации .cf. В этом случае в системе отсутствуют записи в регистрах, которые обычно создаются при «Первом старте» из эталонного дампа (файла .dt).

Когда мы загружаем данные через правила обмена (например, из КОРП в ПРОФ), справочник Валюты заполняется, но записи в регистре КурсыВалют для рубля (код 643 или 810) могут не создаться автоматически. При проведении документа типовые механизмы 1С обращаются к функции пересчета валют. Если функция не находит запись в регистре на дату документа, она возвращает 0 в качестве курса или кратности, что и приводит к математической ошибке деления на ноль в общем модуле.

Способ 1: Использование функций для технического специалиста

Посмотрим на ситуацию со стороны интерфейса. Если в базе отключен валютный учет, вы не увидите гиперссылок на курсы валют. Чтобы исправить это вручную, выполним следующие шаги:

  1. Активируем режим «Функции для технического специалиста» (через главное меню — Настройки).
  2. Найдем в списке Регистры сведений — Курсы валют.
  3. Проверим наличие записи для валюты «руб.». Если записи нет, её необходимо создать вручную.
  4. В поле «Валюта» выберем наш рубль, установим дату (период) — желательно начало самого раннего года ведения учета (например, 01.01.1980), и установим Курс = 1, Кратность = 1.

Важный нюанс: Чтобы в справочнике Валюты появились нужные поля, иногда достаточно временно включить валютный учет. Для этого нужно зайти в Параметры учета — Настройки полных прав и добавить любую иностранную валюту (например, USD). После этого функциональная опция ИспользоватьВалютныйУчет станет истинной, и интерфейс позволит редактировать курсы.

Способ 2: Программное восстановление регистра курсов

Если документов много или ручной ввод в регистр недоступен, воспользуемся программным методом. Проанализируем пример кода, который создаст необходимую запись в регистре сведений КурсыВалют для предопределенной или найденной по коду валюты.


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

Попытка
    РегистрКурсыВалют.Записать();
    Сообщить("Запись в регистр курсов валют успешно создана.");
Исключение
    Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;

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

Способ 3: Исправление дублей валют

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

Рассмотрим порядок действий для устранения дублей:

  1. Воспользуемся типовой обработкой «Поиск и удаление дублей» (раздел Администрирование — Обслуживание).
  2. В качестве объекта поиска выберем справочник Валюты.
  3. Укажем критерий сравнения по коду (643).
  4. При объединении выберем «правильным» тот элемент, который имеет большее количество ссылок или является предопределенным.
  5. Нажмем кнопку «Удалить дубли». Система автоматически заменит ссылки во всех документах (включая ОтчетОРозничныхПродажах) на одну верную валюту, для которой уже установлен курс 1 и кратность 1.

Способ 4: Массовое заполнение реквизитов в документах

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

Разберем код обработки, которая исправит эти значения в уже существующих документах:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|   ОтчетОРозничныхПродажах.Ссылка КАК Ссылка
|ИЗ
|   Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
|ГДЕ
|   (ОтчетОРозничныхПродажах.КурсДокумента = 0 ИЛИ ОтчетОРозничныхПродажах.КратностьДокумента = 0)";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    ОбъектДок = Выборка.Ссылка.ПолучитьОбъект();
    ОбъектДок.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
    ОбъектДок.КурсДокумента     = 1;
    ОбъектДок.КратностьДокумента = 1;
    
    // Записываем без проведения, если нужно просто поправить реквизиты
    // Или используем РежимЗаписиДокумента.Проведение, чтобы сразу проверить результат
    Попытка
        ОбъектДок.Записать(РежимЗаписиДокумента.Запись);
    Исключение
        Сообщить("Не удалось записать документ: " + Выборка.Ссылка);
    КонецПопытки;
КонецЦикла;

Рекомендация по созданию баз

Подводя итог, отметим: 1С рекомендует создавать новые базы БП 3.0 ПРОФ не из пустого .cf, а из поставляемого файла выгрузки .dt, который идет в комплекте дистрибутива (папка ExtFiles/DemoData или аналогичные). В таком файле уже выполнены все процедуры начального заполнения, установлены константы и прописаны курсы для валюты регламентированного учета. Это позволит избежать подобных «фантомных» ошибок при последующей загрузке данных через механизмы обмена или КД 2.0 / 3.0.

Резюме: Если вы столкнулись с делением на 0 — проверьте регистр КурсыВалют, убедитесь в отсутствии дублей валюты «Рубль» и проконтролируйте заполнение реквизитов курса внутри самих документов.

← На главную