Деноминация национальной валюты Республики Беларусь, проведенная 1 июля 2016 года (в соотношении 10 000 : 1), поставила перед сообществом 1С-разработчиков и бухгалтеров уникальную по сложности задачу. Главная трудность заключалась в том, что реформа проводилась внутри финансового года, а не на его стыке. Это исключило классический сценарий простого закрытия года и начала работы в новой базе с чистого листа.
В этой статье мы подробно разберем, как подготовить информационные базы 1С к переходу на новые денежные единицы, проанализируем различные технические стратегии, изучим конкретные примеры кода для конвертации регистров и разберем сложные вопросы округления себестоимости запасов.
---
Прежде чем приступать к технической реализации, нам необходимо четко понимать требования законодательства. В соответствии с Постановлениями Минфина РБ и Нацбанка, ключевыми правилами перехода являются:
---
Этот вариант предполагает прямое изменение всех стоимостных показателей в документах и регистрах за весь исторический период или с начала текущего года. Рассмотрим его достоинства и недостатки, а также техническую реализацию.
Преимущества: сохраняется единая база данных, работают все стандартные отчето-обороты, нет необходимости поддерживать две базы в актуальном состоянии.
Недостатки: высокая нагрузка на СУБД, риск нарушения логической целостности данных, потеря исторической точности при делении копеечных сумм.
Перепроведение документов за прошлые периоды — крайне опасная операция, которая может исказить себестоимость, партионный учет и взаиморасчеты. Поэтому самым надежным способом является прямой пересчет ресурсов регистров с помощью набора записей. Проанализируем пример кода для конвертации регистров накопления:
// Пример обработки для конвертации ресурсов регистра накопления
Процедура ДеноминироватьРегистрНакопления(ИмяРегистра, МассивДокументов) Экспорт
Для Каждого СсылкаНаДокумент Из МассивДокументов Цикл
// Создаем набор записей по регистратору
НаборЗаписей = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
// Начинаем модификацию записей
Для Каждого Запись Из НаборЗаписей Цикл
// Пересчитываем только стоимостные ресурсы (пример для регистра Продажи)
Если ИмяРегистра = "Продажи" Тогда
Запись.Стоимость = ОкруглитьДоКопеек(Запись.Стоимость / 10000);
Запись.СуммаНДС = ОкруглитьДоКопеек(Запись.СуммаНДС / 10000);
ИначеЕсли ИмяРегистра = "ВзаиморасчетыСКонтрагентами" Тогда
Запись.Сумма = ОкруглитьДоКопеек(Запись.Сумма / 10000);
КонецЕсли;
КонецЦикла;
// Записываем набор без выполнения проверок при записи (оптимизация скорости)
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать(Истина);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ОкруглитьДоКопеек(Значение)
Возврат Окр(Значение, 2, РежимОкругления.Окр15как20);
КонецФункции
Важное примечание разработчикам: При делении больших объемов данных через встроенный язык 1С производительность может быть неудовлетворительной. Для оптимизации процесса на клиент-серверных базах данных можно использовать прямой пересчет через SQL-запросы, однако после этого обязательно необходимо выполнить полное пересоставление итогов по регистрам через конфигуратор или обработку УправлениеИтогами.
---
Для крупных и сильно кастомизированных баз данных интересным решением является идея создания временных "дублирующих" регистров. Рассмотрим ее по шагам:
ПартииТоваровНаСкладах) в метаданных создаются их копии с суффиксом _Деноминация._Деноминация датой 30.06.2016 23:59:59._ДоДеноминации, а новый регистр _Деноминация переименовывается в основной.Этот способ позволяет существенно сократить время простоя базы данных в "час Х", так как исторические движения не изменяются, а обрабатываются только текущие остатки.
---
Свертка является наиболее чистым решением с точки зрения методологии учета. База делится на два периода: до 30 июня включительно (в старых ценах) и после 1 июля (в новых ценах).
Выясним особенности проведения свертки:
Для пользователей программ на платформе «1С:Предприятие 7.7» (например, «1С:Бухгалтерия 7.7») классическим решением является использование штатной обработки WRAP.ert. Разберем правильный алгоритм работы с ней:
WRAP.ert."Объект не найден", если удалить их некорректно.---
Особую сложность при деноминации представляет округление себестоимости запасов, хранящихся на складах в больших количествах, но имеющих малую стоимость за единицу.
Проанализируем классическую дилемму на примере:
На складе числится 10 000 штук гаек общей стоимостью 100 старых белорусских рублей (BYR).
Подход 1: Округление общей стоимости остатка товара
Если мы деноминируем общую сумму остатка: 100 рублей / 10 000 = 0,01 рубля (1 копейка).
После деноминации: остаток 10 000 шт., общая стоимость = 1 копейка. Цена за единицу при этом становится ничтожно малой (0,000001 рубля), что невозможно отразить в стандартных печатных формах.
Подход 2: Округление цены единицы товара
Цена за 1 гайку до деноминации: 100 руб. / 10 000 шт. = 0.01 руб. (1 копейка).
Если разделить цену единицы на 10 000, мы получим 0,000001 руб. При округлении до 2 знаков после запятой цена единицы становится равна 0 копеек. В результате мы полностью теряем стоимость актива при списании!
Если же цена единицы составляла, например, 85 рублей (при количестве 10 000 шт. и общей сумме 850 000 рублей):
85 руб. / 10 000 = 0,0085 руб. Округляем до копеек = 0,01 руб. (1 копейка).
Новая общая стоимость: 10 000 * 0,01 руб. = 100 рублей (или 1 000 000 старых рублей). Возникает необоснованная прибыль из-за округления в размере 150 000 старых рублей!
Для минимизации погрешностей и предотвращения искажения себестоимости можно использовать следующие приемы:
---
С 1 июля 2016 года Национальный банк Республики Беларусь изменил правила установления курсов некоторых иностранных валют. В частности, курс российского рубля (RUB) стал устанавливаться не за 1 рубль, а за 100 российских рублей. Точность установки курсов увеличилась до 4 знаков после запятой.
При настройке 1С необходимо выполнить следующие действия:
01.07.2016)."рубль", "рубля", "рублей", "копейка", "копейки", "копеек").Валюты. Для российского рубля установите кратность равной 100, а курс введите с точностью до 4 знаков после запятой.Кратность:
// Корректный расчет суммы в валюте учета с учетом кратности
СуммаВВалютеУчета = ?(Кратность = 0, 0, (СуммаВВалюте * Курс) / Кратность);
---
В первые недели июля бухгалтерия неизбежно столкнется с ситуацией, когда необходимо будет вводить документы "задним числом" за июнь (акты выполненных работ от поставщиков, начисление заработной платы за июнь и т.д.).
Чтобы организовать этот процесс безболезненно, придерживайтесь следующего плана:
Следуя этим методикам и своевременно выполнив подготовку информационных баз, вы сможете обеспечить бесперебойную работу учетных систем предприятия и избежать досадных ошибок в регламентированной отчетности.