Как изменить валюту учета в 1С и исправить ошибку «В базе есть движения по "суммовым" регистрам накопления!»

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

При настройке или ведении учета в программных продуктах на платформе «1С:Предприятие 8» (особенно в конфигурациях 1С:УНФ, 1С:ERP, 1С:КА или 1С:УТ) пользователи часто сталкиваются с необходимостью изменить базовую валюту учета. Типичный сценарий — переход со старого кода валюты 810 (RUR) на действующий международный стандарт 643 (RUB) или исправление ошибочно выбранной валюты при первоначальном заполнении базы.

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

---

Почему возникает блокировка и как работает этот механизм

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

  1. Записывает сумму операции в валюте самого документа (например, в долларах или евро).
  2. Пересчитывает эту сумму по курсу на дату документа и записывает результат в специальном ресурсе регистра в так называемой валюте учета.

За хранение этих данных отвечают оборотные и остаточные регистры накопления, такие как ДвиженияДенежныхСредств, Взаиморасчеты, Запасы, Продажи и другие. В коде конфигурации (как правило, в форме настроек параметров учета) прописана специальная функция — например, ОтказИзменитьВалютаУчета(). Она делает запрос к базе данных, проверяя наличие записей в этих регистрах. Если обнаруживается хотя бы одна копейка или одна проведенная строка, интерфейс настройки намертво блокируется.

---

Почему метод «просто распровести все документы» часто оказывается неэффективным

На форумах часто советуют сделать все документы в базе непроведенными, изменить валюту и провести их обратно. Рассмотрим, почему на практике этот способ вызывает массу проблем:

  1. Наличие непроводимых документов: Документы типа ОперацияБух (ручные операции) или специализированные корректировки регистров не имеют стандартного режима проведения — они делают записи в регистры напрямую при записи. Распроведение документов их не затронет.
  2. Документы ввода остатков: Операции по вводу начальных остатков часто упускают из виду, но именно они генерируют ключевые движения по регистрам Взаиморасчеты или Запасы.
  3. «Битые» ссылки и технический мусор: При некорректном удалении документов в базе могут остаться записи в регистрах без документа-регистратора (так называемые «сироты»). Физически документа нет, а запись в таблице базы данных осталась — этого достаточно для срабатывания блокировки.
  4. Проблема обратного перепроведения: Если база ведется давно, то при попытке массово перепровести все документы за несколько лет вы почти гарантированно столкнетесь с ошибками нехватки запасов на складах, нарушением хронологии партионного учета или ошибками во взаиморасчетах.

Поэтому рассмотрим более надежные и профессиональные методы изменения валюты учета.

---

Способ 1. Объединение дублей валют (если в базе два разных рубля)

Очень часто проблема кроется в том, что в справочнике Валюты заведены два элемента: один с кодом 810, другой — с кодом 643. Если учет велся на одной валюте, а договоры начали оформлять на другой, правильнее всего объединить эти элементы. Для этого мы воспользуемся встроенным типовым механизмом «Поиск и замена дублей».

Разберем процесс по шагам:

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных.
  2. Откроем гиперссылку Поиск и удаление дублей.
  3. В поле «Искать в» выберем справочник Валюты.
  4. Нажмем кнопку Найти дубли.
  5. В появившемся списке выделим правильную валюту (с кодом 643) и отметим ее как Оригинал. Валюту с кодом 810 определим как Дубль.
  6. Нажмем кнопку Объединить.

Система автоматически найдет все упоминания старой валюты в договорах, документах и регистрах накопления и заменит их на актуальный элемент справочника.

---

Способ 2. Временный обход проверки в коде конфигурации

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

Важно: Перед выполнением любых процедур в конфигураторе обязательно создайте резервную копию вашей базы данных (выгрузку .dt или копию файла 1Cv8.1CD)!

Выполним следующие шаги:

  1. Запустим программу в режиме Конфигуратор.
  2. Откроем конфигурацию (меню Конфигурация — Открыть конфигурацию).
  3. Если база находится на поддержке, включим возможность редактирования: перейдем в Конфигурация — Поддержка — Настройка поддержки и нажмем кнопку Включить возможность изменения.
  4. Найдем модуль, отвечающий за проверку возможности изменения параметров (обычно это модуль формы настроек параметров учета или общий модуль работы с валютами). Нам нужно найти функцию, которая возвращает булево значение при проверке наличия записей в суммовых регистрах. Примерное имя функции: ОтказИзменитьВалютуУчета() или ЕстьДвиженияПоСуммовымРегистрам().
  5. В самом начале этой функции пропишем принудительный возврат значения Ложь (False), чтобы заставить программу думать, что база абсолютно чиста. Пример кода:

Функция ЕстьДвиженияПоСуммовымРегистрам() Экспорт
    // ВРЕМЕННЫЙ ОБХОД БЛОКИРОВКИ ДЛЯ СМЕНЫ ВАЛЮТЫ
    Возврат Ложь; 
    
    // Ниже идет оригинальный код проверки, который теперь выполняться не будет
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 ...";
    ...
КонецФункции
  1. Сохраним конфигурацию и обновим базу данных, нажав клавишу F7.
  2. Запустим 1С в режиме Предприятие, зайдем в настройки параметров учета и беспрепятственно изменим валюту учета на нужную (например, выберем рубль с кодом 643).
  3. Вернемся в Конфигуратор, удалим временно добавленную строчку Возврат Ложь; и снова обновим конфигурацию базы данных (F7).
  4. Обязательное условие: Чтобы данные в отчетах не исказились, необходимо выполнить полное групповое перепроведение документов за весь период ведения учета. Программа пересчитает все рублевые суммы по новым внутренним алгоритмам под измененную валюту учета.

---

Способ 3. Программная очистка движений без распроведения документов

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

Проанализируем алгоритм работы такой обработки:

  1. Программа находит все регистры накопления, у которых установлен признак суммового учета.
  2. Для каждого проведенного документа программно очищаются наборы записей по этим регистрам с помощью следующего кода:

НаборЗаписей = РегистрыНакопления.Продажи.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
НаборЗаписей.Записать(); // Записывает пустой набор, стирая движения в БД
  1. После того как все суммовые движения «сброшены» (при этом сами документы визуально остаются в статусе проведенных), администратор спокойно заходит в настройки и меняет валюту учета.
  2. Запускается процедура группового перепроведения документов. Так как документы уже имеют статус «Проведен», система просто последовательно перезаписывает их, автоматически генерируя новые движения в регистрах уже с использованием новой валюты учета.

---

Резюме и рекомендации

Изменение валюты учета в уже работающей базе данных — это сложная техническая операция. Прежде чем приступать к радикальным мерам, попробуйте сначала выполнить поиск и слияние дублирующихся валют (Способ 1), так как очень часто проблема кроется именно в путанице между кодами 810 и 643. Если же этот метод не помог, воспользуйтесь Способом 2 или 3, обязательно предварительно сделав архивную копию базы данных.

← На главную