Как исправить ошибку "timestamp out of range" при переносе базы 1С 8.2 на PostgreSQL?

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

При переводе старых баз данных, работающих на платформе 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: Использование старой версии PostgreSQL (быстрое, но не рекомендуемое решение)

Самый очевидный путь — создать для старой платформы 1С 8.2 привычную ей среду. Для этого нужно найти и установить совместимую версию СУБД.

Порядок действий:

  1. Найдите дистрибутив PostgreSQL, специально адаптированный для 1С. Для платформы 8.2 наиболее стабильной считается версия PostgreSQL 9.1.9-1.1C. Важно: нельзя использовать "ванильный" PostgreSQL с официального сайта, так как в сборках от 1С содержатся важные патчи для корректной работы блокировок и сортировки.
  2. Скачайте дистрибутив. Если при попытке скачивания с официального портала 1С (releases.1c.ru) на сервере Windows Server 2012 возникает "ошибка доступа", скорее всего, дело в устаревших протоколах безопасности (TLS) встроенного браузера. Попробуйте скачать файл с другого компьютера с современной операционной системой и браузером, а затем перенести его на сервер.
  3. Установите и настройте PostgreSQL 9.1.9 на сервере.
  4. Создайте новую информационную базу под управлением сервера 1С 8.2 и этой версии PostgreSQL.
  5. Загрузите ваш .dt файл. В этой среде ошибка timestamp out of range возникнуть не должна.

Недостатки этого подхода:

Вариант 2: Корректная миграция с помощью платформы 1С 8.3 (рекомендуемый способ)

Этот метод является правильным с технической точки зрения и обеспечивает стабильную работу в будущем. Он основан на использовании возможностей новой платформы 1С для работы со старыми конфигурациями.

Ключевой момент — разделение понятий: версия платформы и версия конфигурации. Вы можете запустить старую конфигурацию, написанную для 8.2, на новой платформе 8.3, не переписывая код. Для этого существует режим совместимости.

Пошаговый алгоритм миграции:

  1. Подготовка сервера. Установите на сервер актуальную версию платформы "1С:Предприятие 8.3" и совместимую с ней версию PostgreSQL (например, рекомендованную сборку от 1С или Postgres Pro).
  2. Конвертация файловой базы. Возьмите вашу исходную файловую базу (файл 1Cv8.1CD). Не используйте .dt, выгруженный на платформе 8.2! Запустите эту файловую базу с помощью платформы 8.3 (через "Запуск 1С:Предприятие" или "Конфигуратор"). Система автоматически обнаружит, что база от старой версии, и предложит выполнить конвертацию. Согласитесь и дождитесь окончания процесса.
  3. Проверка. После конвертации откройте базу в режиме предприятия на платформе 8.3. Убедитесь, что все работает, интерфейс остался прежним (обычные формы), данные на месте. Конфигурация автоматически перейдет в режим совместимости с версией 8.2.
  4. Создание корректного файла выгрузки. Теперь, когда база сконвертирована и открыта в конфигураторе платформы 8.3, выполните выгрузку информационной базы в файл .dt (меню "Администрирование" -> "Выгрузить информационную базу..."). Этот новый .dt файл уже "понимает" современные форматы данных.
  5. Загрузка на сервер. Создайте на сервере 1С 8.3 новую, пустую информационную базу с СУБД PostgreSQL. Затем загрузите в нее созданный на предыдущем шаге .dt файл.

Этот процесс гарантирует, что платформа 8.3, которая умеет работать с современным PostgreSQL, сама корректно преобразует все типы данных, включая проблемные даты, и загрузка пройдет успешно.

Что делать, если ошибка сохраняется?

Если даже при правильном алгоритме миграции ошибка timestamp out of range все равно возникает, это свидетельствует о наличии "битых" данных в исходной файловой базе. Файловый режим менее строг к целостности данных, чем SQL, и мог "пропустить" некорректные значения.

Для диагностики и исправления:

  1. Тестирование и исправление (ТиИ). Перед началом миграции откройте файловую базу в конфигураторе и запустите утилиту "Тестирование и исправление" (меню "Администрирование"). Обязательно установите флажки "Проверка логической целостности" и "Проверка ссылочной целостности" с опцией "Создавать объекты" или "Очищать ссылки".
  2. Поиск проблемной записи. Если ТиИ не помогло, проанализируйте имя таблицы из сообщения об ошибке. Например, _document113_vt1392. Это означает, что нужно искать документ, у которого есть табличная часть с внутренним идентификатором 1392. С помощью обработок или внешних утилит (например, TOOL_1CD) можно проанализировать данные в этой таблице и найти записи с аномально старыми или "пустыми" датами, чтобы исправить их вручную.

В подавляющем большинстве случаев переход через конвертацию на платформе 8.3 решает проблему без необходимости ручного вмешательства в данные.

← На главную