Форум Кладовочки АЛьФ`а

Общие вопросы => 7.7 => Тема начата: Пиит от 16 апреля 2024, 12:33

Название: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 12:33
В школе, на уроках математики, наша Классная всегда заставляла решать задачки несколькими способами. Прямо одержимость какая-то была. Решили вроде, ан нет, давай ещё, покрути, посмотри под другим углом, возьми другую ручку. Бывало, проверяет домашку, шесть человек у досок стоят, мелом чиркают, две доски у нас было на это дело, целый урок могли посвятить таким разборкам, и всем Классом выбирали лучшее решение. Спасибо, Валентина Владимировна, долгих лет, научила главному - коли решил, не останавливайся, может есть другой способ, по-красивше. Именно так, по-красивше. В математике, как оказалось, тоже есть своя красота.

Предлагаю поделиться решением задачки, кто решит по-красивше, сами выберем.

Дано: обычный справочник, код и наименование не существенно, как и прочие реквизиты, но есть в ём важный реквизит ДатаЗнач типа Дата, с сортировкой, и дана переменная ДатаДок типа Дата. Значения ДатаЗнач в справочнике уникальны.
Найти: метод, позволяющий найти элемент в данном справочнике, по аналогии с методом объекта Периодический.НайтиЗначение(ДатаДок), т.е. если в справочнике есть Элемент со значением ДатаЗнач = ДатаДок, вернуть этот Элемент, если нет, предыдущий элемент в порядке ДатаЗнач, либо следующий за ним, на ваш выбор. Количество итераций есть конечная величина и уж точно меньше чем 99 999 999.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: АЛьФ от 16 апреля 2024, 13:26
Навскидку как-то так:

SELECT TOP 1 врем.ID [Элемент $Справочник.Некий]
FROM
(
SELECT спр.ID
FROM $Справочник.Некий спр
WHERE $спр.ДатаЗнач >= :ДатаГраницы
ORDER BY $спр.ДатаЗнач, спр.ID
) врем

Знак сравнения в WHERE подставляем в зависимости от того нужен предыдущий или следующий.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: trad от 16 апреля 2024, 13:39
правильно так:
SELECT TOP 1
 спр.ID [Элемент $Справочник.Некий]
FROM $Справочник.Некий спр
WHERE $спр.ДатаЗнач >= :ДатаГраницы
ORDER BY $спр.ДатаЗнач, спр.ROW_ID
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 13:43
Вот, демоны ))))

Забыл главное сказать, без внешних компонент  )))


Уже поди забыли, что такое бывает )
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: trad от 16 апреля 2024, 13:53
Зачем без ВК если известно, что иные способы хуже?

а СоздатьОбъект("ADODB.хххх") - это уже запрещенка или еще нет?
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 14:00
Цитата: trad от 16 апреля 2024, 13:53это уже запрещенка или еще нет

Есть такая группа задач в геометрии - задачи на построение, где у вас есть только линейка и циркуль.
Вот и здесь, только линейка и циркуль. ))
Только непосредственно методы 1Сv7 как есть в учебнике "Описание встроенного языка".

ЗЫ: один чел даже доказал теорему, что все задачи на построение, которые подлежат решению, можно решить только с помощью циркуля )
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 14:03
Я всегда знал, что программиста нельзя загнать в рамки, это художник, черпает краски мира, в отличие от одинэсника, сапожника в своей тесной и пыльной мастерской.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: АЛьФ от 16 апреля 2024, 14:34
Тогда так, наверное:
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"
|Элемент = Справочник.Некий.ТекущийЭлемент;
|ДатаЗнач = Справочник.Некий.ДатаЗнач;
|Группировка ДатаЗнач;
|Группировка Элемент;
|Условие(ДатаЗнач >= ВыбДата);
|";
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;

Если Запрос.Группировка(1) = 1 Тогда
Если Запрос.Группировка(2) = 1 Тогда
Сообщить(Запрос.Элемент);
КонецЕсли;
КонецЕсли;
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 14:43
Цитата: АЛьФ от 16 апреля 2024, 14:34" |Элемент = Справочник.Некий.ТекущийЭлемент; |ДатаЗнач = Справочник.Некий.ДатаЗнач; |Группировка ДатаЗнач; |Группировка Элемент; |Условие(ДатаЗнач >= ВыбДата);

Эх, всё после каникул забыли, когда последний раз Запрос писали?

Этот вариант уже можно зафиксировать для истории?
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: АЛьФ от 16 апреля 2024, 14:50
Цитата: Пиит от 16 апреля 2024, 14:43
Цитата: АЛьФ от 16 апреля 2024, 14:34" |Элемент = Справочник.Некий.ТекущийЭлемент; |ДатаЗнач = Справочник.Некий.ДатаЗнач; |Группировка ДатаЗнач; |Группировка Элемент; |Условие(ДатаЗнач >= ВыбДата);

Эх, всё после каникул забыли, когда последний раз Запрос писали?

Этот вариант уже можно зафиксировать для истории?

Уже лет 15 с черными запросами только эпизодически сталкиваюсь. Все сейчас тут пишу с ходу. Для нормального решения надо тестовый полигон делать.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 14:54
Цитата: АЛьФ от 16 апреля 2024, 14:50Уже лет 15 с черными запросами только эпизодически сталкиваюсь

А у меня обратный прикол. Сто лет назад написал на Запросе уни ПоискПоВхождению слова, отлизал как мог в отладчике, портянки замеров, и забросил. На фаловых базах оценка неуд, от 10-ти секунд и более. А вот относительно недавно попробовал на огромной базе, sql, и ёкнул, за 2 сек, не больше, справляется.

не хуже прямых запросов!
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 14:56
Трудно на запросах, хоть каких, количество итераций оценить, без знаний о запросе.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 14:57
Сразу скажу, что решения я не знаю, идеи есть, но пока так себе.
Делал раньше тоже запросом, но с хитрецой.

Это чтобы вы не подумали, что я тут издеваться над кем-то вздумал.
Олимпиада эта и для меня тоже.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 16 апреля 2024, 15:05
Цитата: АЛьФ от 16 апреля 2024, 14:50Для нормального решения надо тестовый полигон делать.
Вот именно! А делать тестовый полигон, да еще каждому участнику, это зачем такая нагрузка на всех? Давайте тестовую базу!

Запрос можно, но лучше сначала проверить по НайтиПоРеквизиту или отдельным запросом на точное равенство.
А уже потом делать длительный запрос.
Но если по условию задачи только дата, то любая оптимизация даст почти 0й прирост в скорости.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 15:06
Давайте положим, что количество элементов, обработанных в запросе + все циклы по обработке запроса = количество итераций.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 15:08
Цитата: Djelf от 16 апреля 2024, 15:05Давайте тестовую базу!

Согласен, виноват, исправлюсь, подготовлю тестовую базу и впредь, буду лучше готовиться к теме.

Просьба, поскольку рабочий день, а задачка имхо повышенного уровня, чуток стать на паузу.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 15:10
Цитата: Djelf от 16 апреля 2024, 15:05Но если по условию задачи только дата,

В условии задачи нет ограничений на любые приемы, хоть бинарные деревья, но только встроенным языком.

Как говорит один мой знакомый, любой изврат, лишь бы не 1с++.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 15:18
Мне когда-то на экзамене Чистов щелбан треснул за такое. Кто, говорит, тебе мешал оборотное субконто в счет добавить? И - тресь, прямо в мозжечок.  После этого волшебного щелбана у меня реально мозг на место встал.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 16 апреля 2024, 15:18
Непонятно как сейчас попугаями мерятся, их длиной, или их толщиной...
Саморазгоняющиеся и самозамедляющиеся процессоры дают слишком большой люфт в  оценке производительности.
Надо видимо из запасов какое-то старье вытащить на свет, либо биос ковырять...
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 15:23
Цитата: Djelf от 16 апреля 2024, 15:18Непонятно как сейчас попугаями мерятся,

А че тут думать, скинем одному все решения, и пусть считает. Я даже знаю, кто это будет.

У меня старичок, первый icore, то что надо
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 15:29
Только сначала все решения нужно подготовить, и сдать на перемене.
Можно и не одно решение.
Может, срок какой установить? Неделя хватит?
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 16 апреля 2024, 15:35
Только ты учти что БД АЛьА на MSSQL ;)
Да и год или даже 10 лет нас не напрягает... Справляемся же...
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 16:10
Цитата: Djelf от 16 апреля 2024, 15:35Только ты учти что БД АЛьА на MSSQL

Таки в чём вопрос?
Если АЛьФ захочет, может и у себя проверить.

Я подготовлю шаблон обработки, для решения, если не против, чтобы одни условия были.
На скорость влияет всякая фигня, в т.ч. обращение к реквизитам формы.

Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 16:12
Не на жопу ведь играем, так, мозги встряхнуть.
Пусть проверяет кто захочет.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 16 апреля 2024, 18:44
Вроде выродил, 119976 записей за 27817 млсек.
Даты - одна на месяц с начала эры по конец 9998 года.
Гляньте, может замечания будут.

ОлимпДатаЗнач.zip (https://disk.yandex.by/d/cQoVSNaVq2F5qA)

Споймал косяк какой-то, по 9999 году, транзакция зависает в воздухе, по Esc снимается, а после этого вообще похоже Спр не работает.



Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 16 апреля 2024, 23:24
решение кривое.
Замер: 16.04.24 23:21:21: аргумент = 16.04.1966, результат =   .  .    , время выполнения = 0 млсек
Замер: 16.04.24 23:21:26: аргумент = 16.04.1966, результат =   .  .    , время выполнения = 0 млсек
есть значения 12.03.1966 и 17.04.1966 - одно из них очевидно (?) является решением
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 16 апреля 2024, 23:26
ограничений на компостокод нет, поэтому тупо накомпостекодил
   СпрН = СоздатьОбъект("Справочник.Номенклатура");
   СпрН.ПорядокРеквизита("ДатаЗнач");
   СпрН.ОбратныйПорядок(0); СпрН.ВыбратьЭлементы(); СпрН.ПолучитьЭлемент();
   ДатаМин = СпрН.ДатаЗнач; ДатаМин = ДатаМин - 1;
   СпрН.ОбратныйПорядок(1); СпрН.ВыбратьЭлементы(); СпрН.ПолучитьЭлемент();
   ДатаМакс = СпрН.ДатаЗнач; ДатаМакс = Мин(ДатаМакс,ДатаДок);
   СпрН.ВыбратьЭлементы();
   Пока ДатаМакс > ДатаМин Цикл
      Если СпрН.НайтиПоРеквизиту("ДатаЗнач",ДатаМакс,1)=0 Тогда
         ДатаМакс = ДатаМакс - 1;
         Продолжить;
      КонецЕсли;
      Прервать;
   КонецЦикла;
   Если СпрН.Выбран()=1
   Тогда Сообщить("ДатаЗнач = "+ДатаМакс);
   Иначе Сообщить("ДатаЗнач = решение не найдено");
   КонецЕсли;
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 16 апреля 2024, 23:40
обработка https://wdfiles.ru/1sG80
(как к ответу прикрепить файл?)
время = 0.
.
или в твою обработку

Функция ПоискЭлементаПоДате(Знач ДатаДок)
   Перем Результат;
   
   Результат = ПолучитьПустоеЗначение("Справочник.Тестовый");
   СпрН = СоздатьОбъект("Справочник.Тестовый");
   СпрН.ПорядокРеквизита("ДатаЗнач");
   СпрН.ОбратныйПорядок(0); СпрН.ВыбратьЭлементы(); СпрН.ПолучитьЭлемент();
   ДатаМин = СпрН.ДатаЗнач; ДатаМин = ДатаМин - 1;
   СпрН.ОбратныйПорядок(1); СпрН.ВыбратьЭлементы(); СпрН.ПолучитьЭлемент();
   ДатаМакс = СпрН.ДатаЗнач; ДатаМакс = Мин(ДатаМакс,ДатаДок);
   СпрН.ВыбратьЭлементы(); сч = 1;
   Пока ДатаМакс > ДатаМин Цикл
      Если СпрН.НайтиПоРеквизиту("ДатаЗнач",ДатаМакс,1)=0 Тогда
         ДатаМакс = ДатаМакс - 1; сч = сч + 1;
         Продолжить;
      КонецЕсли;
      Результат = СпрН.ТекущийЭлемент();
      Прервать;
   КонецЦикла;
   Возврат Результат;
КонецФункции
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 16 апреля 2024, 23:49
Замер: 16.04.24 23:47:03: аргумент = 16.04.1966, результат = 12.03.1966, время выполнения = 0 млсек
Замер: 16.04.24 23:47:11: аргумент = 16.04.1960, результат = 12.03.1960, время выполнения = 1 млсек
Замер: 16.04.24 23:47:17: аргумент = 16.04.1958, результат = 18.03.1958, время выполнения = 0 млсек
Замер: 16.04.24 23:47:35: аргумент = 16.04.1938, результат = 18.03.1938, время выполнения = 0 млсек
Замер: 16.04.24 23:47:44: аргумент = 16.04.1925, результат = 02.03.1925, время выполнения = 1 млсек
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 17 апреля 2024, 06:43
Вот, есть такие ученики в каждом Классе, которые не "тянут руку", а "с места" любят озвучить свои знания. За подсказки будем ругать. Как же мы узнаем знания других учеников?
Не торопитесь, Злоп, оформляйте рабочую тетрадь.
Как мы видим, решений уже не одно, и это радует.

И да, я таки намерен считать количество итераций, а то походу во всех решениях будет 01 млсек
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 17 апреля 2024, 11:34
прогнал с 1700 по сейчас, среднее колво итераций = 18
(итерация - операция поиска подходящего значения)
прогнал на всем массиве по всем датам в периоде данных - то же самое, ~18 итераций
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Arbuz от 17 апреля 2024, 14:50
Цитата
любой изврат, лишь бы не 1с++

Вас когда приснопамятная учительница заставляла несколькими способами домашку решать, тоже, наверное ограничения ставила: решите это только используя арифметические операции сложения и вычитания, и только в области определения натуральных чисел?

Нафейхоа эта акробатика, если прикладной практический (1С же) смысл стремится к отрицательной величине?

Если покажите практический пример где чОрные запросы реально уделывают прямые, то заберу свои слова обратно ))
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 17 апреля 2024, 14:56
А микросервисы на Golang использовать можно?  ;)
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Arbuz от 17 апреля 2024, 15:03
Цитата: Djelf от 17 апреля 2024, 14:56А микросервисы на Golang использовать можно?  ;)

ИМХО, всё можно использовать — просто трудоёмкость и плохая воспроизводимость по производительности данного варианта не позволит ему выиграть.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 17 апреля 2024, 15:10
Цитата: Arbuz от 17 апреля 2024, 15:03
Цитата: Djelf от 17 апреля 2024, 14:56А микросервисы на Golang использовать можно?  ;)

ИМХО, всё можно использовать — просто трудоёмкость и плохая воспроизводимость по производительности данного варианта не позволит ему выиграть.
Наверное так, с вероятностью 99.9999+ эти движки не умеют cdx парсить и с ним работать.
Но все все равно это микросекунды, на этом объеме данных.
Нужна задача потяжелее чем эта.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Arbuz от 17 апреля 2024, 15:31
Цитата: Djelf от 17 апреля 2024, 15:10Нужна задача потяжелее чем эта.
Я именно про это, т.е. на этой задаче при том же объёме внешний сервис проиграет на трудоёмкости создания/поднятия/размещения по сравнению с более традиционными :D способами. Следовательно, не вижу причин ограничивать полёт мысли.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 17 апреля 2024, 15:56
Цитата: Arbuz от 17 апреля 2024, 14:50Вас когда приснопамятная учительница заставляла несколькими способами домашку решать, тоже, наверное ограничения ставила...

Нет, дружище, ограничения у нас устанавливал Марк Иванович Сканави.
Как щас помню, любил повторять: "Только линейка и цикруль, двоешники, и нечего с грязной лопатой в класс заходить!"


Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Arbuz от 17 апреля 2024, 17:13
Цитата: Пиит от 17 апреля 2024, 15:56Нет, дружище, ограничения у нас устанавливал Марк Иванович Сканави.
Как щас помню, любил повторять: "Только линейка и цикруль, двоешники, и нечего с грязной лопатой в класс заходить!"

Да-да, а калькулятор это вообще зло за гранью! Только меня, например, системно обучали работе на калькуляторе и я знаю, что я умею считать на нём в несколько раз быстрее и качественнее чем те, кого не обучали луддиты от математики, и понимаю границы применимости этого умения. При этом меня там же учили считать в уме очень быстро (прикидочно, с необходимой точностью) и вы не поверите, калькулятор был для этого (обучения) нужен. Кстати, это умение моментально прикидывать результат крайне полезно в жизни и не раз пригождалось в весьма неочевидных ситуациях. Родители у меня были потомственные инженеры и чертить умели как надо, но что-то я (знающий что такое кульман и рейсфедер) черчу в CAD/CAM системах быстрее и лучше их, затрачивая меньше усилий. Не подскажите где сейчас кузнеца хорошего найти в городе, коня подковать на стёртую подкову? А перо зачинить умеете? А чернила замешать? А зачем?
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 17 апреля 2024, 18:22
Цитата: Arbuz от 17 апреля 2024, 17:13Да-да, а калькулятор это вообще зло за гранью!
Ну, во-первых.
Я дал Вам время извиниться, хотя бы в личке, но видимо Ваши родители недостаточно уделяли Вам своё внимание. Ещё раз прошу Вас не отягощать меня своим вниманием в моих ветках. По моему, это не сложно. В своих темах делайте всё, что пожелаете.
Во-вторых.
Я не нуждаюсь в Ваших комментариях, Ваши посты ко мне здесь и впредь буду расценивать как троллинг, как попытки вывести меня из равновесия и спровоцировать конфликтную ситуацию, и буду реагировать на них соответствующим образом, в рамках действующих правил данного форума.
И в треьих.
Извинения Ваши в будущем приняты не будут, ни здесь ни где-либо ещё.

Корм в коня зашёл.
Всего Вам доброго.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 17 апреля 2024, 18:46
Коллега Пиит, больше пиитета! Спокойнее, спокойнее...
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 17 апреля 2024, 18:48
Ну, кто еще порешал реально (я понимаю, что смысла нет/влом, ноавдруг)...?
или только мой копрокод пока рулит..?
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 17 апреля 2024, 18:50
Хорошо что никто из Вас не модератор, а то битва бы была эпичная...

Я вот недавно нашел рукописные трактаты своего деда и понял что я дебил :(
Эти формулы о движении нефти, масла и воды, и я вообще ни фига понимаю как это работают и зачем они и почему нужны.
Чуток отвлексекся от темы...

Но Вы деритесь!
И учтите что Истина рождается в Споре, а не в Драке!
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 17 апреля 2024, 18:57
Кстати, по тестовой обработке.
Снова уперся в то, что надо писать исходя что "один" - это частный случай "много", пришлось вызов расчета для конкретной даты в цикл оборачивать (и сейчас клиенту приходится тоже править вымороченную обработку, которая ориентирована на "один", а оказалось что надо разово проосчитать для "много" - жуть как не хочется это делать, кошака за хвост тяну третий день...)
.
С этой точки зрения в снеговике правильно сделано, когда "склад" может быть один - и его можно настройками вынести в шапку, или складов м.б. "много" - и тогда в строках ТЧ. Но не везде такое там...
.
Так что если вдруг внезапно алярм и писать прикладую конфу под убивцу >|<опы Одина - сразу писать по концепции "много".
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 17 апреля 2024, 18:58
Цитата: Злоп от 17 апреля 2024, 18:48Ну, кто еще порешал реально (я понимаю, что смысла нет/влом, ноавдруг)...?
или только мой копрокод пока рулит..?

18 итераций это имхо круто, коллега, но я принципильно не смотрю Ваш код, хотя очень чешется.
Не торопите события, у кого работа, семья и всё такое, у нас неделя сроку на решение.
Сдаём работы 23-го числа до 24:00.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 17 апреля 2024, 18:58
Цитата: Djelf от 17 апреля 2024, 18:50Но Вы деритесь!
Ставки делать будем?
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 17 апреля 2024, 19:00
Цитата: Пиит от 17 апреля 2024, 18:5818 итераций это имхо круто
имхо количество итераций зависит от равномерности/разреженности данных. Если данных много и они распределены более/менее равномерно то среднее будет ~15 и ниже... Но с меня слабый математик
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 17 апреля 2024, 19:01
Цитата: Злоп от 17 апреля 2024, 18:57Снова уперся в то, что надо писать исходя что "один" - это частный случай "много", пришлось вызов расчета для конкретной даты в цикл оборачивать

Да, Вы правы, коллега, мой просчёт, нет опыта подобных мероприятий.
Как-то наскоком всё, нужно таки лучше готовиться.
Попробую наваять тесты на множество аргументов, обработку только потребуется всем заменить, для одинаковых условий.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 17 апреля 2024, 19:03
Цитата: Злоп от 17 апреля 2024, 18:58Ставки делать будем?
Не думаю, оба участника достаточно адекватные. Чуток воды на голову и усё успокоится.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 17 апреля 2024, 19:12
//*******************************************
Функция ПоискЭлементаПоДате(Знач ДатаДок,сч)
   Перем Результат;
   
   Результат = ПолучитьПустоеЗначение("Справочник.Тестовый");
   СпрН = СоздатьОбъект("Справочник.Тестовый");
   СпрН.ПорядокРеквизита("ДатаЗнач");
   СпрН.ОбратныйПорядок(0); СпрН.ВыбратьЭлементы(); СпрН.ПолучитьЭлемент();
   ДатаМин = СпрН.ДатаЗнач; ДатаМин = ДатаМин - 1;
   СпрН.ОбратныйПорядок(1); СпрН.ВыбратьЭлементы(); СпрН.ПолучитьЭлемент();
   ДатаМакс = СпрН.ДатаЗнач; ДатаМакс = Мин(ДатаМакс,ДатаДок);
   СпрН.ВыбратьЭлементы(); сч = 1;
   Пока ДатаМакс > ДатаМин Цикл
      Если СпрН.НайтиПоРеквизиту("ДатаЗнач",ДатаМакс,1)=0 Тогда
         ДатаМакс = ДатаМакс - 1; сч = сч + 1;
         Продолжить;
      КонецЕсли;
      Результат = СпрН.ТекущийЭлемент();
      Прервать;
   КонецЦикла;
   Возврат Результат;
КонецФункции

//_____________________________________________________________________________
Процедура Выполнить()
   ДатаНач = '01/01/0001'; ДатаКон = '27/12/2998'+1; // период дат массива данных
   Колво = 0; Итератор = 0;
   Пока ДатаНач < ДатаКон Цикл
      Хронометр1 = _GetPerformanceCounter();
      сч = 0; Результат = ПоискЭлементаПоДате(ДатаНач,сч); //ВыбДатаДок
      Хронометр2 = _GetPerformanceCounter();
      
      //Сообщение = "Замер: " + ТекущаяДата() + " " + ТекущееВремя();
      //Сообщение = Сообщение + ", аргумент = " + Формат(ДатаНач, "ДДДММГГГГ");
      //Сообщение = Сообщение + ", результат = " + Формат(Результат.ДатаЗнач, "ДДДММГГГГ");
      //Сообщение = Сообщение + ", итераций = "+сч+", время выполнения = " + (Хронометр2 - Хронометр1) + " млсек";
      //Сообщить(Сообщение);
      
      Итератор = Итератор + сч; Колво = Колво + 1; ДатаНач = ДатаНач + 1;
   КонецЦикла;
   Сообщить("среднее колво итераций: "+Итератор/Колво);   
КонецПроцедуры //Выполнить
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 17 апреля 2024, 19:12
Цитата: Злоп от 17 апреля 2024, 19:00имхо количество итераций зависит от равномерности/разреженности данных

И здесь согласен, тестовая база какая-то слишком простая, можно под неё подстроиться.
Я просто хотел нарожать побольше, чтобы запросы исключить.

АЛьФ, убери пожалуйста коды с ветки, чтоб не подглядеть у соседа по парте, от греха подальше, нету сил больше.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 17 апреля 2024, 19:34
Цитата: Пиит от 17 апреля 2024, 19:12можно под неё подстроиться.
я под нее не подстраивался, тупо взял период с дат первой и последней записи. и прогнал ПО ВСЕМ ДНЯМ КАЛЕНДАРЯ этого периода в качестве ДатаДок. Да, некоторые даты календаря дали всего 1 итерацию (найдено точно), там где даты календаря совпадали с датами массива...
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 17 апреля 2024, 19:42
Цитата: Djelf от 17 апреля 2024, 19:03Не думаю, оба участника достаточно адекватные.

Даже если вы искренне убеждены в своей адекватности и превосходстве над оппонентом, это не даёт вам права преследовать его с целью убедить, что он не соответствует вашим критериям интересного собеседника. По крайней мере это не вежливо, особенно если вас попросили этого не делать.

Этот спич, Djelf, не относится персонально ни к Вам, ни к другим участникам.
Это просто мои правила поведения в чужих ветках.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 17 апреля 2024, 19:51
Цитата: Злоп от 17 апреля 2024, 19:34...взял период с дат первой и последней записи.

Эээ, коллега, ну не подсказывайте же так громко.
Я тут прошу АЛьФа затереть Ваши коды, а Вы их развешиваете на все флагштоки.
Замечание Вам.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 17 апреля 2024, 21:01
Цитата: Пиит от 17 апреля 2024, 19:42Даже если вы искренне убеждены в своей адекватности
В своей адекватности я не убежден! Такие дела...
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 18 апреля 2024, 10:26
Цитата: Djelf от 17 апреля 2024, 21:01
Цитата: Пиит от 17 апреля 2024, 19:42Даже если вы искренне убеждены в своей адекватности
В своей адекватности я не убежден! Такие дела...
Не переживайте, коллега, я тоже. Будем дружить.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Arbuz от 18 апреля 2024, 14:33
Ладно, ладно.
  ;D
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 18 апреля 2024, 16:33
Цитата: Arbuz от 18 апреля 2024, 14:33Ладно, ладно.
  ;D

Давайте не в ладушки играть, а над решением корпеть.
Вам персональное ограничение, исключительно методами Спр, без запросов.
Ну и конечно, любой израт, хоть оборотные субконто.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 23 апреля 2024, 18:39
Друзья, я не успеваю, никогда не мог работать "по техническому заданию".
Просьба, давайте "отдвинем строй твердынь" до пятницы.
И база тестовая ни к чёрту.
Коллеги, Злоп, никто не против?
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 23 апреля 2024, 19:11
Мне как пионэру - по барабану
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 24 апреля 2024, 09:23
Цитата: Злоп от 23 апреля 2024, 19:11Мне как пионэру - по барабану

Да, день рождения Ленина и у меня кпепко сидит в хронологической таблице. )

Вообще, коллеги, признаюсь, хотел вас "обойти на повороте" в этой задаче.
Была идея, что можно схитрить, положить ДатаЗнач в Наименование как ГодМесяцЧисло, 20240422, и с помощью НайтиПоНаименованию, по первым символам, каким-то образом сократить количество итераций.
А сам за неделю так и не смог подступиться к решению, чувствую даже, что путь этот тупиковый.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 24 апреля 2024, 11:33
Цитата: Пиит от 24 апреля 2024, 09:23положить ДатаЗнач в Наименование как ГодМесяцЧисло, 20240422, и с помощью НайтиПоНаименованию, по первым символам,
- открой для себя  СпрН.НайтиПоРеквизиту("ДатаЗнач",ИскомаяДата,1)
.
"Клюшки неисчерпаемы как атом"
(с) скромный Я
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 24 апреля 2024, 11:40
Цитата: Злоп от 24 апреля 2024, 11:33- открой для себя  СпрН.НайтиПоРеквизиту("ДатаЗнач",ИскомаяДата,1)

Эээ, коллега, я таки не смотрел ещё Ваше решение, обуздал своё любопытство, но здесь имхо Вы себя обманываете, это поиск с операндом "=", а не какое-то регулярное выражение.
А если не равно?
Или я чего-то не допонял?
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 24 апреля 2024, 19:06
Это поиск по индексу, быстро.
Если не равно - переходим к следующей дате.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 24 апреля 2024, 19:30
Цитата: Злоп от 24 апреля 2024, 19:06Это поиск по индексу, быстро.
Если не равно - переходим к следующей дате.
Так этож 10000 дат можно перебрать, не коллега, я потерплю до пятницы
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 24 апреля 2024, 20:01
Цитата: Пиит от 24 апреля 2024, 19:30так этож 10000 дат можно перебрать,
- с чего бы это? по полному массиву данных - как выше писал - среднее колво итераций ~18.
10 тыс - это если ДатаДок = 01.01.2024, а ближайшая ДатаЗнач = 01.01.1994...

Все зависит от данных как я писал. В сильно разреженных ДатаЗнач - проще искать ДатаЗнач на совпадение с ДатаДок. В сильно наполненных ДатаЗнач - как выше тупой алгоритм.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: xav от 27 апреля 2024, 23:01
Приветствую!
Немного припозднился, но я только сегодня узнал о существовании задачи. Может и моё решение на что-нибудь сгодится)
ссылка (https://dropmefiles.com/G727z)
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 28 апреля 2024, 07:14
Цитата: xav от 27 апреля 2024, 23:01Приветствую!
Немного припозднился,

Приветствую Вас, коллега!
Скажу честно, сам не знаю, обрадовался я или огорчился Вашему появлению. )
Хотел уже, как судья международной категории, поднять руку победителю с этой схватке, коллеге Злопу, с формулировкой "за неявку соперников".
У меня-то руки в этой ветке уже опустились.

Чтож, олимпиада по информатике продолжается, как организатор, отодвигаю срок ещё на неделю, вдруг кто-то ещё вспомнит молодость, и подключится к нашему мероприятию.
Сам я имею решение, на запросе, но не считаю его красивым, хочу разрешить задачу с помощью линейки и циркуля, на методах Спр и каких-нибудь хитросклёпанных индексах.

В общем, где-то, наверно, возможно, как будто, я таки рад Вам, коллега. )
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 28 апреля 2024, 11:05
Ниче, ниче, ща я критиканства наведу и все опошлю ;-)
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 28 апреля 2024, 13:06
Цитата: xav от 27 апреля 2024, 23:01Может и моё решение на что-нибудь сгодится)
Зачетно!

Даже вообще не думал в эту сторону, это как бы "сбоку" заход в базу ;-)
Но условия задачи не нарушены, все - штатно... ;-)

Вообще не подумал в эту сторону. А то, что режимы поиска по ключу есть - вообще только посмотрев "вспомнил" ;-)
Короче, однозначно, респект! Раз в 20 должно быть быстрее моего варианта.

По большому счету СпрТестовый Вообще не нужен можно сделать.
ЗначениеВстрокуВнутр(ПолучитьПустоеЗначение("Справочник.Тестовый")); // тоже даст что надо для вытаскивания имени таблицы, экономим на Спр.Выбрать/Спр.Получить и результат можно тоже собрать из найденого ключа в стандартную ссылку.

Недостатки:
1. не работает в монопольном режиме; // это имхо несущественно
2. имя индекса задано константой, по уму если - придется парсить DD/DDS..?
 
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 28 апреля 2024, 13:15
Прогнал на режиме "меньше или равно"
Количество обрабатанных дат: 712328
Время выполнения чистое: 45.001
Среднее колво итераций: 2
Время выполнения на одну итерацию: 0.00006317454880336025 сек
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: xav от 28 апреля 2024, 13:27
Цитата: Злоп от 28 апреля 2024, 13:06Зачетно!

;) А то сразу критиканством стращать)))

Цитата: Злоп от 28 апреля 2024, 13:06ЗначениеВстрокуВнутр(ПолучитьПустоеЗначение("Справочник.Тестовый")); // тоже даст что надо для вытаскивания имени таблицы, экономим на

Согласен, не подумал

Цитата: Злоп от 28 апреля 2024, 13:06и результат можно тоже собрать из найденого ключа в стандартную ссылку.

Так изначально и хотел сделать, но нужно было ID из 36ричной системы переводить в десятичную. Не знаю как это сделать штатными средствами. Да и поиск по индексированному полю достаточно быстрая история

Цитата: Злоп от 28 апреля 2024, 13:06Недостатки:

Ещё и в SQL работать не будет. И имя поля тоже константой задано...
Не стал с этим заморачиваться т.к. всё равно решение это не для прода. Правильное решение - прямой запрос имхо
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Forum123 от 28 апреля 2024, 13:34
Цитата: xav от 28 апреля 2024, 13:27Не знаю как это сделать штатными средствами. Да и поиск по индексированному полю достаточно быстрая история
https://infostart.ru/1c/articles/65091/ 1С - Недокументированные возможности
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: xav от 28 апреля 2024, 14:47
Вот с учетом критики и подсказок (https://dropmefiles.com/aidCA).
Новый вариант однозначно быстрее, правда, замерить толком у меня не получается т.к. на моей машине старый вариант 1-2 млсек, а новый 0-1 млсек.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 29 апреля 2024, 01:14
Цитата: xav от 28 апреля 2024, 13:27но нужно было ID из 36ричной системы переводить в десятичную.
это есть штатные функции или самому можно написать... Их есть...
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 29 апреля 2024, 08:19
Цитата: xav от 28 апреля 2024, 14:47Вот замерить толком у меня не получается т.к. на моей машине старый вариант 1-2 млсек, а новый 0-1 млсек.
 (https://dropmefiles.com/aidCA)
У меня по тестам на скорую руку выигрыш практически не значимый на большом количестве операций, процентов 5-6, но может я чего нахомутал, посмотрю позже
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 29 апреля 2024, 10:09
Цитата: xav от 27 апреля 2024, 23:01Немного припозднился, но я только сегодня узнал о существовании задачи. Может и моё решение на что-нибудь сгодится)

Вот так бывало у нас на уроках математики. Стоят у доски ребята, расписывают решения свои простынями до самого плинтуса, и тут вызвется к доске какой-нибудь парень, дескать и у него есть кое-какие мысли. Тихий такой парень, звёзд с неба не хватает, сидит обычно за партой, в окно поглядывает, рисует чего-то в тетрадке, а тут выходит он к доске, черканул две строчки, и тишина. И вот уже в Классе начинается гул: "ни хрена себе", "а так можно было?", "ну ты даёшь", "да ты гений, брат". И Классная наша, Валентина Владимировна, женщина простая, деревенская, в такие моменты могла подзабыть правила приличия, и высказать свою оценку ученику: "а я то думала, что ты тупой, Эдик".
На самом деле это тогда был не Эдик, а Вадик, или Вовчик, суть от этого не меняется. В таких случаях весь Класс единогласно соглашался, что его решение достойно первого места на местном конкурсе математической красоты.

Так и здесь, у нас, я двумя руками буду голосовать, что это решение, на XBase, не только оригинальное, но и очень красивое. Всего одна итерация, что ж может быть лучше.
Я так вообще получил очередной удар, ниже пояса, всю жизнь полагал, что XBase даже не может открыть родную таблицу ИБ, всегда блокируя её на запись, дескать только для обмена данными это гаджет. Как говорит коллега Злоп, семёрка неисчерпаема, как атом.
Снимаю шляпу, коллега xav!
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Forum123 от 29 апреля 2024, 11:02
Цитата: Пиит от 29 апреля 2024, 10:09Так и здесь, у нас, я двумя руками буду голосовать, что это решение, на XBase, не только оригинальное, но и очень красивое. Всего одна итерация, что ж может быть лучше.

Для работы с DBF и CDX конйигураций 1С 7.7 использую проект https://github.com/harbour/core.
API для использования CDX полностью поддерживает все возможности (в 1С работа с CDX не всю функциональность поддерживает).
Конечно API позволяет использовать CDX 1С.
Разработал возможность использования для DBF нескольких CDX.
Например одна CDX от 1С, а вторая с какими-либо индексами которых в CDX от 1С нет.

Но ИМХО всё это баловство, хотя и 100% функционирует.
В основном API для работы с конфигурацииями 1С мне нужна было лишь для тестирования разрабатываемого API.
Желания разработать а-ля 1С 7.7 никогда не было, хотя с использованием harbour это вполне возможно.
Давно разработал API для работы с любыми объектами конфигураций 1С 7.7.
Но как сказал ранее мне это API нужно лишь для тестирования разрабатываемого API, которое к 1С никакого отношения не имеет.

Ещё раз акцентирую то, что имеется великолепный проект https://github.com/harbour/core.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 04 мая 2024, 23:12
Хочу черкануть пару слов о решении этой задачи на Запросе.

В случае, если есть полная уверенность в том, что записи в справочник внесены в хронологическом порядке, вполне работоспособным будет следующий код:
ТекстЗапроса = "
|ТекущийЭлемент = Справочник.Тестовый.ТекущийЭлемент;
|ДатаЗнач = Справочник.Тестовый.ДатаЗнач;
|Условие(ДатаЗнач <= ДатаДок);";
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
    Результат = Запрос.ТекущийЭлемент;
КонецЕсли;
Фишка здесь в отсутствии в Запросе Группировки как таковой, и этом случае Запрос вернёт только одну итоговую запись, с готовым результатом. Но это только при соблюдении вышеказанного условия. Дело здесь в том, что Запрос проходит справочник только по порядку ID, фактически по хронологии создания записей, и если Элемент с более ранней ДатаЗнач внесён позже, задним числом, то это решение работать не будет, и придётся ввести Группировку, что увеличит время Запроса примерно в 2.5-3 раза:
ТекстЗапроса = "
|ТекущийЭлемент = Справочник.Тестовый.ТекущийЭлемент;
|ДатаЗнач = Справочник.Тестовый.ДатаЗнач;
|Условие(ДатаЗнач <= ДатаДок);
|Группировка ТекущийЭлемент Упорядочить По ТекущийЭлемент.ДатаЗнач;";
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
    Если Запрос.Группировка(1, -1) = 1 Тогда
        Результат = Запрос.ЗначениеГруппировки(1);
    КонецЕсли;
КонецЕсли;
В любом случае, количество итераций при Запросе равно количеству Элементов Справочника, вне зависимости от того, индексируется ДатаЗнач или нет, поэтому эти решения востребованы уж точно не будут.
Сам по себе Запрос - это очень интересный объект в семёрке, но к сожалению, не был как следует доработан, и вызывает, конечно, массу нареканий. Но и в нём есть фишки, так, например, режим запроса БезИтогов фактически даёт в распоряжение N-мерную Функцию, и с помощью метода Получить(<Измерение1>,...,<ИзмерениеN>) эти брюки превращаются в РегистрСведенийV8.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 05 мая 2024, 00:06
Спасибо, друзья, всем, кто уделил своё внимание этой теме. Как организатор, я обязан подвести некоторые итоги этого мероприятия.

Творческое состязание состоялось, урок информатики прошёл успешно, поставленные цели достигнуты. Так что мы собственно узнали на этом уроке?

Во-первых, мы все разные, каждый со своим опытом, своими творческими подходами,  со своим уникальным устройством полушарий. Поэтому каждому из нас есть чем поделиться с коллегами. Вот, бывает и такое, что казалось бы, ничем тебя уже в жизни не удивишь, ан нет, получи и распишись. Такой опыт общения всегда полезен.

Во-вторых, и как следствие, на примере одной ничем не примечательной задачи мы смогли убедиться, что универсальных подходов и решений не бывает. Как и в жизни, нет одной волшебной таблетки от всех болезней. В одних условиях, на базе SQL, лучшим решением будет прямой запрос от Алексея Леонидовича, в других это вполне может быть и ADODB from Trad, и XBase from Xav с известными ограничениями, а общем случае и прямой перебор коллеги Злопа даёт тоже неплохие результаты. Но ведь здесь и не все решения представлены. Я уверен, что будь здесь Александр Орефков, он бы предложил к нашим услугам свой 1sqlite, а Владимир Ходаков, усмехнувшись, достал бы из кармана свой Ext на CodeBase и уделал бы всех в одну итерацию в монопольном режиме. Наверняка мог бы придумать что-нибудь и Анатолий Щербаков на своём DBNet.

В общем, как и следует говорить в таких случаях, победила дружба.

И в завершении, как обычно, по традиции, небольшой спич.
Написал я Щербакову письмо, недели две назад, про исходники спрашивал. Пока он не ответил, и боюсь, что отвечать не будет. Когда-то я его обидел, хоть он сам и не знает об этом. Обошёл я его своим вниманием, не поддержал, не принял участие в тестировании его работ, не сказал ему, какой он молоток. А ведь сегодня все мои клиенты работают на его DBNet. А он, Анатолий Викторович, ведь и движок хотел сменить, полность переписал dblang на SQLite. Но в какой-то момент остановился. Мне кажется, что у него тогда просто опустились руки. Подумал он, а кому это вообще я всё делаю, и плюнул в конце концов, на всё и вся.

И вот, здесь и сейчас, я хотел бы пожелать всем Творцам не опускать руки, творите и знайте, что к вам "не зарастёт народная тропа".
Со светлой Пасхой вас, друзья, налегайте на свячёное и много не пейте.
И почаще читайте хорошие Коды, например, Александра Сергеевича:
...
Веленью Божию, о Муза, будь послушна,
Обиды не страшась, не требуя венца,
Хвалу и клевету приемли равнодушно
И не оспоривай глупца...
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 05 мая 2024, 00:27
Угу. Все верно.
Код без нештатных возможностей и который работает в любой ситуации и с вполне приемлемым временем исполнения - пока один. Так что ухожу непобеждённый ;-)
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 05 мая 2024, 15:37
Цитата: Пиит от 05 мая 2024, 00:06на базе SQL, лучшим решением будет прямой запрос от Алексея Леонидовича
Он же не только на SQL работает, но и на DBF тоже (через 1sqlite).
Но у него есть недостаток: разбор "прямого запроса" и выпрямление его в еще более прямой запрос (в "нативный запрос", позвольте так высказаться) занимает зачастую значительно больше времени, чем выполнение "нативного запроса".
Из-за этого я у него попросил вывод конечного парсера и он это сделал. Это получилось удобно, но пользовался я этим недолго - подкачал скилы и стало без надобности, тем более что sqlite стал значительно круче, но "прямой запрос" об этом то и не знает...

Алгоритм Злопа в победителях гонки, по условиям задачи (без ВК) и кросплатформенно (это заявлено не было, но видимо подрозумевалось).

А другого нет и быть не может.

З.Ы. 1sqlite в DBF базах однозначно рулит! Раз в 10 быстрее с LIMIT 1, нам ведь сортировка в индексе не требуется, она уже есть, т.е. первое попавшееся поле по индексу и мы поймали дату.

З.Ы.Ы. Насчет черного запроса я лучше промолчу, это дикое уродство (по современным меркам) в клюшках. Не осуждаю, это было давно и парсеры были в зачаточном состоянии.

Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 05 мая 2024, 15:43
АЛьФ, а можно сделать в Сервис замер Пикосекунд?  ;D
Мы тут уже нули с нулевыми Наносекундами пытаемся сравнивать, а они все нулевые  :o
Я не понимаю, что тут ускорять, кроме отказа от 1С:7.7:Запрос...
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 06 мая 2024, 10:52
Цитата: Djelf от 05 мая 2024, 15:43... можно сделать в Сервис замер Пикосекунд...

В этом нет необходимости.
Когда проводят школьные олимпиады, для тестирования решений используют заранее подготовленный набор данных, в нашем случае можно 1000 раз прогнать через цикл с ДатаДок, начиная с ВоксресенияГосподня, наращивая аргумент 366 днями или ещё каким-нибудь способом, например, 365++ в каждом цикле.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 06 мая 2024, 12:27
Ну ладно, Запрос так запрос... Вспомнил фишку клюшечных запросов.
Перем Счетчик;
//*******************************************
Функция Счетчик()
Счетчик=Счетчик+1;
Возврат Счетчик;
КонецФункции
//*******************************************
Функция ПоискЭлементаПоДате(Знач ДатаДок)
Счетчик = 0;
ТекстЗапроса = "
|ТекущийЭлемент = Справочник.Тестовый.ТекущийЭлемент;
|ДатаЗнач = Справочник.Тестовый.ДатаЗнач;
|Условие(ДатаЗнач>=ДатаДок);
|Условие(Счетчик()=1);
|";
Запрос=СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
Возврат Запрос.ТекущийЭлемент;
КонецЕсли;
КонецФункции
В монопольном режиме со Счетчиком в 10 раз быстрее, в разделенном всего в  2 раза, ну и конечно без Счетчика вернет самую последнюю запись, но зато это позволяет определить порядок ускорения.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 06 мая 2024, 14:09
Тут непонятно в каком порядке будут выбираться элементы.
И как например сработать на условие <=
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Пиит от 06 мая 2024, 14:16
Цитата: Djelf от 06 мая 2024, 12:27Ну ладно, Запрос так запрос... Вспомнил фишку клюшечных запросов.

так будет так работать только если порядок ID совпадает с порядком ДатаЗнач,
в общем случае нет, попробуйте в тестовой базе первый попавшийся результат поставить позже следующего по порядку ДатаЗнач, и Запрос вернёт в следующий раз все равно это значение, а не следующее по порядку ДатаЗнач
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 06 мая 2024, 14:17
Тут непонятно в каком порядке в общем случае будут выбираться элементы.
И как, например, сработать на условие <=
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 06 мая 2024, 14:18
Связь плохая
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 06 мая 2024, 14:45
Цитата: Пиит от 06 мая 2024, 14:16так будет так работать только если порядок ID совпадает с порядком ДатаЗнач,

Насколько я знаю принципы выборки, по коду 1sqlite, и копанием в кишках 1С, так быть не должно.
Выборка без индекса идет по ROWID, а не по ID (путать ROWID и ID не стоит).

В данном случае на поле ДатаЗнач стоит флаг Сортировка, следовательно есть индекс.

Я не копал как работает 1С:Запрос, это в принципе бессмысленно, но работать он должен так:

1. Сначала Запрос должен или может (в этом случае должен) увидить что есть индекс по ДатаЗнач и условие по ДатаЗнач.
2. Затем Запрос накладывает фильтр по индексу и сливает данные во временный файл DBF по индексу с наложеным фильтром (иначе работать было бы невозможно из-за диких тормозов).
3. После этого во временном DBF оказываются (уже частичные) данные, упорядоченные по индексу, т.е. по новому ROWID, а не по ID.
4. Выборка из временного файла идет по порядку записей, а они в данном случае должны быть изначально отсортированы по индексу.
5. Первая запись является первой и единственно верной (в условиях задачи).

Заполнение таблицы дат было же рандомное (для исключения глюка эффекта выборки по неизвестному ID).
Данные выборки в #83 соответствует данным полученным из 1sqlite. Вроде гипотеза доказана...
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 06 мая 2024, 14:57
А <= ?
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 06 мая 2024, 14:59
Но не факт что запрос работает как ты описал.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 06 мая 2024, 15:01
Цитата: Злоп от 06 мая 2024, 14:57А <= ?
Этот финт ушами работает только при  >=
В платформе есть все мехнизмы для этого, а вот в Запрос:1С их нет.
Т.е. нельзя.
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 06 мая 2024, 15:02
Цитата: Злоп от 06 мая 2024, 14:59Но не факт что запрос работает как ты описал.
Проверь, в чем проблема то?

И я знаю что не факт, но по другому это не должно работать, имхо.
/* видя изнутри */
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Злоп от 06 мая 2024, 15:24
Вряд ли, например, на дбфном движке строится какой-то оптимизатор/план запроса. hogik как-то рассказывал что там всё гораздо проще. Но настаивать не буду, вам виднее
Название: Re: v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)
Отправлено: Djelf от 06 мая 2024, 16:54
Я 1sqlite зачем зачем 10 лет подряд подпиливаю?
Чтобы понимать в 7.7 ее кишки изнутри больше или меньше?

Да там все просто, ну не совсем просто, но и парсер запросов в 1С невероятно примитивный.
Типа так оно работает:
1. Смотрим есть ли в Запрос:1С условие по индексу, тут в запросе только одно условие и индекс есть, решение однозначное - использовать.
Что делать когда есть одновременно условия на товар или склад у движка (для DBF это точно) идей у 1С не существует. Видимо будет выбран первый индекс (это не относится к теме).
2. 1С копирует данные во временный файл DBF по индексу и фильтру (без фильтра можно застрелиться ожидая данных).
3. Тут есть не у всех понимание, данные заполняются по индексу и мы потом выбираем записи уже не по ID, а по RowID, а они у нас записаны по возростанию индекса с фильтром. И записаны новые данные во временный файл DBF, а из него мы уже выбираем записи по RowID (без упорядовачивания так это и работает!).
4. Профит! Как я выше и отпостил.

Проверяйте... 1sqlite дает те же самые результаты, что и этот вариант.