Почему функция НАЧАЛОПЕРИОДА в запросе 1С возвращает пустые значения на SQL Server?

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

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

Диагностика проблемы: определяем область поиска

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


ВЫБРАТЬ
    Д.Дата КАК Дата,
    НАЧАЛОПЕРИОДА(Д.Дата, ГОД) КАК ДатаГод,
    НАЧАЛОПЕРИОДА(Д.Дата, ДЕНЬ) КАК ДатаДень
ИЗ
    Документ.РеализацияТоваровУслуг КАК Д
ГДЕ
    Д.Дата МЕЖДУ &НачалоПериода И &КонецПериода

Если в результате выполнения этого запроса поле Дата содержит значение (например, "15.06.2022 14:30:00"), а поля ДатаГод и ДатаДень выглядят пустыми, значит, платформа 1С не может корректно интерпретировать результат вычислений, полученный от SQL-сервера. Чтобы исключить влияние конкретных данных в таблицах, выполним проверку на константах. Попробуем запустить тестовый запрос:


ВЫБРАТЬ 
    ДАТАВРЕМЯ(2022, 6, 15), 
    НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ(2022, 6, 15), ГОД),
    НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ(2022, 6, 15), ДЕНЬ)

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

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

Это самая распространенная причина. В MS SQL Server стандартный тип данных DATETIME поддерживает диапазон дат только с 1 января 1753 года. Однако платформа 1С поддерживает даты начиная с 0001 года. Для обхода этого ограничения при создании базы данных в 1С предлагается параметр "Смещение дат".

Рассмотрим два варианта этой настройки:

  1. Смещение 0: Даты хранятся "как есть". Если в базе окажется дата ранее 1753 года, SQL Server выдаст ошибку или вернет некорректный результат.
  2. Смещение 2000: Ко всем датам при записи в SQL прибавляется 2000 лет, а при чтении — вычитается. Это позволяет безопасно хранить даже "пустые" даты 1С (0001 год) в поле SQL, так как они превращаются в 2001 год.

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

Причина 2: Проблемы с драйвером SQL Server Native Client

Взаимодействие сервера 1С с СУБД происходит через драйверы. Выясним, какую роль они играют в нашей проблеме. Современные версии 1С используют тип DATETIME2 (в новых версиях SQL), который не имеет ограничения 1753 года. Однако, если на сервере установлена устаревшая версия драйвера (например, SQL Server Native Client 10.0), он может некорректно обрабатывать преобразования типов, которые генерирует 1С для функции НАЧАЛОПЕРИОДА.

Рассмотрим рекомендации по обновлению:

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

Посмотрим на настройки самой базы данных внутри SQL Server Management Studio. Параметр Compatibility Level определяет, по правилам какой версии SQL Server будут выполняться запросы. Если база была перенесена со старого сервера (например, с SQL 2008 на SQL 2019) простым восстановлением бэкапа, уровень совместимости мог остаться низким.

Разберем, как это влияет на 1С:

  1. В новых уровнях совместимости (130 и выше) используется другой оптимизатор запросов.
  2. Изменяется логика неявного преобразования строк в даты.
  3. Иногда понижение или повышение уровня совместимости (например, до 110 или 140) устраняет проблему с расчетом периодов, так как SQL начинает иначе обрабатывать функции DATEDIFF, подставляемые платформой.

Причина 4: Региональные стандарты и язык системной учетной записи

Иногда причина кроется в настройках операционной системы или пользователя SQL. Проанализируем ситуацию: если служба SQL Server запущена под пользователем, у которого в региональных настройках (Regional Settings) установлен формат даты, отличный от ожидаемого 1С (например, американское MM/DD/YYYY вместо DD.MM.YYYY), то константы дат, которые 1С передает в запросах, могут интерпретироваться неверно.

Что нужно проверить:

Причина 5: Кэш планов выполнения запросов

Если запрос перестал работать внезапно, хотя раньше всё было хорошо, мы можем столкнуться с "отравлением" кэша планов. SQL Server сохраняет план выполнения запроса. Если первый раз запрос был вызван с параметрами, которые привели к ошибке, этот "ошибочный" план может закешироваться.

Для исправления ситуации можно попробовать очистить кэш планов для конкретной базы данных с помощью команды:

DBCC FREEPROCCACHE

Это заставит SQL Server перекомпилировать все запросы от 1С заново, используя актуальную статистику и типы данных.

Резюме и план действий

Подводя итог, если у вас не работает НАЧАЛОПЕРИОДА в запросе на SQL-версии, выполните следующие шаги:

  1. Проверьте смещение дат в настройках базы 1С (рекомендуется 2000).
  2. Убедитесь, что в запросе не используются "пустые" даты документов, которые могут вызвать переполнение типа DATETIME в SQL.
  3. Обновите драйверы подключения к SQL Server на сервере приложений 1С.
  4. Проверьте Compatibility Level базы данных в SQL Management Studio.
  5. Удостоверьтесь, что язык пользователя SQL совпадает с локализацией базы (Russian/English).

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

← На главную