Разберем ситуацию, с которой сталкиваются многие разработчики: одна и та же конструкция кода, например Дата("01.10.2020 00:00:00"), в одной конфигурации отрабатывает корректно, а в другой вызывает фатальную ошибку преобразования. Это происходит даже в тех случаях, когда базы запущены на одном и том же компьютере. Давайте выясним причины этого поведения и рассмотрим способы надежного решения проблемы.
Основная причина, по которой функция Дата() выдает ошибку, заключается в том, что она является «чувствительной» к текущим региональным настройкам информационной базы или сеанса. Когда мы передаем строку, платформа пытается «распарсить» её, опираясь на установленный формат даты и времени.
Рассмотрим ключевые факторы, влияющие на результат:
Дата("01.10.2020 00:00:00 PM")) временно решает проблему, но это «костыльное» решение, которое нельзя назвать надежным.Администрирование -> Региональные установки информационной базы установлена галочка «Использовать региональные настройки текущего сеанса», поведение кода становится зависимым от настроек операционной системы пользователя, который инициирует выполнение кода.Если вы хотите, чтобы ваш код работал одинаково на любом сервере, у любого пользователя и в любой конфигурации, использование стандартной функции Дата() является рискованным. Наиболее профессиональным подходом является использование метода XMLЗначение(). Этот метод опирается на стандарт ISO 8601, который является стандартом для XML-данных в 1С.
Разберем, как правильно использовать этот метод. Платформа ожидает строку в формате «ГГГГ-ММ-ДДTЧЧ:ММ:СС». Это позволяет избежать любой неоднозначности, связанной с разделителями (точки или тире) или форматами времени.
Посмотрим на пример кода:
// Универсальный метод преобразования строки в дату
СтрокаДаты = "2020-10-01T22:00:10";
ДатаРезультат = XMLЗначение(Тип("Дата"), СтрокаДаты);
// Теперь переменная ДатаРезультат содержит корректный тип Дата
// вне зависимости от региональных настроек компьютера
Преимущество этого подхода в том, что формат XMLЗначение жестко задан стандартом платформы и не зависит от настроек операционной системы или региональных параметров ИБ.
Если по каким-то причинам вы не можете отказаться от использования метода Дата(), необходимо привести окружение к единообразию. Выполним следующие шаги:
Администрирование -> Региональные установки информационной базы.Использовать региональные установки текущего сеанса. Если он установлен, поведение системы будет зависеть от настроек профиля ОС (в Windows это настройки «Региональные стандарты»).Подводя итог нашему исследованию, можно сделать однозначный вывод: поведение стандартной функции Дата() при парсинге строк является непредсказуемым в условиях распределенных систем или различных настроек окружения. Чтобы избежать подобных инцидентов в будущем, мы рекомендуем придерживаться следующих правил:
XMLЗначение().1C:Enterprise Server Agent, может иметь совершенно иные региональные настройки, чем обычный пользователь в файловом варианте базы.Применяя XMLЗначение(), вы делаете свой код более устойчивым к внешним изменениям и избавляете себя от необходимости отладки ошибок, связанных с локальными настройками системы.