Проведение деноминации в конфигурациях платформы 1С:Предприятие 7.7 — комплексная задача, требующая не только изменения коэффициентов цен и остатков, но и глобальной переработки метаданных, так как в неденоминированных базах учет часто велся в целых рублях без копеек. Разберем основные подходы к выполнению деноминации, программный пересчет движений и исправление типичных ошибок платформы при работе с дробными числами.
При попытке пересчитать суммы в операциях и проводках через встроенный язык разработчики часто сталкиваются с ситуацией, когда рассчитанное значение содержит копейки (например, 225.45), но после записи в журнал операций сумма превращается в целое число (225). Выясним причину такого поведения платформы 1С 7.7.
В платформе 1С 7.7 точность хранения сумм на уровне регистров бухгалтерского учета жестко привязана к конфигурации. Если копейки отсекаются, необходимо проверить следующие настройки:
Бухгалтерский учет, перейдем в свойства используемого плана счетов и проверим параметр «Точность суммы» (или разрядность суммового учета). Если там установлено значение 0, платформа на уровне СУБД (в таблицах 1SENTRY и 1SBKTTL) будет автоматически округлять любую записанную сумму до целого числа. Для появления копеек необходимо установить точность, равную 2.15.2 (15 знаков всего, 2 знака после запятой).Окр() передается корректное количество знаков дробной части.Если поставлена задача сохранить всю историю первичных документов и движений за текущий год, деноминируя их на лету, воспользуемся алгоритмом пакетного пересчета операций через объект Операция.
Рассмотрим пример кода для деноминации сумм ручных и документных проводок:
Опер = СоздатьОбъект("Операция");
КоэфДеноминации = 10000;
КолЗнаковДробнойЧасти = 2;
ЗначениеНоля = 0;
Опер.ВыбратьОперации(НачДата, КонДата);
Пока Опер.ПолучитьОперацию() = 1 Цикл
Сообщить("Обработка документа: " + Опер.Документ);
Опер.ВыбратьПроводки();
Пока Опер.ПолучитьПроводку() = 1 Цикл
СуммаПроводки = Окр(Опер.Сумма / КоэфДеноминации, КолЗнаковДробнойЧасти);
Если СуммаПроводки <> 0 Тогда
Опер.Сумма = СуммаПроводки;
Иначе
Опер.Сумма = ЗначениеНоля;
КонецЕсли;
КонецЦикла;
// Пересчитываем сумму операции на основе суммы проводок
Опер.СуммаОперации = Окр(Опер.СуммаОперации / КоэфДеноминации, КолЗнаковДробнойЧасти);
Опер.Записать();
КонецЦикла;
При использовании этого метода важно учитывать специфику архитектуры 1С 7.7:
НачатьТранзакцию() и ЗафиксироватьТранзакцию().0.00. Для таких реквизитов в метаданных задают точность 15.4 либо переходят на укрупненные единицы измерения.Для типовых и близких к ним бухгалтерских конфигураций стандартным решением является свертка базы с последующим вводом деноминированных остатков. В типовой поставке 1С 7.7 для этого предназначена специализированная обработка wrap.ert.
Разберем пошаговый порядок работы с обработкой:
wrap.ert. В форме обработки укажем:
00 или 000);Когда рабочая база содержит большой объем данных (от нескольких гигабайт в формате DBF), стандартное удаление сотен тысяч документов и пересчет проводок могут занять несколько дней. В таких случаях наиболее эффективна методика переноса:
После корректировки метаданных и пересчета данных необходимо проверить код конфигурации:
Ч015.0 на формат с копейками Ч015.2.глСуммаПрописью и СтрПрописьВалюты), убедившись, что они корректно подставляют наименование разменной монеты (копеек) и дробную часть числа.