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

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

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

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

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

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

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

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

В общем, как бы то ни было, огромное спасибо за новые познания в области написания запросов.
7 Fram
 
23.03.18
19:16
(6) можно немного упростить конструкцию

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