Почему запросы возвращают пустые даты в 1С после обновления платформы до версии 8.3.13 на виртуальных машинах?

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

Многие технические специалисты столкнулись с неожиданной проблемой при переходе на новые релизы платформы 1С:Предприятие, начиная с версии 8.3.13. После обновления системы стандартные запросы, которые раньше работали безупречно, начинают возвращать «пустые» даты (0001-01-01) или некорректные данные в отчетах. Особенно часто эта ситуация проявляется при работе на виртуальных машинах под управлением Windows Server в связке с Microsoft SQL Server.

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

Разберем причину: изменения в генерации T-SQL запросов

Для начала давайте выясним причину такого поведения системы. Начиная с версии платформы 8.3.13.1513 и выше, разработчики 1С существенно оптимизировали механизм трансляции встроенного языка запросов 1С в инструкции T-SQL, которые понимает SQL Server.

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

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

Почему проблема локализуется на виртуальных машинах?

Многие пользователи отмечают, что на физических серверах все работает штатно, а на виртуальных «поднимается» ошибка. Это связано не с самой технологией виртуализации, а с особенностями развертывания операционных систем. Рассмотрим этот момент:

  1. Минималистичные образы: На виртуальные машины часто устанавливаются «чистые» образы ОС. В их составе по умолчанию может отсутствовать Microsoft SQL Server Native Client актуальной версии.
  2. Состав компонентов: На физических серверах, где SQL Server часто устанавливается «локально» вместе с инструментами управления (Management Studio), нужные драйверы устанавливаются автоматически в процессе инсталляции СУБД.
  3. Драйверы по умолчанию: Если Native Client не установлен, система может использовать стандартный драйвер SQL Server, входящий в состав Windows (старый OLE DB провайдер), который не поддерживает новые конструкции передачи параметров дат, используемые платформой 1С.

Шаг 1: Проверка и установка SQL Server Native Client

Ключевым решением проблемы является установка или обновление компонента Microsoft SQL Server Native Client 11.0. Несмотря на то, что Microsoft официально переходит на новые драйверы (MSOLEDBSQL), для корректной работы 1С с SQL Server 2012–2017 использование Native Client версии 11 остается критически важным.

Выясним, где именно нужно производить установку. Компонент должен быть установлен на сервере приложений 1С:Предприятие. Именно процессы rphost инициируют соединение с базой данных и используют установленные в системе провайдеры данных.

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

  1. Скачайте пакет sqlncli.msi. Он входит в состав Microsoft SQL Server 2012 Feature Pack, но совместим и с более поздними версиями SQL Server.
  2. Запустите установку на всех серверах, входящих в кластер 1С (на каждом рабочем сервере).
  3. Убедитесь, что в процессе установки выбраны компоненты клиентского доступа.

Шаг 2: Перезапуск служб и проверка результата

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

  1. Остановите службу Агент сервера 1С:Предприятия.
  2. Для уверенности можно также очистить серверный кэш (папку snaccfg в каталоге данных сервера), хотя в данном случае это не является обязательным требованием.
  3. Запустите службу Агента заново.

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

Дополнительный анализ: Региональные настройки

Если установка Native Client не помогла на 100%, проанализируем ситуацию с региональными стандартами. Хотя в большинстве случаев причина в драйвере, иногда на виртуальных машинах сброшены системные настройки локали (System Locale).

Посмотрим на важные моменты:

Технические детали для разработчиков

Если вы хотите убедиться в наличии проблемы самостоятельно, мы рекомендуем использовать SQL Server Profiler. При трассировке запроса от проблемной платформы вы увидите конструкции, подобные этой:


SELECT
DATEADD(DAY, DATEDIFF(DAY, 0, T1._Date_Time), 0) AS _Period
FROM _InfoReg123 T1

В случае использования старого драйвера, параметры функции DATEDIFF могут передаваться некорректно, что приведет к результату NULL. Платформа 1С, получая NULL в поле, которое в метаданных определено как Дата, автоматически преобразует его в 0001-01-01 00:00:00.

Именно поэтому в отчетах вместо текущих дат пользователи видят «пустоты», а виртуальные таблицы (например, ОстаткиИОбороты), в параметры которых передается такая дата, перестают возвращать данные, так как период становится некорректным.

Заключение

Подведем итог нашему исследованию. Проблема пустых дат в платформе 8.3.13+ на виртуальных машинах — это классический конфликт между обновленной логикой генерации запросов 1С и устаревшими компонентами доступа к данным в ОС.

Главное решение: принудительная установка SQL Server Native Client 11.0 на сервере приложений 1С. Это гарантирует, что все современные оптимизации T-SQL, внедренные разработчиками платформы, будут правильно поняты и исполнены на стороне SQL-сервера.

← На главную