Универсальный OLE-перенос объектов между БД с идентичными конфигурациями




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

99 Comments

  1. wolfsoft

    В ответ на претензии по «тормозной» работе http://infostart.ru/projects/181/ выкладываю данную разработку.

    Она работает быстрее, так как не содержит «тормозов» системных методов «1С» ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр().

    Пожалуйста, комментарии, отзывы, ошибки — сюда, милости просим 😉

    Reply
  2. wolfsoft

    Не понял, все так плохо, что даже комментировать не хочется? 😉

    Reply
  3. wolfsoft

    Тогда закрываю обработку, теперь «только для зарегистрированных».

    Reply
  4. kosty

    работает шустренько, спасибо

    был бы не лишний отбор по виду документа

    Reply
  5. wolfsoft

    2 kosty: Спасибо за комментарий. В общем-то обработка может переносить любые объекты, предназначена скорее другим программистам, чем пользователям, как «заготовка» для своих обработок. Перенос документов — просто пример.

    Но вообще Вы правы, надо подумать и о пользователях.

    Доработаю интерфейс — выложу обновленную версию.

    Reply
  6. wolfsoft

    2 kosty: По просьбам трудящихся доработан интерфейс для пользователя 😉

    Добавлен отбор документов и элементов справочников по виду и отбор «по-штучно».

    Reply
  7. wolfsoft

    Ждем «плюсиков»! 🙂

    Reply
  8. wolfsoft

    Не стесняемся, Дамы и Господа! Пишем комментарии, «плюсуем» 🙂

    Reply
  9. wolfsoft

    А вот зайца кому? Кому зайца? (с) м/ф «Падал прошлогодний снег»

    Reply
  10. Vadik

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

    ОбъектПриемник = База.CreateObject(«Счет.» + Объект.ПланСчетов().Идентификатор());

    {C:DOWNLOADSBUHBUXOBRABOTKIПЕРЕНОСПЕРЕНОС ОБЪЕКТОВ 1.20 (OLE).ERT(280)}: 1С:Предприятие: Неудачная попытка создания объекта (Счет.): 0

    хотя конфы идентичны, просто данные в них разные

    Reply
  11. wolfsoft

    (10) Большое спасибо за сообщенную ошибку.

    Исправлена ошибка при выгрузке операций.

    Скачайте свежий релиз 1.21

    http://infostart.ru/projects/1120/download.php?file=1621

    Reply
  12. Vadik

    странно… но вот даже после того как скачал новую версию у меня вываливается тоже самое сообщение…

    ОбъектПриемник = База.CreateObject(«Счет.» + Объект.ПланСчетов().Идентификатор());

    {C:DOWNLOADSBUHBUXOBRABOTKIПЕРЕНОСПЕРЕНОС ОБЪЕКТОВ 1.20 (OLE).ERT(280)}: 1С:Предприятие: Неудачная попытка создания объекта (Счет.): 0

    Reply
  13. wolfsoft

    (12) «ПЕРЕНОС ОБЪЕКТОВ 1.20 (OLE).ERT» — это старая версия обработки

    используйте «ПЕРЕНОС ОБЪЕКТОВ 1.21 (OLE).ERT» 😉

    Reply
  14. wolfsoft

    Виноват, приношу свои извинения Vadik и тем, кто успел скачать версию 1.21.

    По ошибке в архиве оказалась старая версия 1.20 🙁

    Обновил снова файл с версией 1.21.

    Reply
  15. maos

    Спасибо большое! Долго искал. Перепробовал кучу аналогов. У всех свои недостатки. Эта очень понравилась и позволила решить проблему переноса документов

    Reply
  16. wolfsoft

    (15) Вам спасибо за комментарий 🙂

    Reply
  17. Vadik

    Благодарю, обработка очень выручила!!!

    Reply
  18. avega

    жаль только что если народ работал и в источнике и приемнике то документы ЗАМЕЩАЮТСЯ 🙁

    Reply
  19. wolfsoft

    (18) Ну так перенос, он на то и перенос, а не обмен, это ж не УРИБД 🙂

    Это разные задачи.

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

    Reply
  20. LordOfChaos

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

    Reply
  21. wolfsoft

    (20) Рад, что помог, спасибо за комментарий 🙂

    Reply
  22. JannyFan31

    Спасибо, очень многому можно научиться, используя такие вещи.

    Reply
  23. Кос

    Перепробовал уйму обработок — эта самая лучшая и что, пожалуй, самое важное — безошибочная.

    Огромное спасибо!

    Reply
  24. Diman23

    На релизе 1.21 работает все кроме:

    ОбъектПриемник.Родитель = РодительОбъекта;

    {D:INSTALL1C_TREE_77.ВНЕШНИЕ ОТЧЕТЫ И ОБРАБОТКИINFOSTARTPERENOS_OLE_121121ПЕРЕНОС ОБЪЕКТОВ 1.21 (OLE).ERT(440)}: 1С:Предприятие: Неверное значение!

    Просим поправить! В целом же реализация вполне годится.

    Reply
  25. wolfsoft

    (24) Данной информации недостаточно для определения ошибки.

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

    Reply
  26. wolfsoft

    +(25) Попробуйте перебросить данные вот этой обработкой Serjant-а

    http://infostart.ru/projects/156/

    Если не трудно,

    Reply
  27. mihenius

    ОбъектПриемник.Родитель = РодительОбъекта;

    {ПЕРЕНОС ОБЪЕКТОВ 1.21 (OLE).ERT(460)}: 1С:Предприятие: Неверное значение!

    Такая же ошибка

    Reply
  28. mihenius

    ТиС 937 глючит на номенклатуре (уровней 5)

    Reply
  29. mihenius

    http://www.abelov.com/forum/f.php?ak=31356

    Вот кстати аналогичная проблема и ее решение … т.е. нужно завести еще одну перменную

    Reply
  30. mihenius

    Еще бы лучше Сообщить не использовать или чистить Окно Сообщений

    А информацию скидывать в лог файл

    дело в том что 1с-ка копит память … а потом ругается что памяти не хватает …

    Reply
  31. mihenius

    Еще ошибка …

    ОбъектПриемник.Новый();

    {ПЕРЕНОС ОБЪЕКТОВ 1.21 (OLE).ERT(432)}: 1С:Предприятие: Неверный владелец.

    Reply
  32. wolfsoft

    (27-31) В монопольном режиме никаких подобных ошибок мной не наблюдается. Судя по ссылке, которую Вы дали в посте (29), эти ошибки возникают у Вас при попытке переноса в «не монопольном» режиме работы?

    Если да, попробуйте осуществлять перенос в монопольном режиме, ошибки остаются?

    Reply
  33. mihenius

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

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

    Еще не понравилось снятие документов с проведения по ссылкам в предыдущем периоде …

    Дело в том, что часть этих доков может не провестись … и полетят остатки

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

    Reply
  34. mihenius

    В (29) я просто пробовал решить проблему сам и поискал в яндексе подобную ошибку.

    Нашел ссылку, кинул вам.

    Вставил в место ошибки попытку исключение

    Глючит на некоторых новых товарах, кот. еще нет в базе приемнике

    Проверял на дублеж товаров, дублирующих кодов не нашел

    Reply
  35. mihenius

    И все таки все работает нормально )

    Это у нас дубль нашел у группы и элемента один код … как такое могло случиться …

    А я на дубли проверял только сами элементы

    Прога пыталась подставить в качестве родителя элемент )))))))))

    Короче нужно на всякий сделать проверку чтоб родитель был папкой!

    А так все обработка супер ставлю +

    Reply
  36. mihenius

    Вообщем стоит с параметром добавить примерно следуещее

    Код
    Ном = СоздатьОбъект("Справочник.Номенклатура");
    Ном.ПорядокКодов();
    Тек = 0;
    ТекИмя = 0;
    Ном.ВыбратьЭлементы(0);
    Пока Ном.ПолучитьЭлемент() = 1 Цикл
        Если Тек <> Ном.Код Тогда
            Тек = Ном.Код;
       ТекИмя = Ном.Наименование;
        Иначе
       Сообщить("Дублирование кода товара - "+Тек+"="+ТекИмя +" = с = "+    Ном.Код+"="+Ном.Наименование);
       КонецЕсли;
    КонецЦикла;
    

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

    Reply
  37. mihenius

    Обработка универсальная

    поэтому беру свои слова обратно (36)

    Но в документации следует на всякий случай предупредить о проблемах, если будут дубли по ключам в справочниках/документах

    А проверять каждый должен сам )

    Reply
  38. wolfsoft

    2 Mihenius:Спасибо за комментарии.

    Честно говоря, никак не учитывал, что возможны ситуации дублей ключей синхронизации 🙂

    В описании немного намекается на уникальность ключа синхронизации в следующем абзаце:

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

    Прямым текстом действительно не написано, но в принципе это подразумевалось 🙂

    Вообще, большое спасибо, что не бросили и разобрались в проблеме до конца.

    По поводу параметра «не снимать с проведения документы с датой раньше периода переноса» — не знаю, сложно сказать. При желании добавить его не трудно, но на сколько это правильно и как определить документы, которые надо перепровести, а которые не надо? Пока наверное воздержусь от добавления, надо еще подумать (может быть каждому виду документа сделать отдельную галку…). Но проблема понятна — спасибо, будем думать 🙂

    Reply
  39. rka

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

    Reply
  40. mihenius

    (38) Документы то перепроводить нужно, на счет этого я не спорю

    Но снимать с проведения нужно только в том периоде, кот. переносим

    Т.е. делаем 2 ТЗ с доками кот. нужно перепровести

    У нас просто УРиБ и в разных базах под справочники выделены свои диапазоны кодов, а вот блин почему то группа проскочила через ограничитель …

    Поэтому не хватает ЛОГА ОШИБОК для вашей обработки. В других обработках случаи с дубликатами рассматриваются 😉 , но нет ссылочного переноса

    Reply
  41. wolfsoft

    (40) Будем думать и искать свободное время для доработки 🙂

    Reply
  42. rka

    Может это только у меня…

    Комплексная, при переносе документов ПоступлениеПрочее (Поступление ОС,НМА) в табличной части не заполняются данные о счете.

    Видимо это потому что в документе у данных полей Тип = Неопределенный. И нужное значение рекизиту не присваивается. Нужно сначала назначить тип рекизиту, а затем уже присваивать ему значение…

    Я не прав?

    Reply
  43. wolfsoft

    (42) Спасибо за сообщение. Да, Вы совершенно правильно указали причину.

    Будет добавлено в следующей версии.

    Reply
  44. wolfsoft

    (42) Пожалуйста, попробуйте версию 1.22 и сообщите о результатах.

    Времени не хватает для полноценного тестирования.

    Reply
  45. rka

    Обработка очень понравилась!!!

    Причем из огромного количества аналогов, единственная которая работает!!! Огромное спасибо!

    При переносе из Комплексной возникают следующие проблемы. У некоторых документов (ПоступлениеПрочее, СписаниеТМЦ, ОприходываниеТМЦ), есть поля у которых тип Неопределенный. (Счет, субконто1, субконто2 и т.д.). Следовательно нужно смотреть, если в Источнике есть значение, то аналогичный тип присваивать Приемнику.

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

    В общем и целом. Все супер буквально летает. Тип я сам подправил. Еще в принципе предусмотрел выгрузку таблицы проведенных в Источнике документов. Потом сравнивал с тем что проведено в Приемнике. Так проще выявлять проблемные. Но в целом все равно 5 баллов. И главное она работает!!! Сейчас гляну 1.22.

    Reply
  46. wolfsoft

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

    Reply
  47. wolfsoft

    (45) Новый релиз 1.23.

    Reply
  48. mdzen

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

    Reply
  49. malutin

    Процедура отличная, единственная проблема, не смог перекинуть справочник цены в ТиЗ, пробовал всякими способами, и в документах, и через справочник номенклатура, и ключи менял…

    Reply
  50. wolfsoft

    (49) Дело в том, что нет ссылок на эти элементы справочника «Цены номенклатуры». Самый простой способ решения — дописать процедуру отбора элементов для справочников, подчиненных другим справочникам.

    После этого отобрать все элементы справочника «Цены номенклатуры» и выгрузить их (по ключу «Тип цен»).

    Reply
  51. malutin

    Попробую, сапсибо!

    Reply
  52. rka

    Комплексная при переносе Контрагентов, Договоров. Иногда возникает ситуация что движение по регистрам делается по одному контрагенту, а бух. итоги по другому. Связано это с тем (как я думаю), что движения формируются по договору, а проводки по контрагенту.

    Не плохо было бы при переносе контрагентов и договоров в документах проверять владельца Договора.

    Reply
  53. wolfsoft

    (52) >Комплексная при переносе Контрагентов, Договоров. Иногда возникает ситуация что движение по регистрам делается по одному контрагенту, а бух. итоги по другому.

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

    Reply
  54. ash2015

    СПАСИБО БХРАТ!

    Reply
  55. wolfsoft

    И ТЕБЕ БХРАТ СПАСИБО 🙂 А где плюсик?!! 😉

    Reply
  56. avolk

    ВЕСЧ!!!!!!!!!!! СПАСИБО!!!!!!!

    Из пожеланий — не плохо бы было добавить проверку на идентичность реквизитов, я понимаю что в заголовкее написано для «ИДЕНТИЧНЫХ», но в жизни бывает что в одной конфе что-то поменял, а в старой(архивной) осталось все как есть, хоть это и все решается обновлением конфигурации, но всеж хотелось бы чтоб об этом было предупреждение до загрузки, а не когда уже половина документов перекинута (а механизма транзакций нет) вылетала ошибка о неверном имени(типе) реквизита

    Reply
  57. wolfsoft

    (56) Хм.. Подумаю.. Но вообще, это такое маловероятное событие, все-таки переброска делается как правило между конкретными БД, БД эти меняются не так часто, а вот возни со сравнением этих двух БД из обработки.. В общем, подумаю, за коммент — спасибо 🙂

    Reply
  58. avolk

    Зато слово «Универсальная» большее значение примет))). Не обязательно проверять сразу всю конфу на идентичность, можно просто при установке значения реквизита в базе приемнике сделать проверку на его существование и соответствие типа, и если не существует просто его пропустить с соответствующим сообщением в лог, или вообще вставить в конструкцию «попытка…исключение» без всякой проверки, главное чтоб ошибки не выдавало и из обработки на полпути не выкидывало (как я и сделал). А вообще в идеале было бы сделать все в обратную сторону, т.е. загрузку производить из базы приемника, тогда можно было бы использовать механизм транзакций, и в случае вылета ошибки просто база откатывалась бы в исходное состояние, и не приходилось бы париться с восстановлениями из архива, да и скорость бы загрузки на порядок бы увеличилась, но это я так просто губу раскатал)))).

    А ВООБЩЕ ОБРАБОТКА ОЧЕНЬ ДОБРОТНО СДЕЛАНА! Я перепробывал их кучу, но эта единственная реально и быстро без особых проблем заработала. МОЛОДЕЦ! Еще раз Спасибо огромное и человеческое)))

    Reply
  59. swd

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

    Reply
  60. wolfsoft

    Дамы и господа, а чего не комментируем, а только «плюсуем»? 😉

    Reply
  61. Dmitry100

    Красивая штука. Сворачивал базу на мощном компе. Сворачивалась база сутки. Потом из рабочей в свернутую пришлось докидывать наработанные документы. Перрепробовал пяток обработок. Эта обработка меня сильно выручила. БОЛЬШОЕ СПАСИБО!

    Reply
  62. Dmitry100

    Вот вроде такое заметил: если в приемнике уже есть документ и он помечен на удаление, а в источнике этот документ провенден, то в приемнике он перезаполняется, но пометка на удаление не снимается. А было бы логично. Использовал версию 123.

    Reply
  63. wolfsoft

    (62) Ценное замечание. Реализовано 🙂

    Reply
  64. vlad_klg

    +1

    Reply
  65. krava_vlad

    При переносе не проводит проведеные документы (Конфигурация комплексная для Украины)

    Reply
  66. wolfsoft

    (65) Хм.. А на закладке «Настройка» галочку «Проводить документы» поставили?

    Reply
  67. wolfsoft

    (64) А где же «плюсик»?! 🙂

    Reply
  68. NDeclin

    Пустые значения реквизитов типа «дата» переносятся как 30-12-1899

    Reply
  69. wolfsoft

    (68) Спасибо, проверим.

    Reply
  70. wolfsoft

    +(69) Там даты в общем-то передаются из источника в приемник «как есть», видимо «УстановитьАтрибут()» так отрабатывает через ОЛЕ.

    Reply
  71. Abadonna

    >Пустые значения реквизитов типа «дата» переносятся как 30-12-1899

    А именно так и должны переноситься. Понятие ПустоеЗначение(Дата) придумано в 1С, на самом деле это переменная TDateTime=0, что как раз и соответствует дате «сотворения мира» 30 декабря 1899 года. Именно с этой даты во всех компах идет отсчет времени. OLE все правильное делает, надо на входе подшаманивать под 1С

    Reply
  72. wolfsoft

    (71) Еще бы знать как? 🙂

    Reply
  73. Abadonna

    (72) Дык очень просто: дату в строку, если строка=»30.12.1899″ тогда НашаДата=ПолучитьПустоеЗначение(«Дата»);

    Reply
  74. wolfsoft

    (73) Попробуем, только такое чувство, что «УстановитьАтрибут()» опять переведет пустое значение в «30.12.1899».

    Reply
  75. Abadonna

    УстановитьАтрибут() тут не при чем, он как раз и устанавливает то, что приехало с ОЛЕ (30.12.1899). Ты перед установкой переведи в пустую дату, УстановитьАтрибут() и установит пустую.

    Reply
  76. wolfsoft

    (75) Чувствую недопонимание, попробую пояснить:

    Код
    ОбъектПриемник.УстановитьАтрибут(РеквизитИдентификатор,
       Объект.ПолучитьАтрибут(РеквизитИдентификатор));
    

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

    Объект — это объект текущей БД-источника

    ОбъектПриемник — это объект БД-приемника

    УстановитьАтрибут() — это метод БД-приемника, в который передается обычная "дата" текущей БД-источника, которая и является "пустой".

    Reply
  77. Abadonna

    Никакого недопонимания! Просто надо разбить твой код на 2 части:

    Код
    ТекАтрибут=Объект.ПолучитьАтрибут(РеквизитИдентификатор);
    Если ТипЗначения(ТекАтрибут)=3 Тогда //дата
    Если Строка(ТекАтрибут)="30.12.1899" Тогда
      ТекАтрибут=ПолучитьПустоеЗначение("Дата");
    КонецЕсли;
    КонецЕсли;
    ОбъектПриемник.УстановитьАтрибут(РеквизитИдентификатор,ТекАтрибут);
    

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

    Reply
  78. Abadonna

    А ваще щас гляну твой код, а то может я не про то… :))))

    Reply
  79. Abadonna

    А.. я думал ты а Приемнике запускаешь, а оказывается наоборот, в источнике… тады другое дело… бум посмотреть

    Reply
  80. Abadonna

    Проверил, вот так работает правильно, добавка в коде установки реквизитов шапки доков

    Код
       // устанавливаем реквизит
             ОбъектПриемник.УстановитьАтрибут(РеквизитИдентификатор,
                   ОпределитьОбъект(Объект.ПолучитьАтрибут(РеквизитИдентификатор)));
             //--- добавлено АК----------------      
             УстАтрибут=ОбъектПриемник.ПолучитьАтрибут(РеквизитИдентификатор);      
             Если ТипЗначения(УстАтрибут)=3 Тогда
                Предупреждение("Дата!");
                Если УстАтрибут=Дата("30.12.1899") Тогда
                   Предупреждение("Кривая");
                   ОбъектПриемник.УстановитьАтрибут(РеквизитИдентификатор,ПолучитьПустоеЗначение());
                КонецЕсли;
             КонецЕсли;
             //----------------------------------------------------
    

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

    Reply
  81. wolfsoft

    2 Abadonna: Убедил 🙂 Как появится время, исправлю и протестирую. Спасибо 🙂

    Reply
  82. Abadonna

    Кстати, до этого твои коды не смотрел, понравилось, что стиль программирования один в один мой, т.е. правильный :)))))))))))))))))

    Reply
  83. wolfsoft

    (82) В ВУЗе так учили 🙂

    Reply
  84. wolfsoft

    Релиз 1.25

    Замечание от NDeclin:

    «Пустые значения реквизитов типа «дата» переносятся как 30-12-1899.»

    Исправлено.

    Reply
  85. wolfsoft

    Блин, забыл упомянуть про неоценимую помощь Abadonna! 🙂

    Reply
  86. Abadonna

    Если ПустоеЗначение(Объект) = 1 Тогда

    Возврат ПолучитьПустоеЗначение();

    А красиво вышло ;))))

    Reply
  87. wolfsoft

    (86) Главный вывод из твоего кода — пустое значение типа «дата» передается не совсем корректно, а пустое значение неопределенного типа нормально передается. Вот и «подсунул» в нужном месте замену.

    😉

    Reply
  88. Abadonna

    (87) Мне просто лень было поискать, где в твоем коде оно в одном месте лежит 😉

    А мысля такая же была

    Reply
  89. wolfsoft

    Дык понятное дело 🙂

    Reply
  90. Abadonna

    Дружно поздравляем Антоху (wolfsoft): на сей секунд рейтинг ровно 1000

    Reply
  91. wolfsoft

    (90) Спасибо! Правильно, поздравим дружным голосование за разработки! :))

    Reply
  92. Alister

    Большое спасибо за Вашу разработку ! Очень мне на днях помогла — все четко и ясно !

    Reply
  93. praza

    Спасибо за программу

    Reply
  94. wolfsoft

    (93) Если Вам понравилась программа, то не поленитесь, проголосуйте за нее — этим Вы доставите большую радость разработчику, приблизите его на один шаг к его мечте — обогнать по рейтингу CheBurashku ! :)))

    Reply
  95. TIG-PROGRAMMIST

    А добавь туда плиз крючечек что бы можно было открывать не монопольно базу приемника…..

    Reply
  96. wolfsoft

    (95) Ответ на Ваш пост здесь

    http://www.1partner.nnov.ru/forum/index.php?fid=3&id=120082323675&page=0

    Reply
  97. Abadonna

    Антоха, блин…

    Процедура СоздатьПриемник()

    Путь=Симв(34)+Путь+Симв(34); // обязательно надо!!!!

    // иначе при наличии пробела в пути не стартует

    😉

    Reply
  98. wolfsoft

    (100) Аркадий, блин 🙂

    Все комменты — на сайте разработчика в разделе «Обратная связь»

    http://www.1partner.nnov.ru/forum/index.php?fid=3

    🙂

    ЗЫ: Добавлю, обновлю, но позже, вечерком.

    Reply
  99. apollo1982@mail.ru

    (86) Abadonna, Я делаю подключение к базе 77 из другой 77 для дублирования в ней объектов. База приемник не принимает пустое значение даты, хотя пытаюсь решить Вашим способом. Заполняет его 30.12.99. Вот часть кода — думаю, что достаточно. Что можете подсказать?

    Если тип = «Дата» Тогда
    Если ПустоеЗначение(реквЗн) = 1 Тогда
      справочникПриемник.установитьАтрибут(идентиф,ПолучитьПустоеЗначение())
     Иначе
    справочникПриемник.установитьАтрибут(идентиф,реквЗн);
    КонецЕсли;
    КонецЕсли;
    Reply

Leave a Comment

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