Структура подчинености. Правильное отображение.




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

88 Comments

  1. mosAdm

    Замерил производительность 14 секунд (второй запуск обработки) и менее секунды типовая. Мдассссссссссссс запустил третий раз и не подумав флаги поставил (искать мол в шапке таб частях) . Конфу закрывал через диспетчер

    Reply
  2. vladnet

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

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

    Да а зачем через диспетчер закрывали, неужто ctrl+break не помог? В коде прерывание пользователя прописано.

    Reply
  3. vladnet

    (1) Когда получилось 14 секунд, сколько документов вывелось в отчет?

    Reply
  4. CheBurator

    неестественно снизу вверх

    Reply
  5. artem666

    по мне так, типовая вполне нормальная, при виде такого графа юзер просто очумеет…

    Reply
  6. mosAdm

    (3) совсем не много 5 или 7, база УПП. ctrl+break не помог.

    Reply
  7. vladnet

    (4) Зато:

    1. Отсортированы по дате

    2. Стрелка показывает — начало где была ссылка, конец — на какой документ ссылка

    И это естественно.

    (5) Кому как, мне вот так больше нравится ) По типовой я чего то часто не допру, что там и на что ссылается.

    (6) Посмотреть бы что она делает в отладчике, честно скажу на УПП не проверял, только на УТ и бухгалтерии.

    Reply
  8. _Xelon_

    На УПП выдал сообщение об ошибке:

    {Форма.Форма(137)}: Ошибка при вызове метода контекста (Выполнить): Ошибка выполнения запроса «Построенный запрос к СУБД использует слишком много таблиц. Допустимо не более 256.

    Microsoft OLE DB Provider for SQL Server: Too many table names in the query. The maximum allowable is 256.

    HRESULT=80040E14, HRESULT=80040E14, SQLSrvr: Error state=1, Severity=F, native=102, line=2215

    SQLSrvr: Error state=1, Severity=F, native=106, line=1858

    »

    лТзПодчиненные=лЗапрос.Выполнить().Выгрузить();

    по причине:

    Ошибка выполнения запроса «Построенный запрос к СУБД использует слишком много таблиц. Допустимо не более 256.

    Microsoft OLE DB Provider for SQL Server: Too many table names in the query. The maximum allowable is 256.

    HRESULT=80040E14, HRESULT=80040E14, SQLSrvr: Error state=1, Severity=F, native=102, line=2215

    SQLSrvr: Error state=1, Severity=F, native=106, line=1858

    »

    по причине:

    Построенный запрос к СУБД использует слишком много таблиц. Допустимо не более 256.

    Microsoft OLE DB Provider for SQL Server: Too many table names in the query. The maximum allowable is 256.

    HRESULT=80040E14, HRESULT=80040E14, SQLSrvr: Error state=1, Severity=F, native=102, line=2215

    SQLSrvr: Error state=1, Severity=F, native=106, line=1858

    Reply
  9. vladnet

    (8) Там запрос то простой очень:

    «ВЫБРАТЬ

    | &Ссылка КАК Документ,

    | СвязанныеДокументы.Ссылка КАК ДокументСвязанный

    |ИЗ

    | КритерийОтбора.»+лИмя+»(&Ссылка) КАК СвязанныеДокументы»;

    Видимо 1с его хитро разворачивает, исправил код на вот этот:

    лМассивСвязанныхДокументов=КритерииОтбора[лИмя].Найти(пДокСсылка);

    Теперь должно работать.

    Reply
  10. _Xelon_

    (9) Теперь работает. Спасибо.

    Reply
  11. logarifm

    Труд вложил… По мне ужастно не удобное отображение, типовый механизм и быстрее и удобнее! +1 за труды -1 за изобретение велосипеда = 0

    Reply
  12. vladnet

    (11) Кому что. А разбор графической схемы делался не для этой обработки.

    Вот только объясните чем же типовая удобнее схема?

    Reply
  13. vladnet

    (11) Если и быстрее то не существенно.

    Reply
  14. WiseSnake

    Спасибо за работу! Обработка интересна скорее с точки зрения разбора графической схемы.

    Но вот Ваш код мне разрывает мозг… )))) без обид ;).

    Сразу видно что не первый день кодите, но какая же… нехороший человек научил Вас код так набивать? Может быть все таки придерживаться правил и уважать братьев по цеху?

    Reply
  15. Ish_2

    (14) Ну .. Заинтриговал .Я уж ожидал что-нибудь совсем экзотическое.

    Не поленился -скачал.

    А тут всего лишь нет комментариев и выделения пустыми строками.

    «Если» и «цикл» пишутся в одну строку.

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

    Очевидно ,им важнее своё удобство , а не что подумает кто-то.

    У некоторых эта причуда проходит , у некоторых нет.

    Автору : исправьте ошибку при пустом реквизите ДокументСсылка нажатие кнопки «Обновить» вызывает ошибку .

    Reply
  16. vladnet

    (14) (15) Ну чужой код он всегда плохо читается. Этот стиль принят в нашей команде.

    Почему он такой:

    Принят максимально линейный код. Т.е.

    Если пЭлемент.ТекущийЭлемент=Неопределено Тогда Возврат; КонецЕсли;

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

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

    Так же в коде соблюдается наш принцип — 1 процедура занимает не более 1 экрана. Что позволяет даже при сложном и компактном коде все таки понять чем же она занимается.

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

    Ошибку поправлю.

    Reply
  17. vladnet

    (14) А да первые кто учил меня писать именно так были они: http://kint.ru/

    Именно там я понял что ориентироватся на код типовых конфигураций 1с глупо.

    Reply
  18. artbear

    Нормальный, довольно качественно оформленный код.

    Кучу мелких и понятнейших методов — это здорово, я сам так пишу.

    Единственная претензия все-таки к однострочному

    Если Условие Тогда Возврат Результат; КонецЕсли

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

    Reply
  19. noprogrammer

    (18) >> Единственная претензия все-таки к однострочному

    Если Условие Тогда Возврат Результат; КонецЕсли

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

    Reply
  20. Ish_2

    (17) Понятно. Первый язык у специалистов «Кинта» был не 1с .

    Термин «причуда» был употреблен с позиции 1с-ника , пишущего для других

    1с-ников и ориентирующегося , естественно, на стиль типовых конфигураций 1с.

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

    Reply
  21. CheBurator

    соглашения по стилю именования в 1С вообщем-то давно опубликованы…

    Reply
  22. vladnet

    (21) Зачем они мне, у меня свои есть:

    http://tunesoft.ru/content/view/15/32/

    Их и придерживаюсь, хотя может их уже обновить надо )

    Reply
  23. WiseSnake

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

    1. Для меня длинные строки не удобны для чтения, так как у меня не только код на экране…

    2. Код без пробелов и разделителей сливается в одну кашицу… и хоть она и влезает на 1 страницу, но е

    Reply
  24. WiseSnake

    й это читабельности не прибавляет…

    3. Иногда если бы не было комментариев к строкам в 1С я бы потратил на разбор кода не 1 час а 4 часа…

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

    Кстати маленький нюанс для создания уникальных имен для временных файлов можно использовать функцию ПолучитьИмяВременногоФайла(<Расширение>)

    P.S. Это все ИМХО если Вашей команде так удобно то не вопрос, я просто высказал личное мнение…

    Reply
  25. Ish_2

    Такое именование переменных в двумя префиксами рекомендуется в

    некоторых СУБД (FOXPRO), причем рекомендуется давно (задолго до появления 1с 77). У 1с тут ,как обычно, свой подход , не «субэдэшный» .

    У меня твердое убеждение , что разработчики еще языка 77 ходили в майках с надписью «Бэйсик forever !» .

    Reply
  26. vladnet

    (24) (25)

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

    1. Да к этому стилю надо привыкать. Тут есть плюсы и минусы. Я привык к нему за полгода.

    2. Согласен. Иногда кстати я выделяю переводом строки особенно важные блоки. Но так как делает программеры в 1с — а они выделяют разделителями все, в этом смысла я не вижу. По сути не выделять ничего разделителями или выделять разделителями все, одно и тоже, только в первом случае процедура умещается на экран а во втором случае надо листать.

    3. ИМХО 70 % комментариев там ни о чем. По моему мнению комментарии нужны только тогда когда имена процедур и переменных не смогут сказать о том что происходит в коде, но комментариев нужно избегать.

    4. У меня с этим полный порядок. Я пишу со своей строгой логикой, конфигурация http://tunesoft.ru/ полностью поддерживается мной, если бы мне код в ней казался бы нечитабельным (а там его кстати очень много), то я просто не смог бы развивать эту конфгурацию.

    Кстати да )

    Reply
  27. vladnet

    А вообще по стилю я считаю в общем так: любой стиль которого придерживаются лучше его отсутствия )

    Reply
  28. Ish_2

    (25) Теперь спор , на мой взгляд, смысла не имеет.

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

    Вот что нужно учитывать , критикуя автора темы.

    Reply
  29. WiseSnake

    (28) Вот тут не могу не согласится…

    (29) Каких языках? я видимо не встречался с этими языками,хотя они более распространены чем 1С…. И в каком из языков поощряется отсутствие комментариев, я вообще не знаю…

    Есть определенные стандарты для 1С о чем говорилось в (22) всем известные и большинством используемые, их тоже не дураки придумывали

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

    Reply
  30. Ish_2

    (30) Хочется покритиковать критику критики.

    Речь шла про FOXPRO , Субд чуть более распространённую чем 1с.

    Имелось ввиду только именование переменных с двумя префиксами.

    Одностроковый же стиль для написания операторов выбора и цикла

    я встречал также в Паскале .

    Паскаль тоже распространен чуть более чем 1с.

    Что касается отсутствия комментариев — то это плохо в любом языке, что бы ни писал автор темы.

    Reply
  31. WiseSnake

    (31) Хочется не критиковать, а найти истину, а в споре она как известно рождается

    > Имелось ввиду только именование переменных с двумя префиксами.

    1C вообще то, по моему, рекомендует наиболее полно писать наименование переменных (то есть не тз…, а ТаблицаЗначений…) другое дело кому то лень писать так (а кто то не считает нужным, потому что вроде и так понятно)…

    > Одностроковый же стиль для написания операторов выбора и цикла

    я встречал также в Паскале

    Ну я встречал одностроковый стиль для написания операторов выбора и цикла и в 1С ;)… но код на паскале который я видел (признаюсь видел я его не много), что то не запомнился мне этой особенностью….

    P.S. Скорей бы вымер уже FOXPRO, а то я уже устал с ним бороться…. ИМХО…

    Reply
  32. vladnet

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

    (32) Вымрет то он может и вымрет, а вот стиль останется, я например никогда и не писал на фоксе (лабы в универе не в счет)

    Reply
  33. Ish_2

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

    Reply
  34. artbear

    1. Главный принцип хорошего кода — легкость его чтения, а значит, и сопровождения и т.д.

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

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

    Reply
  35. Ivon

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

    Reply
  36. vladnet

    (36) Вот тут описано чуть чуть: http://www.infostart.ru/blogs/1113/

    Reply
  37. vladnet

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

    Reply
  38. Ish_2

    (36) Поддерживаю . Если , конечно, это не нарушает коммерческих планов автора темы.

    Reply
  39. vladnet

    (39) Пишите что подробнее расписать, я дополню статью: http://www.infostart.ru/blogs/1113/

    Reply
  40. Ish_2

    (40) В одной хорошо иллюстрированной статье с примерами кода рассмотреть методы работы с графической схемой и основы работы с графом.

    Reply
  41. SatanClaws

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

    Перем АктивныйЭлемент;

    //…

    Процедура ПолеГрафическойСхемыПриАктивизации(Элемент)

    УстановитьЦвет(АктивныйЭлемент, ЦветаСтиля.ЦветРамки);

    АктивныйЭлемент = Элемент.ТекущийЭлемент;

    УстановитьЦвет(АктивныйЭлемент, WebЦвета.Черный);

    КонецПроцедуры

    Процедура УстановитьЦвет(Элемент, Цвет)

    Если ТипЗнч(Элемент) = Тип(«ЭлементГрафическойСхемыДекоративнаяЛиния») Тогда

    Элемент.ЦветЛинии = Цвет;

    ИначеЕсли ТипЗнч(Элемент) = Тип(«ЭлементГрафическойСхемыДействие») Тогда

    Элемент.ЦветРамки = Цвет;

    КонецЕсли;

    КонецПроцедуры

    Так же ТолькоПросмотр графической схемы, на мой взгляд, по умолчанию должен = Истина, и завязать его на кнопку с пометкой.

    Reply
  42. SatanClaws

    ЗЫ Общее исполнение, впечатляет, но весьма своебразно…

    Reply
  43. vladnet

    (42) А для чего это надо и так ведь видно что выбрано в текущий момент?

    (43) Что именно своеобразно?

    Reply
  44. SatanClaws

    (44) Это важно, в первую очередь, для стрелок.

    Ибо когда граф получился на 3 страницы — офигенно весело сролиться вверх-вниз, пытаясь не потерять линию. 🙂

    Reply
  45. lvadim

    Спасибо автору за пример работы с графической схемой.

    С точки зрения кодирования на мой взгляд лучше было выделить некоторые блоки и называть ф-ции примерно так:

    ВыводКвадратВывести

    ВыводЛинияВывести

    ВыводФигурыСоединить

    ЗаписьКвадратСохранить

    ЗаписьКвадратСохранитьСоСвзяанными

    тогда в тексте было бы проще ориентироваться и дорабатывать

    Reply
  46. aochkasov

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

    Вот сейчас пытаюсь подогнать под свою конфигурацию. Толку мало

    Reply
  47. orefkov

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

    Reply
  48. w-divin

    (33) (35) (27)п.3

    Собсно по поводу комментов к процедурам/функциям… есть у 1С-негоф ИМХО очень замечательная вещь — описание параметров, независимо от того понятны они или нет:

    // Проверяет наличие требуемых данных в источнике и Формирует таблицу значений
    //
    // Параметры
    //  Источник  – ТаблицаЗначений или ТабличнаяЧасть или КоллекцияСтрокДереваЗначений с исходными данными
    //
    //  Реквизиты – структура – Структура реквизитов.
    //             Ключ     — Наименование колонки в источнике
    //             Значение — Наименование колонки в получаемой ТЗ, если значение опущено — приравнивается ключу.
    //  ПолучитьНомерСтрокиДокумента — булево
    //                                 Используется только при выгрузке из табличной части документа.
    //                                 В формируемой таблице создает новую колонку «НомерСтрокиДокумента»
    //                                 и заполняет её реальными номерами строк
    //
    //  КоллекцияКолонокДереваЗначений — только для коллекции строк дерева значений.
    //
    // Возвращаемое значение:
    //  Таблица значений или Неопределено (если не хватает реквизитов)
    //
    Функция СформироватьТаблицуЗначений(Источник,Реквизиты=Неопределено,ПолучитьНомерСтрокиДокумента = ложь,ФормироватьОтстутствующиеКолонки=Ложь,КоллекцияКолонокДереваЗначений=Неопределено) экспорт
    

    Показать

    Имея такие комменты перед процедурой/функцией намного легче писать вызовы… не надо лопатить код (хоть он и умещается на 1 странице). Ну и естественно ежели оно тебе не надо — в свернутом виде занимает 1 строку…

    Reply
  49. w-divin

    (6) (7) по производительности — полный аут (((

    Замер:

    Результат:

    База — переделанная УТ, файловая, размер 7,5Гб

    Для сравнения тоже с типовым механизмом:

    Замер:

    Результат:

    По направлению стрелок — ну совсем непонятно…

    По логике ИЗ заказа сделана РН — следовательно:

    Заказ —> РН, а у Вас наоборот (((

    Reply
  50. w-divin

    +(50) (7) — учитывая графический результат и направления стрелок — представленный продукт правильнее было бы назвать «Граф ссылок на объект», а никак не «Структура подчиненности»

    Reply
  51. vladnet
    w-divin пишет:

    Собсно по поводу комментов к процедурам/функциям… есть у 1С-негоф ИМХО очень замечательная вещь — описание параметров, независимо от того понятны они или нет:

    Да бывают комментарии и полезные, в любом правиле есть исключения.

    Стрелки переделаю. По поводу скорости посмотрю, переделаю.

    Reply
  52. vladnet

    Все новая версия готова. Скорость — такая же как и в стандарте, направление стрелок правильное.

    Reply
  53. PVS73

    для 8.2 не планируете адаптацию?

    Reply
  54. vladnet

    А что адаптировать то, откройте в конфигураторе под 8.2, согласитесь с конвертацией!

    Reply
  55. vladnet

    Хотя для самых ленив выложил версию под 8.2.

    Reply
  56. PVS73

    У меня УПП 1.3, сконвертированная версия выдаёт цветные прямоугольники без надписей. Из всей информации виден только ответственный

    Reply
  57. vladnet

    (57) К сожалению такая проблема есть. Возникает на старых релизах платформы. Так что попробуйте ее обновить.

    Reply
  58. 84kg

    Некоторые документы открывает быстро в граф виде ,а некоторые документы тупо зависает 1С и висит себе пару минут и отваливается

    Reply
  59. vladnet

    (59) Какая конфигурация, какие документы?

    Как отрабатывает стандартная структура подчиненности?

    Reply
  60. 84kg

    ут8.1 10.3 стандартная быстро формирует а граф тормозит на поступление товаров и услуг сори с кпк тяжело писать))на светофоре

    Reply
  61. antonina84

    (8.1.15.14)

    Reply
  62. ddk78ddk

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

    Reply
  63. Бывают дубли линий. Не разбирался. Просто в процедуре мОбновитьОтчет() перед вызовом мПостроитьСхемуПоСвязям() добавил вызов процедуры:

    Процедура УдалитьПовторяющиесяСтроки()

    УжеВТЧ = Новый Соответствие;

    КолвоСтрокТЧ = СвязьДокументов.Количество();

    Для ОбратныйИндекс = 1 По КолвоСтрокТЧ Цикл

    СтрокаТЧ = СвязьДокументов[КолвоСтрокТЧ — ОбратныйИндекс];

    Если УжеВТЧ[СтрокаТЧ.Документ] = СтрокаТЧ.ДокументСвязанный Тогда

    СвязьДокументов.Удалить(КолвоСтрокТЧ — ОбратныйИндекс);

    Иначе

    УжеВТЧ[СтрокаТЧ.Документ] = СтрокаТЧ.ДокументСвязанный;

    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры

    Иногда граф получается слишком большим. Неплохо бы добавить возможность исключения документов. Самый простой вид фильтра, например, если смотрим связи документа ПоступлениеТоваровУслуг, добавить флажок «кроме других документов ПоступлениеТоваровУслуг». Можно, конечно, реализовать процедурой, аналогичной вышеприведенной, можно и немного покопаться для увеличения быстродействия.

    Reply
  64. Aydrey

    Спасиб, пригодилась

    Reply
  65. Трактор

    «Управление торговлей и взаимоотношениями с клиентами (CRM)», редакция 1.0 (1.0.2.2)

    Обработка не хотела работать с задачами и бизнес процессами. Сказал чтобы пропускала их. Начала строить дерево, но ничего не построила. Работала примерно два часа и упала 🙁

    Жаль. Попробовать не удалось. Идея хорошая.

    Reply
  66. vovkakursk

    Идея хорошая

    Reply
  67. vladnet

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

    Reply
  68. Dali

    Скачавшие или автор, закиньте пожалуйста на мыло dali@front.ru, рейтинга не хватает.

    Спасибо.

    Reply
  69. dandrontiy

    При запуске выдает ошибку. (версия 8.1) конфа не типовая.

    {Форма.Форма(122,25)}: Переменная не определена (ОбщегоНазначения)

    лСтруктураПутьКДанным=<<?>>ОбщегоНазначения.РазобратьПутьКОбъектуМетаданных(лЭлементСостава.ПолноеИмя());

    Reply
  70. vladnet

    Нужно будет функцию из модуля вставить, вот эту:

    Функция РазобратьПутьКОбъектуМетаданных(ПутьКДанным,мКэшПраваДоступаКМетаданным,МетаданныеДокументы) Экспорт

    Структура = Новый Структура;

    СоответствиеИмен = Новый Массив();

    СоответствиеИмен.Добавить(«ТипОбъекта»);

    СоответствиеИмен.Добавить(«ВидОбъекта»);

    СоответствиеИмен.Добавить(«ПутьКДанным»);

    СоответствиеИмен.Добавить(«ИмяТаблЧасти»);

    СоответствиеИмен.Добавить(«ИмяРеквизита»);

    Для индекс = 1 по 3 Цикл

    Точка = Найти(ПутьКДанным, «.»);

    ТекущееЗначение = Лев(ПутьКДанным, Точка-1);

    Структура.Вставить(СоответствиеИмен[индекс-1], ТекущееЗначение);

    ПутьКДанным = Сред(ПутьКДанным, Точка+1);

    КонецЦикла;

    ПутьКДанным = СтрЗаменить(ПутьКДанным, «Реквизит.», «»);

    Если Структура.ПутьКДанным = «ТабличнаяЧасть» Тогда

    Для индекс = 4 по 5 Цикл

    Точка = Найти(ПутьКДанным, «.»);

    Если Точка = 0 Тогда

    ТекущееЗначение = ПутьКДанным;

    Иначе

    ТекущееЗначение = Лев(ПутьКДанным, Точка-1);

    КонецЕсли;

    Структура.Вставить(СоответствиеИмен[индекс-1], ТекущееЗначение);

    ПутьКДанным = Сред(ПутьКДанным, Точка+1);

    КонецЦикла;

    Иначе

    Структура.Вставить(СоответствиеИмен[3], «»);

    Структура.Вставить(СоответствиеИмен[4], ПутьКДанным);

    КонецЕсли;

    Возврат Структура;

    КонецФункции // РазобратьПутьКОбъектуМетаданных()

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

    Reply
  71. ylyas

    ошибка вываливается при формировании запроса в функции

    мПолучитьМассивДокументовПоКритериюОтбора()

    когда лТекстЗапроса = «».

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

    Reply
  72. Brawler

    Довольно хорошая разработка на первый взгляд ИМХО, правда под себя все же пришлось капельку доработать.

    Убрал возможность редактировать схему, убил ссылку внизу окна, добавив на ее место панель с кнопкой закрыть, немного по перемещал выравнивающие линии, потом переименовал реквизит «ДокументСсылка» в «СсылкаНаОбъект» и добавил в модуле обработки следующую процедурку:

    Функция Печать() Экспорт
    
    ПолучитьФорму(«Форма»).Открыть();
    
    Возврат Неопределено;
    
    КонецФункции // Печать

    Получилась таки еще и внешняя печатная форма. Вот только думаю приклепать или нет авторегистрацию ко всем документам конфигурации как это делается в альтернативном решении http://infostart.ru/public/103500/

    Reply
  73. opiumdx

    Спасибо интересная разработка, скачаю, посмотрю, может пригодится.

    Reply
  74. m_aster

    Спасибо, посмотрим.

    Reply
  75. m_aster

    Не работает в типовой БП 2.0 8.2:

    {Форма.ФормаО.Форма(328)}: Ошибка при вызове метода контекста (ЗначениеИзФайла)

    лНастройкиТипы = ЗначениеИзФайла(КаталогВременныхФайлов() + «СтруктураПодчиненностиНастройкиТипы»);

    по причине:

    Ошибка преобразования

    Reply
  76. vladnet

    (79) Не ясно откуда вы взяли эту ошибку. В обработке нет формы с таким названием, и нет такой строки.

    Reply
  77. vladir

    Интересная обработка. Спасибо.

    Reply
  78. zfilin

    Столько всего про код написано, что скачал специально посмотреть код. =)

    Мне, как фанату Макконела, код во многом нравится. Небольшие цельные методы, самодокументируемые имена, все класс.

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

    И еще не хватает более общей структуры. Не зря же есть рекомендованная «структура модуля». Можно было бы как-то выделить блоками — это вспомогательные, это основная логика, это отрисовка.

    Reply
  79. vladnet

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

    А вообще я считаю что хорошего программиста определяет то как он пишет и то как четко он следует своим принципам.

    Можно кстати по структуре модуля? Что за рекомендованная?

    Reply
  80. vladnet

    (87) Хватит рекламироваться в моей теме.

    Reply
  81. AlexanderKai

    По ссылке схемы1с.рф просто жесткие схемы. Зигзагообразные линии вводят в ступор 🙂

    Reply
  82. stash_84

    Проект еще продолжается? Есть данная обработка под 8.3?

    Reply
  83. German_Tagil

    Я разачарован — всего 8 документов — а система выпадает в аут

    заказ поставщику

    и приходники

    с поступлениями

    И что платная что не платная обработки одинаковые

    может я чего-то не понял?

    Reply
  84. PROF1L

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

    Reply
  85. lazarenko

    Данный пример не работает в управляемых формах. Пытаюсь выводить идентичные структуры в УФ и обычных, в обычных выводит в УФ при попытке выполнить метод Прочитать() пишет «Ошибка формата потока»

    Reply
  86. lazarenko

    (94) я имел ввиду структуры СтруктураГрафическойСхемы, та что входным параметром в методе СохранитьГрафическуюСхему используется

    Reply
  87. sdamm2

    Я скачал бесплатную версию, запустил, у меня что-то глюкнуло в базе и пропали все пункты меню. Остались только правка и окна. Выгрузка/загрузка не помогли (в т.ч. восстановление на другом компе). помогает только удаление всех юзеров. Стоит добавить одного — меню исчезает. Я не утверждаю, что глюк связан с обработкой, но возник он сразу после ее открытия….

    Reply

Leave a Comment

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