При обновлении платформы 1С:Предприятие на версию 8.3.13.1644 многие разработчики столкнулись с крайне неприятным поведением системы: функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА в запросах внезапно начинают возвращать пустую дату (01.01.0001). Особенно критично это проявляется в типовых решениях, таких как УПП или ЗУП 2.5, в механизмах расчета зарплаты и НДФЛ, где корректность периодов определяет правильность всех начислений.
В данной статье мы подробно разберем, почему возникает этот сбой, как его диагностировать и какие шаги необходимо предпринять для его устранения.
Рассмотрим ситуацию: у нас есть запрос, который годами работал стабильно. В нем вычисляется дата окончания месяца для определенного поля. После перехода на платформу 8.3.13 результат этого поля становится пустым, хотя исходные данные заполнены корректно. Проанализируем типичный фрагмент запроса, вызывающий ошибку:
ВЫБРАТЬ
КОНЕЦПЕРИОДА(ДанныеДокумента.ПериодРегистрации, МЕСЯЦ) КАК КонецПериодаРегистрации
ИЗ
Документ.НачислениеЗарплатыРаботникамОрганизаций КАК ДанныеДокумента
Самое коварное в этой ошибке то, что при проверке «простых» запросов в консоли запросов всё может работать идеально. Посмотрим на пример, который в консоли выдаст правильный результат:
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 10, 26) КАК ИсходнаяДата,
НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ(2023, 10, 26), МЕСЯЦ) КАК НачалоМесяца
Почему же в одном случае функция работает, а в реальном коде конфигурации — нет? Выясним причину: ошибка проявляется только тогда, когда запрос использует временные таблицы или менеджер временных таблиц.
Разберем по шагам, что происходит на уровне системы. Платформа 8.3.13.1644 имеет специфическую особенность взаимодействия с базой tempdb на стороне MS SQL Server. Когда результат функции КОНЕЦПЕРИОДА помещается во временную таблицу, сервер приложений 1С (процесс rphost) формирует структуру этой таблицы в SQL.
Если на сервере, где запущен кластер 1С, не установлен или некорректно настроен драйвер SQL Server Native Client, платформа может использовать стандартный драйвер ODBC или устаревшие механизмы доступа. В этом случае при чтении данных из временной таблицы происходит ошибка маппинга (сопоставления) типов данных. Бинарный поток, возвращаемый SQL-сервером, интерпретируется платформой неверно, и вместо даты 1С получает NULL, который преобразуется в пустую дату.
Как показала практика и обсуждения на технических форумах, наиболее действенным решением является установка актуального компонента доступа к данным от Microsoft. Проанализируем последовательность действий:
DATETIME2 и временными таблицами даже на более свежих версиях SQL Server (2014, 2016, 2019).После выполнения этих действий проблема с пустыми датами в функциях НАЧАЛОПЕРИОДА/КОНЕЦПЕРИОДА внутри временных таблиц обычно исчезает.
Выясним, является ли версия 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 этот метод часто игнорируется платформой.PARAMETERIZATION. Рекомендуется установить его в значение SIMPLE. Форсированная параметризация (FORCED) может усугублять ошибки типизации в 1С.Подводя итог, отметим, что связка платформы 8.3.13.1644 и MS SQL Server требует обязательного наличия SQL Server Native Client для корректной работы с временными таблицами. Это знание поможет вам сэкономить время при диагностике странных ошибок в расчетах, которые на первый взгляд кажутся необъяснимыми.