Как изменить валюту банковского счета в 1С:Бухгалтерия 3.0, если по нему уже есть движения

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

В процессе эксплуатации 1С или при переносе данных из предыдущих версий (например, с платформы 7.7 на 8.3) пользователи часто сталкиваются с ситуацией, когда в справочнике БанковскиеСчета у валютного счета не заполнена или неверно указана валюта. Попытка исправить это вручную в карточке счета приводит к ошибке: система сообщает, что изменение валюты невозможно, так как по счету уже зарегистрированы операции. Это происходит из-за жесткой проверки в программном коде конфигурации, которая призвана защитить данные от нарушения логической целостности.

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

Почему 1С блокирует изменение валюты?

Разберем причину такого поведения системы. В конфигурации «Бухгалтерия предприятия 3.0» в модуле объекта справочника БанковскиеСчета встроен обработчик события ПередЗаписью. Этот обработчик проверяет, не изменился ли реквизит ВалютаДенежныхСредств. Если значение было изменено, система выполняет запрос к регистрам (таким как Хозрасчетный или регистры накопления денежных средств). Если по данному счету найдены хотя бы какие-то записи, транзакция прерывается и пользователю выводится предупреждение.

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

Способ 1: Использование группового изменения реквизитов

Это наиболее доступный способ для администратора системы, не требующий написания кода. Мы воспользуемся стандартной обработкой «Групповое изменение реквизитов», но с использованием скрытых настроек.

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных и откроем Групповое изменение реквизитов.
  2. В поле «Выбирать элементы» укажем Банковские счета.
  3. Нажмем кнопку Дополнительные параметры в нижней части окна.
  4. В появившемся окне в разделе «Специальные возможности» обязательно установим флаг Режим разработчика. Именно этот режим позволяет обходить встроенные в модули объектов проверки. Также рекомендуется установить флаг Записывать объекты без проверок.
  5. Вернемся к основному окну обработки и выберем нужный счет через «Все элементы» или установив соответствующий отбор по наименованию или номеру счета.
  6. В списке реквизитов найдем поле Валюта (или ВалютаДенежныхСредств) и установим нужное значение (например, USD или EUR).
  7. Нажмем кнопку Изменить реквизиты.

Благодаря режиму разработчика система проигнорирует процедуру ПередЗаписью в модуле объекта и запишет новое значение реквизита напрямую в базу данных.

Способ 2: Программное изменение через консоль кода

Если групповая обработка по каким-то причинам не справляется или вам нужно точечное решение, мы можем написать небольшой скрипт. Основной секрет здесь заключается в свойстве ОбменДанными.Загрузка. Если установить его в значение Истина, платформа 1С отключает большинство стандартных проверок при записи объекта.

Рассмотрим пример кода, который можно выполнить во внешней обработке «Консоль кода» или «Групповая обработка объектов»:


Попытка
    // Находим нужный банковский счет по наименованию или коду
    СчетОбъект = Справочники.БанковскиеСчета.НайтиПоНаименованию("Валютный USD").ПолучитьОбъект();
    
    Если СчетОбъект <> Неопределено Тогда
        // Находим нужную валюту
        ВалютаСсылка = Справочники.Валюты.НайтиПоКоду("840"); // Код доллара
        
        СчетОбъект.ВалютаДенежныхСредств = ВалютаСсылка;
        
        // Включаем режим загрузки данных, чтобы обойти проверку модуля объекта
        СчетОбъект.ОбменДанными.Загрузка = Истина;
        
        СчетОбъект.Записать();
        Сообщить("Валюта успешно изменена!");
    Иначе
        Сообщить("Счет не найден!");
    КонецЕсли;
Исключение
    Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;

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

Способ 3: Метод замены ссылок (безопасная альтернатива)

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

  1. Создадим в справочнике Банковские счета новый элемент с правильной валютой и всеми остальными идентичными данными.
  2. Воспользуемся обработкой Поиск и замена значений (входит в состав «Инструментов разработчика»).
  3. В качестве «Заменяемого объекта» выберем старый счет (с пустой/ошибочной валютой).
  4. В качестве «Объекта-заменителя» выберем только что созданный правильный счет.
  5. Выполним замену во всех документах и регистрах.

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

Способ 4: Манипуляции через XML-выгрузку

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

  1. Используем обработку Выгрузка загрузка данных XML.
  2. Выгружаем только один объект — наш проблемный банковский счет — в файл.
  3. Открываем полученный XML-файл в текстовом редакторе (например, Notepad++).
  4. Находим тег, отвечающий за валюту (ВалютаДенежныхСредств), и вписываем туда GUID или код правильной валюты. Если поле было пустым, нужно добавить соответствующую структуру XML-узла.
  5. Загружаем файл обратно этой же обработкой.

При загрузке через XML платформа автоматически использует режим ОбменДанными.Загрузка = Истина, что позволит нам миновать проверку на наличие движений.

Важные рекомендации после изменения валюты

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

  1. Пересчет итогов и перепроведение: Если по счету были документы, их стоит перепровести, чтобы убедиться, что движения в регистрах теперь корректно учитывают валютную составляющую.
  2. Проверка отчетов: Сформируйте Оборотно-сальдовую ведомость по счету (например, 52) и проверьте, появились ли там валютные суммы и корректно ли они отображаются.
  3. Архивная копия: Любые манипуляции с обходом стандартных проверок должны проводиться только после создания резервной копии базы данных!

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

← На главную