Почему в запросах 1С поле ПериодДень становится пустым после переноса сервера на MSSQL 2022?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При миграции серверной инфраструктуры 1С:Предприятие на новое оборудование или обновлении версии системы управления базами данных (СУБД) до Microsoft SQL Server 2022, системные администраторы и разработчики иногда сталкиваются с крайне странным поведением системы. Во всех отчетах, использующих стандартные периоды, а также в произвольных запросах, поля ПериодДень, ПериодНеделя или ПериодМесяц оказываются пустыми (значение NULL или пустая дата), хотя исходные данные в таблицах присутствуют и заполнены корректно.

Особенно загадочно выглядит ситуация, когда функция НАЧАЛОПЕРИОДА возвращает результат, если дата указана в запросе жестко (константой), но выдает пустое значение, если дата берется из физической таблицы или временной таблицы. В данной статье мы подробно разберем, почему это происходит, и как восстановить работоспособность системы.

Проанализируем ситуацию: симптомы и диагностика

Рассмотрим характерный пример запроса, который на старом сервере работал корректно, а на новом (с MSSQL 2022) начал возвращать пустые значения. Проблема проявляется при попытке получить начало периода от даты, которая уже находится во временной таблице или в таблице БД.

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


ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ(2025, 12, 31, 23, 59, 59), ДЕНЬ) КАК ДеньПериода
ПОМЕСТИТЬ ВТ_Данные;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Данные.ДеньПериода КАК ИсходнаяДата,
    НАЧАЛОПЕРИОДА(ВТ_Данные.ДеньПериода, ДЕНЬ) КАК РезультатПусто
ИЗ
    ВТ_Данные КАК ВТ_Данные;

В этой ситуации поле ИсходнаяДата будет заполнено, а РезультатПусто — нет. Это происходит потому, что платформа 1С при работе с SQL-сервером транслирует функцию НАЧАЛОПЕРИОДА в сложную математическую конструкцию на языке T-SQL, использующую функции DATEADD и DATEDIFF. Если драйвер подключения или логика оптимизатора запросов SQL-сервера дают сбой, результат вычисления даты превращается в NULL.

Причина 1: Несовместимость версии платформы и MSSQL 2022

Выясним причину технического несоответствия. Платформа 1С:Предприятие 8.3.18.1741 и более ранние версии были выпущены задолго до выхода Microsoft SQL Server 2022. Официальная поддержка этой версии СУБД появилась только в более поздних релизах платформы, начиная с 8.3.20.2076, 8.3.21.1607 и 8.3.22.1672.

Основная проблема заключается в том, что старые версии платформы не знают об изменениях в типах данных и механизмах обработки запросов в SQL 2022. Рассмотрим подробнее, что можно сделать, если оперативное обновление платформы невозможно:

  1. Проверьте текущую версию платформы. Если она ниже указанных выше значений, вы находитесь в зоне риска нестабильной работы.
  2. Если обновление платформы — трудоемкий процесс, попробуйте изменить Compatibility Level (уровень совместимости) базы данных.

Причина 2: Уровень совместимости базы данных (Compatibility Level)

При развертывании базы на SQL Server 2022 уровень совместимости по умолчанию устанавливается в значение 160. В этом режиме SQL Server использует новые алгоритмы оптимизатора запросов, которые могут некорректно обрабатывать специфические конструкции T-SQL, генерируемые старой платформой 1С для работы с датами.

Чтобы исправить это, выполним следующие действия в SQL Server Management Studio (SSMS):

  1. Нажмите правой кнопкой мыши на вашу базу данных и выберите "Properties" (Свойства).
  2. Перейдите на вкладку "Options" (Параметры).
  3. Найдите поле "Compatibility level" (Уровень совместимости).
  4. Установите значение SQL Server 2019 (150) или SQL Server 2017 (140).
  5. Нажмите "ОК" и перезапустите службу сервера 1С или просто очистите кэш запросов.

Понижение уровня совместимости заставляет СУБД использовать старую логику обработки, которая "понятна" платформе 8.3.18.

Причина 3: Отсутствие драйвера SQL Server Native Client

Разберем еще один критический момент. SQL Server 2022 официально больше не включает в себя и не поддерживает старый драйвер SQL Server Native Client (SNAC 11), на который жестко ориентированы старые релизы 1С. Вместо него Microsoft предлагает использовать Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL).

Если на новом сервере Windows не установлен Native Client 11, сервер 1С может пытаться взаимодействовать с базой через другие механизмы, что приводит к искажению типов данных при передаче между rphost и SQL. Особенно это касается временных таблиц, где типы данных определяются динамически.

Что нужно сделать:

Причина 4: Смещение дат в настройках 1С

Проанализируем ситуацию со смещением дат. В 1С существует параметр "Смещение дат" (0 или 2000 лет). Если при переносе виртуалки или создании базы в консоли кластера 1С было указано смещение, отличное от того, что было на старом сервере, функции работы с периодами могут "сходить с ума", так как SQL Server хранит даты с минимальным значением 01.01.1753.

Посмотрим, как проверить этот параметр:

  1. Откройте консоль администрирования серверов 1С.
  2. Найдите вашу информационную базу.
  3. В свойствах базы проверьте значение поля "Смещение дат". Оно должно совпадать с тем, которое было на сервере-источнике. Обычно это 0 для SQL-версий.

Использование SQL Profiler для глубокого анализа

Если вышеперечисленные методы не помогли, нам необходимо увидеть, что именно "вылетает" из платформы в сторону SQL. Для этого воспользуемся инструментом SQL Server Profiler.

Рассмотрим, на что обратить внимание в трассировке:

  1. Запустите профайлер и отфильтруйте события по вашей базе данных.
  2. Выполните в 1С проблемный запрос.
  3. Найдите в трассировке текст SQL-запроса, который содержит вызов DATEADD или DATEDIFF.
  4. Скопируйте этот запрос и попробуйте выполнить его напрямую в Management Studio.
  5. Если SQL возвращает NULL, значит проблема в том, как платформа сформировала константы для расчета начала периода. Часто это связано с неверным форматом даты или неявным приведением типов datetime к datetime2.

Итоги и рекомендации

Подводя итог, можно сказать, что проблема "пустых дат" — это классический конфликт поколений программного обеспечения. Чтобы гарантированно решить проблему, мы рекомендуем следующий порядок действий:

План действий:

  1. Обновление платформы: Это самый правильный путь. Переход на актуальный релиз ветки 8.3.20+ снимет все вопросы совместимости с SQL 2022.
  2. Установка Native Client 11: Обязательно установите старый драйвер, даже если вы используете новый SQL.
  3. Compatibility Level: Снизьте уровень совместимости базы до 140 или 150. Это наиболее частое решение, помогающее "здесь и сейчас" без остановки работы пользователей.
  4. Обслуживание БД: После переноса базы обязательно выполните обновление статистик и полную реиндексацию командами:
    
    EXEC sp_updatestats;
    DBCC FREEPROCCACHE;
    

Соблюдение этих шагов позволит восстановить корректное отображение периодов в отчетах и обеспечит стабильную работу системы 1С:Предприятие на современном оборудовании.

← На главную