Кольцевые ссылки в скриптах 1С




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

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

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

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

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

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

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

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

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

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

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

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

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

72 Comments

  1. Арчибальд

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

    Reply
  2. tango

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

    Вот, думается, не потому ли конфигуратор время от времени схлопывается, что 1сина так же грязно работает и в этом режиме?

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

    (2) Я это и имел в виду. Не просто убить ссылку, но сначала убить то, на что она ссылается. Помню, была в Эльбрусе процедурка с двусмысленным именем ВернутьПамЯть 😀

    Reply
  4. tango

    А как?

    Сделаем в ПриЗакрытии

    Фрм = «»;

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

    Сама-то она останется в памяти как пустая строка (или нет?)!

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

    Reply
  5. steban

    1С использует подсчет ссылок (reference counting) а не сборку мусора. Так что надеяться на уничтожение объектов, на которые не осталось внешних ссылок, не стОит. При достаточной изворотливости можно наделать циклических ссылок и утечек памяти.

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

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

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

    Reply
  7. tango

    (5) значит ли это, что 1с в обозримом будущем от сабжа не избавится, и это фича, а не баг, и можно смотреть на полезное использование?

    Reply
  8. tango

    Определение: reference counting

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

    http://www.pcmag.ru/encyclopedia/term.php?ID=4091

    Reply
  9. tango

    Для понимания того, как Python находит значение некоторой переменной, необходимо ввести понятие блока кода. В Python блоком кода является то, что исполняется как единое целое, например, тело определения функции, класса или модуля.

    Локальные имена — имена, которым присвоено значение в данном блоке кода. Глобальные имена — имена, определяемые на уровне блока кода определения модуля или те, которые явно заданы в операторе global. Встроенные имена — имена из специального словаря __builtins__.

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

    Так как переменную можно связать с объектом в любом месте блока, важно, чтобы это произошло до ее использования, иначе будет возбуждено исключение NameError. Связывание имен со значениями происходит в операторах присваивания, for, import, в формальных аргументах функций, при определении функции или класса, во втором параметре части except оператора try-except.

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

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

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

    Никогда не следует использовать from модуль import * — это может привести к затенению имен из других модулей, а внутри определения функции просто запрещено.

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

    Убрать связь имени с объектом можно с помощью оператора del. В этом случае, если объект не имеет других ссылок на него, он будет удален. Для управления памятью в Python используется подсчет ссылок (reference counting), для удаления наборов объектов с зацикленными ссылками — сборка мусора (garbage collection).

    http://www.intuit.ru/department/pl/python/1/7.html

    Reply
  10. tango

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

    http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D1%81%D­1%81%D1%8B%D0%BB%D0%BE%D0%BA

    Reply
  11. tango

    Основные понятия сборки мусора. Для системы управления памятью работа приложения может быть представлена как последовательность обращений к памяти. Связанная совокупность данных, создаваемая в результате размещения объектов, назначения и модификации указателей, может рассматриваться как направленный граф достижимости, узлами которого являются используемые объекты в куче, а связями – указатели. Исходное множество ссылок (root set), задается набором ячеек памяти, хранящихся вне области кучи и содержащих указатели на объекты в куче. Root set может состоять из статических переменных, объектов системных классов, локальных переменных процедур, регистров и т.д.

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

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

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

    http://www.swsys.ru/index.php?page=article&id=963

    Reply
  12. tango

    (10) vs (5)

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

    Вопрос — как?

    Reply
  13. marsohod

    (0) 😮 😮 😮

    (6)

    предупрежден — значит, вооружен

    как это верно…

    Reply
  14. steban

    (12)

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

    из (10) не следует возможность сослаться на неудаленный объект, на который нет внешних ссылок

    Reply
  15. steban

    +(14) то, что я назвал «внешними ссылками», в (11) описано как rootset

    Reply
  16. tango

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

    Reply
  17. steban

    (16)нет.

    вот эта строка приводит к созданию циклических ссылок:

    Фрм = ПолучитьФорму(«Форма»)

    Если ее убрать, то «роскошный глюк» таковым быть перестанет

    Reply
  18. steban
    значит ли это, что 1с в обозримом будущем от сабжа не избавится, и это фича, а не баг

    скорее всего — да

    Reply
  19. tango

    (17) если Фрм не назначать Экспорт, то Фрм = ПолучитьФорму(«Форма») не дает сабжа.

    Наверное, кольца ссылок все-таки нет, есть некая «внутренняя», которая порождается Экспротом

    **

    и не очищается при закрытии формы

    Reply
  20. steban
    если Фрм не назначать Экспорт, то Фрм = ПолучитьФорму(«Форма») не дает сабжа

    убрал Экспорт. Форма не умерла.

    Движок 8.1.14

    Reply
  21. steban

    При внимательном чтении описания метода «ПолучитьФорму» в синтакс-помощнике, можно сделать вывод, что Фрм=ПолучитьФорму(«Форма») эквивалентно Фрм=ЭтаФорма

    Reply
  22. tango

    (20) упс… сейчас посмотрю, умиралажже

    Reply
  23. steban
    Фрм = ПолучитьФорму(«Форма»,,3)

    возвращается новая форма, циклических ссылок нет, все умирают.

    Reply
  24. steban

    Создай новую внешнюю обработку, в ее модуле напиши

    Перем Т;
    
    Т=Новый ТаблицаЗначений();
    Т.Колонки.Добавить(«т»);
    Для Сч=1 По 1000000 Цикл
    Стр=Т.Добавить();
    Стр.Т=Т;
    КонецЦикла; 

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

    Reply
  25. tango

    Вот Ой! так Ой!

    правда, не умирает.

    стало быть, фрм=ЭтаФорма…

    Reply
  26. tango

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

    Reply
  27. steban
    Однакож, здесь-то где закольцованная ссылка? Т в Т?

    после окончания цикла счетчик ссылок на Т будет равен 1000001 (переменная модуля ссылается на Т + миллион ссылок внутри самой Т).

    При разрушении объекта обработки счетчик ссылок на Т будет уменьшен на 1, и т.к. он все еще положителен, то Т уничтожена не будет

    Reply
  28. steban

    1. «взрослые дяди» оказались обруганы ни за что,

    2.

    Постарайтесь как можно меньше использовать в своей работе ключевое слово Экспорт

    сомнительная рекомендация, основанная на ложных выводах

    3. «Роскошный глюк» оказался ожидаемым поведением

    Reply
  29. tango

    Ок, я сообразил, почему на Экспорт погрешил: эксперементировал, когда Фрм была в модуле объекта.

    Reply
  30. tango

    (28) текст публикации уже поправил, см. первый абзац

    Reply
  31. tango

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

    Reply
  32. steban

    (31) рекомендация использовать голову никогда лишней не будет 😉

    Reply
  33. tango

    блин, сними минус, steban, поправилж

    Reply
  34. steban

    (33)уже

    Reply
  35. tango

    Имхо, фи к «взрослым» так же остаются в силе.

    1. Программеры камней (базовый ввод-вывод)

    2. Программеры ОС (виндовс, люникс, etc)

    3. Программеры «взрослых» языков (си, паскаль, ява,..)

    4. Программеры прикладных пакетов (1с,..)

    5. Программеры скриптов (веб-дизайнеры, 1сники,…)

    Очевидно, проблема циклических ссылок органично существует на 3. уровне (может быть, и на 1.,2.)).

    Но не менее очевидно, что на уровнях 3.-4. эта проблема ДОЛЖНА быть решена уже и НЕ транслироваться на уровень 5.

    Reply
  36. Душелов

    (38) В C# при возникновении бесконечного цикла срабатывает исключение.

    Reply
  37. steban

    (38)

    Очевидно, проблема циклических ссылок органично существует на 3. уровне (может быть, и на 1.,2.))

    Но не менее очевидно, что на уровнях 3.-4. эта проблема ДОЛЖНА быть решена

    Я бы не сказал, что она ДОЛЖНА быть решена.

    Выбор между RC и GC — это выбор между накладными расходами на сборку мусора или возможными утечками памяти (которых можно избежать). Те, кто проектировал 1С, сделали свой выбор в пользу «возможных утечек».

    Reply
  38. steban

    рискуем скатиться в холивар C++ vs С# 🙂

    Reply
  39. tango

    Свой выбор они сделали. Однако в мануалах написать об этом забыли.

    Reply
  40. tango

    (41) вот, вот. 1сниковское ли это дело?

    Reply
  41. steban

    (42)

    Свой выбор они сделали. Однако в мануалах написать об этом забыли.

    Диск ИТС.

    Методическая поддержка 1С:Предприятия 8.1 -> Методические рекомендации по конфигурированию -> Встроенный язык -> Особенности хранения значений в переменных модулей объектов и форм

    В платформе 1С:Предприятие 8 используется стратегия управления временем жизни объектов, основанная на подсчете ссылок на объекты — reference counting. Данная стратегия заключается в следующем. Каждый объект платформы содержит счетчик ссылок. При появлении ссылки на объект (объект присваивается какой-либо переменной) происходит увеличение счетчика на единицу, при уничтожении подобной ссылки —

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

    Особенностью подсчета ссылок на объекты является возможность организации «циклической ссылки». Циклическая ссылка возникает, когда объекты начинают ссылаться друг на друга. Это приводит к ситуации, при которой ни один из объектов, участвующих в циклической ссылке, не будет уничтожен. В свою очередь это является причиной возникновения утечек памяти (memory leaks).

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

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

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

    2 хранение ссылки на владеемый объект в объекте-владельце и ссылки на объект-владелец во владеемом объекте — оба объекта никогда не будут уничтожены.

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

    Reply
  42. tango

    (44) ок, дурак, ваше благородие 🙂

    Reply
  43. steban

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

    Reply
  44. tango

    Технологических журналов в кадетском корпусе не проходили.

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

    Reply
  45. tango

    (28) Нет, это НЕ ожидаемое поведение. Ожидаемое — это закрыли, значит закрыли.

    И то, что нам задним числом, за отдельную плату, объяснили (44), чего они НЕ сделали, дела не меняет.

    Reply
  46. tango

    Кольцевые ссылки — полезное применение.

    http://www.infostart.ru/forum/messages/forum1/topic30204/message339521/?result=new#message339521

    Reply
  47. artbear

    Для выравнивания ситуации также минусану.

    Давным-давно известная проблема, со времен 7.7 ничего не изменилось 🙁

    Как уже steban написал, 1С выбрала наиболее простой, определенный и быстрый метод.

    Reply
  48. artbear

    Последние абзацы в описании вообще не понятны — кого убивать-то?

    Reply
  49. Dementor

    (46) Не купил, а украл. Практически со всеми конфами (типовыми так точно) идет подписка ИТС на 6 месяцев. Но даже если платформа идет не совсем законным путем, то что мешает «от туда» взять и образ ИТС?

    За напоминание про циклические ссылки — спасибо.

    Reply
  50. steban

    2tango

    Расскажи мне, пожалуйста, почему выставление минуса публикации ты посчитал личным оскорблением и решил ответить личным оскорблением в описании публикации?

    Reply
  51. iceflash

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

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

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

    Reply
  52. steban

    ответь на (54)

    Reply
  53. tango

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

    разработчики не стали (поленились, недопёрли) этого сделать. это плохо. в смысле — недостаток оболочки для 1снегов.

    Reply
  54. artbear

    (0) Имей уважение к оппонентам.

    Пиши имени/ники оппонентов правильно, а не как тебе хочется.

    Некоторые твои сообщения скрыты из-за нарушения п.3 и п.4. правил

    Reply
  55. tango

    ок, исправлю в публикации своё фырканье в адрес оппонента. тем более, что он фактически соавтор оной 🙂

    Reply
  56. pencroff

    Здесь все обсуждают то что могут быть кольцевые ссылки и утечки памяти. Подскажите как бороться с этими самыми утечками памяти в скрещенной конфигурации. Скрестили так что месячный документооборот при перепроведени = 1Gb оперативки. Как работать с технологическим журналом? Кто сталкивался с такими вопросами?

    Reply
  57. AlexO

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

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

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

    Reply
  58. tango

    (66) AlexO,

    такое просто так не сделаешь

    если что-то может быть сделано, кто-нибудь это сделает

    Reply
  59. a-novoselov

    Сбор мусора, коллеги, это прошлый век!))

    Посмотрите Win8 (специальные приложения на новом API) или Android — там память очищается всегда автоматически. Если не нужна программа, или форма программе, да и фиг с ней — пометили как не нужную и система сама заменит новыми данными, когда память нужна станет. И даже после закрытия программы, данные этой программы остаются в оперативной памяти. Зато при повторном запуске мгновенно открывается на том же месте, где закрыл. Сбор мусора — очень дорогостоящая и ни кому не нужная операция. Тем более сейчас даже на мобилках по 2 Гб оперативной памяти ставят, не говоря уж про десктопы. Мне кажется лет через пять программисты вообще забудут о том, что такое сборщик мусора, как о страшном сне. Так же, как когда-то забыли о необходимости встраивать драйвера для всех видео- и звуковых карт в свои приложения, когда вышел DirectX и OpenGL. А вы что думаете по этому поводу?

    Reply
  60. AlexO

    (68) a-novoselov,

    пометили как не нужную и система сама заменит новыми данными

    скажите об этом разработчикам 1С с их бесконечными утечками памяти.

    И даже после закрытия программы она остается в оперативной памяти

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

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

    Вы имеете весьма и весьма отдаленное представление о работе копмьютера, ОС, программ и 1С.

    В данном случае — перепутали очистку памяти (сборку мусора) с кэшированием/загрузкой памяти.

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

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

    Так же, как когда-то забыли о необходимости писать драйвера под все видео- и звуковые карты, когда вышел DirectX и OpenGL

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

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

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

    Reply
  61. AlexO

    (68) a-novoselov,

    Android — там память в принципе не очищается.

    архивируется и самовоспроизводится в кремниевых кристаллах?

    Reply
  62. a-novoselov

    (70) Что за привычка к словам цепляться…

    Имелось ввиду память не очищается приложением, а очищается самой системой.

    Так же как в Java память очищается средой исполнения а не конечной программой. И 1С сама память очищает, за редким исключением)

    (69) А про OpenGL имелось ввиду не разработка драйверов в принципе, а то что их не нужно стало включать в каждую игру. Помните под ДОСом чтобы что-то запустить сперва конфигурируешь настройки встроенных драйверов через setup.exe… Прописываешь IRQ и DMA каналы для звуковой карты и т.д. Я не про производителей оборудования говорил, что им не нужно будет драйвера писать, а про разработчиков конечных приложений для пользователей.

    Reply
  63. AlexO

    (71) a-novoselov,

    а то что их не нужно стало включать в каждую игру.

    Так это и есть применение унификации через API, а не встройка драйверов устройств — в игры. Вы же пишите про драйвера к устройствам, а не к играм.

    Прописываешь IRQ и DMA каналы для звуковой карты

    Только лишь потому, что плата не предоставляла такую информацию драйверу, и приходилось их размещать вручную. Сейчас — предоставляет, и драйвер настраивается на «все те же прерывания» автоматически.

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

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

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

    Имелось ввиду память не очищается приложением, а очищается самой системой.

    Посмотрите, что сами же и написали:

    Посмотрите Win8 … или Android — там память в принципе не очищается. Если не нужна программа, или форма программе, да и фиг с ней — пометили как не нужную и система сама заменит новыми данными, когда память нужна станет. И даже после закрытия программы она остается в оперативной памяти.
    Reply
  64. a-novoselov

    (72) Изменил сообщение, чтобы сложнее было к словам придираться… Так что же, все таки, думаете по сути вопроса? а не про глубину и широту ваших познаний в области архитектуры ПК перед моими… Нужна будет забота об очистке памяти разработчикам конечных приложений для пользователей?

    Reply
  65. AlexO

    (73) a-novoselov,

    Нужна будет забота об очистке памяти

    А как вы представляете без этого? 🙂

    Самоочищающийся модуль памяти? Так еще не изобрели такого.

    Reply
  66. tango

    Ладно. Тема, похоже, бессмертна, как перенумератор.

    Reply
  67. AlexO

    (75)

    На самом деле, почему бы просто не написать:

    — не пользуйте во внешних отчетах, обработках присвоение в переменной уровня модуля объекта — ссылки на какую-либо форму этой же обработки/отчета

    Перем Форма; Форма = ПолучитьФорму(«ДопФорма»); Форма.Открыть();

    , т.е. не делать циклическую ссылку на сам объект (внешнюю обработку/отчет) через вызов формы как части этого объекта, а если есть в этом нужда — ПриЗакрытии явно очищать эту переменную Форма;

    — не пользуйте во внешних отчетах, обработках присвоение переменной уровня модуля объекта/реквизиту объекта — установку ссылки на саму себя «любимую», тем более — в цикле а-ля пример из ( 24) (а для реквизита внешней обработки/отчета — избегать присвоение ему ссылки на него самого, как в коде, так и в задании Типданных «вручную» в «Свойствах»).

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

    А то на ИТС это занимает целую страницу «мелким почерком», да еще и в разных местах, да еще и не все варинаты и неполное описание….

    Reply
  68. tango

    (76) AlexO, привет

    почему бы просто ни написать

    Потому что изначально — «доступно и всериоз»

    Потому что до сих пор предмет гордости — прибыль на количество сотрудников

    «пипл схавает»

    **

    да, еще: «Проблемы индейцев вендора не…». Ну то есть клиентами для флагмана являются франи, а не конечные юзеры

    Reply
  69. AlexO

    (77)

    у меня вообще подозрение, что внутри 1С в части разработки платформы, методологии и написания справок/ИТС все еще более запутанно и «не по уму» 🙂

    Об этом в этом сообщении.

    Reply
  70. tango

    (78) AlexO, Что творится в кишках вендора, можно только строить предположения.

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

    Reply
  71. AlexO

    (79)

    Привет, конечно же 🙂

    более на «чего изволите»

    А кто вот предъявляет это «изволяю»?! Вот его и надо вывесить …. на всеобщее обозрение…

    Reply

Leave a Comment

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