Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Как сопоставить элементы с похожими датами

Как сопоставить элементы с похожими датами
Я
   slafor
 
17.03.18 - 13:58
Пишу дополнения к конфигурации для отслеживания и записи телефонных звонков.

1. Есть регистр сведений "ДетализацияЗвонков" с датой и номером телефона (у него есть регистратор - документ "Звонок", который создается на основании данных из XML-файла детализации звонков, полученного от оператора связи, но это так, для общего понимания сути вопроса).
2. Есть каталог с файлами записи телефонных звонков, где у каждого файла в имени указаны дата и время звонка.
Соответственно, в итоге я имею 2 таблицы - таблицу с именем файла и с датой/временем звока и таблицу регистра сведений с датами/временем в нужном периоде.
Нужно совоставить одно с другим, т.е. нужно файлы загрузить в документы-регистраторы записей регистра ДетализацииЗвонков.
НО! Есть небольшая проблема. Дата звонка и дата файла могут немного отличаться. Ну, скажем, +-5 секунд.
Задачу я решил, но уж слишком банально - путем перебора таблицы с файлами и поиска похожих по дате/времени записей в регистре.
Еще дополнительно есть возможность сравнивать длительность звонка и размер файла (не прямо, конечно, но возможность такая есть), для поиска наиболее точного соответствия.
Собственно, вопрос такой: можно ли в САМОМ запросе сравнить ПОХОЖИЕ даты?
 
 
   Cyberhawk
 
1 - 17.03.18 - 14:08
Много букв, чо надо-то?
И желательно в виде одной картинки чтобы все было понятно.
   slafor
 
2 - 17.03.18 - 14:24
(1)
Если совсем просто, то есть две таблицы, и в первой и во второй есть колонка "Дата" (Дата и Время).
Даты в одной таблице и даты в другой различаются на +- 5 секунд.

Можно ли сопоставить строки этих двух таблиц, используя только запрос?
   1Сергей
 
3 - 17.03.18 - 14:25
(2) для начала попробуй вичислить разницу между датами и найти минимумы
   Cyberhawk
 
4 - 17.03.18 - 15:58
(2) Это безсмысленно, т.к. поддерживать этот алгоритм в запросе сможет далеко не каждый. Делай это в коде.
   Sapiens_bru
 
5 - 17.03.18 - 16:25
Формулу в соединение таблиц:
(РАЗНОСТЬДАТ(Таблица1.Дата,Таблица2.Дата,СЕКУНДА)<5 И РАЗНОСТЬДАТ(Таблица1.Дата,Таблица2.Дата,СЕКУНДА)>-5)
   slafor
 
6 - 23.03.18 - 18:57
(4) Наверное, лучше бы я на этом и остановился. Но попробовать в запросе очень хотелось, и я все-таки рискнул.

(5) Спасибо за подсказку. Никогда не думал, что можно соединять таблицы не просто так, по реквизитам, а на основании формул в соединениях. Не дорос, значит, до этого.

В итоге у меня получился вот такой запрос:

    ТаблицаСоответствий = Объект.ТаблицаСоответствий.Выгрузить();
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ТЗ", ТаблицаСоответствий);
    Запрос.Текст = "
    |ВЫБРАТЬ ТЗ.ИмяФайла КАК ИмяФайла, ТЗ.ДатаФайла КАК ДатаФайла
    |ПОМЕСТИТЬ ТаблицаСоответствий
    |ИЗ &ТЗ КАК ТЗ
    |;
    /////////////////////////////////////////////////////////////

    |ВЫБРАТЬ ТаблицаСоответствий.ИмяФайла КАК ИмяФайла, 
    |    ТаблицаСоответствий.ДатаФайла КАК ДатаФайла,
    |    ДетализацияЗвонков.Дата КАК ДатаЗвонка,
    |    ДетализацияЗвонков.Номер КАК НомерТелефона, 
    |    ДетализацияЗвонков.Контрагент КАК Контрагент, 
    |    ДетализацияЗвонков.ТипВызова КАК ТипВызова, 
    |    ДетализацияЗвонков.ДлительностьСтрока КАК ДлительностьСтрока, 
    |    ДетализацияЗвонков.Длительность КАК Длительность, 
    |    ДетализацияЗвонков.Регистратор КАК Регистратор
    |ИЗ ТаблицаСоответствий КАК ТаблицаСоответствий 
    |ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДетализацияЗвонков КАК ДетализацияЗвонков
    |ПО (РАЗНОСТЬДАТ(ТаблицаСоответствий.ДатаФайла,ДетализацияЗвонков.Дата,СЕКУНДА)>=-5
    |    И РАЗНОСТЬДАТ(ТаблицаСоответствий.ДатаФайла,ДетализацияЗвонков.Дата,СЕКУНДА)<=5)
    |";
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
<...ну и так далее...>

В итоге я:
1. Не использую множество ТЗ.
2. Не обрабатываю ненужные данные.
3. Получаю все необходимые соединения, даже если +-5 секунд это данные из разных дат.

Но запрос и обработка в целом работают ровно на 1 секунду дольше! :)
Может, это потому что режим работы файловый?

В общем, как бы то ни было, огромное спасибо за новые познания в области написания запросов.
   Fram
 
7 - 23.03.18 - 19:16
(6) можно немного упростить конструкцию
РАЗНОСТЬДАТ(ТаблицаСоответствий.ДатаФайла,ДетализацияЗвонков.Дата,СЕКУНДА) МЕЖДУ -5 и 5
   Wern
 
8 - 23.03.18 - 19:22
(6) Не на файловой будет еще больше разница во времени. Ты передаешь таблицу на SQL сервер, там ее обрабатываешь и возвращаешь обратно, хотя мог бы ограничиться только получением таблицы один раз и склеивать их программно вне запроса. т.е. таблица по каналам связи у тебя передается 2 раза, вместо одного. И если узкое место это канал связи, будет работать вдвое дольше.
   Fram
 
9 - 23.03.18 - 19:41
(8) т.е. ты предлагаешь тащить весь РегистрСведений.ДетализацияЗвонков из базы для программной обработки?

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует