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




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

60 Comments

  1. nipil

    Класс!

    Работает даже без «модуля внешнего соединения».

    ИмяФайла = «\ShareВнешниеОбработкиCOMAdd.epf»;
    Попытка
    Обработка = connection.ВнешниеОбработки.Создать(ИмяФайла);
    Исключение
    Сообщить(«Ошибка создания внешней обработки: «+ИмяФайла+Символы.ПС+ОписаниеОшибки());
    КонецПопытки;
    .
    .
    ОтветОттуда=Обработка.ИсполнитьВн(ИсполнитьКод,СсылкаCOM);
    
    

    Показать

    Reply
  2. V_V_V

    Я ничего не путаю, в первой функции ошибок нет? Сдается мне она ВСЕГДА должна ответ «ОК» присылать. Может все же должно быть Ответ = Выполнить(КодВыполнить); ?

    И почему проверка на Строку? А если я в ответ именно строковое значение хочу получить?

    Сорри конечно, если я туплю…

    Reply
  3. nipil

    (2) V_V_V, У меня «ошибается» только с пустыми параметрами

    .ИсполнитьВн();
    

    Пример с «номенклатурой» работает.

    Reply
  4. jobkostya1c8

    Да, все долго мучились с COM-соединением. Интересная методика 🙂 Попробую взять на вооружение.

    Reply
  5. script

    Спасибо. Я месяца 2 назад потратил 2 два дня только на разработку инфраструктуры для обмена через Com. Где же вы были раньше.

    Reply
  6. Yashazz

    Мдя, скоро и правда даже «Сообщить(«Привет») станет на ИС откровением и сакральным знанием… Если уж на столь очевидные вещи находятся восторгающиеся…

    Матчасть учите и ИТС читайте, будет вам щастье.

    p.s. за советы «чуть-чуть изменить конфу» хочется минусовать, не глядя. Есть несколько способов добиться того же, что описано в статье, не меняя конфу никак (вот, хотя бы, в (1) приведено, но там нужны права на запуск внешних обработок). Но топорные решения — они да, самые простые…

    Reply
  7. Danila-Master

    Методика, конечно, интересная.

    Но увеличивает уязвимость базы.

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

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

    Вот же вирусяка то получится 🙂

    Reply
  8. asved.ru

    (7) Danila-Master, то же самое можно сделать и без такой функции.

    Reply
  9. Stim213

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

    это очень облегчает жизнь тем, кто хочет произвести неправомерные действия с базой. Если я увижу такую ДЫРУ в какой-либо из сопровождаемых базах, я немедленно её закрою, а на того, кто её сделал поставлю вопрос о проф пригодности.

    Автор никогда не задумывался, почему такую супермегаполезную функцию разработчики за десяток лет не запилили ни в одной типовой конфигурации?

    Reply
  10. Рэйв

    (9) Stim213, Тогда надо всю жизнь сидеть дома и не выходить на улицу. Вдруг машина собъет или кирпич на голову упадет?

    Хотя и на квартиру может упасть самолет:-)

    Чтобы знать что такая функция есть надо зайти в конфигуратор и посмотреть в модуль внешнего соединения. А уж нахождение в конфигураторе — вот это уязвимость так уязвимость!:-)

    Reply
  11. Рэйв

    (6) Yashazz, не все подписаны на ИТС. И не для каждого это элементарные вещи. Хотя для более менее опытного спеца- конечно ерунда. Но ведь не все супер спецы, не так ли?

    Reply
  12. Рэйв

    +(6)>>p.s. за советы «чуть-чуть изменить конфу» хочется минусовать, не глядя

    🙂 Сразу видно ярого апологета, молящегося на стандартные конфы. Это, сударь, скорее ваш недостаток, чем достоинство. Я всю карьеру работаю либо с силь

    Reply
  13. bulpi

    (9)

    Главная защита неуловимого Джо в том, что он на фиг никому не нужен. Помни об этом 🙂

    Reply
  14. Stim213

    (13) да без разницы. правила информационной безопасности едины для всех. Плох тот программист, который не соблюдает эти правила в своих разработках, независимо от степени важности информационной базы.

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

    Reply
  15. Stim213

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

    Отвечаю: чтобы узнать про эту дыру не нужен доступ в конфигуратор. Достаточно доступа к бекапу, cf или просто болтливый программист.

    В базе может быть внешний пользователь, например, для обмена. Его имя и пароль используются в скриптах обмена/обновлений. Доступ к скриптам имеют админы, менеджеры и все те, кто этим занимается.

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

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

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

    Reply
  16. Stim213

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

    http://infostart.ru/public/182849/

    Reply
  17. lefthander

    Интересная идея. Спасибо, возьму на вооружение, у меня куча отчетов по COM тянет данные из примерно 30 различных баз.

    Reply
  18. spezc

    жесть… вот вам доступно и всерьез

    Reply
  19. PiccaHut001

    (14) Stim213, не устраивайте цирк, если у пользователя есть права доступа к данным, он сможет стянуть их и без этой чудной функции. У автора нормальное решение, правила ИБ каждая кормушкакорпорация устанавливает свои, очень сомневаюсь, что даже в ваших есть что-то про использование «выполнить» на стороне базы.

    Reply
  20. Stim213

    (19) PiccaHut001, это не цирк, а элементарное соблюдение прав доступа и безопасности информационной базы.

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

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

    Reply
  21. acsent

    Вообще то это ошибка

    CWE-676 по классификации «2011 CWE/SANS Top 25 Most Dangerous Software Errors»

    Reply
  22. JesteR

    Передай туда такой код:

    Для каждого ТекРегистр ИЗ Метаданные.РегистрыСведений Цикл
    НЗ = РегистрыСведений[ТекРегистр].СоздатьНаборЗаписей();
    НЗ.Записать();
    КонецЦикла;

    или

    Выборка = Справочники.Контрагенты.Выбрать();
    //даллее код отправки на мыло.

    Reply
  23. PiccaHut001

    (20) Stim213, чтобы стащить справочник контрагентов,

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

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

    Reply
  24. Stim213

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

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

    Reply
  25. PiccaHut001

    (24) Stim213,

    вообще не важно, какие права у внешнего пользователя

    не совсем Вас понял. Есть пользователь, под которым запускается код в выполнить. Если выполнить запускается НЕ в привилегированном режиме и у пользователя нет прав на справочник, как он его может прочитать? Тем-более кудо слить? Может действительно я отстал от жизни

    Reply
  26. Stim213

    (25) PiccaHut001,

    «Если выполнить запускается НЕ в привилегированном режиме и у пользователя нет прав на справочник, как он его может прочитать? »

    Привилигированный режим устанавливается программно, доступен при внешнем соединении.

    Reply
  27. monkbest

    (9) Stim213, в чем дыра?

    подключения производятся под пользователем 1С

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

    Единственно, что сейчас появился привилегированный режим, который чихать на права хотел, и которой включается кодом, вот про него во внешнем соединении не знаю ничего

    Reply
  28. Stim213

    (27) monkbest, «вот про него во внешнем соединении не знаю ничего»

    ну раз не знаете, зачем писать?

    Reply
  29. monkbest

    (28) Stim213, вообще зря они этот режим ввели. Это для тех, кому права правильно настраивать лень. В 7.7 была такая дыра, если нет прав, но можно запустить внешнюю обработку, ты царь и бог в базе:)

    а разве нельзя написать:

    Соединение.УстановитьПривилегированныйРежим(ИСТИНА)

    кажись можно, а значит «выполнить» и не дыра вовсе, дыра — возможность соединения

    Reply
  30. monkbest

    Спор про безопасность считаю закрытым. т.к. без всяких «Выполнить», можно написать код:

     База = Новый COMObject(«V83.COMConnector»);
    Соединение = База.Connect(«Srvr=»»apps2:1741″»;Ref=»»zup30″»;Usr=»»Тест»»;Pwd=»»******»»;»);
    Соединение.УстановитьПривилегированныйРежим(Истина);
    Соединение.УстановитьПривилегированныйРежим(Ложь);
    Соединение = Неопределено;

    код отработал на ура, печалька

    Reply
  31. Stim213

    (30) monkbest, вы дурачитесь или серьезно?

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

    учите матчасть.

    Reply
  32. PiccaHut001

    (31) Stim213,

    Привилигированный режим устанавливается программно, доступен при внешнем соединении.

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

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

    Reply
  33. monkbest

    (31) Stim213, я серьезно

    ошибки он уже не выдал, я это проверил

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

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

    Если, как Вы утверждаете метод УстановитьПривилегированныйРежим ничего не включает, то нафига его сделали доступным у ком объекта?

    Reply
  34. monkbest

    (31) Stim213, эксперимент закончен

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

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

    База = Новый COMObject(«V83.COMConnector»);
    Соединение = База.Connect(«File=»»C:Documents and Settings*****My Documentsзуп30″»;Ref=»»zup30″»;Usr=»»test»»;Pwd=»»******»»;»);
    
    Соединение.УстановитьПривилегированныйРежим(Истина);
    
    эл = Соединение.справочники.Сотрудники.СоздатьЭлемент();
    эл.ОбменДанными.Загрузка = Истина;
    эл.Наименование = «проба»;
    эл.Код = «99999»;
    эл.Записать();
    
    Соединение.УстановитьПривилегированныйРежим(Ложь);
    Соединение = Неопределено;

    Показать

    Reply
  35. Stim213

    (32)

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

    я так не говорил и не говорю.

    Установка привилегированного режима вполне себе выполнится как на сервере, так и при внешнем соединении.

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

    Режим не установится только в том случае, если база клиент-серверная, а установка выполняется на клиенте.

    Reply
  36. Stim213

    (33) monkbest, этот метод доступен, когда вызывается как бы «внутри» базы, встроенным языком 1С.

    Когда вы пишите Соединение.МойОбщийМодульВнешнегоСоединения.ВыполнитьУстановкуПривилегированногоРежима() — режим для подключения установится. Выполнения кода в данном случае выполняется в 1С.

    Когда вы пишите Соединение.УстановитьПривилегированныйРежим(Истина) — привилег режим не установится, потому установка режима выполняется не в 1С, а той программой, которая установила соединение — vb скрипт, к примеру, и код выполняется dll’кой в процессе, вызвавшем COMConneсtor.

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

    Reply
  37. monkbest

    (36) Stim213, понятно, спасибо.

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

    Reply
  38. ManyakRus

    я так и не понял зачем такой бред:

    ИсполнитьКод= «Ответ=Перечисления.КакоетоИмя.КакоетоЗначение»;//код на исполнение

    ОтветОттуда=Соединение.ИсполнитьВн(ИсполнитьКод);

    🙁

    когда можно сразу написать:

    ОтветОттуда= Соединение.Перечисления.КакоетоИмя.КакоетоЗначение;

    и остальное всё тоже бред 🙁

    Reply
  39. Рэйв

    (38)

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

    Reply
  40. Рэйв

    Мое скромное имхо, господа, — ваш заруб за безопасность вечен и принципиально не разрешаем:-)

    Reply
  41. webester

    (40)stim123, сказал все правильно, что там неразрешаемого?

    Reply
  42. Рэйв

    (41)Просто кто-то не очень подвержен паранои и готов немного поступиться безопасностью ради удобства, а кто-то нет:-)

    Reply
  43. uri1978

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

    Почему решили, что команда «Выполнить» работает под полными правами?

    Если у пользователя, под которым подключаются по COM есть доступ к данным, то не важно — есть функция в Модуле Внешнего Подключения, нет такой функции — удалить или прочитать данные можно. Например ,никто не запрещает через Соединение очистить регистры.

    По безопасности — выстраивайте ПРАВИЛЬНЫЕ права у пользователя который к COM подключается и спите спокойно.

    Reply
  44. Bacemo

    такое встетил впервые. поразбираюсь автору +

    Reply
  45. Stim213

    (43) uri1978,

    «Если у пользователя, под которым подключаются по COM есть доступ к данным»

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

    Любой админ, любой пользователь — кто угодно!

    Reply
  46. Stim213

    (39) Рэйв,

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

    Это не повод делать дыру в базе.

    Используйте строковое представление перечисления XMLСтрока(), или системный реквизит Порядок перечисления.

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

    Reply
  47. uri1978

    (45) Stim213,

    В МодулеВнешнегоПриложения не происходит контроль прав?

    Reply
  48. Stim213

    (47) uri1978, происходит, разумеется. Но его прекрасно можно отключить установкой привилегированного режима.

    Reply
  49. uri1978

    (48) Stim213,

    Т.е. в команде Выполнить — можно «УстановитьПривилегированныйРежим(Истина)» и всё прокатит? Тогда это дыра, согласен.

    Reply
  50. Stim213

    (49) uri1978, конешн прокатит. Это прокатывает с обработкой универсального обмена XML, я об этом уже писал

    http://infostart.ru/public/182849/

    Reply
  51. uri1978

    (50) Stim213,

    Век — живи век — учись. Пошел почитаю вашу статью про обмен.

    Reply
  52. ezhik_2000

    (29) monkbest, «вообще зря они этот режим ввели. Это для тех, кому права правильно настраивать лень.» — Тут дело не в лени а в новых возможностях. Например для пользователя нет прав на чтение регистра сведений, но при выполнении алгоритма данные оттуда нужно тянуть

    Reply
  53. Рэйв

    (46) Stim213, Я уже выше говорил про параною и разное отношение к ней.

    Я наверное програмер уже старой закваски.Слегка разпиз@яйской-)) Так что как я выше и говорил — понять друг друга можем, но убедить нет:-)

    Reply
  54. tormozit

    Описанная здесь идея лежит в основе нашего тиражного продукта 2iS:Интеграция http://www.2is.ru/ . Это конфигурация на 1С, в которой ты регистрируешь нужные базы 1С. Далее, используя виды автозаданий (предопределенные внешние обработки или добавленные свои внешние обработки или даже просто алгоритмы), выполняешь автозадания по расписанию или вручную или через шлюз веб-сервисов. Предопределенных видов автозаданий уже довольно много (мониторинг, обмен, управление пользователями, загрузка и обновление конфигурации, выгрузка базы и т.д.). Также реализована подсистема портал отчетности, которая позволяет разрабатывать и формировать отчеты в Интеграции для подключенных к ней баз. Все это без изменения конфигурации подключаемых к Интеграции баз.

    Reply
  55. Рэйв

    (54) tormozit, И не стыдно тебе? 🙂 Вроде уважаемый инфостартер…

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

    Не хорошо.

    Reply
  56. Рэйв

    (54)Оставлю, пуст будет тебе укором.

    Reply
  57. tormozit

    Кому то реклама, а кому то ссылка на много готового кода…

    Reply
  58. Рэйв

    (57)А ты не оправдывайся, чувачок. Иди на своей странице код свой нужный и готовый приводи коли такой умный…..

    Reply
  59. Chloe

    не очень понятно как запрос передать в ИсполнитьКод…..

    Reply
  60. Рэйв

    (60) Chloe,

    Можно разными способами.

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

    //———-

    ТекстЗапрос=»Выбрать * Из Справочник.Номенклатура»;

    КодТам=»Запрос=Новый Запрос; Запрос.Текст=ВспомПараметр;Ответ=Запрос.Выполнить().Выгрузить()»;

    Результат=Соединение.ИсполнитьВн(КодТам,ТекстЗапрос);

    Reply

Leave a Comment

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