Почему функция КОНЕЦПЕРИОДА возвращает пустую дату в запросах 1С на платформе 8.3.13?

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

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

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

Проявление проблемы и первичная диагностика

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


ВЫБРАТЬ
    КОНЕЦПЕРИОДА(ДанныеДокумента.ПериодРегистрации, МЕСЯЦ) КАК КонецПериодаРегистрации
ИЗ
    Документ.НачислениеЗарплатыРаботникамОрганизаций КАК ДанныеДокумента

Самое коварное в этой ошибке то, что при проверке «простых» запросов в консоли запросов всё может работать идеально. Посмотрим на пример, который в консоли выдаст правильный результат:


ВЫБРАТЬ
    ДАТАВРЕМЯ(2023, 10, 26) КАК ИсходнаяДата,
    НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ(2023, 10, 26), МЕСЯЦ) КАК НачалоМесяца

Почему же в одном случае функция работает, а в реальном коде конфигурации — нет? Выясним причину: ошибка проявляется только тогда, когда запрос использует временные таблицы или менеджер временных таблиц.

Техническая причина: взаимодействие с MS SQL Server

Разберем по шагам, что происходит на уровне системы. Платформа 8.3.13.1644 имеет специфическую особенность взаимодействия с базой tempdb на стороне MS SQL Server. Когда результат функции КОНЕЦПЕРИОДА помещается во временную таблицу, сервер приложений 1С (процесс rphost) формирует структуру этой таблицы в SQL.

Если на сервере, где запущен кластер 1С, не установлен или некорректно настроен драйвер SQL Server Native Client, платформа может использовать стандартный драйвер ODBC или устаревшие механизмы доступа. В этом случае при чтении данных из временной таблицы происходит ошибка маппинга (сопоставления) типов данных. Бинарный поток, возвращаемый SQL-сервером, интерпретируется платформой неверно, и вместо даты 1С получает NULL, который преобразуется в пустую дату.

Решение проблемы №1: Установка SQL Server Native Client

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

  1. Определите версию SQL Server: Убедитесь, какая версия СУБД используется для вашей базы данных.
  2. Установите Native Client: Рекомендуется использовать Microsoft SQL Server 2012 Native Client (версия 11.0). Несмотря на то что он относится к версии 2012 года, он обеспечивает наиболее стабильную работу платформы 1С с типами данных DATETIME2 и временными таблицами даже на более свежих версиях SQL Server (2014, 2016, 2019).
  3. Перезагрузите сервер: После установки драйвера желательно перезагрузить службу агента сервера 1С:Предприятие, чтобы система начала использовать обновленные библиотеки доступа.

После выполнения этих действий проблема с пустыми датами в функциях НАЧАЛОПЕРИОДА/КОНЕЦПЕРИОДА внутри временных таблиц обычно исчезает.

Решение проблемы №2: Обновление платформы

Выясним, является ли версия 8.3.13.1644 единственным вариантом. На самом деле, ветка 8.3.13 была признана одной из самых нестабильных в плане работы с запросами. Если установка Native Client не помогает или невозможна по техническим причинам, единственным надежным выходом будет переход на более современные релизы.

Рассмотрим рекомендуемые версии:

Как проверить работоспособность (пример кода)

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


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	ДАТАВРЕМЯ(2023, 1, 15) КАК ТестоваяДата
|ПОМЕСТИТЬ ВТ_Даты
|;
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	НАЧАЛОПЕРИОДА(ВТ_Даты.ТестоваяДата, МЕСЯЦ) КАК РезультатФункции
|ИЗ
|	ВТ_Даты КАК ВТ_Даты";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить("Результат: " + Выборка.РезультатФункции);
КонецЦикла;

Если в окне сообщений вы увидите 01.01.2023 00:00:00 — система работает корректно. Если же вы увидите 01.01.0001 00:00:00 — значит, проблема с драйвером или платформой всё еще актуальна.

Дополнительные рекомендации

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

Подводя итог, отметим, что связка платформы 8.3.13.1644 и MS SQL Server требует обязательного наличия SQL Server Native Client для корректной работы с временными таблицами. Это знание поможет вам сэкономить время при диагностике странных ошибок в расчетах, которые на первый взгляд кажутся необъяснимыми.

← На главную