При работе с конфигурацией «Управление торговлей», редакция 10.3 (особенно на актуальных релизах, таких как 10.3.62.2 и выше), пользователи и программисты часто сталкиваются с неинформативным сообщением об ошибке: «Не удалось записать: Курсы валют». Проблема может возникать как при создании новой валюты, так и при попытке редактирования курсов уже существующих. В этой статье мы подробно разберем, почему это происходит и как устранить проблему, используя как программные методы, так и инструменты администрирования платформы.
Первым делом проанализируем ситуацию на уровне кода. В типовых конфигурациях на обычных формах часто встроены проверки, которые блокируют запись при некорректных данных. Рассмотрим фрагмент кода, который отвечает за проверку данных в регистре сведений КурсыВалют перед их фиксацией в базе данных:
// Процедура - обработчик события ПередЗаписью
Процедура ПередЗаписью(Отказ, Замещение)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
КоличествоЗаписей = ЭтотОбъект.Количество;
Если КоличествоЗаписей > 0 Тогда
Для Сч = 0 По КоличествоЗаписей -1 Цикл
Если (ЭтотОбъект[Сч].Кратность = 0) ИЛИ (ЭтотОбъект[Сч].Курс = 0) Тогда
ОбщегоНазначения.СообщитьОбОшибке("Кратность или курс не могут быть нулевыми!", Отказ);
Возврат;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Выясним причину ошибки, исходя из этого кода: если система обнаружит, что в записываемом наборе данных Курс или Кратность равны нулю, сработает флаг Отказ = Истина. Однако стандартное системное сообщение может «перекрыть» пояснительный текст, и пользователь увидит лишь общую фразу о невозможности записи. Важно: проверьте, чтобы при вводе курса поле кратности не оставалось пустым, так как по умолчанию оно должно быть равно единице.
Разберем ситуацию, когда данные введены корректно, но ошибка всё равно сохраняется. Регистр сведений КурсыВалют является периодическим (с периодичностью «В пределах дня»). Это накладывает жесткое ограничение: для одной валюты на одну дату может существовать только одна запись.
Рассмотрим сценарии возникновения конфликта:
Иногда корень проблемы кроется не в данных, а в локальных временных файлах пользователя. Для конфигураций на обычных формах это «больное место». Если структура регистра обновлялась в процессе обновления конфигурации, старый кэш может конфликтовать с новыми правилами записи.
Рекомендуем выполнить следующие действия для очистки кэша:
AppData.Также стоит проверить физическую целостность таблиц. Для этого используем утилиту chdbfl.exe (находится в папке bin установленной платформы) или запустим Тестирование и исправление в Конфигураторе со следующими параметрами:
Хотя УТ 10.3 предназначена для работы в режиме обычных форм, современные версии платформы 8.3 вносят свои коррективы. Проанализируем настройки в Конфигураторе. Если свойство конфигурации «Режим использования модальности» установлено в значение Не использовать, это может приводить к неожиданным отказам при вызове диалоговых окон в старом коде.
Также проверьте права доступа. При включенном механизме RLS (Ограничение прав на уровне записей) пользователь может иметь право на редактирование справочника Валюты, но не иметь прав на добавление записей в регистр КурсыВалют по определенным условиям. В этом случае система также вернет общую ошибку «Не удалось записать».
Если вышеперечисленные методы не помогли, воспользуемся отладчиком. Пройдем по шагам:
КурсыВалют в процедуре ПередЗаписью.ЭтотОбъект. Проверьте, какие записи реально передаются на запись.Период. Если там указана пустая дата (01.01.0001), запись в SQL-версии базы может не пройти из-за ограничений СУБД на минимальную дату.Записать() внутри транзакции, которая была отменена ранее из-за другой скрытой ошибки.Таким образом, мы выяснили, что ошибка записи курса валют чаще всего связана либо с нарушением уникальности периода, либо с некорректным заполнением реквизитов Курс и Кратность. Тщательный анализ данных и проверка технического состояния базы данных позволяют решить эту проблему в кратчайшие сроки.