Маленькие хитрости большого программирования. Часть 1. "Контекст, покажи личико"




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

93 Comments

  1. GROOVY

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

    Reply
  2. mbreaker

    (1) В условии основная фишка: его можно безболезненно забыть… 😀

    Да и во время отладки он не мешается…

    Reply
  3. Трактор

    (0) Я обычно добавляю комментарий // УБРАТЬ!!!!!!

    Потом ищу по восклицательным знакам.

    (1) Странное слово «кодинг». Созвучно словам модинг, гопинг и маркетинг.

    Reply
  4. Трактор

    (2) И потом искать свой код тут http://govnokod.ru/1c

    Его туда выложат настоящие говнокодеры 🙂

    Reply
  5. GROOVY

    Да и я обычно пишу «ПустаяСсылка()»… 😉

    Reply
  6. mbreaker

    (5) Честно сказать, здесь написал, что в голову первое пришло… На самом деле, что именно будет там — не важно… Главное — чтобы это что-то было нужного типа… 😉

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

    Сторно понравилось 🙂

    Reply
  8. mbreaker

    (8) с бухгалтерами 6 лет пообщаешься — и кошелёк свой в разрезе статей ДДС начнёшь видеть… 😀

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

    (9) Вот потому и понравилось. Имею 1С Бухгалтерию 17-й год 😀

    Reply
  10. GROOVY

    А с составным типом ктонить победил также красиво?

    Reply
  11. Yashazz

    Да. Вот его безобидность, если забыли убрать, это безусловно прекрасно. Спасибо за идею!

    Reply
  12. mbreaker

    (11) можно и с составным… кто мешает? 🙂

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

    На пример на базе конф. «Бухгалтерия предприятия 8 ред. 1.6» будет так:

    Если Ложь Тогда

    Основание = Документы.СчетФактураВыданный.СоздатьДокумент().ДокументОснование;

    КонецЕсли;

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

    Reply
  13. O-Planet

    (0) Тож так делаю, только без Если Ложь Тогда… Потом просто убиваю явное определение.

    ПС, Что-то подсказывает, что прочитавшие это пользователи Опенконфа и Телепата вытерли грустную слезу о потугах восьмерочников…

    Reply
  14. artbear

    (0) Бывшие пользователи и соучастники Опенконфа и его скриптов/плагинов постоянно матюгаются при написании кода в 1С 8 🙂

    Reply
  15. mbreaker

    (14) честно скажу, не пользовался ни тем, ни другим… знакомство с миром 1С начал с V8 с самых её первых релизов… и наслушался критики в её сторону — вагон и две телеги… так что привычно… 😉

    тем не менее не совсем понимаю, чем могут помочь надстройки конфигуратора при обращении к нетипизированному параметру? ведь такое обращение может быть как в событии (где ещё можно выйти на тип передаваемого параметра), так и в процедуре общего модуля… а «парсить» все обращения к этой процедуре — по меньшей мере неблагодарное занятие…

    Reply
  16. mbreaker

    (15) на вкус и цвет… все фломастеры одинаковые… 😀

    может и 8.х станет расширяемой когда-нибудь…

    Reply
  17. sipoju

    «Если Ложь Тогда» — Красота 😀

    Reply
  18. mbreaker

    (19) Уважаемый Александр, если Вы недостаточно внимательно прочитали комментарии, специально для Вас повторю: 8-й платформой я занимаюсь более 6-ти лет. Программированием — более 15-ти лет. Перед тем, как размещать эту статью, поиском прошелся по Инфостарту и нечего на тему работы с контекстной подсказкой не нашёл, поэтому вашу фразу «из-за таких баянистов» откровенно не понял.

    Статья была написана как раз-таки для начинающих и чуть более того программистов 1С. И навеяна очередным объяснением своим подопечным таких вот «азов», потому что они либо продолжают терять время, набирая километровые наименования реквизитов, либо зовут помочь разобраться, почему у них код не работает, т.к. забыли убрать принудительное назначение типа в «безблочной» конструкции.

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

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

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

    Если Вы сомневаетесь в моей компетенции почитайте мои статьи на более серьёзные темы… Например http://infostart.ru/public/65456/ [Пардон, не заметил Ваш плюсик, на этой статье]

    И, если Вас, конечно, это не затруднит, объясните что именно «отрезвляющее» Вы внесли своим постом в эту тему? Раз десять перечитал Ваше сообщение и так и не понял, Вы призываете не пользоваться такими уловками?

    Reply
  19. anig99

    (20) Боян — в том смысле, что данная вещь давно известна…А не то, что упоминалась на инфостарте… Если ограничиваться инфостартом, то можно большую часть мисты опубликовать.

    Во-вторых, я не сомневался в Вашей компетенции. Мой минус не за саму статью, а частично за её наличие, и частично за удивительно большое число плюсов от опытных программистов. По поводу наличия… Тут уже давно был разговор о том, что «программисты 1с» не знают элементарных основ написания кода. Причем не отдельных приемов, а систематическое незнание. Поэтому было бы лучше, на мой взгляд, отсылать пользователей «в сад», т.е. к книгам по основам, сайтам для изучающих (вроде того же delphikingdom), где не зацикливаются на синтаксисе, а рассматривают в том числе приемы и алгоритмы. Меня очень сильно раздражает мнение многих программистов в других средах, которые считают, что те, кто занимается 1с ну ни как не программисты. Часто это обосновано — доля носильщиков ИТС гордо именующих себя программистами 1с очень велика. Сам был свидетелем, когда человек, окончивший институт по соответствующей специальности не смог открыть 7.7 в режиме конфигуратора — он просто не знал где и что это…

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

    Именно поэтому, я приветствую дискуссию по этому поводу, но отрицательно отношусь к активному плюсованию статьи.

    Вот… Щас нараздаю плюсы за комменты.

    Reply
  20. zaebidze

    Ну anig99 ты и выдaл)))))Дело в том что другие программисты и правильно что не считают тех кто занимается 1с программистами.Нуралиев правильно ответил для PC Magazine вот кусок статьи

    «Теперь попробуем ответить на второй вопрос — о профессии разработчика приложений на базе платформы «1С:Предприятие». Все-таки, по нашему мнению, специалиста любой профессии характеризует не только инструмент, которым он пользуется, но и круг задач, которые он умеет решать. Нам кажется, лучше использовать не термин «программист», а именно термин «разработчик». Создание приложений на «1С:Предприятии» не является написанием программы. Написание кода — только часть работы. Это именно разработка приложения, строящаяся, как мы говорили выше, начиная от структуры прикладных объектов, описания их взаимосвязи, продумывания бизнес-процессов. То есть разработчиков на «1С:Предприятии» характеризует не знание синтаксиса встроенного языка. Профессиональные разработчики на «1С:Предприятии» — специалисты по разработке бизнес-приложений. Само по себе описание структуры данных в «1С:Предприятии», написание программы на встроенном языке, рисование форм не является сложным и осваивается на некотором уровне, достаточном для решения несложных задач, обычно за 2-3 недели. Но разработка бизнес-приложений — это весьма сложная задача, не менее сложная, чем создание, например, средств разработки, САПР и т. д.»

    Reply
  21. iov

    (4) Хм вот всегда удивлялся пусть хоть весь мой код будет там . НО именно таким кодом большенство делает БЫСТРО И ДЕШЕВО и это работатет.

    А если я сижу и пишу для себя для души. то я каждую строчку откоомментирую

    Главное правило (потраченное время (еффективно*) = вознаграждение* оставшееся свободное время). тоесть если я портатил 1 час то останется 15 часов (примерно 24 -1 — 9(сон)). Так вот в идеале потраченное время стремимся свести к минимуму а вознаграждение к максимуму и достигается это именно забиванием на эргономичнось красоту и простоту и справку и камменты.

    Да и извиняюсь Потом или вы или иной программист заработатет на ОПТИМИЗАЦИИ!!!

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

    (21) Ну многие всетаки верно не считают 1С — ПРОГРАММИСТАМИ! Потому как все таки нет возможности работы с базами данных напрямую (записи) штатными средствами (да понятно что так меньше сломают но все же).

    Потому как нет возможности штатными средствами чистить память за собой . Да много чено нету. Но зато 1С предоставила возможность зарабатывать больше большинства сишников дельфистов и иных. Да прогеры SAP ов больше получают но их меньше и им сложнее. А по поводу статьи… Ну вот чесно она же привлекла внимание? Вы потратили время написав комментарий. Но количество плюсов указывает на то что как минимум 22 человека получили ПОЛЕЗНУЮ информацию. Так что минус наверно стоило адресовать тем кто не хочет изучать азы, а автор статьи все таки донес крупицу истины.

    лично я называя себя программистом 1С (8 лет стажа) в дуже понимаю что умение писать код и умение ПИСАТЬ КРАСИВЫЙ код — это две большие разницы.

    А в большинстве когда ищут программиста ищут не того кто красиво пишет а того кто сделает меньше ошибок принесет, больше пользы, и не будет требовать доплатить за откамментированный код. И что не маловажно программист должен не только оптимизировать и «кирпичизировать»* программу а так же снизить расходы на её эксплуатацию.

    * кирпичизировать — сделать максимально простую и непотопляемую систему с максимально простым в понимании и изучении интерфейсом.

    P.S. Просьба авторов постов не кипятится отвечаю не ВАМ лично а не темы вами затронутые. Просто добавив немного буковок в базу сайта.

    Reply
  22. iov

    (23) Блин надо почаще спать все таки… 😮 АпШибок море.

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

    Reply
  23. iov

    (22) Вот точно я то вспоминал кто же это сказал….

    Reply
  24. iov

    Да и вообще учитывая что мы то хотьчто-то создаем. А посмотрите на бухгалтеров они то бедные кроме кучи отчетов и пачек архивной бумаги ничего не создают… Спросите их что они создали? А многие директора кроме создания перемещения кадров по компаниям и акустических колебаний на собраниях вообще нихрена не создали но ОНИ получают больше и руководят ВАМИ. Так что радость создания ЛЮБОГО кода это уже путь к большому и светлому чувству Я _ АРРЕНИТЕЛЬНЫЙ ПРОГРАММИСТ СОЗДАВШИЙ ДОХРЕНА ПРОГРАММ 😀 .

    P.S. но кроме этого дерево- дом, дерево-сын, дерево-дуб все таки надобы выполнить 😀

    Reply
  25. larisab

    (0) Отрицать полезные вещи трудно, поэтому поддержу anig99. Писать красочные статьи с картинками для студентов наверное надо, но вот данная тема… хм… есть что-то тошнотворное в этом… вспоминаются прописи в первом классе школы…

    Reply
  26. WellMaster

    Спасибо. Знал, но почитать было весело 🙂

    Reply
  27. artbear

    (19) Я поставил плюс не за то, что написано или открыто что-то супер.

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

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

    За это и плюсанул.

    Reply
  28. artbear

    (23) В «красивом» коде как раз и ошибок меньше хотя бы за счет того, что его читать/изучать легче, а значит, и ошибки лучше видны 🙂

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

    А по поводу противопоставления разработчиков и программистов — ИМХО Нуралиев просто применил психологический прием для повышения самооценки работников нашей отрасли и все.

    Лично я не отделяю разработку от программирования.

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

    А сравнивать/разделять программистов и разработчиков ИМХО равносильно поведению простых юзеров, которых всех ИТ-ников «обзывают» программистами, независимо от роли, знаний, умений и т.д. 🙂 — т.е. это такой крайне низкий уровень знаний и умений.

    Reply
  29. artbear

    И вообще мало в среде 1С публикаций, направленных на повышение уровня разработки как в кодировании, так и в разработке архитектуры бизнес-решений.

    Например, досталась мне тут одна база 77 — это пример некачественной разработки архитектуры решения http://www.1cpp.ru/forum/YaBB.pl?num=1265121403/15

    В одном регистре куча измерений, более 8, из них часть числовых — ВУ_Метраж, ВУ_Площадь, ВУ_Ширина и т.д.

    В результате этого решения на реальной базе ОЧЕНЬ медленно открывается период ТА, хотя сама база очень маленькая.

    Reply
  30. artbear

    (0) Насчет » //ПОТОМ УДАЛИТЬ!!!»

    ИМХО проще и привычнее написать что-то типа

    //TODO_УДАЛИТЬ код после разработки

    и выполнять поиск по TODO

    В более удобных средах разработки давным-давно есть TODO-списки, формируемые средой автоматом

    ЗЫ лично я давно, еще со времен 77, юзаю следущие варианты дополнительно к простому TODO :

    TODO_МЕТАДАННОЕ — в комменте описываю изменения, который я вносил в метаданные типовой конфы, например, движения по доп.регистрам

    TODO_ФОРМА

    TODO_ИНТЕРФЕЙС

    TODO_ПРАВА

    и т.д.

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

    Reply
  31. WKBAPKA

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

    Reply
  32. artbear

    Завел новую публикацию Повышение удобства разработки в 1С 8

    Сослался в своей публикации на сабж, т.к. считаю очень полезным.

    Reply
  33. anig99

    (22) В данном высказывании Нуралиев ставить 1совцев ВЫШЕ программистов. А я говорю о тех, кто не может поставить рядом словосочетания «1с Предприятие» и «программирование».

    (23) Душелов, Гилев, Абадонна… Они находят возможность программировать вполную для 1с… Еще можно вспомнить 1с++, ei…1с — высокоуровневый язык программирования, поэтому много ему напрямую недоступно. В том же самом Delphi работа с базами данных происходит через BDE и т.д — в 1с можно работать с SQL посредством драйвера совершенно спокойно… А в С++ нельзя нормально работать с массивами…

    (29) Лучше бы потратили время на другое — например на подробную статью о тонкостях работы запросов…

    Reply
  34. iov

    (35) Я еще раз повторюсь. Я сказал что ПУСТЬ ХОТЬ ВЕСЬ КОД ТАМ бУДЕТ … И так же написал про то что я стремлюсь меньше работать и больше зарабатывать. Просто показатель эффективности работы не красота кода или его мега качество а желание клиента за него платить.

    И если я пишу что-то то каменты описания и максимум универсальности стараюсь выжать. Уговорить меня (если оплата не по часам) добавить лишний реквизит может только ПОЛНОЕ отсутсвие других вариантов (при этом я делаю копию «до» «после» и описываю изменения). Но всегда стараюсь изучить что-то новое даже напрямую не связанную с 1С. И если кто-то что-то выкладывает чего не было раньше на ресурсе — Я ЗА. И Я ЗА КРАСИВЫЙ КОД если конечно средства не превышают задач цели.

    Да и по поводу Нуралиева он ОБЯЗАН продвигать свой продукт. Так что пусть хоть религию 1С проповедует и пострижение в разработчики проводит ето дело каждого. Но в 1С действительно своя специфика… Как пример текущая хотелка клиента привязывать возврат от покупателя к одной накладной (а товар в возврате из накладных за месяц) И что делать основание — неправильно.

    Но учитывая особенности учета в компании необходимо. Как програмисту мне это сделать 5 минут. Как разработчику мне это надо изучить возможные проблемы и методы их решения. И как обьяснить заказчику что это займет мое время и увеличит его затраты ? Директора считают деньги и готовы платить не за проблемы через год а за решение проблемы СЕЙЧАС. Так что я не готов тратить СВОЕ ВРЕМЯ и внедрять универсальные процедуры — оптимизировать —

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

    Душелов, Гилев, Абадонна… ОНИ ПРОДАЮТ СВОИ РЕШЕНИЯ. Тоесть количество продаж зависит от качества кода и возможности его применения и развития. Так что …. Да кстати и они учились и развивались на статьях других…

    Reply
  35. mbreaker

    (34) Приятно это слышать! 🙂

    Reply
  36. mbreaker

    (21)

    Так вот, такие вот статьи вредны тем, что способствуют такой ситуации, когда новичок не чувствует потребности не то, чтобы прочитать книжку по основам программирования, но даже пройти курсы 1с и сдать на сертификат…

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

    Вы вот, например, готовы сказать, что знаете абсолютно ВСЕ такие уловки? Можно заниматься программированием 20 лет, а на 21-й год узнать какую-то вещь, про которую кто-то другой скажет «фу, боян, ему 20 лет уже!»

    И готовы ли Вы назвать хоть один курс или книжку или аттестационный тест, в котором бы было описание или вопрос про вещи, подобные этой?

    Reply
  37. mbreaker

    (36)

    Директора считают деньги и готовы платить не за проблемы через год а за решение проблемы СЕЙЧАС

    Знакомая проблема… Вменяемым директорам полезно бывает озвучить в цифрах стоимость «решения проблемы через год» (50% гарантировано передумают ибо «считают деньги»). Для невменяемых составлять ТЗ, в котором указаны возможные проблемы при конкретной реализации, и заставлять подписаться в нём и в акте сдачи-приемке.

    Reply
  38. iov

    (39) НЕкоторых это не особо пугает… это же потом будет… Конечно акт подписывают и в коде пишу тем кто будет исправлять почему так сделал. И в документации. Но некоторые перцы все равно потом пытаются свое фи высказать.

    Reply
  39. Tiger77

    Кто б еще написал шаблон, быстро генерирующий нужный код ?

    Reply
  40. anig99

    (38) Тут где-то была ссылка на целую книгу по оптимизацию написания кода…

    Нет… все уловки я не знаю.

    А про курсы… Эти курсы называются «школа, 9-11 классы»… Именно там была заложена основа, о которой я говорю.

    Reply
  41. orefkov

    (16)

    тем не менее не совсем понимаю, чем могут помочь надстройки конфигуратора при обращении к нетипизированному параметру?

    Показываю принцип:

    Процедура ОбработкаЗаполнения(Основание // :Документы.СчетФактураВыданный.ДокументОснование
    )
    

    или

    Процедура ОбработкаЗаполнения(Основание)
    …
    // Основание : Документы.СчетФактураВыданный.ДокументОснование
    
    

    intellisence в 7ке распознает такие комментарии и активно их использует для построения списка.

    Самодокументирование кода практически.

    Reply
  42. mbreaker

    (43) хм… забавно… в первом пример только по-моему такое описание убъёт закрывающую скобку процедуры…

    тем не менее и принцип и сама реализация практически та же самая, что и у примера в статье…

    Reply
  43. artbear

    (43), (44) Схема, аналогичная реализованной нами в Интеллисенс для 77, сделана в подсистеме «Контекстная подсказка» (и соответственно в Инструменты разработчика») для 8.1

    (44) Схема все-таки отличается, т.к. в нашем варианте только комментарии, никакого лишнего кода 🙂

    Reply
  44. mbreaker

    (43), (44) а если так? 😉

        #Если Клиент И Сервер Тогда
    НужнаяПеременная = <Создание или назначение объекта нужного типа>;
    #КонецЕсли;
    
    Reply
  45. artbear

    (46) Да, ИМХО намного красивее, чем просто Если Ложь 🙂

    Но сразу не работает 🙂

    : Ошибка в операторе препроцессора

    #<<?>>КонецЕсли;

    : Ожидается завершение оператора препроцессора Если (If)

    Точка с запятой после КонецЕсли лишние, без этого все путем.

    Правда, я совсем не уверен в качестве реализации препроцессора — возможно, нет никакой разницы между 2-мя этими способами.

    ЗЫ в тестировании — наше все 🙂

    Reply
  46. mbreaker

    (47) да, спасибо за исправление… скопировал — не заметил «;»

    если бы не было разницы, код бы исполнялся везде…

    Reply
  47. artbear

    (48) Я говорю о разнице в быстродействии.

    Т.к. мы не знаем деталей реализации препроцессора.

    Reply
  48. mbreaker

    (49) и я о них же…

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

    Reply
  49. artbear

    (50) По опыту разработки над ВК 1С++ и ФормЕкс знаю, что 1С очень слабо занимается оптимизацией кода работы.

    Кстати, можно попробовать проверить 🙂

    1000 раз или еще побольше с замером времени запустить код Выполнить(Строка), передавая обе строки в Выполнить.

    Reply
  50. ll13

    #Если Клиент И Сервер Тогда // типизирование переменных без вреда для исполняемого кода

    НужнаяПеременная = <Создание или назначение объекта нужного типа>;

    #КонецЕсли

    В файловой версии условие #Если Клиент И Сервер ВСЕГДА будет ИСТИНА (так называемое «слияние контекста») поэтому этот блок будет ВСЕГДА скомпилирован и выполнен.

    Правильно использовать следующую конструкцию

    #Если НЕ (Клиент Или Сервер Или ВнешнееСоединение) Тогда

    Объект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

    #КонецЕсли

    Reply
  51. mbreaker

    (52) да, согласен, благодарю за поправку… сказывается апгрейд конфигурации «1С:Мозг программиста» с версии 8.1 на версию 8.2… 😀

    Reply
  52. Ivon

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

    Если Истина Тогда

    // Блок кода, делающий то-то

    ……

    КонецЕсли;

    Теперь для того, чтобы скрыть ненужный блок я просто сворачиваю ненужное Если

    Reply
  53. mbreaker

    (55) 💡 хм… тоже интересное решение… а главное — этот блок можно быстро отключить, поменяв флаг на Ложь…

    Ivon, Вы не против упоминания такого трюка в одной из частей «Маленьких хитростей»? естественно с упоминанием о первоисточнике…

    Reply
  54. Ivon

    (56). Только за.

    Reply
  55. mbreaker

    (57) Договорились! 😉

    Reply
  56. mbreaker

    (55) Кстати, натолкнули на одну интересную идею… Постараюсь в ближ. время оформить её во вторую часть «маленьких хитростей»… пришлю ссылку… 😉

    Reply
  57. NewNick

    (52) #Если НЕ Клиент И Клиент Тогда

    помоему короче 😉

    плюс сразу позволяет вменяемому человеку на париться — ясно вписан бред

    по поводу статьи —

    правда если в шаблон конструкцию #если #конецесли не воткну пользоваться не буду — привык втыкать пустуюссылку и потом комментировать (если не забыл). собсно плюс за возможность «не забыть».

    а на тему спора что мол 1с это не программисты и эта статья пример. я в 1с пришел после watcom c с ассемблером. про контекстную подсказку узнал ток через 2 года(халтурил чуток там и сям и выпадающее меню после точки меня в шок не повергло). а вывод стало быть простой — те же дельфисты то же как то на суровых полноценных программистов не тянут.

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

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

    Reply
  58. mbreaker

    (60) логика здравая, но… в предложенном варианте присутствует неоднозначность для препроцессора… трудно сходу сказать, что именно получится в процессе компиляции… это, наверное, больше вопрос для artbear, он в этом лучше разбирается…

    по поводу отдела — угадали… в принципе, данная статья и родилась после очередного консультирования на тему «как сделать быстрее» и последующего выискивания, где же забыли что-то закомментировать…

    Reply
  59. php5

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

    Reply
  60. mbreaker

    (62) 😀 этот велосипед каждый для себя изобретает сам… вопрос в том, когда именно «осенит»…

    прописные истины всегда лежат на поверхности, проблема как раз в том и состоит, что со временем «ныряешь» всё глубже, и часть неувиденного в начале так и остается где-то там за спиной…

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

    Reply
  61. Мастер1С

    Блок Если … Тогда… КонецЕсли лишний.

    Просто пустую ссылку нужного типа запихиваю

    Reply
  62. Abadonna

    (30)

    А сравнивать/разделять программистов и разработчиков ИМХО равносильно поведению простых юзеров, которых всех ИТ-ников «обзывают» программистам

    Простые юзеры зовут еще круче — «компьютерщики» 😉

    Reply
  63. mbreaker

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

    Reply
  64. mbreaker

    (67) прочитайте ту часть статьи, которая выделена красным цветом, там как раз подробно объясняется, зачем тут приведены «всякие варианты извращений с инструкциями препроцессора»…

    Reply
  65. Abadonna

    (68) Да я уж свой пост и закрыл, когда ВНИМАТЕЛЬНО прочитал 😉

    Reply
  66. Abadonna

    Блин, с самого начала изучения 8.х стал так делать, но как-то даже в голову и не пришло, что это ноу-хау 😉 Это мне просто от Дельфи в наследство досталось

    Reply
  67. mbreaker

    (70) «ноу хау» (просто для справки) переводится с английского (know how) как «знаю как»… так что соглашусь! это действительно «ноу хау», т.к. я ЗНАЮ КАК и сообщаю об этом тем, кто ещё может быть не знает…

    Reply
  68. Abadonna
    Ноу-хау (от англ. know how — знать как) или секрет производства — это сведения любого характера (оригинальные технологии, знания, умения и т. п.), которые охраняются режимом коммерческой тайны и могут быть предметом купли-продажи или использоваться для достижения конкурентного преимущества над другими субъектами предпринимательской деятельности

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

    Не стоит в лобовую переводить.

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

    (72) Зануда

    Reply
  70. Abadonna

    (73) А то! 😉

    Я просто помню как из-за одного недописанного слова «например» СССР профукал патент на подводные крылья.

    Reply
  71. tsd

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

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

    Кстати, почему то нигде не увидел про конфигурирование в режиме отладчика.

    Запускаем отладку, в начале модуля/блока кода ставим точку останова, ну и начинаем весело кодировать.

    Если нажать «вычислить выражение», то получим рассчитанное значение требуемой переменной. Соответственно, видим ее текущее значение, можем поползать по всем реквизитам и т.п.

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

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

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

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

    Reply
  72. Abadonna

    (75)

    вроде наоборот, лишней фразы.

    В формуле изобретения написали:

    …отличающее тем, что.. установлены под углом 38 градусов

    А надо было:

    …установлены под углом, например, 38 градусов

    Reply
  73. tsd

    (76) вообще градусы указывать не нужно было.

    Градус заранее на бутылках с алкоголем видить хорошо 😀

    Reply
  74. l_men

    (56) (55) Ivon, А не проще данный кусок кода вынести в отдельную процедуру и уж если что, то просто комментировать вызов данной процедуры? Хотя решение классное, я его даже в свой шаблон кода включил.

    Reply
  75. Ivon

    (78). Можно, но в определенных случаях это не всегда будет удобно. Тем более, что в процедуры лучше выводить куски кода, которые могут повторяться в нескольких местах кода. Если фрагмент единичен, то выносить его в процедуру не имеет смысла. Это мое ИМХО.

    Reply
  76. l_men

    (79) Ivon, Конечно ответ не по сабжу, в этом случае одна процедура может получиться очень большой, а где гарантия того что через пару недель не потребуется этот кусок кода, а так процедуру отладил и забыл о ней и в коде особо не мешается, но это лично мое мнение.

    Reply
  77. saiten

    Красиво. Люблю такие, якобы очевидные, плюшки: улыбает и повышает настроение.

    Reply
  78. BalVlad

    Очень познавательно. Хотелось бы увидеть вторую и дальнейшие части. +

    Reply
  79. Гость

    Я постaвил плюс не за то, что написано или открыто что-то супер

    Мне лично это было известно и использование этой фичи для меня естественно, я даже не думaл, что другим будeт полезно

    Но после прочтeния сабжа лично я считаю, что подобные публикaции как раз и помогают прогрaммистaм/разработчикaм совершенствовaть свой профессионализм

    За это и плюсaнул

    Reply
  80. Necytij

    Спасибо. Я также как г-н в 64м пихал вручную пустую ссылку. Потом удалял. Иногда маялся, но редко, у меня нет длинных модулей пока. Работаю на малых и крохотных базах, однако, ваш метод возьму себе под крыло. немного под себя перенастроил — создал отдельный шаблон для спр и документа с автозаменой с «контдок» на:

    #Если НЕ (Клиент Или Сервер Или ВнешнееСоединение) Тогда  //УДАЛИТЬ
    <?»ИмяПеременной»> = Документы.<?»», Документ>.ПустаяСсылка();
    #КонецЕсли

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

    Теперь буду осторожнее и надеюсь быстрее )

    Еще раз сердечно благодарю за разборку такого деликатного метода.

    Reply
  81. trunix

    Спасибо.

    Reply
  82. tormozit

    А где же мой супер способ?

    #Если _ Тогда
    …
    #КонецЕсли

    Подробнее читайте здесь http://partners.v8.1c.ru/forum/thread.jsp?id=1001471#1001471

    Способ несколько более рискованный чем с компилируемым Если, но я пользуюсь им.

    Reply
  83. tormozit

    Кстати способ с Если Ложь Тогда я описал тут http://www.forum.mista.ru/topic.php?id=256586 еще в далеком 2007 году.

    Reply
  84. Necytij

    (86) tormozit,

    Очень интересует

    #Если _ Тогда

    отрабатывает нормально и на 8.1, и на 8.2? при всех типах соединения?

    А то скобочку

    не (клиент или сервер или внешнсоед)

    для 8.2 писать надо другую… а так можно будет одну юзать.

    Reply
  85. tormozit

    (88) Будет работать и в 8.1 и в 8.2 во всех режимах компиляции

    Reply
  86. Flashill

    Тоже постоянно так обманывал конфигуратор, но за

    #Если НЕ (Клиент Или Сервер Или ВнешнееСоединение) Тогда…

    большое спасибо 🙂

    Reply
  87. echo77

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

    С условием можно и забыть про этот кусок и не убирать его

    Reply
  88. AlexO

    (35) anig99,

    …Гилев…

    Лучше бы потратили время на другое

    я только за

    Reply
  89. AlexO

    (35) anig99,

    В том же самом Delphi работа с базами данных происходит через BDE и т.д — в 1с можно работать с SQL посредством драйвера совершенно спокойно…

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

    А 1С работает «напрямую» посредством драйвера — с люббой SQL-базой, кроме собственно базой 1С.

    А в С++ нельзя нормально работать с массивами…

    С++ уже давно (лет так 15) заменен на Visual C, Borland C, и прочие «С».

    И все там с массивами прекрасно, разве что они значительно отличаются (в лучшую сторону причем) от «массивов» 1С.

    Reply
  90. anig99

    (93) да… сейчас уже не язык программирования важен, а среда разработки. Вот, например, недавно вышел RAD Studio XE4… Там куча языков.

    Reply
  91. AlexO

    (94) anig99,

    Там куча языков.

    ну, может, кто-то и назовет это кучей: Delphi XE4 и C++ Builder XE4.

    А все остальное под смартфоны и прочие мобилы — эту пену я за языки не считаю, через 20 лет никто и не вспомнит про смартфоны и языки «допрограммирования» для них… 🙂

    Reply
  92. orefkov

    У, какая старая тема.

    Из свежих новостей.

    Снегопат-Reborn позволяет такие типизирующие выражения прописывать сразу как комментарий:

    Функция Некоторая Функция(Док, Таблица)
    //: Док = Документы.ВозвратМатериаловИзЭксплуатации.ПолучитьСсылку()
    Док. < тут выдаст методы и свойства ДокументСсылка.ВозвратМатериаловИзЭксплуатации
    //: Таблица = Новый ТабличныйДокумент
    Таблица. < тут выдаст методы и свойства типа ТабличныйДокумент
    

    Фишка в том, что когда контекстная подсказка 1С получает текст модуля для анализа, снегопат заменяет «//:» на пробелы.

    Reply
  93. Sardukar

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

    Reply

Leave a Comment

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