УстановитьСсылкуНового() как ход оптимизации!




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

80 Comments

  1. Gureev

    только надо обязательно в одну транзакцию их вставить

    а то будет в контрагенте «объект не найден»

    Reply
  2. logarifm

    (1) Gureev, Тут все относительно…. Это тоже самое, что сделать обмен данными. Все зависит от целей конечного результата.

    Reply
  3. davdykin

    (1) Gureev, Честно говоря не понял почему нужно соблюдать данное условие, ведь даже если транзакция будет зафиксирована после записи контрагента, а потом я в другой транзакции запишу договор, ссылка не должна измениться, ни на справочник контрагенты, ни на справочник договор, или я не прав?

    Reply
  4. ojiojiowka

    (3) davdykin, но ведь при записи договора может произойти ошибка. А так у метода есть небольшой недостаток — нарушается механизм формирования ссылок. Допустим, нельзя будет по ссылке определить дату создания объекта (минуя журнал регистрации) — на инфостарте есть такая публикация, значит кому-то полезно (мне тоже дважды пригодилось). Можно конечно написать свой генератор гуидов, который сохранит дату…

    Reply
  5. fancy

    А что если в момент записи контрагента будет инициировано создание нового объекта спр-ка Договоры (другим пользователем например) и новая ссылка будет сгенерирована используя тот-же уникальный идентификатор. Или это исключено?

    Reply
  6. Gureev

    (2) что относительного в соблюдении логической целостности БД? Договор не запишется и все! В записанном контрагенте битая ссылка.

    (5) fancy, Исключено. Повтор гуида это как сантаклаус — сказка для малышей

    П,С, А ни у кого не завалялся готовый код формирования time-based GUID?

    Reply
  7. logarifm

    (6) Gureev, я вже вроде как внятно написал Все зависит от целей конечного результата.

    Reply
  8. pricec

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

    Reply
  9. dj_serega

    Ошибка в коде: СправочникКонтрагенты. Я так понял нужно Справочник.Контрагенты

    Reply
  10. igo1

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

    Reply
  11. logarifm

    (8) PiccaHut001, потому, что Вам еще не приходилось обслуживать загрузку справочников которые содержат более полутора миллионов записей. Вот тогда и начинаешь задумываться.

    Reply
  12. DoctorRoza

    (12) а у нас пацаны на районе, для загрузки более полутора миллиона записей, используют КД! 🙂

    Reply
  13. logarifm

    (13) DoctorRoza, а разве при КД кто-то отменяет физическую транзакцию!?

    Или КД умеет загружать форматы из Екселя? Или дбф научилась читать?

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

    Reply
  14. monkbest

    Круто, я не знал. Единственно, злоупотреблять этим не стоит. Читабельность второго кода -> 0. В данном случае злоупотреблением является применение этого механизма к контрагенту. Ссылку договора сгенерили и сунули её в контрагента, а контрагента мы суем в договор, когда он уже записан, зачем ему предварительно ссылку генерить.

    Не то чтобы я хотел придраться, статье «+», просто реально читабельность падает на глазах.

    Reply
  15. logarifm

    (15) monkbest, Читабельность и Оптимизация это разное 😉

    Да злоупотреблять не стоит. Тут не так даже я б сказал, просто стоит понимать применяя это. Устранить максимум <Объект не найден>

    Reply
  16. PiccaHut001

    (12) загружать полтора миллиона новых контрагентов? КАК часто вы это делаете?

    Reply
  17. logarifm

    (17) PiccaHut001, не загружать полтора миллиона, а загружать в справочник где уже есть поллтора миллиона.

    Обслуживание билинговых систем.

    Reply
  18. dj_serega

    Так что на счет очепятки? СправочникКонтрагенты

    Reply
  19. HiGHT

    Ребята что такое КД?

    Reply
  20. PiccaHut001

    (18) и в чём тогда выигрыш вашего метода. Загрузить пару тысяч контрагентов, минут 5 максимум.

    Reply
  21. PiccaHut001

    (20) HiGHT, Конвертация данных — есть такая конфигурация- очередная святыня 1С.

    Reply
  22. davdykin

    (21) PiccaHut001, А вы уверены что 5 минут, я вот думаю совсем нет. Т.к. операция записи самая ресурсоемкая для БД (из использованных в примере) , а тут экономия в 2 раза. Если интересно проверьте на БП 3.0.:) Да у способа довольно узкая область применения, но автору однозначный плюс за пример и описание.

    Reply
  23. asved.ru

    А через XDTO еще быстрее 🙂

    Reply
  24. logarifm

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

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

    Reply
  25. Rustig

    (0) вечная проблема:

    при создании номенклатуры сначала записать ее первый вариант,

    затем записать ЕдИзм, присвоив ЕдИзм.Владелец = Ном.Ссылка,

    затем снова Ном.ЕдИзм = ЕдИзм.Ссылка.

    по-моему автор предложил красивое решение.

    (11) если это стандарт разработки, то где-то он должен быть описан?

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

    Reply
  26. zqzq

    (26) Rustig, В Конвертации данных используется УстановитьСсылкуНового(). Кстати, поэтому в КД нежелательно в обработчиках эту процедуру использовать, можно поломать стандартную загрузку связанных объектов, сам на эти грабли наступал.

    + В реальном коде бывает полезно делать проверку с помощью ПолучитьСсылкуНового(), чтобы несколько раз не переназначить ссылку.

    Reply
  27. DoctorRoza

    (14) ну полноте Вам, застремали меня не по-детски! Я же не в претензию и, тем более, без какого-либо осуждения! В обучающем курсе Дмитрия Шестабитова по мобильной Платформе, модуль 2, используется подобный механизм, но ведь не все его изучали! Предложенную идею нужно знать и помнить, поэтому и плюсанул! А Вы набросились сразу, знаю-не знаю, 15 лет! 😐

    Reply
  28. PiccaHut001

    (23) davdykin, ага, целых 5 тысяч записей в одну табличку и 5 тысяч в другую. По объёму, мегабайт 20 (ОГО, как МНОГО). Плёвая задача для dbf СУБД 98-2000 годов. 1С 8.3 это ставит в ступор, приходится придумывать специальные приёмы оптимизации. Скажем спасибо борису и его замечательной команде талантливых студентов.

    Reply
  29. insurgut

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

    Reply
  30. burlakov

    просто и эффективно. спасибо Автор. сам как-то не додумался

    Reply
  31. Gureev

    (7)

    Все зависит от целей конечного результата.

    Назовите хоть одну цель не уделять внимания контролю ссылочной целостности.

    Цель «Неуделение внимания контролю ссылочной целостности» не принимается.

    Без транзакции считаю данный код вредным и опасным.

    Reply
  32. logarifm

    Если посмотреть, что говорит о <объект не найден> 1С, там все просто: это ничем не вредит базе. АБСОЛЮТНО!

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

    Reply
  33. Gureev

    Ссы́лочная це́лостность (англ. referential integrity) — необходимое качество реляционной базы данных, заключающееся в отсутствии в любом её отношении внешних ключей, ссылающихся на несуществующие кортежи.

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

    Есть правило, и оно должно соблюдаться. Нравится это вам или нет.

    Reply
  34. SemenovaMarinaV

    Не знала этого

    Reply
  35. wunderland

    (16)(18) — да, 100% когда счет идет на миллионы транзакций, один штрих в коде/запросе может в результате дать «+» или «-» несколько часов выполнения. Обязательно применю, как раз на горизонте очередная нестандартная загрузка 🙂

    Reply
  36. wunderland

    (29) ради интереса, посмотри сколько таблиц в SQL задействуют эти 2 справочника

    Reply
  37. logarifm

    (34) Gureev, Это Вы будете заказчику в уши лить эту чушь!

    Reply
  38. logarifm

    Здесь не ким образом не нарушается ссылочная целестность. Ибо когда объект не создан и на него ссылаются другие объекты. Еще раз пишу, для тех кто сидит в бронепоезде:

    Если посмотреть, что говорит о <объект не найден> 1С, там все просто: это ничем не вредит базе. АБСОЛЮТНО!

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

    (39) а никто и не говорит, что при успешном завершении ссылочная целостность не будет нарушена. А что произойдет в случае, если номенклатура, в реквизит которой мы занесли ссылку на единицу измерения запишется успешно, а вот запись единицы остановится с какой-нибудь ошибкой? Тут она (целостность) и будет нарушена.

    И понятное дело, что базе это никак не повредит. Но что-то мне подсказывает, что это довольно сильно расходится с основами реляционных баз данных 🙂

    Отсюда и вывод — что метод по сути для единичного узкого применения. Никто не говорит, что он не состоятелен. Просто если его в массы продвигать (в смысле использовать в какой-нибудь рабочей конфигурации, с одновременной работой массы пользователей), заключать его в транзакцию надо. А тут уже не понятно, что быстрее — начало транзакции + 2 записи + фиксация транзакции, либо просто 3 записи.

    Reply
  40. logarifm

    Ребята, а кто транзакции пишет единично?

    Если вы оптимизируете объявляйте счетчики транзакций и фикируйте их пакетами. Вы что это же элементарные вещи.

    Reply
  41. insurgut

    (41) я бы назвал это скорее узким применением для решения определенной (по сути единичной) задачи 🙂 Для чего ваш метод и хорош.

    Reply
  42. Aleksey_3

    (15) Более того в типовой БП это работать не будет, потому что разработчики типовых при записи нового контрагента принудительно меняют ссылку (вот хз зачем они так сделали), поэтому я бы поостерёгся таких вот оптимизаторов подпускать к типовым, к этому кладезу граблей и недоразумений

    Reply
  43. PiccaHut001

    (43) Aleksey_3, Респект. Внезапно, Автор оптимизировал, записыватели тысяч контрагентов и миллионов штрихкодов оптимизировали — в итоге получили грабли.

    Reply
  44. logarifm

    (43) Aleksey_3, а я бы пооберегся таких людей которые не разбираются в штатном коде. И вместо того, чтобы найти причину говорят в ответ — ХЗ. Таких программистов я просто уволняю…

    Ой и перед этим как ОРАТЬ «ЭТО РАБОТАТЬ НЕ БУДЕТ» изучить как минимум мат.часть, где говорится

    ОбменДанными.Загрузка = Истина;

    Но такие оруны работать должны только метлами….

    Reply
  45. logarifm

    (44) PiccaHut001, а этот порыв мысля я даже и не понял

    Reply
  46. slazzy
    Reply
  47. PiccaHut001

    (47) slazzy,

    (8) PiccaHut001, утверждение заслуживающее увольнения, ничего личного.

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

    Reply
  48. slazzy

    (48) PiccaHut001, если для вас выполнить лишнюю запись объекта (самую сложную и длительную операцию в 1С) лишний раз это не проблема, тем самым замедляя транзакцию, вызывая дополнительные блокировки, ухудшая параллельность работы в условиях когда этого можно избежать путем написания 2-3 логичных строк кода, то у меня для вас плохие новости.

    К тому же, как я показал выше — в типовых конфигурациях в подобной ситуации ВСЕГДА используется описанный метод. То есть вы откровенно игнорируете правильный подход к программированию в 1С, который настоятельно рекомендуется использовать по многочисленным причинам и используете более корявый и откровенно неправильный и при этом гордитесь этим потому, что ЯКОБЫ ваш код легче читается? Не надо всем рассказывать о своем невежестве.

    Но я скажу даже больше. В примере который привел я, вообще нельзя сделать по-другому. Потому что запись связанного объекта выполняется в процедуре ПередЗаписью и повторная запись основного объекта вызовет рекурсивную запись.

    Reply
  49. logarifm

    (49) slazzy, Да о чем тут говорить, люди не понимают, что говорят. У меня стояла задача, при записи накладной вовремя исполнения определенных условий, чтобы автоматически создавалась еще накладная и определенный товар перешол с одной табличной части в другую. при этом чтобы можно было попасть в такие накладные реквизитами. Собственно там много чего надо было сделать, но вот за основу было взято какраз таки УтановитьСсылку() и я не плакал о том, что там будет плохая читабельность кода. Я думал только как сделать это оптимальней и при возникновении ошибки откатится.

    Reply
  50. insurgut

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

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

    Reply
  51. PiccaHut001

    (49) slazzy, у вас какая-то параллельная реальность: «типовые» конфигурации о которых никто не знает, «типовые» приёмы которыми никто не пользуется, основные проблемы

    выполнить лишнюю запись объекта (самую сложную и длительную операцию в 1С)

    с которыми никто не сталкивался. Вы точно 1С занимаетесь?

    Reply
  52. slazzy

    (51) insurgut, я очень извиняюсь, но вы несколько неправильно поняли мою мысль. В типовых это ИСПОЛЬЗУЕТСЯ и используется всегда и везде, когда надо синхронно записать 2 набора связанных данных. Пример я привел выше, он взят из типовой 🙂 другой вопрос, что пример рассматриваемый конкретно тут это пример для обмена, то есть внешняя запись двух связанных объектов.

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

    Что до скорости, то две записи всегда быстрее трех записей.

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

    Reply
  53. slazzy

    (52) PiccaHut001, я вам выше привел пример конкретно из типовой БСП и конкретно типовой Бухгалтерии 3.0, аналогичное видел и в УТ11, могу привести пример.

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

    Вы лучше приведите мне хотя бы ОДИН ПРИМЕР из типовых, где используется двойная запись. Нет, серьезно, найдите хоть один.

    Reply
  54. PiccaHut001

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

    Reply
  55. slazzy

    (55) PiccaHut001,

    Reply
  56. PiccaHut001

    (54) slazzy, неудобно искать, на работе у меня в основном самописки, но (56) меня убедил — открыл УПП 1.3 для Украины, там в справочнике контрагентов есть помощник ввода контрагентов. Вбил туда нового контрагента с контактным лицом и адресом, нажал ОК — запись Контрагента и договора была произведена 2 раза. Скриншот в моём профиле. Кто-нибудь подтвердите, что в русской УПП точно так-же? Дома проверю на более распространённых конфигурациях.

    Reply
  57. monkbest

    (57) PiccaHut001, при чем тут ручной ввод?

    Reply
  58. PiccaHut001

    (58) monkbest, вручную вбил в форму помошника ввода контрагента текст «контрагент2» и в соседнее окошко «ДанныеКонтактногоЛица1» нажал записать — контрагент записался 2 раза.

    Reply
  59. Aleksey_3

    (45) Ну расскажи, зачем писатели типовых так сделали. Почему для номенклатуры так не сделали?

    И где у автора статьи про ОбменДанными.Загрузка = Истина; ?

    Reply
  60. slazzy

    (57) PiccaHut001, я понимаю, что этот ответ такого как вы не убедит, но полагаю УПП 1.3 это прямой потомок 1.2, сделанного ещё под 8.1 и качество кода в некоторых местах там несколько нетипично для 8.3, тк код напрямую перекочевал в новые версии. Да и завязано там всё на работу с обычными формами. Собственно я в пример приводил сравнительно новые конфигурации, такие как БП 3.0, УТ 11 и прочие. В них везде где возможно пишут правильно. Сути это не меняет

    Reply
  61. PiccaHut001

    (61) slazzy, проверил на последней УПП 1.3, ситуация такая-же, как в (57), обработка помощник «регистрации данных нового клиента» записывает контрагента 2 раза, фото пруфы в моём профиле. В УТ11 я не нашёл аналогичного помощника, проблему с единицами измерения там тоже обошли, смотреть нечего.

    Вы лучше приведите мне хотя бы ОДИН ПРИМЕР из типовых, где используется двойная запись. Нет, серьезно, найдите хоть один.

    Reply
  62. logarifm

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

    Reply
  63. maldinitaly

    Всем, здравствуйте. Приведенный автором прием рассматривается в курсе по программированию Евгения Гилева (вроде Базовый курс). Автору статьи плюс, за то , что рассказал про этот метод.

    Reply
  64. xzorkiix

    5 копеек

    1. Обернуть тело метода в транзакцию

    2. Получить ТОЛЬКО НовыйДоговорСсылка

    3. В договоре указать владельца как ДоговорКонтрагента.Владелец = НовыйКонтрагент.Ссылка;

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

    Reply
  65. help1Ckr

    (65) xzorkiix, анализ обходится через ОбменДанными.Загрузка = Истина;

    Reply
  66. glek

    Хорошая идея. Спасибо автору.

    Reply
  67. insurgut

    (66) help1Ckr, не вводите людей в заблуждение.

    Reply
  68. INTECH1

    Прикольно, когда человеку мыслящему как-то немного по-другому другой человек начинает что-то объяснять — сам вживую, бывает, наблюдаю в своем офисе. Не знаю, можно ли таких в одну команду набирать, но на Марс их вместе точно не отправишь — поубивают же друг-друга.

    Тоже пользуюсь УстановитьСсылкуНового(). Например, в УПП была задача сделать, чтобы Счет на оплату привязывался непосредственно к Реализации (штатно Счет привязывается к Заказу покупателя) — ну, стараюсь делать правки конфигурации такие, чтобы обновлению это не мешало. Значит, добавляем регистр сведений, где будем хранить эту связь, ставим обработчик на Обработку заполнения Счета, созданного на основании Реализации, и в этом обработчике заранее создаем ссылку нового счета и записываем её в регистр. Тогда если Счет в итоге будет записан, то в регистре получим его ссылку. Если не будет записан — ну будет битая ссылка, считаем, что записи нет, перепишем её при повторном создании счета. Не знаю, что скажут Гуру, но работает, и не мешает мне обновлять конфу

    Reply
  69. alexscamp

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

    Reply
  70. Storung

    Есть одна особенность о которой автор не указал. Если попытаться записать договор контрагента раньше самого контрагента, то будет ошибка: «Поле Владелец не заполнено или заполнено не верно».

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

    Корректно отработает только при не иерархических справочниках или при подчинении группа и элементам, либо при установке признака ОбменДанными.Загрузка = Истина.

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

    Тогда откуда столько восторга и холивара на эту тему. Лучше описать особенности работы данного метода, а не «Смотрите какой крутой метод».

    Reply
  71. WKBAPKA

    (66) help1Ckr,

    хотел написать. без этого работать не будет )

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

    Reply
  72. Storung

    WKBAPKA,

    Без этого работать будет и использовать ОбменДанными.Загрузка = Истина НЕ правильно. Например при загрузке справочника происходит обновление полного наименования, но делается это после проверки ОбменДанными.Загрузка. Учитывать все эти нюансы при загрузке будет не верно, так как алгоритм может измениться в процессе обновления.

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

    Reply
  73. unoDosTres

    (14)

    загружал из excel в 1с используя Кд, как говорится голь на выдумки хитра, эх 1с 🙂

    Reply
  74. jobkostya1c8

    Хорошо что я прочитал до конца про возможные «подводные камни» такой оптимизации (особенно для типовых конфигураций и обход проверок ОбменДанными.Загрузка=Истина

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

    Reply
  75. Resha

    Народ, а по-моему вместо

    Справочник.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор)

    надо

    Справочник.Контрагенты.ПолучитьСсылку()

    Иначе может получиться, что 1С «угадает» УИД из справочника. Да, это маловероятно, но в теории возможно.

    Reply
  76. sanek_gk

    (2)

    се зависит от целей конечного р

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

    Reply
  77. www2000

    Исправьте, пожалуйста, НовыйКонтрагентСсылка = СправочникКонтрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор);

    Reply
  78. treedo

    Отличная идея! Только действительно нужно в транзакцию поместить что бы завершить эту идею 😉

    Reply
  79. zfr475

    В УТП стоят «заглушки» на подобный метод, при создании Номенклатуры и её ЕдиницИзмерения.

    Жаль, не прокатило

    Reply
  80. w.r.

    (5) Думаю, что это предусмотрели и ссылка, полученная методом ПолучитьСсылку() резервируется платформой

    Reply

Leave a Comment

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