Порядковый номер в запросе (Новым простым способом)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

56 Comments

  1. tanzwut

    (1)

    Это конечно, прикольно — 4 цифры, двоичная система, непонятная с первого взгляда начинающему формула… Чтобы понять эту формулу, надо потрудиться, подумать. А очень многие программисты 1С (по моему личному опыту) очень хорошо составляют алгоритмы, но создать и понять формулу (тем более сложную) для них становится очень трудной задачей. Не все они изучали высшую математику, статистику и т.д. Программист должен написать расчет по предоставленной ему формуле — вот его основная задача при сегодняшнем подходе.

    Поэтому Ваш ограниченный вариант (1024 числа) можно заменить более понятным для простого человека:

    ВЫБРАТЬ    0 КАК Поле
    ПОМЕСТИТЬ Цифры
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ    1
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ    2
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ    3
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ    4
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ    5
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ    6
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ    7
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ    8
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ    9;
    X
    ВЫБРАТЬ ПЕРВЫЕ 1000000
    Числа1.Поле + 10 * Числа2.Поле + 100 * Числа3.Поле + 1000 * Числа4.Поле + 10000 * Числа5.Поле + 100000 * Числа6.Поле + 1 КАК Поле
    
    ИЗ    Цифры КАК Числа1,    Цифры КАК Числа2,    Цифры КАК Числа3,    Цифры КАК Числа4,    Цифры КАК Числа5,    Цифры КАК Числа6
    УПОРЯДОЧИТЬ ПО    Поле ;
    

    Показать

    Все в десятичных числах, какой предел нужен, такой и ставим. Зачем эти вычисления в двоичной системе? Кто их поймет?

    Это из разряда, когда мне поставили задачу: сделать мотивацию торговых представителей от объема сбыта, но так, чтобы один торговый работает со 100 небольшими клиентами и имеет объем 1000000, а второй — с 20 крупными и имеет объем 5000000. Пришлось извратиться и использовать логарифм от объема: все равно заказчику важен конечный результат, а не формула (которую он, кстати, и не видит и не понимает).

    Reply
  2. Rothschild

    (0)

    Олимпиадные задачи по математике всегда вызывали у меня

    чувство чуть ли не религиозного благовеения…

    ***

    но меня больше интересует более практическая задача:

    как можно пронумеровать произвольную выборку запроса, а именно —

    вставить колонку «НомерСтроки» и заполнить ее порядковыми номерами строк в выборке???

    Reply
  3. Rothschild

    (3)

    это может пригодиться для дополнения двух таблиц «друг другом» в итоговой таблице

    как это обсуждается на ветке

    http://forum.infostart.ru/forum26/topic102445/

    там это решается по «тупому» —

    — таблицы выгружаются в ТЗ,

    программно перенумеруются с созданием колонки «НомерСтроки»

    и загружаются в запрос обратно для соединения.

    Reply
  4. tanzwut

    (3) Rothschild,

    Все уже придумано до нас:

    ВЫБРАТЬ
    СписаниеТоваров.Ссылка,
    СписаниеТоваров.Дата,
    СписаниеТоваров.Номер
    ПОМЕСТИТЬ Доки
    ИЗ
    Документ.СписаниеТоваров КАК СписаниеТоваров
    УПОРЯДОЧИТЬ ПО Дата, Номер;
    X
    ВЫБРАТЬ count(Доки_2.Дата) КАК Порядок, Доки_1.Дата, Доки_1.Номер, Доки_1.Ссылка
    ИЗ Доки КАК Доки_1
    inner join Доки КАК Доки_2 on
    Доки_1.Дата >= Доки_2.Дата
    group by Доки_1.Дата, Доки_1.Номер, Доки_1.Ссылка
    УПОРЯДОЧИТЬ ПО Порядок
    

    Показать

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

    Взято с sql.ru

    А вообще жаль, что 1С не поддерживает функцию SQL 2005 типа «ROW_NUMBER() OVER(ORDER BY name ASC)»

    Reply
  5. Rothschild

    (5) tanzwut,

    Испльзование агрегатной фукции COUNT для нумерации

    строк мне как-то и в голову не могло придти!

    Пример не очень удачный, не универсальный —

    — завязан на конкретный пример с хронологией документов.

    И проканает ли использование УПОРЯДОЧИТЬ при укладывании

    сортируемой выборки во временную таблицу???

    ***

    У меня под 8.1 этот номер ни разу не выходил!!!

    Reply
  6. tanzwut

    (6) Rothschild,

    там это необязательно. я делал себе для проверки. эту строку можно удалить.

    единственный минус этого примера — при наличии одинаковых дат, нумерация строится неверно.

    т.е. требование — в нумеруемой таблице в поле (полях) сортировки должны быть уникальные значения.

    Если сортировка идет по двум и более полям, то и запрос в объединении надо соответственно подправить.

    Reply
  7. tanzwut

    (8)

    Надо попробовать заставить 1С не резать своим компилятором функцию ROW_NUMBER() в SQL2005 и выше.

    Все равно SQL2000 уже мало у кого остался, а для относительно небольших файловых баз подойдет и указанный вариант (если он там конечно сработает — не проверял).

    А что касается секунды на нумерацию миллиона — так надо еще посмотреть, сколько времени займет нумерация в выгруженной таблице значений. Думается, что SQL быстрее. гораздо быстрее.

    Reply
  8. MrFlanker

    (9) tanzwut, Можно-то можно….. но спать-то потом трудно будет… вдруг ночью кто-нибудь SQL-сервак поменяет))

    Можно изначально создавать почти любое количество записей,… тогда будет очень быстро.

    p.s. Выбирая размерность множества от 2 до 20 и количество операций объединения 2..6 можно получить максимальные размеры таблицы с порядковыми числами от 4 до 20#k8SjZc9Dxk6.

    Reply
  9. Rothschild

    (9) tanzwut,

    там много какие функции «зарезаны»



    у движка запросов 1С ваще голову сносит,

    он должен генерить запросы для множества мало-совместимых СУБД


    Информационная база (IInfoBaseInfo)

    DBMS (DBMS)


    Использование:

    Чтение и запись.

    Описание:

    Тип: Строка.

    Определяет тип СУБД, в которой размещается информационная база. Возможны следующие типы СУБД:

    MSSQLServer — Microsoft SQL Server;

    PostgreSQL — PostgreSQL;

    IBMDB2 — IBM DB2;

    OracleDatabase — Oracle Database.

    Доступность:

    Интеграция.

    Показать

    плюс — еще для своего самобытного файлового формата

    (могли бы сохранить DBASE для файлового варианта как в 7.7

    а не городить самопал!)

    Reply
  10. Rothschild

    (11)

    а для PostgreSQL, как я понял, вообще все плохо.

    там движок запросов часто городит не работающие запросы к СУБД.

    и народу приходится переводить базы на файловый формат

    пока в следующих релизах платформы очередной баг не залатают:

    http://forum.infostart.ru/forum87/topic102443/

    http://forum.infostart.ru/forum26/topic102234/

    http://forum.infostart.ru/forum26/topic102539/

    Reply
  11. ildarovich

    Давно не видел статей с такой высокой «плотностью» ошибок в названии и содержании. Автора жонглирует терминологией, которую, наверное, не вполне понимает.

    Это как сделать четыре ошибки в слове «ещё». То есть описание всех ошибок по объему будет больше самой статьи.

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

    Осталось непонятным на какой метод автор не может смотреть «без боли в глазах».

    В общем, «неряшливая работа».

    Reply
  12. andrewks
    ну не смог без боли в глазах смотреть на предлагаемый всюду способ образования натуральных(порядковых) чисел в запросе

    так я и не понял, в чём новация предлагаемого запроса — этот способ был предложен много-много лет назад

    Reply
  13. tanzwut

    (13) ildarovich,

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

    Не будете ли Вы так любезны привести пример кода для такой задачи:

    «Требуется пронумеровать по-порядку 1,2,3…. все строки запроса непосредственно в самом запросе».

    P.S.

    И еще: насколько я понимаю, это форум, на котором люди делятся своими знаниями, незнаниями, мыслями, просят помочь в решении задачи и т.д. и т.п. Поэтому применять выражения

    Давно не видел статей с такой высокой «плотностью» ошибок

    и

    В общем, «грязная работа»

    считаю некорректным. Относитесь, пожалуйста, с уважением к присутствующим на форуме людям. Знаете решение — подскажите. А сказать

    «грязная работа»

    и не предложить решение — странное поведение, недостойное человека, тем более профессионала.

    Reply
  14. Rothschild

    (13) ildarovich,

    (14) andrewks,

    (15) tanzwut,

    О всемогущий Яхве-Саваоф, сущий на небе и на земле!

    Прости их — ибо не ведают они, что творят!!!

    Reply
  15. andrewks
  16. MrFlanker

    Этот способ достаточно известен у него есть существенный недостаток — ресурсоёмкость. Вряд ли он выживет на таблице из миллиона строк.

    Я бы его не рекомендовал ни под каким соусом. Все ИМХО.

    Reply
  17. andrewks

    (19) предложите свой

    Reply
  18. ildarovich

    (18) (15) В чем, по моему мнению основная, но не единственная ошибка данной публикации. В названии. Оно неверное. Судя по приведенным запросам, в них решается задача получения таблицы с одной колонкой, содержащей все натуральные числа в заданном диапазоне.

    Это никак не нумерация. Ведь нумерация предполагает наличие некоторой исходной таблицы, к которой в запросе добавляется колонка с номером записи. Это совсем другая действительно сложная и ресурсоемкая задача, которая в данной статье не решается. (но решается в статье по ссылке из комментария (17) и более быстрым способом (даже для миллиона строк) в статье Баттерфляй — метод быстрого расчета нарастающего итога в запросе).

    Далее в аннотации к статье говорится о натуральных (порядковых) числах. Есть натуральные числа и есть порядковые (обобщение первых). А зачем здесь порядковые числа? Блеснуть словцом?

    Говорится, что без боли в глазах невозможно смотреть на применяемый всюду метод. Что это за метод. Это осталось совершенно непонятным. Какой метод имеется ввиду? Его обязательно нужно указать, привести, удовлетворить общее любопытство.

    Ну и о новизне. Вот несколько ссылок навскидку, в которых используется тот же метод:

    Некоторые полезные новичкам платформы 1С8.х приёмы работы с запросами — 2 часть — пример 7.

    Порождающий запрос — решения из комментариев 7, 17, 19, 38

    Работаем с датами в запросе.

    Формирование списка дат в заданном диапазоне в тексте запроса.

    Генерация числовой последовательности и последовательности дат при помощи языка запросов.

    Я же считаю лучшим методом оригинальный метод из статьи

    Порождающий запрос

    Reply
  19. ildarovich

    (15) Признаю, что погорячился. Просто после слов «по образованию я прикладной математик» ожидал более аккуратного обращения с терминологией. Видимо, более подходящим словом было «неряшливая работа» (именно это я на самом деле имел ввиду). Еще раз внимательно прочитал статью. Надеюсь, Вы не будете против, если я уточню свой комментарий с таким несчастливым номером (13).

    Reply
  20. MrFlanker
    Reply
  21. ildarovich

    1) Название. Нумерация — это отглагольное существительное, подразумевающее существующий объект действия — нумеруемое множество. В данном случае его нет, оно образуется в процессе выполнения запроса.

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

    Неправильное название — это ошибка с серьезными последствиями.

    Это все равно, что положить шприц с адреналином в коробку с надписью «средства от насморка».

    Это может стоить человеческой жизни.

    2) Новизна. В названии написано, что метод новый. Новый — это ранее неизвестный. Но к моим ссылкам добавляете еще несколько ссылок на тот же метод. «С болью в глазах» — это вложенный запрос. То есть перенос вложенного запроса во временную таблицу, который, к тому же ранее многократно публиковался, называется новизной? упрощением? Новизной считается обобщение — использование произвольного основания? Но уже было основание 2, 6, 10. Добавили основание 4? Новизна в этом? — Тогда докажите, что основание 4 лучше. — Оптимальнее? — Укажите критерий, приведите значение этого критерия для разных оснований. То есть сомнительная необоснованная оптимальность, но не новизна.

    3) Простота. Тоже нужен критерий. Число строк в запросе. Число соединений. Число знаков в записи запроса. Что-то объективное.

    4) «Порождающий запрос». Его суть не в начальном основании 2, а в каскадном попарном соединении таблиц. Вот это действительно другой по своей структуре принцип. Он никак не может являться частным случаем выбора оснований. В конце статьи «Порождающий запрос» приведена рекурсивная функция, которая строит по заданному числу требуемых элементов текст порождающего запроса с минимальным числом соединений и произвольным основанием.

    В общем, если хотите, исправьте ошибки и неточности, уточните название, уберите из него слово «новый». Если не будет обмана, то статья обязательно кому-нибудь пригодится. Римейки вообще бывают популярны. Как Елки-3.

    Reply
  22. MrFlanker
    1) Название. Нумерация — это отглагольное существительное, подразумевающее существующий объект действия — нумеруемое множество. В данном случае его нет, ….

    Нет конечно, это не то что вы хотите, а то что написано

    2) Новизна.

    Самая короткая запись кода, без ущерба скорости, при том достаточно понятная.

    3) Простота. Тоже нужен критерий. Число строк в запросе.

    Именно

    4) «Порождающий запрос». Его суть не в начальном основании 2, а в каскадном попарном соединении таблиц.

    Вы абсолютно правы, но это лишь Ваше мнение. Для меня ничего особенного в этом нет… я так часто делаю в целях оптимизации. Но для количества в 1000 строк это ничего не дает, только кода больше. Как я уже написал это было промежуточным звеном в моих рассуждениях.

    Римейки вообще бывают популярны. Как Елки-3.

    Рад что вы усматриваете хоть какую-то полезность решения, а то я уже про себя думаю зачем вообще опубликовал….

    Reply
  23. утюгчеловек

    Интересно. Только это не нумерация, а генерация числовой последовательности.

    Reply
  24. ildarovich

    (25) Не знаю, стоит ли дальше спорить. Если мы не можем согласовать значения простых слов «новый», «нумерация». Вижу, что свой обман (что метод новый) Вы признавать не хотите. Это некрасиво: думаю, Вам и самому неприятно, когда обманывают, например, в магазине — под видом новых подсовывают просроченные продукты. Это почти тоже самое.

    Для меня ничего особенного в этом нет… я так часто делаю в целях оптимизации

    экстраполяция Вашей манеры спорить говорит, что это тоже обман. — Жалко, что приходится говорить об этом, а могли бы обсудить вопрос (я, кажется, проследил ход Ваших рассуждений), почему для изоморфного отображения множеств была выбрана линейная функция.

    Reply
  25. DoctorRoza

    Надо внимательней изучить материал, может пригодится! 🙂

    Reply
  26. Rothschild

    (28) DoctorRoza,

    диапазон целых чисел — не знаю



    но генерация диапазона дат у нас используется

    в одном из навороченных «аналитических» отчетов.

    ЗЫ

    Ну а большая часть подобных работ скорее

    представляет академический интерес, как

    занимательные примеры олимпиадных задач.

    Reply
  27. spetzpozh

    Спасибо за статью, мне было полезно.

    Reply
  28. zqzq

    Кстати, нумерация строк произвольного запроса поддерживается в новых версяих MS SQL без всяких танцев с бубнами, жаль что 1С полноценно не поддерживает T-SQL. (Да, я тоже по заголовку подумал про эту задачу, а не про генерацию числового ряда).

    Reply
  29. Sitex

    Спасибо. Изначально меня тоже смутил заголовок. Но все равно зачетно.

    Reply
  30. MrFlanker

    (33) Sitex, формулировал заголовок я большей частью для поисковых систем, на всякий случай приложил картинки запросов.

    p.s. Мои извинения, всем кого заголовок вводит в заблуждение.

    Если сформулировать заголовок «Натуральный ряд в запросе» тоже будет не всем понятно.

    По этому пока оставляю так «Порядковый номер в запросе«.

    Reply
  31. wunderland

    (21) тот случай, когда комментарий полезнее статьи 😉

    Reply
  32. AllexSoft

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

    Reply
  33. MrFlanker

    (37) AllexSoft, Спасибо вам большое за положительный отзыв.

    Это мотивирует на дальнейшие публикации.

    Помнится по молодости из деревни приехал в город на олимпиаду по информатике там только 10 и 11 классы были, меня взяли с 9-м в порядке исключения, мол пусть деревенский парень поучаствует. Учитель мой провел (спасибо ему огромное).

    С заданиями я справился быстро, думаю чем заняться начал «курочить» Yamaha MSX….это привлекло внимание вообщем попросили сдать работу и выйти. Помню долго ждал в коридоре больше часа пока хоть кто-нибудь выйдет.

    Допустил 1 ошибку в 1 задании (Задание было анализ алгоритма, первую половину описал верно, а вторую по молодой самоуверенности не стал даже анализировать написал что никогда не выполнится)

    После оглашения результата с первого взгляда увидел свою ошибку… а за это задание 10 балов было… ну мне только 5 дали. В итоге второе место, удивленные морды и тур на областную олимпиаду.

    К чему это я здесь пишу,…. потому что я уже много лет с 2002 года не IT-к……, пришлось выбирать между свободой от работодателей и любимым делом. А так хочется чего нибудь по-программировать что-нибудь полезное.

    P.s. Ссори за оффтопик, нахлынули воспоминания былой славы 🙂

    Reply
  34. AllexSoft

    (38) только вот хотел все же написать по поводу заголовка статьи (кстати спасибо что написали про новый метод, иначе бы не зашел в статью и не увидел…) так вот, зашел просто ради интереса что за новый метод, сама нумерация была не очень интересна, а тут подарок с таблицей дат… пишите на будущее более точно что в статье есть (даже про подарки)

    Reply
  35. pakill

    Согласен во многом с ildarovich.

    Конечно есть путаница в терминах. Но вряд ли кто-то понимает разницу между терминами «порядковые числа» и «числа по-порядку». Единственно, не следует в таком случае упоминать про математику. Поскольку в математике

    порядковое число — это нечто другое. Простим ему так же и обращение к теории вероятностей.

    Все же, статья, полагаю, оказалась интересной и полезной для многих читателей

    Теперь по теме.

    1. Поскольку фрагмент

    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1

    конструктор запроса записывает в 5 строк, то лично я вместо основания 4 использую основание 3. Получается компактнее. Для больших чисел, все равно использую основание 3. Просто формула становится длинее и все. Не вижу смысла переходить к основанию 10.

    2. Насчет «Порождающего запроса».

    Для меня как-то неочевидно, что соединение двух 16-строковых таблиц выполнится быстрее, чем соединение 4-х таблиц по 4 строки в каждой. Мне думается, что это будет одинаково по производительности.

    Я даже не учитываю, что эти 16-строковые таблицы еще предварительно надо сформировать где-то в памяти. Впрочем, это несущественные мелочи.

    Делалась ли проверка этого факта на тестах?

    Интуитивно 4 вложенных цикла по 4 и два вложенных цикла по 16 примерно одинаковы по производительности, если это написано на серьезном языке, с оптимизацией счетчиков.

    Reply
  36. foliage

    Меня тоже заголовок статьи ввел в заблуждение. Хотя, прочитав все комментарии и обдумав, склоняюсь к тому, что заголовок верный, а вот его восприятие (у меня) почему-то неверное 🙂

    И спасибо за запрос генерации последовательности дат!

    Reply
  37. alexk-is

    (23) Компактный код не всегда самый быстрый. Вот код для сравнения

    ВЫБРАТЬ 0 КАК Цифра ПОМЕСТИТЬ Единицы
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6
    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9;
    ВЫБРАТЬ Десятки.Цифра * 10 КАК Цифра ПОМЕСТИТЬ Десятки ИЗ Единицы КАК Десятки;
    ВЫБРАТЬ Сотни.Цифра * 10 КАК Цифра ПОМЕСТИТЬ Сотни ИЗ Десятки КАК Сотни;
    ВЫБРАТЬ Тысячи.Цифра * 10 КАК Цифра ПОМЕСТИТЬ Тысячи ИЗ Сотни КАК Тысячи;
    ВЫБРАТЬ ДесяткиТысяч.Цифра * 10 КАК Цифра ПОМЕСТИТЬ ДесяткиТысяч ИЗ Тысячи КАК ДесяткиТысяч;
    ВЫБРАТЬ СотниТысяч.Цифра * 10 КАК Цифра ПОМЕСТИТЬ СотниТысяч ИЗ ДесяткиТысяч КАК СотниТысяч;
    ВЫБРАТЬ Десятки.Цифра + Единицы.Цифра КАК Цифра
    ПОМЕСТИТЬ ДоСотни ИЗ Десятки КАК Десятки, Единицы КАК Единицы;
    ВЫБРАТЬ Тысячи.Цифра + Сотни.Цифра КАК Цифра
    ПОМЕСТИТЬ ДоДесятиТысяч ИЗ Тысячи КАК Тысячи, Сотни КАК Сотни;
    ВЫБРАТЬ СотниТысяч.Цифра + ДесяткиТысяч.Цифра КАК Цифра
    ПОМЕСТИТЬ ДоМиллиона ИЗ СотниТысяч КАК СотниТысяч, ДесяткиТысяч КАК ДесяткиТысяч;
    ВЫБРАТЬ ДоМиллиона.Цифра + ДоДесятиТысяч.Цифра + ДоСотни.Цифра КАК Цифра
    ИЗ ДоМиллиона КАК ДоМиллиона, ДоДесятиТысяч КАК ДоДесятиТысяч, ДоСотни КАК ДоСотни
    УПОРЯДОЧИТЬ ПО Цифра;

    Показать

    Это кусок выдранный из http://infostart.ru/public/68269/

    Reply
  38. ildarovich

    (40) Задачи, в которых можно применить искусственные (создаваемые не на основе данных ИБ) таблицы, можно пересчитать по пальцам. Кстати, буду благодарен, если Вы поможете расширить мою коллекцию таких задач. Особых требований по компактности записи запроса или по скорости его работы в этих задачах , как правило, не предъявляется. Поэтому практического смысла спорить по поводу выбора основания системы счисления вроде бы нет.

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

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

    Что касается быстродействия, то основание 2 тоже, как мне кажется, будет лучше. Оно обеспечивает более плотное покрытие натурального ряда числами, в которых не будет «холостых» соединений. Например, если нужно сгенерировать ряд от 1 до 257, то основание 4 даст 1024 — 257 = 767 холостых прогона, а основание 2 — только 512 — 257 = 255 (в три раза меньше!). Ну и поэтому основание 2 по сравнению с другими основаниями в среднем будет давать меньше лишних строк в декартовом произведении.

    Видите, сколько факторов можно при желании учесть. Чтобы зря не ломать каждый раз над этим голову, я написал маленькую функцию, которая по требуемому количеству строк формирует запрос, генерирующий таблицу чисел. Я уже видел обработки, в которых она была использована. Функция приведена в статье «Порождающий запрос». Ну а эффективность «порождающего запроса» лучше обсуждать в соответствующей ветке комментариев (метод вложенных циклов для оценки производительности запросов будет очень кстати).

    Reply
  39. MrFlanker

    (40) pakill,

    Согласен с вами во всем, я не использовал математические термины. Название оптимизировано под поисковик.

    А про теорию вероятности, спасибо за прощение. Ну а вообще: а) это было лирическое отступление б) я действительно искал последовательность псевдослучайных чисел обладающих нужным мне распределением.

    Насчет «Порождающего запроса».

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

    Reply
  40. MrFlanker

    (43) ildarovich, на редкость согласен с вашим постом за исключением

    Что касается быстродействия, то основание 2 тоже, как мне кажется, будет лучше. Оно обеспечивает более плотное покрытие натурального ряда числами, в которых не будет «холостых» соединений.

    Более плотное покрытие достигается использованием произвольного основания… о чем я написал еще в первом посте (не дословно конечно) «Изучив предложенный код вы сами с легкостью напишите запросы для ваших нужд«.

    Ну и дальше в комментах разжевано это уже.

    Reply
  41. vano-ekt

    и нахе*а эта последовательность в запросе?

    Reply
  42. ugroblin

    Один вопрос. Как это попало в рубрику «выбор экспертов»?

    1. Как уже много раз упоминалось в комментариях: новизны 0 целых 0 десятых.

    2. Практической пользы в таблице порядковых номеров без привязки к данным из других таблиц тоже 0.

    3. Чем вас не устроил цикл «Для Н = 1 По Х» с добавлением в массив? По Вашим же критериям «Самая короткая запись кода, без ущерба скорости, при том достаточно понятная» — короче, быстрее и максимально понятно даже новичку. В тонком клиенте работает, гонять данные между сервером и клиентом не нужно — все выполнится на месте.

    (3) как можно пронумеровать произвольную выборку запроса, а именно —

    — вставить колонку «НомерСтроки» и заполнить ее порядковыми номерами строк в выборке???

    Однозначно вопрос претендует на маленькую нобелевскую премию…. это позволило бы решить ряд прикладных задач.

    Поздравляю с успешной демонстрацией полного незнания общеизвестных вещей. С Вас премия автору http://kb.mista.ru/article.php?id=703

    (38) Прямо выпрашиваете похвалу. Вся статья просто сплошной поток самовосхваления и желания продемонстрировать мнимую значимость («нахлынули воспоминания былой славы» и т.д.) и превосходство. И образование математическое и теорию вероятностей применил к порядковым номерам (что за бред вообще, где тут случайные события?).

    Итог: публикация для сбора плюсов за счет громкого наименования. Жаль что некоторые ведутся.

    Reply
  43. MrFlanker

    (47) ugroblin,

    Один вопрос. Как это попало в рубрику «выбор экспертов»?

    Я не знаю что там куда попало, отвечу по вашим репликам:

    1. Для вас может и нет новизны, а в инете на момент публикации короче записи не было.

    2. Пользы без привязки к данным действительно мало…. так, пожалуй во всем 🙂

    3. Хотелось обойтись языком запросов. Распространенное желание.

    http://kb.mista.ru/article.php?id=703

    — Не вы первые привели эту ссылку

    — По этой ссылке действительно «нумерация». Если бы я раздавал премии, я бы отметил эту работу. У меня же просто генерация числовой последовательности.

    где тут случайные события

    — я действительно искал последовательность псевдослучайных чисел обладающих нужным мне распределением.

    — Просто не знал как подойти к решению этой задачи…. уверен есть и другие подходы.

    Прямо выпрашиваете похвалу.

    — Приятно получать позитивные комментарии, а такие как у вас — «так себе».

    Reply
  44. with

    Коллеги, можно бизнес кейс в студию для чего надо порядковый номер в запросе вычислять? И почему его нельзя рассчитать при заполнении области вывода?

    Reply
  45. MrFlanker

    (49) with,

    Имхо «бизнес-кейс» вы неуместно ляпнули.

    лично для меня смысл больше теоретический,….если кто-то найдет серьезное практическое применение, пусть порадует нас.

    Reply
  46. PLAstic

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

    Статья с датой публикации 30.03.10 : http://infostart.ru/public/68269/

    Именно предлагаемое решение описано в 35ом комментарии мной.

    ps: Ознакомился. Всё верно, баян. Даже не думал, что можно было оснастить свой комментарий таким количеством псевдонаучных слов.

    Reply
  47. MrFlanker

    (51) PLAstic,

    Конечно подобные публикации были, просто я не смог их прогуглить.

    Но до сих пор я не видел такой простой лаконичной записи…. но я не считаю что это как-то умоляет ваших заслуг, а также заслуг других авторов.

    Конечно кто-то когда-то это сделал первым, возможно еще до вас.

    У меня была весьма скромная цель: сделать запись компактнее.

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

    Это что моя проблема ??? для чего вы это пишите?

    ps. Я тоже не думал что моя «заметка» привлечет такое количество «псевдо-умников».

    А если кому-то понравилась, я искренне рад 🙂

    Reply
  48. PLAstic

    (52) единственное, что можно было бы изменить — меньше пафоса в подаче статьи. Остальное всё верно говорите. У меня ж тоже такая ситуация была: http://infostart.ru/public/294052/

    Кричат «баян», а ссылок не дают. Потом только я изучил комментарии к статье и заметил среди прочих один, где предлагалась такая же идея. Только комментарии к статьям читают далеко не все, да и поиска по ним нет, а статьи даже в рассылке упоминаются.

    Reply
  49. MrFlanker

    (53) PLAstic,

    У вас конкретное практическое решение конкретной проблемы.

    К тому же все сделано верно с методологической точки зрения.

    Использование объектов метаданных по назначению так сказать.

    Думаю многие начинающие кодеры извлекут пользу из вашей публикации.

    Хотя конечно для программиста 1С это очевидность 🙂

    Но критиковать вашу публикацию может только балбес или тот кому делать нечего :-))

    p.s. У меня же есть к чему прицепиться «новизна?», «практическое применение?», «пафос?» — все вызывает желание покритиковать,… да и ладно 🙂

    Reply
  50. awk

    (24) ildarovich, Про адреналин. Адреналин — сосудосужающее и прекрасно помогает при насморке :))))

    Reply
  51. ildarovich

    (55) awk, в моей версии этой истории пациент должен был умереть от остановки сердца, а не от насморка.

    Reply
  52. os01

    в ласт примере ласт пакет чуть более корректно так:

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&ДатаНач, ДЕНЬ, Числа.Поле — 1) КАК ПолеДата
    ИЗ
    Числа КАК Числа
    ГДЕ
    Числа.Поле <= РАЗНОСТЬДАТ(&ДатаНач, &ДатаКон, ДЕНЬ)
    Reply
  53. shira84

    Запросы просто огонь! Но мне чаще всего натуральный ряд нужен бывает во временной таблице, которую упорядочить к сожалению не получится.

    Reply
  54. vatkir

    Как я понимаю, пронумеровать ЭТИМ ничего нельзя? Если так, я только что потратил 15 минут жизни на изучения ненужной ерунды

    Reply
  55. Alien_job

    АВТОНОМЕРЗАПИСИ()

    Reply
  56. user1154710

    (60)

    АВТОНОМЕРЗАПИСИ()

    с платформы 8.3.13

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *