Недавно мною обнаружен некорректное получение значение реквизитов объектов метаданных с типом "Дата" в запросах, осуществляемых через COM-соединение.
Ошибка воспроизводилась на платформах 1 С 8.3.20, 8.3.25 в файловых и серверных вариантах размещения информационных баз.
Суть ошибки заключается в том, что при выполнении запроса через COM-соединение к объекту метаданных с реквизитами типа “Дата” в случае, если значение реквизита менее или равно “01.01.0100” в результат запроса попадает пустая дата “01.01.0001”.
Для моделирования ситуации, в базе-источнике был создан справочник "Исторические события", содержащий реквизиты "ДатаНачала" и "ДатаОкончания" с типом "Дата". В базе - приемнике создана обработка "Импорт исторических событий", которую можно открыть , запустить установку COM-соединения с базой-источником, выполнить в ней запрос к справочнику и вывести полученные данные.
Итог моделирования представлен на Скриншоте № 1.
Как видно, значения , которые имеют значения "01.01.0100" и меньше, выводятся некорректно. В то же время значения даты , которые больше “01.01.0100”, в результат запроса попадают корректно.
Конечно, событий, учет которых ведется в 1С и значения которых равны или меньше “01.01.0100”, честно говоря, не так много. Но все-таки полностью их исключать нельзя.
Например, это может быть ошибка ввода пользователем . Часть пользователей устремлена не в будущее, а напротив, в прошлое.
Пути обхода данной ошибки в виде “костылей” просты и незатейливы.
Как вариант, можно в запросе к объекту - источнику разбивать реквизит с типом “Дата” на значение День, Месяц, Год, а затем на стороне базы приемника из этих отдельных значений вновь собирать значение исходного реквизита с помощью функции Дата(Год, Месяц, День) .
Пример такого "допиленного" запроса приведен в листинге функции ниже:
Функция ПолучитьТекстЗапросаИсторическихСобытий(ИспользоватьКостыль)
ТекстЗапроса = "";
Если НЕ ИспользоватьКостыль Тогда
ТекстЗапроса = "ВЫБРАТЬ
| ИсторическиеСобытия.Код КАК Код,
| ИсторическиеСобытия.Наименование КАК Наименование,
| ИсторическиеСобытия.ДатаНачала КАК ДатаНачала,
| ИсторическиеСобытия.ДатаОкончания КАК ДатаОкончания
|ИЗ
| Справочник.ИсторическиеСобытия КАК ИсторическиеСобытия
|
|УПОРЯДОЧИТЬ ПО
| Код";
Иначе
ТекстЗапроса = "ВЫБРАТЬ
| ИсторическиеСобытия.Код КАК Код,
| ИсторическиеСобытия.Наименование КАК Наименование,
| ИсторическиеСобытия.ДатаНачала КАК ДатаНачала,
|
//{{Начало блока Костыльное добавление
| ДЕНЬ(ИсторическиеСобытия.ДатаНачала) КАК ДеньДатаНачала,
| МЕСЯЦ(ИсторическиеСобытия.ДатаНачала) КАК МесяцДатаНачала,
| ГОД(ИсторическиеСобытия.ДатаНачала) КАК ГодДатаНачала,
// Конец блока Костыльное добавление }}
|
| ИсторическиеСобытия.ДатаОкончания КАК ДатаОкончания,
|
// {{ Начало блока Костыльное добавление
| ДЕНЬ(ИсторическиеСобытия.ДатаОкончания) КАК ДеньДатаОкончания,
| МЕСЯЦ(ИсторическиеСобытия.ДатаОкончания) КАК МесяцДатаОкончания,
| ГОД(ИсторическиеСобытия.ДатаОкончания) КАК ГодДатаОкончания
// Конец блока Костыльное добавление }}
|
|ИЗ
| Справочник.ИсторическиеСобытия КАК ИсторическиеСобытия
|УПОРЯДОЧИТЬ ПО
| Код";
КонецЕсли;
Возврат ТекстЗапроса;
КонецФункции // ПолучитьТекстЗапросаИсторическихСобытий()
В итоге на стороне приемника можно получить корректные значения для реквизитов с типом "Дата" для значений дат "01.01.0100" и менее , как показано на скриншоте № 2
В качестве модельных, подопытных баз прикладываются файлы выгрузок двух тестовых баз - источника и приемника.
Для экспериментов, помимо установленной платформы 1С 8.3, требуется зарегистрированная в системе библиотека comcntr.dll.