Многие технические специалисты столкнулись с неожиданной проблемой при переходе на новые релизы платформы 1С:Предприятие, начиная с версии 8.3.13. После обновления системы стандартные запросы, которые раньше работали безупречно, начинают возвращать «пустые» даты (0001-01-01) или некорректные данные в отчетах. Особенно часто эта ситуация проявляется при работе на виртуальных машинах под управлением Windows Server в связке с Microsoft SQL Server.
В этой статье мы подробно разберем, почему так происходит, проанализируем изменения в механизмах платформы и подготовим пошаговый план решения проблемы.
Для начала давайте выясним причину такого поведения системы. Начиная с версии платформы 8.3.13.1513 и выше, разработчики 1С существенно оптимизировали механизм трансляции встроенного языка запросов 1С в инструкции T-SQL, которые понимает SQL Server.
Рассмотрим подробнее функцию НАЧАЛОПЕРИОДА. Раньше платформа использовала более универсальные, но менее производительные конструкции для вычисления начала дня, месяца или года. В новых версиях для повышения быстродействия 1С перешла на использование специфических математических операций с датами и приведений типов. В частности, стали активно использоваться функции DATEADD и DATEDIFF с определенными параметрами смещения.
Проанализируем ситуацию: на стороне сервера 1С запрос формируется корректно, однако при передаче этого запроса в СУБД через устаревший драйвер доступа к данным происходит ошибка интерпретации. В результате SQL-сервер не может правильно обработать математику дат и возвращает NULL или минимально возможное значение, которое 1С интерпретирует как ПустаяДата.
Многие пользователи отмечают, что на физических серверах все работает штатно, а на виртуальных «поднимается» ошибка. Это связано не с самой технологией виртуализации, а с особенностями развертывания операционных систем. Рассмотрим этот момент:
SQL Server, входящий в состав Windows (старый OLE DB провайдер), который не поддерживает новые конструкции передачи параметров дат, используемые платформой 1С.Ключевым решением проблемы является установка или обновление компонента Microsoft SQL Server Native Client 11.0. Несмотря на то, что Microsoft официально переходит на новые драйверы (MSOLEDBSQL), для корректной работы 1С с SQL Server 2012–2017 использование Native Client версии 11 остается критически важным.
Выясним, где именно нужно производить установку. Компонент должен быть установлен на сервере приложений 1С:Предприятие. Именно процессы rphost инициируют соединение с базой данных и используют установленные в системе провайдеры данных.
Порядок действий:
sqlncli.msi. Он входит в состав Microsoft SQL Server 2012 Feature Pack, но совместим и с более поздними версиями SQL Server.После установки драйвера система не всегда автоматически переключается на использование нового провайдера для уже запущенных сессий. Поэтому крайне рекомендуется выполнить следующие действия:
snaccfg в каталоге данных сервера), хотя в данном случае это не является обязательным требованием.После этого платформа начнет использовать SQL Server Native Client 11.0 для формирования соединений, и функции типа НАЧАЛОПЕРИОДА в параметрах виртуальных таблиц или полях выбора начнут возвращать корректные значения.
Если установка Native Client не помогла на 100%, проанализируем ситуацию с региональными стандартами. Хотя в большинстве случаев причина в драйвере, иногда на виртуальных машинах сброшены системные настройки локали (System Locale).
Посмотрим на важные моменты:
USR1CV8).Если вы хотите убедиться в наличии проблемы самостоятельно, мы рекомендуем использовать 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-сервера.