При работе в 1С:Бухгалтерия Предприятия 3.0 (особенно в версии ПРОФ) пользователи и программисты часто сталкиваются с неприятной ситуацией: при проведении документов (чаще всего это ОтчетОРозничныхПродажах) система выдает критическую ошибку «деление на 0». Проблема осложняется тем, что при визуальном осмотре справочника Валюты для рубля невозможно найти реквизиты «Курс» или «Кратность», так как интерфейс программы их скрывает. Рассмотрим подробно, почему возникает эта ошибка и как её исправить несколькими способами.
Разберем первопричину. В современных конфигурациях на базе БСП (Библиотека стандартных подсистем), к которым относится и БП 3.0, данные о курсах и кратности валют хранятся не в самом справочнике Валюты, а в независимом регистре сведений КурсыВалют. Проанализируем ситуацию, когда база создается из файла конфигурации .cf. В этом случае в системе отсутствуют записи в регистрах, которые обычно создаются при «Первом старте» из эталонного дампа (файла .dt).
Когда мы загружаем данные через правила обмена (например, из КОРП в ПРОФ), справочник Валюты заполняется, но записи в регистре КурсыВалют для рубля (код 643 или 810) могут не создаться автоматически. При проведении документа типовые механизмы 1С обращаются к функции пересчета валют. Если функция не находит запись в регистре на дату документа, она возвращает 0 в качестве курса или кратности, что и приводит к математической ошибке деления на ноль в общем модуле.
Посмотрим на ситуацию со стороны интерфейса. Если в базе отключен валютный учет, вы не увидите гиперссылок на курсы валют. Чтобы исправить это вручную, выполним следующие шаги:
Важный нюанс: Чтобы в справочнике Валюты появились нужные поля, иногда достаточно временно включить валютный учет. Для этого нужно зайти в Параметры учета — Настройки полных прав и добавить любую иностранную валюту (например, USD). После этого функциональная опция ИспользоватьВалютныйУчет станет истинной, и интерфейс позволит редактировать курсы.
Если документов много или ручной ввод в регистр недоступен, воспользуемся программным методом. Проанализируем пример кода, который создаст необходимую запись в регистре сведений КурсыВалют для предопределенной или найденной по коду валюты.
// Программная установка курса и кратности для рубля
РегистрКурсыВалют = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
РегистрКурсыВалют.Период = Дата(1980, 01, 01); // Устанавливаем дату в далеком прошлом
РегистрКурсыВалют.Валюта = Справочники.Валюты.НайтиПоКоду("643");
РегистрКурсыВалют.Курс = 1;
РегистрКурсыВалют.Кратность = 1;
Попытка
РегистрКурсыВалют.Записать();
Сообщить("Запись в регистр курсов валют успешно создана.");
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
После выполнения этого кода необходимо обновить кэш или просто перезапустить сеанс, чтобы система подтянула новые значения курса для пересчета в документах.
Выясним еще одну частую причину. При обмене данными может возникнуть ситуация, когда в базе появляется два «Рубля». Один был создан системой автоматически, а второй пришел по обмену с другим внутренним идентификатором (UUID). В документах может быть указана одна валюта, а константа ВалютаРегламентированногоУчета ссылается на другую.
Рассмотрим порядок действий для устранения дублей:
Валюты.ОтчетОРозничныхПродажах) на одну верную валюту, для которой уже установлен курс 1 и кратность 1.Если запись в регистре есть, но документ все равно выдает ошибку, проанализируем структуру самого документа. В Отчете о розничных продажах есть скрытые реквизиты: КурсДокумента и КратностьДокумента. Если они были загружены из внешней системы со значениями 0, документ не проведется.
Разберем код обработки, которая исправит эти значения в уже существующих документах:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОтчетОРозничныхПродажах.Ссылка КАК Ссылка
|ИЗ
| Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
|ГДЕ
| (ОтчетОРозничныхПродажах.КурсДокумента = 0 ИЛИ ОтчетОРозничныхПродажах.КратностьДокумента = 0)";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ОбъектДок = Выборка.Ссылка.ПолучитьОбъект();
ОбъектДок.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
ОбъектДок.КурсДокумента = 1;
ОбъектДок.КратностьДокумента = 1;
// Записываем без проведения, если нужно просто поправить реквизиты
// Или используем РежимЗаписиДокумента.Проведение, чтобы сразу проверить результат
Попытка
ОбъектДок.Записать(РежимЗаписиДокумента.Запись);
Исключение
Сообщить("Не удалось записать документ: " + Выборка.Ссылка);
КонецПопытки;
КонецЦикла;
Подводя итог, отметим: 1С рекомендует создавать новые базы БП 3.0 ПРОФ не из пустого .cf, а из поставляемого файла выгрузки .dt, который идет в комплекте дистрибутива (папка ExtFiles/DemoData или аналогичные). В таком файле уже выполнены все процедуры начального заполнения, установлены константы и прописаны курсы для валюты регламентированного учета. Это позволит избежать подобных «фантомных» ошибок при последующей загрузке данных через механизмы обмена или КД 2.0 / 3.0.
Резюме: Если вы столкнулись с делением на 0 — проверьте регистр КурсыВалют, убедитесь в отсутствии дублей валюты «Рубль» и проконтролируйте заполнение реквизитов курса внутри самих документов.