В процессе эксплуатации 1С или при переносе данных из предыдущих версий (например, с платформы 7.7 на 8.3) пользователи часто сталкиваются с ситуацией, когда в справочнике БанковскиеСчета у валютного счета не заполнена или неверно указана валюта. Попытка исправить это вручную в карточке счета приводит к ошибке: система сообщает, что изменение валюты невозможно, так как по счету уже зарегистрированы операции. Это происходит из-за жесткой проверки в программном коде конфигурации, которая призвана защитить данные от нарушения логической целостности.
В этой статье мы подробно разберем, почему возникает такая блокировка, и рассмотрим несколько эффективных способов обхода этого ограничения, начиная от простых инструментов администратора и заканчивая программными методами.
Разберем причину такого поведения системы. В конфигурации «Бухгалтерия предприятия 3.0» в модуле объекта справочника БанковскиеСчета встроен обработчик события ПередЗаписью. Этот обработчик проверяет, не изменился ли реквизит ВалютаДенежныхСредств. Если значение было изменено, система выполняет запрос к регистрам (таким как Хозрасчетный или регистры накопления денежных средств). Если по данному счету найдены хотя бы какие-то записи, транзакция прерывается и пользователю выводится предупреждение.
Логика разработчиков понятна: изменение валюты у счета, по которому уже прошли рублевые или иные валютные проводки, может привести к непредсказуемым результатам при пересчете курсовых разниц и формировании отчетности. Однако в случаях, когда валюта просто не перенеслась при миграции данных, нам необходимо это исправить.
Это наиболее доступный способ для администратора системы, не требующий написания кода. Мы воспользуемся стандартной обработкой «Групповое изменение реквизитов», но с использованием скрытых настроек.
Банковские счета.Валюта (или ВалютаДенежныхСредств) и установим нужное значение (например, USD или EUR).Благодаря режиму разработчика система проигнорирует процедуру ПередЗаписью в модуле объекта и запишет новое значение реквизита напрямую в базу данных.
Если групповая обработка по каким-то причинам не справляется или вам нужно точечное решение, мы можем написать небольшой скрипт. Основной секрет здесь заключается в свойстве ОбменДанными.Загрузка. Если установить его в значение Истина, платформа 1С отключает большинство стандартных проверок при записи объекта.
Рассмотрим пример кода, который можно выполнить во внешней обработке «Консоль кода» или «Групповая обработка объектов»:
Попытка
// Находим нужный банковский счет по наименованию или коду
СчетОбъект = Справочники.БанковскиеСчета.НайтиПоНаименованию("Валютный USD").ПолучитьОбъект();
Если СчетОбъект <> Неопределено Тогда
// Находим нужную валюту
ВалютаСсылка = Справочники.Валюты.НайтиПоКоду("840"); // Код доллара
СчетОбъект.ВалютаДенежныхСредств = ВалютаСсылка;
// Включаем режим загрузки данных, чтобы обойти проверку модуля объекта
СчетОбъект.ОбменДанными.Загрузка = Истина;
СчетОбъект.Записать();
Сообщить("Валюта успешно изменена!");
Иначе
Сообщить("Счет не найден!");
КонецЕсли;
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
Этот метод считается самым «чистым» с точки зрения программирования 1С, так как он использует штатные механизмы платформы для обхода прикладных ограничений.
Иногда прямое изменение валюты в существующем счете может вызвать конфликты в будущем. В таких случаях мы рекомендуем рассмотреть более надежный архитектурный подход:
Банковские счета новый элемент с правильной валютой и всеми остальными идентичными данными.Проанализируем преимущества этого метода: система автоматически перепишет все ссылки во всех движениях документов. После успешной замены старый, некорректный счет можно будет пометить на удаление и окончательно удалить из базы.
Выясним, как использовать механизм универсального обмена данными для нашей задачи. Этот способ полезен, если вы боитесь работать с кодом, но групповое изменение не помогает.
ВалютаДенежныхСредств), и вписываем туда GUID или код правильной валюты. Если поле было пустым, нужно добавить соответствующую структуру XML-узла.При загрузке через XML платформа автоматически использует режим ОбменДанными.Загрузка = Истина, что позволит нам миновать проверку на наличие движений.
После того как вы изменили валюту счета любым из вышеперечисленных способов, обязательно выполните следующие действия:
Оборотно-сальдовую ведомость по счету (например, 52) и проверьте, появились ли там валютные суммы и корректно ли они отображаются.Проанализировав ситуацию, мы видим, что проблема блокировки изменения валюты в 1С — это не технический сбой, а защитный механизм. Однако владение инструментами администратора и понимание принципа работы свойства ОбменДанными.Загрузка позволяют успешно решать подобные задачи при сопровождении информационных систем.