По ссылке или по значению? Ключевое слово Знач и с чем его едят




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

97 Comments

  1. karpik666

    Наверное я зажрался, но плюсовать не хочется. Подобное уже читал на ИТС http://its.1c.ru/db/metod8dev#content:2606:hdoc. Единственное, что почерпнул это понятие «мелкая» и «глубокая». В любом случае спасибо за статью.

    Reply
  2. tormozit

    (1) А где ссылка на особенности передачи параметров при вызове сервера?

    Reply
  3. karpik666

    (2) tormozit, вот конкретно про это где-то читал здесь же на форуме. Пока все что нашел это комментарий fixin http://forum.infostart.ru/forum24/topic135262/message1396038/#message1396038 Ну и в целом по ветке там идет обсуждение «знач». Но помнится была более подробная информация, к сожалению сейчас не смогу привести ссылки.

    Reply
  4. tormozit

    (3) Получается на ИТС про это нет. Я лично не находил. Поэтому статья намного больше раскрывает тему, чем ИТС. Так что плюсовать можно =)

    Reply
  5. starik-2005

    Вопрос: если на сервере создать функцию, возвращающую новый экземпляр объекта, получу ли я таким образом копию, например, структуры?

    Типа так:

    Код
    
    &НаКлиенте
    Процедура МояПроц()
      МояСтруктура = Новый Структура("параметр1, Параетр2, Параметр3", 1, 2, 3);
      МояВтораяСтруктура = КопироватьЧтоТ(МояСтруктура);
      МояВтораяСтруктураюПараметр2 = 5;
      Сообщить(МояСтруктура.Параметр2);
    КонецПроцедуры
    
    &НаСервере
    Функция КопироватьЧтоТо(Знач Ссылка)
      Возврат Ссылка
    КонецФункции
    
    

    Показать полностью

    Вот что выдаст "Сообщить": два или пять?

    Reply
  6. baton_pk

    Передача параметров по ссылке по-умолчанию дичайше удручает…

    Reply
  7. CheBurator

    Ничего не понял

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

    Получается два указателя на один и тот же объект?

    Как тогда по по одному указателю модифицируем объект а по второму указателю получаем немодифицированный объект?

    Так что всетаки копируется ? Указатель на объект или создается копия объекта?

    Разьясните плиз

    Reply
  8. karpik666

    (4) tormozit, но не находите, что если вычленить суть, то какая-то бедненькая статья получается?

    Как известно, не все объекты платформы являются сериализуемыми. Именно отсюда растет ограничение, что не все объекты можно передать в серверный метод с клиента. … Выполняется «глубокая» копия объекта. А при наличии слова Знач объект не поедет с сервера обратно на клиент.
    Reply
  9. karpik666

    (7) CheBurator, тут имеется ввиду, что когда мы имеем дело с не простыми типами и если это не клиент-серверное взаимодействие, то в любом случае мы передаем его по ссылке, даже если используется указатель «знач», изменяя его в какой-то процедуре по значению — мы изменим и исходный объект, Однако если в функции будет использован указатель «Знач» , например

     функция функция1(Знач Параметр1)

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

    Reply
  10. Serg82

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

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

    типа когда можешь управлять на каком сервере будет исполняться код в кластере серверов)

    Reply
  11. Brawler
    Reply
  12. alex_4x

    А многопоточность в 1С 8.3 есть ?

    Чтобы можно было так написать

    thread1.Start();

    thread2.Start();

    thread3.Start();

    thread4.Start();

    thread1.Wait();

    thread2.Wait();

    thread3.Wait();

    thread4.Wait();

    Сообщить(«Шеф, усё готово!»);

    Reply
  13. Evil Beaver

    (5) starik-2005, делать серверный вызов ради копирования структуры — зло. Чтобы получить глубокую копию проще всего сделать ЗначениеВСтрокуВнутр/ИзСтрокиВнутр

    Reply
  14. Evil Beaver

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

    (7) CheBurator,

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

    Если очень условно, то виртуальная машина, которая выполняет скрипт 1С, имеет память в виде массива «значений» языка 1С. Ваша переменная, в которую записана, скажем ТаблицаЗначений, это на самом деле численная переменная. А число указывает на номер ячейки в том массиве памяти виртуальной машины. Так вот, когда вы передаете переменную по значению, то вот это число с номером ячейки (адрес) копируется в другую переменную и становится независимым (ее можно перезаписать другим значением, на исходную переменную это не повлияет). Сам объект в ячейке памяти с первоначальным номером никуда не девается и продолжает жить. Блин, сам запутался…

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

    Reply
  15. Evil Beaver

    (6) baton_pk, ну так с Visual Basic же язык копировали. Символ камента только другой взяли.

    Reply
  16. rtnm

    Я вижу так:

    Процедура КакаяТоПроцедура(Знач Значение)
    Значение = 123;
    КонецПроцедуры
    

    Это тоже самое, с точки зрения получаемого результата, что и:

    Процедура КакаяТоПроцедура(Значение)
    КопияЗначения = Значение; //Это делает платформа за кулисами
    КопияЗначения = 123;
    КонецПроцедуры
    

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

    Значение = 111;
    КопияЗначения = Значение; //Это делает платформа за кулисами
    КакаяТоПроцедура(КопияЗначения);
    

    Т.е. в случае использования ключевого слова «знач» платформа просто создает новую переменную и в нее копирует значение, вот так «КопияЗначения=Значение», и именно с этой копией вы работаете внутри процедуры.

    Это конечно не относится к особенностям ключевого слова «знач» при передачи управления с &НаКлиенте на &НаСервере и обратно.

    Reply
  17. avto1c
    &НаКлиенте
    Процедура ПоЗначениюКлиент(Знач Параметр)
    …

    И

    &НаКлиенте
    Процедура ПоЗначениюКлиент(Параметр)
    …

    Одно и тоже?…

    Косяк однако.

    Reply
  18. su_mai

    (12) alex_4x, А очень надо? Хотите решать коллизии не только с блокировками транзакций, но еще и потоков?

    Reply
  19. starik-2005

    (12) alex_4x, есть: http://infostart.ru/public/370384/

    Reply
  20. starik-2005

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

    Reply
  21. starik-2005

    (18) su_mai, про «коллизии» тоже есть статься: http://infostart.ru/public/384485/

    Reply
  22. starik-2005

    (17) avto1c, как раз не одно и то же. В одном случае параметр с ключевым словом «знач», а во втором случае — нет. В принципе это аналог Var в определении функции/процедуры в Pascal.

    Reply
  23. cssprite
    Reply
  24. klinval

    Не понял прикола в главе «Содержимое объекта и его состояние»…

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

    Reply
  25. Evil Beaver

    (24) klinval, а что непонятного? У вас есть массив, у него содержимое. Или например, объект ЧтениеXML, а у него состояние — текущий узел, на котором стоит чтение. Состояние объекта это его внутренние данные.

    Reply
  26. klinval

    (25) думаю в примере к «Содержимое объекта и его состояние» корректней добавить «Знач», т.к. то что всё изменится без «Знач» было понятно и так, а то что со «Знач» программа всё-равно может поменять «исходный» объект — это ранее в статье не объяснялось.

    Reply
  27. Evil Beaver

    (26) klinval, как это не объяснялось?

    Вот ссылка на ИТС из первого комментария: http://its.1c.ru/db/metod8dev#content:2606:hdoc

    Вот прямая цитата из статьи:

    При передаче по значению копируется не весь объект, а только его указатель. Экземпляр объекта остается одним и тем же. Неважно, как вы передаете объект, по ссылке или по значению — очистка таблицы значений приведет к очистке именно таблицы. Эта очистка будет видна везде, т.к. объект был один-единственный и неважно, как именно он передавался в метод.
    Reply
  28. alex_4x

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

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

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

    как это сделать ? пример может кто-то сделать?

    «Х» — задается на входе в функцию фабрику потоков.

    Reply
  29. starik-2005

    (28) alex_4x, да вообще не вопрос, но задача решается куда проще посредством запроса — SQL уже в несколько потоков получает выборки, поэтому достаточно написать «SEL ECT Товар,COUNT(DISTINCT Ссылка) FR OM Документ.ДокументОтгрузки.Товары GROUP BY Товар WHERE Товар IN (&СписокТоваров)».

    Но если хочется для этого использовать многопоточность, то вариант следующий:

    1. Задать количество потоков

    2. Получить список товаров

    3. Получить список из Н товаров для следующего потока

    4. Если количество потоков меньше Х, то стартануть еще один поток и запомнить его (фоновоеЗадание.Выполнить(«ИмяПроцедуры», Массивпараметров))

    5. Если потоков Х, то дождаться завершения любого из потоков (опрашивать потоки через «НЕ ФоновыеЗадания.ПолучитьФоновоеЗадание(ИдентификаторФЗ).Состояние = СостоянияФЗ.Активно»).

    6. Если данных больше нет — выйдем, иначе к п.3.

    Reply
  30. klinval

    (27) не правильно выразился: я имел ввиду не «не объяснялось», а «не приводилось примеров». Просто до этого куча примеров про то, что если передать по ссылке, то чтобы мы внутри процедуры не сделали — это изменит объект и вне этой процедуры. Так-же до этого приводится примеры как мы передаём «по значению» и вне процедуры мы никаких изменений объекта на видим. И тут в теме «Содержимое объекта и его состояние» говорится, что, оказывается иногда если передать «по значению» объект можно изменить. И в этой теме почему-то пример про передачу «по ссылке»… Тут я считаю логичней либо 2 примера, либо 1 «по значению», но никак не 1 «по ссылке».

    Evil Beaver, не сочтите, что я придираюсь, просто хотел внести посильный вклад в развитие статьи. А так статья хорошая, я плюсанул.

    Reply
  31. starik-2005

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

    Вот такой был пример:

    Код
    Стр = новый Структура("Поле1, Поле2, Поле3, Поле4, Поле5, Поле6, Поле7, Поле8, Поле9, поле10",
    1,
      Дата(2014,12,3),
       "Сложный случай",
       Новый УникальныйИдентификатор,
       ""+(Новый УникальныйИдентификатор),
       17672672.11223,
       "прыволрфволдрыолрв офрволрфылорв лофыр ловролф ыр длрфылдо рволдфыр олывр",
       11,
       Константы.Инсталляция.получить(),
       Константы.Инсталляция.получить().Организация);
    
    Время = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Для А = 1 по 100000 Цикл
       Стр1 = ОбщийМодульХХХ.ВернутьКопиюСтруктуры(Стр);
    КонецЦикла;
    Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - Время);
    
    Время = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Для А = 1 по 100000 Цикл
      Стр1 = ЗначениеИЗСтрокиВнутр(ЗначениеВСтрокуВнутр(Стр));
    КонецЦикла;
    Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - Время);
    

    Показать полностью

    В первом случае у меня было 15 136 мс, во втором — 15 789 мс = на 650 мс больше. При меньшем размере структуры (3 записи) результат повторяется в пользу цикла с вставкой элемента структуры по ключу. У вас также? Версия платформы 8.3.5.1248.

    Reply
  32. Evil Beaver

    (31) starik-2005,

    на 650 мс больше

    Это называется «в пределах погрешности измерений» )

    Reply
  33. starik-2005

    (32) за 20 тестов ВСЕГДА второе выполнялось медленнее первого на 500-1000 мс.

    Reply
  34. starik-2005

    (32) вот сделал 4 теста, время такое:

    1.

    15 164

    15 460

    2.

    14 665

    15 398

    3.

    15 132

    15 288

    4.

    15 132

    15 662

    Понятно, что загрузка сервера «плавающая», но ВСЕГДА второе выполняется дольше первого.

    Reply
  35. starik-2005

    (32) а вот для 1 000 000 итераций:

    149 684

    155 643

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

    Reply
  36. klinval

    Evil Beaver Если вызывать процедуру/функцию &НаСервере с процедуры, которая тоже выполняется &НаСервере будут работать правила описанные в «Клиент-серверное взаимодействие» или описанные выше?

    Reply
  37. WKBAPKA

    тю 🙂

    целая статья на простую тему. в описании к с или jave для работы с объектами это все описано 🙂

    Reply
  38. Evil Beaver

    (35) starik-2005, а если у вас структура структур, в каждой из которых таблицы значений, а в них — СпискиЗначений, которые содержат еще структуры и ТаблицыЗначений? ИзСтроки-ВСтроку это глубокая копия (всего графа объектов). А поэлементное добавление — совсем другой процесс, совсем другие алгоритмы и скорости.

    Reply
  39. Evil Beaver

    (37) WKBAPKA, А про 1С не было. А теперь — есть 🙂

    Reply
  40. starik-2005

    (38) мож потестите что-нибудь такое и выложите результаты? В 99% случаев копируются структуры с простыми типами. Более того, я в жизни еще пока не встречал случаев, зачем мне бы нужно было скопировать структуру.

    Reply
  41. Evil Beaver

    (40) starik-2005, я же не призываю вас делать только сериализацию и ничего больше. Просто если мне нужно получить глубокую копию коллекции и я не знаю, что в ней, то я лучше сделаю сериализацию.

    Reply
  42. starik-2005

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

    Reply
  43. FlyVodolaz

    (38) (41)

    Я бы не стал использовать ЗначениеИзСтрокиВнутр И ЗначениеВСтрокуВнутр если не знаю, что в структуре. Попробуйте сами. Объект — это основной реквизит управляемой формы.

    &НаСервере
    Функция Тест()
    Стр = Новый Структура(«Объект», Объект);
    Стр1 = Тест1(ЗначениеВСтрокуВнутр(Стр));
    КонецФункции
    
    &НаСервереБезКонтекста
    Функция Тест1(С)
    Возврат ЗначениеИЗСтрокиВнутр(С);
    КонецФункции

    Показать

    Reply
  44. WKBAPKA

    (39)

    🙂

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

    Reply
  45. AlexO
    Reply
  46. alex_4x

    Мне кажется бесполезно говорить про понятие указатель, если тот кому говорят о них знаком с программированием только на основе конструктора 1С.

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

    И всё таки не понятно, почему уже фактически завоевав рынок, 1С продолжает это движение «язык для детского сада, штаны на лямках, пусть криво и косо, главное просто». Ведь с их размахом, с их желанием автоматизировать крупные организации, с озвученным «клиент-серверным» развитием, от этого псевдоязыка надо бежать как от чумы. Ну это моё мнение. Если оставлять псевдоязык, то приводить его к нормам таких языков как java, c++.

    Reply
  47. AlexO

    (45) AlexO, небольшая неточность (описка):

    Потому что без разницы, когда передаем указатель на внутренний 1с-указатель (который «указывает» на данные, и обрабатывается исключительно платформой 1с) в случае передачи переменной «по ссылке», или сам указатель на внутренний 1с-указатель (передача «по значению»)

    следует читать как:

    «Потому что без разницы, когда передаем указатель на внутренний 1с-указатель (который «указывает» на данные, и обрабатывается исключительно платформой 1с) в случае передачи переменной «по ссылке», или сам внутренний 1с-указатель (передача «по значению»)»

    Reply
  48. Brawler

    (48) AlexO,

    снова станут «наполовину ОФ»

    Это вы о чем? Ради красивого словца?

    Reply
  49. AlexO

    (49) Brawler, как вам объяснить, если вы не знаете ни УФ, ни ОФ? Ну, поверьте, УФ стали снова «частично ОФ». И за счет этого улучшился немного функционал интерфейса форм.

    Reply
  50. Brawler

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

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

    Reply
  51. Brawler

    (46) alex_4x, я давно уже расценивают язык программирования 1С как скриптовый со всеми вытекающими. Как-то проще жить с этим грузом тогда ))

    Можно ругать 1С и их язык сколько угодно долго, но как попробуешь допустим в версии 7 Ариса попрограммировать на встроенном бейсике, так сразу с любовью вспоминаешь 1С )) Как говорится, бывает и хуже, а то что имеем уже хорошо, что оно у нас есть.

    Reply
  52. Evil Beaver

    (45) AlexO, здравствуй дорогой друг))

    Не напрягайтесь, вы все равно не знаете. А «делает» он вот что

    Не, ну хорошо, допустим, я ничего не знаю. Но вот с чего вы стали считать, что вы — знаете? :):):):)

    Reply
  53. alex_4x

    (52) Brawler, Ну да, конечно всё познается в сравнении. Но ведь есть например ява для далвиковской виртуальной машины на андроиде. Тоже скриптовый язык со всеми вытекающими последствиями, но реализовано концептуально более «продвинуто».

    Я не понимаю, почему выше написали что явная типизация типов данных на корню убьет весь язык 1С. Да, придется дописать уже написанные скрипты. Можно сделать директиву препроцессора #ТипизацияТиповВключена и #ИменемНуралиеваРаботайЧертоваХреньЧтобыНеСлучилосьАминьДелит­ьНаНольМожно

    Reply
  54. Evil Beaver

    (54) alex_4x, ява — скриптовый язык? А я вот задумался, действительно, а что такое «скриптовый» язык? Есть где-то определение?

    Reply
  55. alex_4x

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

    Dalvik — виртуальная машина Java, которая используется для запуска программ (только с APK-расширением)

    с целью сделать доступ быстрее и обеспечить безопасность системы. Dalvik использует собственный байт-код.

    При разработке приложения под Android переводятся компилятором в специальный машинно-независимый низкоуровневый код.

    При выполнении на платформе именно Dalvik интерпретирует и выполняет такую программу.
    Reply
  56. Evil Beaver

    (57) AlexO, слушай друг, я уже устал добиваться от тебя адекватных реакций. На прямые просьбы рассказать про твое «мастерство» и «знание» ты начинаешь лепить отмазки. Вывод — ты трололо и болтун. Несмотря на твои слова о том, что ты-то уж все знаешь и вообще мега-программист, у тебя здесь всего одна унылая публикация. А недавно и ни одной не было. Где творения твоего гения, покажешь может? Нет, не покажешь, их нет. Ты просто балабол, с тобой скучно. Если brawler хочет и дальше с тобой препираться, ради бога, а я пас. Я тебя и твою никчемность уже давно знаю ))

    Reply
  57. awk

    (56) alex_4x, Dalvik — это регистровая виртуальная машина, а не интерпретатор. Так что java не скрипт.

    Reply
  58. Evil Beaver

    (59) awk, интерпретатор и машина (стековая/регистровая) это ортогональные понятия вроде как… Одно другого же не исключает. Вообще, интерпретатор это чего такое? У него машины нет?

    Reply
  59. ИНТЕГРА

    Или я туплю или куча опечаток в примерах кода. Читать даже не хочется. «Аффтор жжот». В любом случае статья явно не для программистов.

    Reply
  60. awk

    (60) Все-таки разница есть. Если по аналогии с БУ то есть трансляция учета, а есть трансформация. Так вот: Интерпретатор выполняет трансляцию, а компилятор трансформацию. Виртуальная машина — это интерпретатор байт кода. JIT — это компилятор. А интерпретатор языка — вообще никакой компиляции не выполняет. На интерпретируемых языках пишут сценарии, а на компилируемых — программы. Когда говорят, что: «1С-совцы не программисты» — я говорю: «Да, они сценаристы». Но 95% людей это все по барабану.

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

    Глупость полная. Компиляция для Dalvik проходит дважды:

    1. Исходники java -> байт код

    2. Байт код -> DEX байт код

    Reply
  61. baton_pk

    (62) awk, ходят некоторые слухи, что 1С всё-таки исполняет байт-код, а не интерпретирует эти ваши Пока и Если 🙂

    Reply
  62. awk

    (63) baton_pk, Это не байт-код,

    {}

    но…

    Reply
  63. WKBAPKA

    (48) AlexO,

    1C решает основные задачи да и ладно.

    А с УФ полностью согласен. Тормоза еще те. А реализация конфигураций под УФ, это застрелиться можно )

    Reply
  64. Evil Beaver

    (64) awk, вот это

    {}

    сериализованный байт-код. По крайней мере, в том смысле, в котором я понимаю этот термин. Поток инструкций формата опкод+аргумент

    Reply
  65. Evil Beaver

    (61) ИНТЕГРА, примеры опечаток тогда уж приведите, я с удовольствием поправлю.

    Reply
  66. awk

    (66) Каждый код операции байт-кода — один байт. У 1С не байт код.

    Reply
  67. ИНТЕГРА

    (67) печально-известный AlexO написал тоже об этом. В этом топике Я, как ни странно, на его стороне. Конечно он перегибает по поводу проблемности 1С.

    Вот такие несогласованные вызовы:

    Таблица = Новый ТаблицаЗначений;
    ОбработатьЗначение(Параметр);

    Таблица = Новый ТаблицаЗначений;
    Таблица.Добавить();
    ОбработатьЗначение(Параметр);

    В более сложный пример даже вникать не стал.

    Reply
  68. Evil Beaver

    (69) ИНТЕГРА, спасибо за конструктив. Исправлю, конечно, набирал прямо в редакторе Инфостарта. Но опечатка в коде не меняет сути темы.

    Reply
  69. Evil Beaver

    (68) awk, Википедия говорит про байт-код:

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

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

    Reply
  70. awk

    (71) Строка «255» в UTF-8 — это 3 байта. Так что формально у 1С не байт код.

    Reply
  71. Brawler

    (73) awk, ну тогда МУЛЬТИ байт код ))))

    Reply
  72. Evil Beaver

    (73) awk, ну я ж не зря написал «сериализованный» )) В памяти-то оно наверняка не строками в момент исполнения. А так, да, мы друг-друга поняли )

    Reply
  73. ИНТЕГРА

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

    В дополнение — каждый программист обязан знать язык Си++, иначе он не более чем сисадмин.

    Reply
  74. Brawler
    каждый программист обязан знать язык Си++

    (76) ИНТЕГРА, больно сильное заявление однако.

    Вы бьете ниже пояса программистам, которые пишут на том же Object Pascal )))

    Reply
  75. starik-2005

    (76) ИНТЕГРА, не С++ — это лишь один из языков программирования. И если уж говорить о понимании того, как работает процессор, то можно заявить, что каждый программист должен знать ассемблер (я, например, для трех архитектур ассемблер знаю: Z80 (Спектрум), СМ (PDP-8, ДВК, …), х86 (IBM-совместимые ПК). При том не просто знать команды, но и понимать архитектуру портов ввода-вывода (PC) / системных регистров (CM), знать вектора прерываний, … В итоге так мы дойдем до системного программиста, который решает совершенно иные задачи. Если верить книге «Совершенный код» (Макконнелл), то системный код куда сложнее прикладного и при ревизиях кода (методология уменьшения ошибок в программе примерно в 8 раз эффективнее тестирования) количество просматриваемых строк системного кода на порядок ниже, чем прикладного.

    Да, знать какой-нибудь компилируемый язык программирования — это хорошо. Уметь написать на нем что-либо — еще лучше. Но эти знания сами по себе не дают никакого преимущества при разработке систем на базе 1С. Но если есть возможность применить подобные знания — это плюс. Например, у нас в конторе мы написали два приложения на Delphi. Первое — это стартер 1С, который получает информацию о списке баз из вебсервиса базы 1С, в которой содержится информация о пользователях и доступных им базах. Вторая — это принтер чеков для автоматической печати чеков из систем онлйан-бронирования. И все это из-за глючности самой 1С и невозможности доверить ей критические задачи, в которых время является одним из решающих факторов. Я не могу быть уверен, что клиент 1С. печатающий чеки по обработке ожидания, в один прекрасный момент не умрет. А вот постоянно рестартующий и самодиагностирующий комплекс на Delphi мало того, что запускается считанные микросекунды, так и анализ своей функциональности за доли секунды проверяет и при необходимости заменяет зависший процесс. В этом плюс такого подхода. Но если необходимо работать с сотней разных документов, сотней печатных форм, все это где-то хранить и не требовать немедленного доступа — 1С вполне подойдет. И в знаниях языков низкого и среднего уровня для доработки такой системы необходимости. ИМХО, нет.

    Reply
  76. baton_pk
    настоящий программист обязан

    Attention! Holy-war detected!

    (76)

    каждый программист обязан знать язык Си++

    Почему не Си, не Раст, не Д, не Го, не ассемблер каждого из семейств процессоров?

    Даже дедушка Строуструп не знает язык Си++. Вы вообще читали его стандарт целиком?

    Reply
  77. Evil Beaver

    (79) baton_pk,

    Почему не Си

    Ага, даешь еще дров в костер холивара! Линус Торвальдс, например, глумливо материт «плюсовцев» и их язык. А равно как и ООП, считая его ересью от программирования. Си-плюс-плюсники — НЕНАСТОЯЩИЕ ПРОГРАММИСТЫ!

    Reply
  78. ИНТЕГРА

    (77) Brawler, Паскаль устарел

    Reply
  79. ИНТЕГРА

    (78) starik-2005, Прочел твое сообщение только первый абзац. Молодец, что знаешь что-то еще помимо 1С. Это тебе дает преимущество при разработке перед чистым 1С-ником хотябы уже потому, что тебе не надо тратить время на понимание как работает передача параметров в функцию и делать детские ошибки, которые очень тяжело отловить.

    Второй абзац прочел «по-диагонали», тк там лирика с которой я не согласен.

    Reply
  80. ИНТЕГРА

    (79) baton_pk, Во времена Строуструпа не было Си++. Технологии развиваются, требованию растут. Сегодня это базовые знания. Стандарт конечно читал, естественно не весь, тк во многих вещах опыт позволяет разбираться самостоятельно. Именно опыт грамотной разработки — это то что я хочу «навязать» сообществу не согласных.

    Reply
  81. starik-2005

    (90) ИНТЕГРА, «Бьерн Страуструп — программист, автор языка программирования C++. Википедия» — гугл. Именно он написал книжку С++. разница между С++ и С в наличии в первом объектной модели по большому счету.

    Reply
  82. awk

    (93) starik-2005,

    разница между С++ и С в наличии в первом объектной модели

    Садись, два… :))))

    Reply
  83. starik-2005

    (95) awk, всегда интересно узнать от других то, что поможет мне что=то понять лучше. Пока не вижу, в чем же, по-Вашему, отличие между С и С++.

    Reply
  84. awk

    (99) starik-2005, О каких версиях Си и Си++ идет речь?

    Reply
  85. starik-2005

    (101) awk, ну как бы стандартом считают ANSI C (ISO C), написанная на котором программа будет компилироваться на любом компиляторе. В последствии стандарт был дополнен С99 и С11, которые, в общем и целом, вбирали в себя все отличия между С и С++, кроме указанного мной — объектной модели. В стандарт С11 даже была включена многопоточность, реализуемая соответствующими библиотеками.

    В конце 1970-х годов С начал вытеснять Бейсик с позиции ведущего языка для программирования микрокомпьютеров. В 1980-х годах он был адаптирован для использования в IBM PC, что привело к резкому росту его популярности. В то же время Бьёрн Страуструп и другие в лабораториях Bell Labs начали работу по добавлению в С возможностей объектно-ориентированного программирования. Язык, который они в итоге сделали, C++, оказал большое влияние на разработку ПО, но так и не смог сравняться по популярности[1] с Си, особенно в UNIX-подобных системах.

    — Википедия.

    Здесь, собственно, и говорится о том, что первоначально Бьерн занимался именно добавлением в С объектной модели. В остальном они в последней версии стандарта практически идентичны, если не считать накопленных за время совместного развития деталей, влияние которых на синтаксис весьма условно, а на функционал — менее, чем заметно.

    Reply
  86. Brawler

    (88) ИНТЕГРА, про устаревший паскаль расскажите группе программистов в моем отделе вояющих софт внутрикорпоративный на делфях ХЕ2 (а главное расскажите это руководителю моего подразделения), да и еще знаю примеры поделок на данном языке и в данной IDE ну то бишь Delphi. И их даже продают!

    ИМХО делфи я бы уже похоронил, не язык, а именно среду разработки. Как замену рассматриваю только VS + C#.

    Для реализации учетных задач, так вообще ИМХО 1С на коне, да не супер возможности для реализации всяких рюшечек (красявости UI типа ribbon интерфейса) нравящихся руководителям, но не из-за рюшечек единых же в организация строится учет.

    Reply
  87. awk

    (102) starik-2005, Я не вижу смысла вам что-то расписывать, так как с то же страницы, откуда вы выдернули свою цитату есть:

    Язык программирования C++ произошёл от Си. Однако в дальнейшем С и C++ развивались независимо, что привело к росту несовместимости между ними. Редакция C99 добавила в язык несколько конфликтующих с C++ особенностей. Эти различия затрудняют написание программ и библиотек, которые могли бы нормально компилироваться и работать одинаково и в С и в C++, что, конечно, запутывает тех, кто программирует на обоих языках.

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

    Различия между этими языками, существующие на сегодня[когда?]:

    inline — подставляемые функции существуют в глобальном пространстве C++, а в Си — в пространстве файла (статическом пространстве). Другими словами, это значит, что в C++ любое определение подставляемой функции (независимо от переопределения функций) должно соответствовать правилу одного определения, требующего того, чтобы любая подставляемая функция была определена только один раз. В С же одна и та же подставляемая функция может быть определена по-разному в разных компилируемых файлах одной программы.

    В отличие от C++, макрос bool в C99 требует включения соответствующего заголовочного файла stdbool.h. В стандарте C99 определён собственный тип логических данных _Bool. Предыдущий стандарт С (C89) не определял булевый тип вообще, поэтому для этого часто использовались различные (а значит, несовместимые) методы.

    Символьные константы (заключённые в одинарные кавычки) по умолчанию имеют: тип int в С и тип char в C++. Поэтому в С справедливо равенство sizeof(‘a’) == sizeof(int), а в C++ — равенство sizeof(‘a’) == sizeof(char).[11]

    Некоторые новые возможности C99, в первую очередь, restrict, не включены в C++.

    Что наводит меня на мысль о бессмысленности больших постов для вас. Вы их не прочтете…

    Reply
  88. ИНТЕГРА

    (104) Brawler,

    группе программистов в моем отделе вояющих софт внутрикорпоративный на делфях ХЕ2… И их даже продают!

    Что только не продают; на чем только не пишут 🙂 Я-же говорю о вечном. Паскаль я забросил, когда напоролся на проблемы в нем с виртуализацией методов (тогда еще он был TURBO). И понял, что надо двигаться дальше. Очень хороший язык для обучения, чтобы потом перейти к Си++.

    ИМХО делфи я бы уже похоронил, не язык, а именно среду разработки. Как замену рассматриваю только VS + C#.

    Для реализации учетных задач, так вообще ИМХО 1С на коне, да не супер возможности для реализации всяких рюшечек (красявости UI типа ribbon интерфейса) нравящихся руководителям, но не из-за рюшечек единых же в организация строится учет.

    Ну вот, и ты туда-же. Все правильно говоришь. Че спорить-то? 🙂

    Reply
  89. starik-2005

    (106) awk, это говорит как раз об обратном — о бессмысленности Вам читать любые длинные посты, ибо сути Вы все равно не улавливаете ))) Те различия, о которые Вы тут скописпастили, не являются существенными различиями в языках, а вот объектная модель — различие существенное, указывающее на принципиальную разницу. А то, что Вам хочется, чтобы Вы тоже были правы, в принципе ненаказуемо. Другое дело, что излишняя педантичность Вам мешает. Можно найти много общего между обезьяной и человеком, как, впрочем, и различного, но, согласитесь, основным различием все-таки будет уровень интеллекта.

    Reply
  90. alexovik

    (14) Если честно, спасибо Вам огромное за Вашу статью, сам парился полдня, потому что не мог скопировать полностью КомпоновщикНастроек пока не нашел Вашу статью, попробывал передачу через Знач и через клиент — сервер и получилось как хотелось. Еще раз спасибо за статью! 🙂

    Reply
  91. АлександрЯрославичъ
  92. WKBAPKA

    (46) на этот вопрос можно ответить только тогда, когда перешел с 1С на нормальный язык программирования. Все очень просто, как ты и писал, язык рассчитан на «программистов». Даже некоторые отклонения от простоты, где уже есть разного рода билдеры, надо вызывать разные методы, стопорят мозг обычному 1С-нику. А уже про знания разного рода паттернов, я молчу

    По себе сужу.

    Когда я начал изучать Java, классно круто. Но все не понятно. Мне понадобилось достаточно много времени что бы просто въехать (с учетом работы на 1С). По прошествии нескольких лет, я еще даже не middle. Вещи, в стиле лямда выражений вводят меня на короткое время в ступор, ну а про Kotlin даже не хочу говорить. Программировать на Java может только программист. А это большая разница, программист на 1С и на Java.

    Если сравнивать тот же Java с 1С,это как сравнивать 7.7 с 8.х и то натянуто.

    Уровень квалификации уже нужен другой

    Reply
  93. Brawler

    (1) за мудрено пишите

    передача параметра по значению = выделяется в памяти еще грубо говоря одна переменная, которой присваивается то же самое значение и код вызванного метода (процедуры/функции) использует в свое работе именно эту новую переменную, и не может попортить значение другой переменной. Однако так как, если в переменных лежит один и тот же мутабельный объект, то изменить его свойства вызванный метод вполне способен и тогда когда метод закончит свою работу, то вызвавший его ранее метод будет работать с уже измененным объектом внутри переменной, но сама переменная так и будет ссылаться на тот же объект, что был в ней изначально. С простыми типами типа Число, Булево, Строка… там все просто, в новой переменной вызванный метод может изменить только само значение новой переменной и это никак не повлияет на значение той переменной, что была использована в качестве аргумента для вызова метода.

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

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

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

    Reply
  94. WKBAPKA

    (138) что мудрено?

    есть примитивные типы данных, а есть структуры данных (классы, объекты). Я не знаю как в 1С, но в Java хранятся они в разных областях памяти. Для манипулирования объектом используются указатели. При присвоении значения новой переменной, новая переменная содержит указатель на ту же область памяти. И я могу манипулировать данными объекта.

    Пример:

    Var1 = new MyObject();

    Var1.doSomething(10);

    Var2 = Var1;

    Var2.doSomething(12);

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

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

    Reply
  95. Brawler

    (139) Постольку поскольку в 1С нет жесткой типизации данных, то можно говорить, что там вообще один единственный тип данных Variant и хранятся данные возможно вообще все в куче, но это не точно, да и не важно где они хранятся, зачем прикладному программисту так много знать о том что завтра может уже работать и по другому.

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

    В своей практике программирования на 1С вообще не приходится сталкиваться с тем чтобы так клонировать данные в памяти.

    В мире того же C# есть свои танцы с бубноми по теме клонирования объектов и там это решается по своему гуглите «Копирование объектов. Интерфейс ICloneable».

    Reply
  96. Evil Beaver

    (139)

    уверен, что происходит создание копии передаваемого объекта

    НЕТ! Передача переменной-объекта в 1С ничем не отличается от передачи переменной-объекта в Java. Просто в Java нет понятия «передача по ссылке» и вы не можете там поэкспериментировать с этим поведением.

    Reply
  97. Evil Beaver

    (147) Парни, ну вот вы нашли друг-друга то….

    1С НИЧЕМ не отличается от С++ и C# в части передачи значений в методы. От Java тоже ничем не отличается, только в Java нет передачи по ссылке, поэтому все идет «по значению». Если в Java вы передали List в метод, то этот ТОТ ЖЕ САМЫЙ List и никакой копии его не происходит. Создайте в Java List на миллиард записей размером по килобайту. А теперь передайте этот List в какой нибудь метод. Заметна потеря времени на «копирование при передаче по значению»? Нет, т.к. никакого копирования нет, передается только указатель. Но передается он «по значению», т.к. нельзя заменить значение, лежащее в этом указателе, так, чтобы это изменение было видно за пределами метода.

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

    Reply

Leave a Comment

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