Библиотека продвинутых функций Фиксина для повторного использования кода.




Принцип обмена данными из 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='\

99 Comments

  1. fixin

    В библиотеке собраны функции разных авторов, большинство из них написал Осипов Сергей (Гений 1С).

    Использование библиотеки абсолютно свободное.

    Перейти к публикации

    Reply
  2. ksv74

    ИНН в описании функций дважды

    Reply
  3. fixin

    (1) ага, поправлю, спасибо.

    Reply
  4. Alex_Japanese_Student

    спасибо, давно пользуюсь

    а вы библиотеку функций давно не обновляли, или она постоянно растет??

    Reply
  5. Rustig

    однажды я что-то уже использовал из вашей коллекции функций, пригодилось…

    а вскоре скопировал вашу коллекцию в свою разработку http://infostart.ru/public/89310/

    спасибо 🙂

    Reply
  6. AnryMc

    (0) Моё «знакомство» с Инфостартои началось с Ваших функций http://infostart.ru/public/57975/

    Заработал -3 балла.

    Reply
  7. fixin

    (5) это завистники. Функции хорошие.

    (3) давно не обновлял, но планирую. Теперь вроде наладил таск-флоу (управление задачами). так что все будет ок.

    Reply
  8. Alex_Japanese_Student

    (6)

    обновляйте, давно пора!!

    ждем!

    спасибо заранее!

    Reply
  9. Поручик

    (6) Не обращай внимания. Я тоже кое-что использовал. Только с БСПятиной не пересекайся, а то заклюют.

    Reply
  10. fixin

    (8) прикол моей библиотеки в том, что 80% функций оттестированы. понятно, что многие функции можно и с нуля написать, но их еще тестировать надо. А тут — сел и поехал.

    (7) ага, буду обновлять. Будут хорошие функции — давайте, включу.

    Reply
  11. sstar90

    fixin, проверь бфФайлы.ПутьБезСлеша(), по описанию «Функция корректирует путь — удаляет из него краевые пробелы и если в КОНЦЕ есть символа слеша, удаляет его», а ты проверяешь первую позицию.

    Файл качал по ссылке http://fix-in.narod.ru/articles/down_funclib/article.htm

    Reply
  12. fixin

    (10) да, однако версия библиотеки старовата. Сегодня обновлю.

    Вот код из нее:

    Функция ПутьБезСлеша(ИсходныйПуть, Слеш=»/») Экспорт
    //Назначение: Функция корректирует путь — удаляет из него краевые пробелы и если в конце есть символа слеша, удаляет его
    //ДатаСоздания: 20070727
    //Автор: Fixin
    //Пример:
    // c: -> c:
    // c: -> c:
    //$Возврат: Строка
    //Тестирована: Да
    
    Рез=СокрЛП(ИсходныйПуть);
    Если Прав(Рез,1)=Слеш Тогда
    Возврат Лев(Рез,СтрДлина(Рез)-1);
    Иначе
    Возврат Рез;
    КонецЕсли;
    КонецФункции

    Показать

    Reply
  13. luns

    в чем смысл?:

    Функция Соо(Сообщение) Экспорт
    Сообщить(Сообщение);
    КонецФункции
    
    Функция ПоказатьМакет(ТД) Экспорт
    //Назначение: Для оперативного отображения макета
    //ДатаСоздания: 20070510
    //Автор: Fixin
    //Тестирована:
    ТД.Показать();
    КонецФункции

    Показать

    «тестирована» во втором умиляет))

    Reply
  14. fixin

    (12) сам догадаешься, или с тебя снять лавры гуру? посмотри на название модуля, где используются эти функции, может после этого наступит просветление, гыгыгы.

    может быть тебе станет легче догадаться, если ты осознаешь, что Показать и Сообщить — это процедуры, а не функции.

    Reply
  15. luns

    (13) и что?

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

    а. так…

    дарю тебе еще несколько:

    Функция ПрибавитьЧисло(Число,СкокаПрибавить)
    Возврат Число + СкокаПрибавить;
    КонецФункции
    
    Функция УбавитьЧисло(Число,СкокаУбавить)
    Возврат Число — СкокаУбавить;
    КонецФункции

    ну и т.п. тока оттестить надо обязательно.

    Reply
  16. fixin

    (14) ты слился, сдался? Я даю тебе еще один шанс реабилитироваться, потом будешь локти кусать, предупреждаю. Смысл есть, думай, какой!!!!

    Reply
  17. dima1c
    Функция Соо(Сообщение) Экспорт
    Сообщить(Сообщение);
    КонецФункции
    

    Lol :D)

    Reply
  18. Flashill

    Не работала на 8.2.14 (конфигурация не хотела загружаться из файла).

    Решил путем открытия конфигурации через файл — открыть. При открытии конфа сконвертировалась.

    При повторной загрузке конфигурации из файла все заработало.

    Reply
  19. fishca

    (14)

    Результат = ?(1 = 1, Соо(), 100); — это работает

    Результат = ?(1 = 1, Сообщить(), 100); — Это НЕТ 😉

    Reply
  20. fixin

    (17) еще один, который не читал мою статью «Хитрости отладки», бугога…

    (18) и это правильно.. конфа то в формате 81, но легко конвертируется в 82. Обратное невозможно, потому в 81.

    (19) Браво, браво, молодое дарование. Товарищ Лунс теперь будет рвать свои седые волосы — надо же так опростоволоситься! Бугога.

    Reply
  21. fishca

    (20) спасибо, ДЕДУЛЯ 🙂

    Reply
  22. luns

    (16) просвети.

    (20) в той статье нет упоминания о Сооб().

    Reply
  23. luns

    (20) с чего бы?

    можешь реальный пример привести необходимости?

    Reply
  24. fixin

    (22)(23) я про статью на мисте: http://www.kb.mista.ru/article.php?id=105

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

    Reply
  25. luns

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

    так что не думаю что проникнусь.

    что касаемо статьи на мисте…

    увидев это:

    Отладка на сервере

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

    дальше читать не стал. ибо чему меня научит человек не знающий про -debug

    Reply
  26. luns

    (19) криво и не читабельно.

    правильнее так:

    ТекстСообщения = ?(1 = 1, «что то», 100);
    ОбщегоНазначения.Сообщение(ТекстСообщения);
    Reply
  27. fishca

    (26) — этот пример я тебе привел в качестве обоснования зачем процедура была преобразована в функцию, а не в качестве образца для подражания.

    Функцию можно использовать в любых выражениях, процедуры нет.

    Reply
  28. fixin

    (25) слив засчитан. если тебе не нужны какие-то фишечки отладки, то это не значит, что они не нужны другим. Это раз. А перевод стрелок на другую тему про дебуг — это вообще манипуляция. Может я тогда и не знал про дебуг, но про трассировку я уже тогда знал, а ты до сих пор не знаешь. 😉

    Reply
  29. luns

    (28) какие манипуляции?

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

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

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

    хочешь еще пример?

    твое:

    Функция СкопироватьМассив(М) Экспорт
    //Назначение: Копирует массив. Почему-то в 1С можно скопировать список, таблицу значений, дерево значений, но не структуру
    //ДатаСоздания: 20070620
    //Автор: Fixin
    //Тестирована: Нет
    Рез=Новый Массив();
    Для Каждого Эл ИЗ М Цикл
    Рез.Добавить(Эл);
    КонецЦикла;
    Возврат Рез;
    КонецФункции
    
    //заменяется на
    
    Список = Новый СписокЗначений;
    Список.ЗагрузитьЗначения(Массив);
    МассивКопия = Список.ВыгрузитьЗначения();

    Показать

    при этом скорость выше раза в два

    Reply
  30. fixin

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

    >> твои «хитрости отладки» тебе и нужны для того, чтобы обойти не знание возможностей платформы.

    Лунс, внимательно слушаю, как платформа позволяет организовать трассировку. Ну что за детский слив. Ну не догадался, признайся и живи дальше.

    насчет массивов, согласен, хорошее замечание, учту в библиотеке. Нельзя быть на 100% идеальным.

    Reply
  31. luns

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

    обвинил платформу что она это не умеет (да не умеет) и требуешь от меня это признать.

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

    в этом ты весь: борец с ветрянными мельницами.

    Нельзя быть на 100% идеальным.

    )))) дели на 10

    Reply
  32. luns

    в статье на мисте последний абзац )))))))))))

    Иногда сложно найти, в какую процедуру заходит программа по нажатию кнопки.
    Reply
  33. fixin

    (31) ну да, дружище лунс, конечно же, такой классический механизм, как трассировка не нужен. Классики программирования были неправы, а Лунсу достаточно имеющихся механизмов.

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

    У меня в РИБ не загружался файл обмена. НЕ хваталао прав на какой-то обмен.

    Вычислить по списку зарегистрированных объектов не получилось.

    Поставил трассировку на событие ПриПолученииДанныхИзГлавного.

    Соответственно быстро выщемил тот объект, который не загружался.

    Может быть можно было и по другому как-то сложно решить проблему, но с трассировкой решилось просто.

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

    Reply
  34. alexqc

    (31) отладчик 1С заточен под интерактивную работу. Фишка в том, что иногда надо отследить изменения некоего значения, но таких изменений м.б. куча (например, в цикле) — делать это пошагово замахаешься. обычно в подобных случаях вставляют Сообщить(), но это изменение кода, что вызывает необходимость перезапуска.

    Так вот, чтобы обходиться без изменения кода, делается один раз обертка над Сообщить(), а потом вызывается в нужном месте путем установки бряки с условием вида глСообщить(«НужнаяПеременная=»+НужнаяПеременная) =123. Пользуюсь таким приемом еще с 7ки. Дополнительный плюс- не нужно по окончании отладки отыскивать и убирать отладочные сообщения.

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

    Reply
  35. fixin

    (34) не распинайся, товарищ Лунс выше этого, отлаживает в уме и трассировку считает некошерной.

    Reply
  36. Uncore

    предложу функцию получения числа прописью в формате «10 лет» вместо «десять лет» стандартными средствами «ЧислоПрописью», в предложенной подборке не нашел:

    //Описание:
    // Возвращает количественное представление переданного числа прописью на основе форматной строки.
    //Параметры:
    //  <Число> (обязательный)
    //   Тип: Число.
    //  Число, которое требуется вернуть прописью.
    //  <ФормСтрока> (обязательный)
    //   Тип: Строка.
    //  Содержит перечисленные через запятую: единственное число именительный падеж, единственное число родительный падеж, множественное число родительный падеж.
    //  <ВыводЧисла> (необязательный)
    //   Тип: Булево.
    //  Признак вывода переданного числа.
    //Например:
    //  ПрописьЧисла = ПрописьЧисла(10, «день,дня,дней»);
    //   вернет «10 дней»
    //  ПрописьЧисла = ПрописьЧисла(3, «год,года,лет», Ложь);
    //    вернет «года»
    Функция ПрописьЧисла(Число, ФормСтрока, ВыводЧисла = Истина)
    
    Строка = ЧислоПрописью(Число, , «,,,,,,,,0»);
    ФорматнаяСтрока = ЧислоПрописью(Число, , ФормСтрока + «,,,,,,0»);
    
    Возврат СтрЗаменить(ФорматнаяСтрока, Строка, ?(ВыводЧисла, «» + Число + » «, «»));
    
    КонецФункции
    

    Показать

    Reply
  37. curys

    Прикольная штука, обязательно скачаю) спасибо автору

    Reply
  38. Izosin

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

    (24)Спасибо за статью на Mista, с удовольствием прочел. Буду качать библиотеку и смотреть что можно из нее использовать у себя.

    Reply
  39. luns

    (38) позиция проста.

    сама идея библиотеки функций хороша, но реализация слабая.

    функции должны возвращать значения (как минимум результат выполнения усешеннет).

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

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

    или они должны расширять возможности типовых процедур, функций.

    со временем функции должны совершенствоваться. если например появляется новая возможность в платформе, то функция должна адаптироваться (с проверкой платформы)

    например у него есть функция

    бфМат.Функция СлучайноеЧисло(Мин,Макс)

    расчитанная под 8.0. вот в ней в начале надо проверять платформу и в случае 8.1 использовать штатный механизм платформы.

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

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

    в общем незачет.

    хотя идея неплоха.

    Reply
  40. fixin

    (39) лучшее — враг хорошего. А писать постоянно один и те же мелкие функции тоже влом. Напиши лучше.

    Reply
  41. Izosin

    (39) Самый большой плюс этой публикации в комментариях. Прочитав их, точней прочитав статью по ссылку мне удалось взглянуть на отладку совсем с другой стороны. однозначный плюс этой статьи в том что ваш спор заставил меня прочитать ту статью, и за это я премного благодарен вам обоим. А с самой библиотекой нужно еще разбираться, беглый взгляд на её содержание привел меня к мысле, что ставить ее себе в таком виде я не буду, перегружать конфигурацию таким обилием общих модулей, половина из которых либо пусты, либо содержат по 2-4 функции, считаю форменным издевательством над теми кто будет работать с этой конфигурацией после меня. Так что публикация оставляет двойственные чувства. С одной стороны хотелось бы побольше публикация помогающих по новой взглянуть на наболевшие проблемы, а с другой стороны структурирована эта библиотека из рук вон плохо. Думаю для большинства полезней было бы если бы большая часть идей была оформлена в виде статью с примерами использования. Своего рода расширенная версия статьи http://www.kb.mista.ru/article.php?id=105, и все функции собранные в одном общем модуле.

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

    Reply
  42. fixin

    (41) не вижу проблемы в большом количестве модулей. 😉 Я долго думал над структурой и пришел к выводу, что лучше много модулей, чем один огромный.

    Reply
  43. Izosin

    (42) Наверно проблема в том что мне лень в голове держать помимо названий функций еще и название общего модуля где он встречается. А еще тем кто работал с УПП может и привычно то что у них справочников, документов и регистров километровыми списками, а как быть тем кто привык работать с УТ? Вот забыл я как точно пишется та или иная функция, а помню что где-то она была, как ее найти в таком обилии? В свернутом виде функции занимают 2 строки на экране, плюс строка интервала между функциями, на экране смело помещаются до 20 функций, а может и больше. Наверно мне просто привычней ковыряться в 10-30тыс строк, нежели в 40 модулях по странице каждый. Но это кто к чему привык.

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

    Reply
  44. Kobra_RU

    (25) luns,

    дальше читать не стал. ибо чему меня научит человек не знающий про -debug

    Статья написана очень неплохо. Про отладку на сервере… Зря не стал читать дальше. В разделе Отладка клиент-серверной базы ключ -debug упоминается, и кстати в 8.0 его не было…

    Reply
  45. luns

    (44) в том то и дело, что всему этому и статье и библиотеке в обед сто лет.

    когда то может и актуально было. но сейчас уже нет.

    Reply
  46. fixin

    (45) не надо народных песен. Что именно неактуально?

    (44) во-во, товарищ Лунс не дочитал до конца, а про -debug пропел.

    Reply
  47. AndreyNit

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

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

    Reply
  48. fixin

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

    (45) Чтобы не было наветов, обновил библиотеку свежеиспеченным файлом.

    Reply
  49. Арчибальд

    (35)

    не распинайся, товарищ Лунс выше этого, отлаживает в уме и трассировку считает некошерной.

    Ну и что? Я программирую более 50 лет (с 1970 г.) и ни разу не пользовался трассерами/дебаггерами. Отлаживал транслятор с языка параллельного потокового программирования, вообще не прикасаясь к клавиатуре — просто говорил кодерам, в каком месте ошибка. В качестве базиса этого принципиального подхода приведу известный афоризм Дейкстры:

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

    Естественно, создание решений происходит в уме, а «отладка» суть приведение в соответствие умозрительного решения и программного текста. Современные мышеводы напротив, пишут что-то, а потом начинают судорожно выяснять, пригодно ли это что-то для достижения нужных целей. Вот, к примеру, демонстрация такого процесса http://infostart.ru/public/121612/.

    Но это так, к слову. А публикация заслуживает внимания, значит, плюса.

    Reply
  50. fishca

    (49) хочешь сказать отладкой чужого кода ни раз не занимался? 😉

    Reply
  51. Арчибальд

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

    Reply
  52. fixin

    (49) Арчибальд, вы уникальный товарищ. Все же большинство кодеров юзают отладчик. А если бы в 1С была трассировка и трассировку юзали бы. Я лично все возможности отладки юзал в 1с — и замеры производительности и просмотр стека и т.п.

    (51) Это ты зря не пробовал, бугога. Иногда истина на поверхности.

    Reply
  53. Арчибальд

    (52) А я не говорю, что пользоваться отладчиком вообще нельзя. Я утверждаю только, что если сначала подумать, а потом уже начинать писать код, то отладчик может и не потребоваться — как со мной и происходило всегда.

    Reply
  54. fishca

    (53) мудрость приходит с годами, к сожалению, в молодости как правило бурлит кровь и рвешься в бой

    Reply
  55. fixin

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

    (54) понты тоже.

    Reply
  56. fishca

    (55)

    понты тоже.

    обоснуй

    Reply
  57. fixin

    (56) да вся бравада Арчибальда в этой ветке мне кажется понтами. Но это, видимо, мои галюцинации. Замнем тему.

    Reply
  58. KapasMordorov

    Поддержу Арчибальда.

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

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

    ЗЫ.

    Ну понты, конечно, присутствуют. «Всегда» и дальше по всем кочкам.

    Reply
  59. alexqc

    (49) при всем уважении, товарищ Арчибальд, вы все-таки понтуетесь.

    Ну и что? Я программирую более 50 лет (с 1970 г.)

    1970+50=2020. ?????


    и ни разу не пользовался трассерами/дебаггерами. Отлаживал транслятор с языка параллельного потокового программирования, вообще не прикасаясь к клавиатуре — просто говорил кодерам, в каком месте ошибка.

    Иными словами — «я проверял результат работы, отлаживали кодеры». Разумеется, так с успехом можно без отладчика обойтись.

    [IS-QUOTE]Программист обязан создавать заслуживающие доверия решения и представлять их в форме убедительных доводов, а текст написанной программы является лишь сопроводительным материалом, к которому эти доказательства применимы.

    Естественно, создание решений происходит в уме, а «отладка» суть приведение в соответствие умозрительного решения и программного текста.[/IS-QUOTE]

    Да, однако сидящее «в уме» решение — «идеально», в отличии от написанной по нему программы. «Всякая программа содержит ошибку, и всякая последняя найденная ошибка — на самом деле предпоследняя». Шутка, конечно, но доля правды как всегда там. И речь идет о отладке программы, а не отладке решения.

    Ну Вы же соглашаетесь, что «отладка» — практически необходимый процесс, и при этом утверждаете что ниразу отладчиком не пользовались? Вот прям так, с первого раза все всегда и работало? «НЕ ВЕРЮ»!!!

    Reply
  60. alexqc

    +(59) *Оказывается, движок не поддерживает вложенных цитат.

    Я кажется понимаю, что мог иметь ввиду Арчибальд под «не пользовался отладчиком»: в те времена когда машины были большими, а машинное время дорого, тратить его на отладочные пр

    Reply
  61. fixin

    (60) слова не мальчика, но мужа. В отличии от Господина А. не вижу ничего зазорного и постыдного в отладке. И даже обдумывать не вижу смысла. Иногда, когда известно, что есть ошибка, особенно в бредовых типовых, проще взять отладчик в руки и найти багу.

    Reply
  62. daho

    Спасибо, Серега!!!! Очень хорошая вещь! Еще бы добавить нормальный движок для поиска чего нужно…

    Reply
  63. Арчибальд

    (59)

    1970+50=2020.

    Это иллюстрация моих слов. Я сразу набирал текст на клавиатуре вместо того, чтобы стачала в уме протестировать этот текст.

    я проверял результат работы, отлаживали кодеры

    Кодеры при этом тоже отладчиком не пользовались.

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

    Отладка — процесс необходимый. Пользование отладчиком — нет. Я до сих пор согласен с утверждением Никлауса Вирта

    Никогда программы не содержат так мало ошибок, как при отсутствии каких-либо средств отладки
    Reply
  64. fixin

    (63) тут мы расходимся во мнениях. С высоты своего 18-летнего опыта программирования считаю, что не пользоваться дебуггером — мазохизм. Но я могу заблуждаться, конечно.

    Reply
  65. leraks

    Автору спосибо позновательно

    Reply
  66. alexqc

    (63) Арчибальд

    Отладка — процесс необходимый. Пользование отладчиком — нет. Я до сих пор согласен с утверждением Никлауса Вирта

    Цитата

    Никогда программы не содержат так мало ошибок, как при отсутствии каких-либо средств отладки

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

    Наконец, приведу другое высказывание Вирта

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

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

    Ну если в вашем случае действительно так, то это — исключение. Весьма и весьма редкое.

    Reply
  67. fixin

    (66) браво-браво, я бы точнее не сказал.

    Reply
  68. Арчибальд

    (66) К той же цитате: «соответствующий» и «специально сделанный» — не одно и то же. Возможно, попадавшиеся мне отладчики просто не соответствовали моим задачам.

    Reply
  69. fixin

    (68) странные какие то у вас задачи, сэр.

    Reply
  70. alexqc

    (68) Вот вам сценарий: некий длинный алгоритм, в котором в одном месте программист ошибся (описАлся) и вместо >= написал >.

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

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

    Пока А<>Б Цикл
    Если А>Б Тогда
    А=А-Б;
    Иначе
    Б=Б-А;
    КонецЕсли;
    КонецЦикла;
    Сообщить(А);
    

    Показать

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

    Reply
  71. alcoholic

    Спасибо Автор, очень удобна и информативна

    Reply
  72. Арчибальд

    (69) Ничего странного. Я автоматизирую учет жизни, которая неповторима.

    (70)

    вместо >= написал >.

    И чем мне в этом случае поможет отладчик?

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

    Я этого не говорил, и это реально не так. И в общем-то, мне неинтересно (разве что, из простого любопытства © О. Бендер), что она делает. Область моей компетенции — знать, что программа должна делать, и заставить ее делать именно это.

    И о приведенном коде. Я не знаю, что это за алгоритм. Я бы сказал, что это вообще не алгоритм, поскольку отсутствует необходимое для алгоритма свойство конечности. Скажем, когда А = 1, Б = 0. Это даже не букварь, это азбука программирования — обеспечить, чтобы циклы заканчивались.

    Reply
  73. fixin

    (72) Арчибальд на своей волне. Что он хочет сказать, я уже не вкуриваю… Ну, может другие поймут, бугога….

    Reply
  74. Uncore
    Пока А<>Б Цикл
    Если А>Б Тогда
    А=А-Б;
    Иначе
    Б=Б-А;
    КонецЕсли;
    КонецЦикла;
    Сообщить(А);
    

    Показать

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

    Reply
  75. Арчибальд

    (73) тебе «бугога» блокирует существенную часть мозга. Когда научишься без него обходиться, будет легче.

    Приведу пример. Предположим, произошел сбой в http://infostart.ru/public/84868/. Эта ситуация никогда не повторится. Я никогда не узнаю, что конкретно произошло. А мне нужно, чтобы в будущем в подобной жизненной ситуации сбоя не случилось. Я включаю мозги и строю версии — при каком раскладе может «выползти» такой сбой, какие дополнительные обстоятельства надо учесть.

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

    Reply
  76. dandrontiy

    // Разбирает строку на две части: до подстроки разделителя и после

    //

    // Параметры:

    // Стр — разбираемая строка

    // Разделитель — подстрока-разделитель

    // Режим — 0 — разделитель в возвращаемые подстроки не включается

    // 1 — разделитель включается в левую подстроку

    // 2 — разделитель включается в правую подстроку

    //

    // Возвращаемое значение:

    // Правая часть строки — до символа-разделителя

    //

    Функция ОтделитьРазделителем(Стр, Знач Разделитель, Режим=0)

    ПраваяЧасть = «»;

    ПозРазделителя = Найти(Стр, Разделитель);

    ДлинаРазделителя = СтрДлина(Разделитель);

    Если ПозРазделителя > 0 Тогда

    ПраваяЧасть = Сред(Стр, ПозРазделителя + ?(Режим = 2, 0, ДлинаРазделителя));

    Стр = СокрЛП(Лев(Стр, ПозРазделителя — ?(Режим = 1, -ДлинаРазделителя + 1, 1)));

    КонецЕсли;

    Возврат(ПраваяЧасть);

    КонецФункции // ОтделитьРазделителем()

    Reply
  77. fixin

    (75) ты путаешь ситуации. Да, есть разбирательство по результатам проблемы, а есть тестирование до внедрения. А ты все в кучу валишь. Я рад что ты научился работать без отладчика, но ты — исключение, которое не рекомендуется превращать в правило. Имхо бессмысленные затраты сил там, где проще отладчиком.

    (76) возьму как кандидата, хотя там есть похожие функции типа СтрокаМежду…

    Reply
  78. Арчибальд

    (77) Я отнюдь не призываю всех не пользоваться отладчиками. Собственно, я встрял в разговор исключительно из-за 35 коммента. И смысл моих высказываний в том, что отладчики — это некоторые гаджеты, без которых вполне можно обходиться. К примеру, я не пользуюсь айфоном. Не потому, что мне западло, а потому, что у меня нет в этом необходимости/потребности. Но я же никого не призываю выбросить свой айфон. И свой не выбрасываю — вдруг потребуется когда-нибудь.

    Reply
  79. fixin

    (78) мне лично вы напоминаете людей, которые не пользуются в наше время сотовыми. Возможно они и находят в этом прелесть, но мне лично непонятна их мотивация. 99% разработчиков 1с пользуются отладчиками, поэтому ваши пассажи о ваших личных заморочках оставьте для ветки ЛАЙФ. Предлагаю больше не возвращаться к этой теме, все же это тематическая ветка.

    Reply
  80. Арчибальд

    (79) Согласен.

    Reply
  81. alexqc

    (74) Uncore, да, это действительно так. Это алгоритм Евклида (в его простейшем варианте) нахождения наибольшего общего делителя. Потестив на реальных числах и выдвинув гипотезу, это даже можно доказать. А вот глядя на код — это врядли определишь.

    (72) Блин, узнаю подход теоретиков-математиков. Как чуть что немного не так — объявлять неверным и отправлять в топку ВСЕ. Ну не пришло мне в голову в формате форума писать контроль входных данных — каюсь и посыпаю голову пеплом. Впредь буду с вами внимательнее.

    вместо >= написал >.

    И чем мне в этом случае поможет отладчик?

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

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

    Я этого не говорил, и это реально не так.

    Значит я просто не понял фразы

    хочешь сказать отладкой чужого кода ни раз не занимался? 😉

    51. Арчибальд

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

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

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

    Reply
  82. NoMax

    Еще одна функция транслитерации

    http://forum.infostart.ru/forum24/topic27629/

    Код фунции

    Функция Transliterate(srtRusWord)

    strRUS = «АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ»;

    strENG = «A///B///V///G///D///E///YO//ZH//Z///I///Y///K///L///M///N//­/O///P///R///S///T///U///F///KH//TS//CH//SH//SHCH’///Y//////­/E///YU//JA//»;

    strResult = «»;

    Для i = 1 по СтрДлина(srtRusWord) Цикл

    s = Сред(srtRusWord, i,1);

    s=ВРег(s);

    k = Найти(strRUS, s);

    Если k = 0 тогда

    strResult = strResult + s;

    Иначе

    strResult = strResult + СтрЗаменить(Сред(strENG, (k — 1) * 4 + 1, 4), «/», «»);

    КонецЕсли

    КонецЦикла ;

    Возврат strResult;

    КонецФункции

    Reply
  83. zhenia74

    а где можно ознакомится с трудами этого гениями?

    Reply
  84. Збянтэжаны Саўка
    Reply
  85. fixin

    (84) когда писалась эта статья, не было еще точек останова по условию и команды «продолжить выполнение до строки».

    Иначе как объяснить, что автор говорит, что шагать по одному оператору дольше, чем добавить контрольное условие?

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

    Reply
  86. dinfo32
    Функция СкопироватьМассив(М) Экспорт
    //Назначение: Копирует массив. Почему-то в 1С можно скопировать список, таблицу значений, дерево значений, но не структуру
    //ДатаСоздания: 20070620
    //Автор: Fixin
    //Тестирована: Нет
    Рез=Новый Массив();
    Для Каждого Эл ИЗ М Цикл
    Рез.Добавить(Эл);
    КонецЦикла;
    Возврат Рез;
    КонецФункции
    
    //заменяется на
    
    Список = Новый СписокЗначений;
    Список.ЗагрузитьЗначения(Массив);
    МассивКопия = Список.ВыгрузитьЗначения();

    Показать

    не совсем поятно

    Reply
  87. AlexO

    (86) dinfo32,

    а что вам не понятно? что Сергей попутал коллекции?

    Копирует массив. Почему-то в 1С можно скопировать список, …., но не структуру

    а в коде — запись в массив из М (список значений?) заменен на заполнение массива из списка значений.

    Reply
  88. fixin

    (87) согласен, через список быстрее работает, надо будет поправить. 😉

    Reply
  89. AlexO

    (78) Арчибальд,

    не знаю, как вы не пользуетесь отладчиком, но подавляющее большинство пользуется отладчиком не для написания нового кода, а для поиска ошибок в старом, которые возникают из-за неверных/не предусмотренных данных в 99% случаев ошибок. И неверные данные вы кроме как отладчиков не поймаете — это не правка кода, это отлов ошибок/ошибочных данных.

    Reply
  90. Арчибальд

    (89) AlexO, автор топика попросил прекратить это обсуждение, и я с ним согласился.

    Reply
  91. fixin

    (91) вынесите в тему отдельную в Лайфе, потрещим.

    Reply
  92. curys

    Спасибо отличная весчь=)

    Reply
  93. vadimt_82

    С какой версией платформы совместима конфигурация? Платформа 8.2.14.537. Конфигурация не загружается.

    Reply
  94. fixin

    (94) конфигурации для 1с81 должны без проблем открываться в конфигураторе 82. Конфа написана на 81.

    Reply
  95. Scukosan

    в качестве ознакомления тема все таки интересна

    принимать чью то сторону считаю глупым(каждому виднее со своей колокольни)

    но обмен наработками однозначно приветствую )

    сам активно пользуюсь отладчиком(частично в силу своей безграмотности) 🙂

    но и разбор чужого кода проще с отладчиком

    Reply
  96. dandrontiy
    Reply
  97. fixin

    (97) а какой смысл в этих функциях? если и так можно получить это всё? Хотя хз.

    Reply
  98. dandrontiy

    (98)

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

    Для получения цифры, строки и даты — такое не надо.

    Кстати еще странный глюк — когда получаем цифру по внешнему соединению, бывает такая ситуация:

    имеем в базе реквизит например 10.2, ну десять знаков в целой части, два после запятой. и допустим там записано значение 99.00, так вот ИНОГДА, и непонятно когда и от чего можно получить не 99.00, а 98.9999999999

    Вообще непонятно от чего такое происходит. Может кто сталкивался и знает от чего такое шаманство происходит ?

    Reply
  99. fixin

    (99) почему не получится? Получится. 😉 В отладчике можно посмотреть, там эти поля по латински называются.

    Хотя кошернее действительно сделать функции-обертки, согласен.

    Reply

Leave a Comment

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