При работе с объектом ТаблицаЗначений в 1С разработчики часто сталкиваются с ситуацией, когда метод Найти() не возвращает ожидаемую строку, хотя визуально дата в таблице и искомое значение совпадают. Разберем по шагам, как устроена логика поиска и в чем заключаются основные ошибки при работе с датами.
Выясним причину, почему метод Найти() не находит нужную запись. Метод ТаблицаЗначений.Найти() выполняет поиск исключительно на строгое равенство типа и значения. Визуальный формат представления даты (например, "01.06.2014 0:00:00") при поиске роли не играет.
Если в колонке таблицы значений хранится значение типа Дата, то и передавать в параметр метода Найти() необходимо значение типа Дата, а не текстовую строку.
Дата, а поиск производится по строке "01.06.2014" (или наоборот).Дата всегда содержит и числовую часть даты, и время. Если в колонке хранится значение 01.06.2014 14:30:00, а поиск выполняется по значению 01.06.2014 00:00:00, платформа вернет Неопределено, так как значения не равны.Рассмотрим ситуацию, когда исходное значение периода передается в виде текстовой строки или объекта другого формата. Для успешного поиска необходимо сначала принудительно привести его к типу Дата.
Посмотрим на пример использования функции Формат() и конструктора Дата() для получения канонической строки и последующего преобразования в тип Дата:
// Приводим произвольное значение периода к каноническому формату ГГГГММДДччммсс и преобразуем в дату
ИскомаяДата = Дата(Формат(СтрокаПериод, "ДФ=ГГГГММДДччммсс"));
// Выполняем поиск по колонки "Дата" в Таблице Значений
НайденнаяСтрока = ТаблицаЗначений.Найти(ИскомаяДата, "Дата");
Если НайденнаяСтрока <> Неопределено Тогда
// Запись найдена, выполняем необходимую обработку
КонецЕсли;
Если время записи не имеет значения и поиск требуется выполнять строго по календарной дате, проанализируем подход с нормализацией. И при заполнении колонки таблицы значений, и перед вызовом поиска необходимо приводить дату к началу дня с помощью функции НачалоДня().
// При заполнении ТЗ приводим дату к началу дня
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока.Дата = НачалоДня(ТекущаяДата());
// Перед поиском также обнуляем составную часть времени
ИскомаяДата = НачалоДня(ВходнаяДата);
НайденнаяСтрока = ТаблицаЗначений.Найти(ИскомаяДата, "Дата");
Напоминаем, что метод Найти() возвращает только первую найденную строку. Если в таблице значений может быть несколько записей за одну дату, целесообразно использовать метод НайтиСтроки() с передачей структуры отбора.
Отбор = Новый Структура;
Отбор.Вставить("Дата", НачалоДня(ИскомаяДата));
МассивНайденныхСтрок = ТаблицаЗначений.НайтиСтроки(Отбор);
Для Каждого СтрокаТЗ Из МассивНайденныхСтрок Цикл
// Обработка всех найденных строк
КонецЦикла;
Таким образом, для корректной работы метода Найти() у таблицы значений всегда проверяйте тип данных в колонке и передавайте значение соответствующего типа Дата с учетом точности времени.