При первоначальной настройке конфигурации «1С:Управление торговлей 10.3» (или аналогичных решений на обычных формах) одной из наиболее критических и трудноисправимых ошибок является некорректное указание базовых валют. Внедренцы или администраторы базы данных могут по ошибке перепутать константы: установить вместо валюты регламентированного учета (например, рубли) валюту управленческого учета (например, доллары), и наоборот.
Когда в систему уже введены и проведены сотни или тысячи документов, просто так поменять эти константы в интерфейсе программа не позволит. Это логичное ограничение платформы 1С, поскольку изменение ключевых валют «на лету» полностью разрушает математику учета. В данной статье мы подробно разберем, почему возникает эта проблема, какие скрытые риски несет в себе ее быстрое «косметическое» решение, и как правильно исправить ситуацию программными методами без потери и удаления документов.
В процессе обсуждения проблемы часто предлагается самый очевидный путь: принудительно изменить значения констант с помощью кода или обработки, отключив проверку записи, а затем запустить групповое перепроведение документов. Рассмотрим подробнее, почему этот метод является «миной замедленного действия» и неизбежно приведет к хаосу в базе данных:
0.011 USD за 1 RUB). Если вы просто поменяете константы местами, система начнет считать рубль базовой валютой, но исторические курсы в регистре сведений автоматически не «перевернутся». Программа будет считать, что доллар стоит 0.011 рублей, что полностью исказит все новые валютные операции.ПартииТоваровНаСкладах) ведется строго в валюте управленческого учета. Если документы проводились в то время, когда управленческой валютой был рубль, себестоимость сформировалась в рублевом эквиваленте. После простой смены константы на USD программа при очередном списании партий начнет трактовать старые рублевые суммы остатков как долларовые. Это приведет к колоссальному завышению себестоимости и искажению финансового результата (отчета о валовой прибыли).Если документов в информационной базе совсем немного, операции были введены недавно, и вы готовы вручную перепроверить каждый договор и каждую сделку, можно прибегнуть к программной установке констант. Для этого нам потребуется написать или запустить внешнюю обработку со следующим кодом:
// Принудительно устанавливаем новые значения валют в обход стандартных проверок формы
Константы.ВалютаРегламентированногоУчета.Установить(Справочники.Валюты.НайтиПоКоду("643")); // Код 643 - Рубль
Константы.ВалютаУправленческогоУчета.Установить(Справочники.Валюты.НайтиПоКоду("840")); // Код 840 - Доллар США
После выполнения данного кода вам потребуется в обязательном порядке выполнить следующие действия:
КурсыВалют, перевернув все курсы относительно новой регламентированной валюты.Если база данных уже содержит огромный массив документов за прошлые периоды, и их перепроведение невозможно или крайне нежелательно (так как изменятся копейки, себестоимость, поплывут закрытые периоды), необходимо использовать метод прямого изменения движений документов. Мы можем написать специальную обработку, которая найдет все движения по регистрам накопления и поменяет местами рублевые и валютные суммы без фактического перепроведения самих документов.
Рассмотрим пример кода для обработки движений регистра накопления ВзаиморасчетыСКонтрагентами по документам реализации товаров и услуг:
Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
Пока Выборка.Следующий() Цикл
// Создаем набор записей для конкретного регистратора
НаборЗаписей = РегистрыНакопления.ВзаиморасчетыСКонтрагентами.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Ссылка);
НаборЗаписей.Прочитать();
Модифицирован = Ложь;
Для Каждого СтрокаДвижения Из НаборЗаписей Цикл
// Сохраняем исходные значения сумм
ВременнаяСуммаУпр = СтрокаДвижения.СуммаУпр;
ВременнаяСуммаРегл = СтрокаДвижения.СуммаРегл;
// Меняем значения сумм управленческого и регламентированного учета местами
СтрокаДвижения.СуммаУпр = ВременнаяСуммаРегл;
СтрокаДвижения.СуммаРегл = ВременнаяСуммаУпр;
Модифицирован = Истина;
КонецЦикла;
// Записываем набор записей с установленным флагом ОбменДанными.Загрузка = Истина,
// чтобы обойти стандартные проверки и блокировки платформы
Если Модифицирован Тогда
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать(Истина);
КонецЕсли;
КонецЦикла;
Давайте проанализируем этот алгоритм. Использование свойства ОбменДанными.Загрузка = Истина является ключевым моментом. Оно позволяет обойти платформенные проверки бизнес-логики при записи набора. Данную операцию необходимо последовательно повторить для всех регистров накопления и регистров бухгалтерии, в которых фигурируют суммы в валютах регламентированного и управленческого учета. К таким регистрам в УТ 10.3 относятся:
ПартииТоваровНаСкладах (и другие партионные регистры);Продажи и ПродажиСебестоимость;ВзаиморасчетыСКонтрагентами и РасчетыСКонтрагентами;Закупки.Для полуавтоматического исправления ситуации можно применить стандартную обработку «Поиск и замена значений» (ее можно найти на диске ИТС или в составе инструментов разработчика). Этот метод требует предельной аккуратности и должен выполняться строго на копии базы данных.
Разберем по шагам логику работы с обработкой:
Валюты. Например, создайте временную валюту «Техническая».Важное примечание относительно платформы 1С:Предприятие 8.4: В обсуждениях на форумах иногда упоминается работа конфигурации УТ 10.3 на платформе 8.4. Напомним, что ветка 8.4 разрабатывалась компанией «1С» как экспериментальная и в широкое тиражирование не пошла, а все успешные технологии были интегрированы в платформу 8.3 (начиная с версий 8.3.10 и выше). Конфигурация УТ 10.3 является классическим решением на обычных формах и стабильно функционирует на современных релизах платформы 1С v8.3 в режиме совместимости.
Подводя итог, отметим: если вы столкнулись с перепутанными валютами учета в работающей базе, не спешите механически менять константы. Оцените объем введенных данных, воспользуйтесь написанием транзитных скриптов для корректировки регистров или проведите свертку базы данных на начало текущего отчетного периода, чтобы начать учет в правильных валютах с «чистого листа».