Как исправить ошибку, если перепутаны валюты регламентированного и управленческого учета в 1С:Управление торговлей 10.3 без удаления документов

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

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

Когда в систему уже введены и проведены сотни или тысячи документов, просто так поменять эти константы в интерфейсе программа не позволит. Это логичное ограничение платформы 1С, поскольку изменение ключевых валют «на лету» полностью разрушает математику учета. В данной статье мы подробно разберем, почему возникает эта проблема, какие скрытые риски несет в себе ее быстрое «косметическое» решение, и как правильно исправить ситуацию программными методами без потери и удаления документов.

В чем заключается скрытая опасность простого изменения констант и перепроведения?

В процессе обсуждения проблемы часто предлагается самый очевидный путь: принудительно изменить значения констант с помощью кода или обработки, отключив проверку записи, а затем запустить групповое перепроведение документов. Рассмотрим подробнее, почему этот метод является «миной замедленного действия» и неизбежно приведет к хаосу в базе данных:

  1. Математика регистра «Курсы валют». В системе 1С курс любой валюты всегда хранится по отношению к базовой валюте — валюте регламентированного учета (значение курса которой всегда условно принимается за 1). Если ранее валютой регламентированного учета был доллар (USD), а управленческого — рубль (RUB), то курс рубля хранился в базе как дробная величина (например, 0.011 USD за 1 RUB). Если вы просто поменяете константы местами, система начнет считать рубль базовой валютой, но исторические курсы в регистре сведений автоматически не «перевернутся». Программа будет считать, что доллар стоит 0.011 рублей, что полностью исказит все новые валютные операции.
  2. Искажение исторической себестоимости. Партионный учет в конфигурации «Управление торговлей 10.3» (в частности, в регистре накопления ПартииТоваровНаСкладах) ведется строго в валюте управленческого учета. Если документы проводились в то время, когда управленческой валютой был рубль, себестоимость сформировалась в рублевом эквиваленте. После простой смены константы на USD программа при очередном списании партий начнет трактовать старые рублевые суммы остатков как долларовые. Это приведет к колоссальному завышению себестоимости и искажению финансового результата (отчета о валовой прибыли).
  3. Контроль валюты договоров контрагентов. Каждый договор контрагента жестко привязан к определенной валюте взаиморасчетов. При проведении документов система сверяет валюту документа, валюту договора и валюты учета. Смена глобальных констант приведет к тому, что старые договоры окажутся привязаны к некорректным с точки зрения новой логики валютам. При попытке перепровести или отредактировать любой исторический документ система выдаст ошибку несоответствия валют либо некорректно рассчитает долг.

Способ 1. Программное изменение констант напрямую (для баз с минимальным количеством документов)

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


// Принудительно устанавливаем новые значения валют в обход стандартных проверок формы
Константы.ВалютаРегламентированногоУчета.Установить(Справочники.Валюты.НайтиПоКоду("643")); // Код 643 - Рубль
Константы.ВалютаУправленческогоУчета.Установить(Справочники.Валюты.НайтиПоКоду("840"));    // Код 840 - Доллар США

После выполнения данного кода вам потребуется в обязательном порядке выполнить следующие действия:

Способ 2. Корректное программное исправление движений в регистрах (без перепроведения документов)

Если база данных уже содержит огромный массив документов за прошлые периоды, и их перепроведение невозможно или крайне нежелательно (так как изменятся копейки, себестоимость, поплывут закрытые периоды), необходимо использовать метод прямого изменения движений документов. Мы можем написать специальную обработку, которая найдет все движения по регистрам накопления и поменяет местами рублевые и валютные суммы без фактического перепроведения самих документов.

Рассмотрим пример кода для обработки движений регистра накопления ВзаиморасчетыСКонтрагентами по документам реализации товаров и услуг:


Выборка = Документы.РеализацияТоваровУслуг.Выбрать();

Пока Выборка.Следующий() Цикл
    // Создаем набор записей для конкретного регистратора
    НаборЗаписей = РегистрыНакопления.ВзаиморасчетыСКонтрагентами.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Ссылка);
    НаборЗаписей.Прочитать();
    
    Модифицирован = Ложь;
    
    Для Каждого СтрокаДвижения Из НаборЗаписей Цикл
        // Сохраняем исходные значения сумм
        ВременнаяСуммаУпр  = СтрокаДвижения.СуммаУпр;
        ВременнаяСуммаРегл = СтрокаДвижения.СуммаРегл;
        
        // Меняем значения сумм управленческого и регламентированного учета местами
        СтрокаДвижения.СуммаУпр  = ВременнаяСуммаРегл;
        СтрокаДвижения.СуммаРегл = ВременнаяСуммаУпр;
        
        Модифицирован = Истина;
    КонецЦикла;
    
    // Записываем набор записей с установленным флагом ОбменДанными.Загрузка = Истина,
    // чтобы обойти стандартные проверки и блокировки платформы
    Если Модифицирован Тогда
        НаборЗаписей.ОбменДанными.Загрузка = Истина;
        НаборЗаписей.Записать(Истина);
    КонецЕсли;
КонецЦикла;

Давайте проанализируем этот алгоритм. Использование свойства ОбменДанными.Загрузка = Истина является ключевым моментом. Оно позволяет обойти платформенные проверки бизнес-логики при записи набора. Данную операцию необходимо последовательно повторить для всех регистров накопления и регистров бухгалтерии, в которых фигурируют суммы в валютах регламентированного и управленческого учета. К таким регистрам в УТ 10.3 относятся:

Способ 3. Использование специализированных обработок поиска и замены значений

Для полуавтоматического исправления ситуации можно применить стандартную обработку «Поиск и замена значений» (ее можно найти на диске ИТС или в составе инструментов разработчика). Этот метод требует предельной аккуратности и должен выполняться строго на копии базы данных.

Разберем по шагам логику работы с обработкой:

  1. Перед началом работы обязательно сделайте резервную копию базы данных! Любая ошибка при замене ссылок может безвозвратно испортить данные.
  2. Поскольку напрямую заменить одну валюту на другую в константах система не позволит из-за ограничений и уникальности ссылок, используйте транзитный (промежуточный) элемент справочника Валюты. Например, создайте временную валюту «Техническая».
  3. Настройте замену: сначала замените везде использование «старой» регламентированной валюты на «Техническую».
  4. Затем замените использование «старой» управленческой валюты на правильную регламентированную.
  5. На финальном шаге замените «Техническую» валюту на правильную управленческую.
  6. После завершения работы обработки обязательно запустите пересчет итогов и восстановите последовательность проведения документов.

Важное примечание относительно платформы 1С:Предприятие 8.4: В обсуждениях на форумах иногда упоминается работа конфигурации УТ 10.3 на платформе 8.4. Напомним, что ветка 8.4 разрабатывалась компанией «1С» как экспериментальная и в широкое тиражирование не пошла, а все успешные технологии были интегрированы в платформу 8.3 (начиная с версий 8.3.10 и выше). Конфигурация УТ 10.3 является классическим решением на обычных формах и стабильно функционирует на современных релизах платформы 1С v8.3 в режиме совместимости.

Подводя итог, отметим: если вы столкнулись с перепутанными валютами учета в работающей базе, не спешите механически менять константы. Оцените объем введенных данных, воспользуйтесь написанием транзитных скриптов для корректировки регистров или проведите свертку базы данных на начало текущего отчетного периода, чтобы начать учет в правильных валютах с «чистого листа».

← На главную