При работе с клиент-серверными версиями 1С:Предприятие программисты иногда сталкиваются с аномальным поведением стандартных функций языка запросов. Одной из таких проблем является ситуация, когда функция НАЧАЛОПЕРИОДА визуально возвращает пустой результат (пустое поле в консоли запросов или в отчете), в то время как исходное поле даты заполнено корректно. Это создает серьезные трудности при группировке данных или построении отчетов по периодам. Рассмотрим подробно причины возникновения этой ошибки и способы её устранения.
Прежде всего, нам необходимо убедиться, что проблема не в логике самого запроса или в данных. Разберем ситуацию на примере стандартного запроса к документам. Проанализируем следующий код:
ВЫБРАТЬ
Д.Дата КАК Дата,
НАЧАЛОПЕРИОДА(Д.Дата, ГОД) КАК ДатаГод,
НАЧАЛОПЕРИОДА(Д.Дата, ДЕНЬ) КАК ДатаДень
ИЗ
Документ.РеализацияТоваровУслуг КАК Д
ГДЕ
Д.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Если в результате выполнения этого запроса поле Дата содержит значение (например, "15.06.2022 14:30:00"), а поля ДатаГод и ДатаДень выглядят пустыми, значит, платформа 1С не может корректно интерпретировать результат вычислений, полученный от SQL-сервера. Чтобы исключить влияние конкретных данных в таблицах, выполним проверку на константах. Попробуем запустить тестовый запрос:
ВЫБРАТЬ
ДАТАВРЕМЯ(2022, 6, 15),
НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ(2022, 6, 15), ГОД),
НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ(2022, 6, 15), ДЕНЬ)
Если даже на фиксированных датах функция НАЧАЛОПЕРИОДА возвращает пустоту, мы имеем дело с инфраструктурной проблемой взаимодействия сервера 1С и MS SQL Server. Выясним основные причины такого поведения.
Это самая распространенная причина. В MS SQL Server стандартный тип данных DATETIME поддерживает диапазон дат только с 1 января 1753 года. Однако платформа 1С поддерживает даты начиная с 0001 года. Для обхода этого ограничения при создании базы данных в 1С предлагается параметр "Смещение дат".
Рассмотрим два варианта этой настройки:
Проанализируем ситуацию: функция НАЧАЛОПЕРИОДА транслируется платформой в сложные арифметические операции на языке T-SQL (используются функции DATEADD и DATEDIFF). Если база создана со смещением 0, а расчет внутри SQL затрагивает "начало времен", происходит выход за границы допустимого диапазона DATETIME. В результате SQL возвращает ошибку, которую платформа 1С интерпретирует как NULL или пустую дату. Если на одном сервере база работает корректно, а на другом нет — проверьте значение смещения в свойствах базы через консоль администрирования серверов 1С.
Взаимодействие сервера 1С с СУБД происходит через драйверы. Выясним, какую роль они играют в нашей проблеме. Современные версии 1С используют тип DATETIME2 (в новых версиях SQL), который не имеет ограничения 1753 года. Однако, если на сервере установлена устаревшая версия драйвера (например, SQL Server Native Client 10.0), он может некорректно обрабатывать преобразования типов, которые генерирует 1С для функции НАЧАЛОПЕРИОДА.
Рассмотрим рекомендации по обновлению:
sqlncli соответствует версии установленного SQL сервера.Посмотрим на настройки самой базы данных внутри SQL Server Management Studio. Параметр Compatibility Level определяет, по правилам какой версии SQL Server будут выполняться запросы. Если база была перенесена со старого сервера (например, с SQL 2008 на SQL 2019) простым восстановлением бэкапа, уровень совместимости мог остаться низким.
Разберем, как это влияет на 1С:
DATEDIFF, подставляемые платформой.Иногда причина кроется в настройках операционной системы или пользователя SQL. Проанализируем ситуацию: если служба SQL Server запущена под пользователем, у которого в региональных настройках (Regional Settings) установлен формат даты, отличный от ожидаемого 1С (например, американское MM/DD/YYYY вместо DD.MM.YYYY), то константы дат, которые 1С передает в запросах, могут интерпретироваться неверно.
Что нужно проверить:
Russian или English.Если запрос перестал работать внезапно, хотя раньше всё было хорошо, мы можем столкнуться с "отравлением" кэша планов. SQL Server сохраняет план выполнения запроса. Если первый раз запрос был вызван с параметрами, которые привели к ошибке, этот "ошибочный" план может закешироваться.
Для исправления ситуации можно попробовать очистить кэш планов для конкретной базы данных с помощью команды:
DBCC FREEPROCCACHE
Это заставит SQL Server перекомпилировать все запросы от 1С заново, используя актуальную статистику и типы данных.
Подводя итог, если у вас не работает НАЧАЛОПЕРИОДА в запросе на SQL-версии, выполните следующие шаги:
DATETIME в SQL.Соблюдение этих технических регламентов обеспечит стабильную работу функций работы с периодами и исключит появление пустых значений в ваших отчетах.