При переводе старых баз данных, работающих на платформе 1С 8.2, с файлового режима на клиент-серверный с использованием СУБД PostgreSQL, часто возникает специфическая ошибка ERROR: timestamp out of range. Эта проблема обычно проявляется в момент загрузки файла .dt в новую базу данных на сервере. Разберем подробно, почему она возникает и какие существуют способы ее решения.
Корень проблемы кроется в фундаментальном различии того, как старые и новые версии PostgreSQL работают с данными типа "Дата и время".
В старых версиях PostgreSQL (например, 9.1.x) существовала специальная опция компиляции --disable-integer-datetimes. При ее использовании дата и время хранились в базе как числа с плавающей запятой (floating point). Платформа "1С:Предприятие 8.2" была разработана с расчетом именно на такой формат хранения данных.
В современных версиях PostgreSQL эта опция была упразднена. Теперь дата и время хранятся исключительно как 64-битные целые числа (int64). Это более точный и производительный способ.
Конфликт возникает, когда платформа 1С 8.2 пытается загрузить данные (например, из файла .dt) в современную СУБД. Она отправляет данные в старом формате, а сервер PostgreSQL ожидает их в новом. Часто сбой происходит на "пустых" или пограничных датах, таких как 01.01.0001 00:00:00. При попытке преобразования такого значения в новый формат оно может выйти за допустимые пределы диапазона, что и вызывает ошибку timestamp out of range.
Сообщение об ошибке, как правило, указывает на конкретное место сбоя, например:
CONTEXT: COPY _document113_vt1392, line 1, column _fld1397
Из этого сообщения можно понять, что проблема находится в таблице _document113_vt1392. Суффикс _vt означает, что это табличная часть (virtual table) некого документа, а не его "шапка".
Самый очевидный путь — создать для старой платформы 1С 8.2 привычную ей среду. Для этого нужно найти и установить совместимую версию СУБД.
Порядок действий:
.dt файл. В этой среде ошибка timestamp out of range возникнуть не должна.Недостатки этого подхода:
Этот метод является правильным с технической точки зрения и обеспечивает стабильную работу в будущем. Он основан на использовании возможностей новой платформы 1С для работы со старыми конфигурациями.
Ключевой момент — разделение понятий: версия платформы и версия конфигурации. Вы можете запустить старую конфигурацию, написанную для 8.2, на новой платформе 8.3, не переписывая код. Для этого существует режим совместимости.
Пошаговый алгоритм миграции:
1Cv8.1CD). Не используйте .dt, выгруженный на платформе 8.2! Запустите эту файловую базу с помощью платформы 8.3 (через "Запуск 1С:Предприятие" или "Конфигуратор"). Система автоматически обнаружит, что база от старой версии, и предложит выполнить конвертацию. Согласитесь и дождитесь окончания процесса.
.dt (меню "Администрирование" -> "Выгрузить информационную базу..."). Этот новый .dt файл уже "понимает" современные форматы данных.
.dt файл.
Этот процесс гарантирует, что платформа 8.3, которая умеет работать с современным PostgreSQL, сама корректно преобразует все типы данных, включая проблемные даты, и загрузка пройдет успешно.
Если даже при правильном алгоритме миграции ошибка timestamp out of range все равно возникает, это свидетельствует о наличии "битых" данных в исходной файловой базе. Файловый режим менее строг к целостности данных, чем SQL, и мог "пропустить" некорректные значения.
Для диагностики и исправления:
_document113_vt1392. Это означает, что нужно искать документ, у которого есть табличная часть с внутренним идентификатором 1392. С помощью обработок или внешних утилит (например, TOOL_1CD) можно проанализировать данные в этой таблице и найти записи с аномально старыми или "пустыми" датами, чтобы исправить их вручную.В подавляющем большинстве случаев переход через конвертацию на платформе 8.3 решает проблему без необходимости ручного вмешательства в данные.