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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *