Как передать дату в метод Найти таблицы значений в 1С?

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

При работе с объектом ТаблицаЗначений в 1С разработчики часто сталкиваются с ситуацией, когда метод Найти() не возвращает ожидаемую строку, хотя визуально дата в таблице и искомое значение совпадают. Разберем по шагам, как устроена логика поиска и в чем заключаются основные ошибки при работе с датами.

Главное правило поиска: сравнение типов, а не формата

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

Если в колонке таблицы значений хранится значение типа Дата, то и передавать в параметр метода Найти() необходимо значение типа Дата, а не текстовую строку.

Почему метод Найти не находит дату: распространенные причины

  1. Несоответствие типов данных: В колонке таблицы находится системный тип Дата, а поиск производится по строке "01.06.2014" (или наоборот).
  2. Несовпадение времени: В платформе 1С тип Дата всегда содержит и числовую часть даты, и время. Если в колонке хранится значение 01.06.2014 14:30:00, а поиск выполняется по значению 01.06.2014 00:00:00, платформа вернет Неопределено, так как значения не равны.

Способ 1. Преобразование строки в тип Дата

Рассмотрим ситуацию, когда исходное значение периода передается в виде текстовой строки или объекта другого формата. Для успешного поиска необходимо сначала принудительно привести его к типу Дата.

Посмотрим на пример использования функции Формат() и конструктора Дата() для получения канонической строки и последующего преобразования в тип Дата:


// Приводим произвольное значение периода к каноническому формату ГГГГММДДччммсс и преобразуем в дату
ИскомаяДата = Дата(Формат(СтрокаПериод, "ДФ=ГГГГММДДччммсс"));

// Выполняем поиск по колонки "Дата" в Таблице Значений
НайденнаяСтрока = ТаблицаЗначений.Найти(ИскомаяДата, "Дата");

Если НайденнаяСтрока <> Неопределено Тогда
    // Запись найдена, выполняем необходимую обработку
КонецЕсли;

Способ 2. Нормализация даты с помощью НачалоДня

Если время записи не имеет значения и поиск требуется выполнять строго по календарной дате, проанализируем подход с нормализацией. И при заполнении колонки таблицы значений, и перед вызовом поиска необходимо приводить дату к началу дня с помощью функции НачалоДня().


// При заполнении ТЗ приводим дату к началу дня
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока.Дата = НачалоДня(ТекущаяДата());

// Перед поиском также обнуляем составную часть времени
ИскомаяДата = НачалоДня(ВходнаяДата);
НайденнаяСтрока = ТаблицаЗначений.Найти(ИскомаяДата, "Дата");

Способ 3. Поиск всех совпадающих строк через НайтиСтроки

Напоминаем, что метод Найти() возвращает только первую найденную строку. Если в таблице значений может быть несколько записей за одну дату, целесообразно использовать метод НайтиСтроки() с передачей структуры отбора.


Отбор = Новый Структура;
Отбор.Вставить("Дата", НачалоДня(ИскомаяДата));

МассивНайденныхСтрок = ТаблицаЗначений.НайтиСтроки(Отбор);
Для Каждого СтрокаТЗ Из МассивНайденныхСтрок Цикл
    // Обработка всех найденных строк
КонецЦикла;

Таким образом, для корректной работы метода Найти() у таблицы значений всегда проверяйте тип данных в колонке и передавайте значение соответствующего типа Дата с учетом точности времени.

← На главную