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

Программист 1С v8.3 (Обычные формы)
← На главную

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

Анализ программного кода обработчика «ПередЗаписью»

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


// Процедура - обработчик события ПередЗаписью
Процедура ПередЗаписью(Отказ, Замещение)
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    КоличествоЗаписей = ЭтотОбъект.Количество;
    Если КоличествоЗаписей > 0 Тогда
        Для Сч = 0 По КоличествоЗаписей -1 Цикл
            Если (ЭтотОбъект[Сч].Кратность = 0) ИЛИ (ЭтотОбъект[Сч].Курс = 0) Тогда
                ОбщегоНазначения.СообщитьОбОшибке("Кратность или курс не могут быть нулевыми!", Отказ);
                Возврат;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

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

Конфликт уникальности записей и периодичность

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

Рассмотрим сценарии возникновения конфликта:

  1. Повторный ввод на ту же дату: Если вы пытаетесь создать запись на «сегодня», а в регистре уже есть запись на эту дату (пусть даже она не видна в текущем списке из-за фильтров), платформа выдаст ошибку записи.
  2. Автоматическая загрузка: В УТ 10.3 реализован механизм загрузки курсов из интернета. Если включено регламентное задание или при открытии справочника срабатывает автоматическое обновление, может возникнуть ситуация, когда фоновый процесс уже создал запись, а вы пытаетесь перезаписать её вручную без признака замещения.
  3. Связанные валюты: Проанализируем настройки валюты. Если установлен способ установки курса «Наценка на курс другой валюты», то при записи основной валюты система обращается к базовой. Если в базовой валюте есть ошибки (например, поврежденная история курсов), это заблокирует запись зависимой валюты.

Проблемы с кэшем и платформенные сбои

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

Рекомендуем выполнить следующие действия для очистки кэша:

  1. Удалите базу из списка информационных баз в окне запуска «1С:Предприятие».
  2. Нажмите «Ок», закройте окно.
  3. Снова добавьте базу в список. Это заставит платформу создать новую папку для кэша в каталоге AppData.

Также стоит проверить физическую целостность таблиц. Для этого используем утилиту chdbfl.exe (находится в папке bin установленной платформы) или запустим Тестирование и исправление в Конфигураторе со следующими параметрами:

Особенности работы на платформе 8.3

Хотя УТ 10.3 предназначена для работы в режиме обычных форм, современные версии платформы 8.3 вносят свои коррективы. Проанализируем настройки в Конфигураторе. Если свойство конфигурации «Режим использования модальности» установлено в значение Не использовать, это может приводить к неожиданным отказам при вызове диалоговых окон в старом коде.

Также проверьте права доступа. При включенном механизме RLS (Ограничение прав на уровне записей) пользователь может иметь право на редактирование справочника Валюты, но не иметь прав на добавление записей в регистр КурсыВалют по определенным условиям. В этом случае система также вернет общую ошибку «Не удалось записать».

Пошаговый алгоритм решения для программиста

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

  1. Установите точку останова в модуле набора записей регистра КурсыВалют в процедуре ПередЗаписью.
  2. Посмотрите значение переменной ЭтотОбъект. Проверьте, какие записи реально передаются на запись.
  3. Обратите внимание на поле Период. Если там указана пустая дата (01.01.0001), запись в SQL-версии базы может не пройти из-за ограничений СУБД на минимальную дату.
  4. Проверьте, не вызывается ли метод Записать() внутри транзакции, которая была отменена ранее из-за другой скрытой ошибки.

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

← На главную