[1С:Предприятие 7.7] Занимательная передача параметров




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

    ИМХО опустить параметр = вообще не упоминать об его существовании при вызове процедуры, т.е. ПередачаПараметров1(1) — в данном случае будет Пар1 = 1, Пар2 = 2 и т.д.

    А то что ты делаешь — ПередачаПараметров1( , ) -ты передаёшь пустое значение (в 8ке там было бы Неопределено)…

    Reply
  2. ssp_

    Весело. Щас попробовал ПередачаПараметров1(,,). Получил:

    Пар1=»Пустой»

    Пар2=2

    Пар3=»Пустой»

    Чудеса…

    Reply
  3. Shaman100M

    Да, есть такое, именно с последним опущенным параметром. Наткнулся на эту фичу в глубокой отладке…

    Reply
  4. Abadonna

    (3)>опущенным параметром

    Опущенный параметр — жесть :)))))

    Reply
  5. vasilykushnir

    (4) да еще в сочетании с глубокой отладкой… Молодец, Шаман, — поднял (в смысле улучшил 🙂 ) настроение.

    Reply
  6. Shaman100M

    )))))) Еще раз перечитал свой пост…. долго думал…. ))) Ну, тогда «фича» и «наткнулся» тож рулят. ))))

    Reply
  7. Altair777

    На 7.70.27 (SQL) релизе тоже самое.

    Похоже, все-таки, дело в запятой перед параметром

    Если запятая есть, то параметр передан.

    А т.к. его фактически нет :-), то передается ПустоеЗначение. (сравните 4 и 5)

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

    ——————————

    1) ПередачаПараметров1(,)

    Пар1=»Пустой»

    Пар2=»Пустой»

    Пар3=3

    ——————————

    2) ПередачаПараметров1(,,)

    Пар1=»Пустой»

    Пар2=2

    Пар3=»Пустой»

    ——————————

    3) ПередачаПараметров1(1,,)

    Пар1=1

    Пар2=2

    Пар3=»Пустой»

    ——————————

    4) ПередачаПараметров1(1,2,)

    Пар1=1

    Пар2=2

    Пар3=»Пустой»

    ——————————

    5) ПередачаПараметров1(1,2)

    Пар1=1

    Пар2=2

    Пар3=3

    ——————————

    Reply
  8. venger

    (7) Даже если передается пустое значение, то в любом случае, если задано значение по умолчанию для формального параметра, формальный параметр должен инициализироваться значением по умолчанию. А этого не происходит, но только в одном случае (что радует), если пропущен фактический параметр после последней запятой при вызове функции, в остальных случаях, все работает, так как должно быть, т.е. если задано значение по умолчанию, то при пропущенно фактическом параметре, формальный параметр инициализируется значением по умолчанию. Т.е. налицо явно баг, хотя если красиво описать, то будет фича:-)))

    Reply
  9. Abadonna

    (8)>Даже если передается пустое значение

    Не передается НИКАКОЕ значение, не передается параметр ВООБЩЕ — а это, как говорят в Одессе, две большие разницы. Не баг и не фича, а стандартная вещь

    Reply
  10. vasilykushnir

    (8) А ведь стопудово прав. Все больше убеждаюсь, что для того, чтобы называть себя программистом, надо пройти курс молодого бойца на ассемблере… И все больше склоняюсь к мысли: чистый 1с-ник — не программист (в том смысле, что за плечами нет других языков программирования).

    Reply
  11. vasilykushnir

    Сорри, пост (10) относится к (9). И еще. Есть золотое правило: прежде чем кричать о глюках, лучше сначала выключить устройство krivie_ruchki.sys…

    Reply
  12. artbear

    Для справки — подобные баги при работе с параметрами по умолчанию были обнаружены еще пару лет назад при работе над ВК 1С++ 🙂

    У меня даже тесты соответствующие с тех пор остались.

    .

    ЗЫ это мы разбирались, как правильно передавать параметры по умолчанию в классы 1С++.

    Reply
  13. artbear

    Например, есть функция в глобальнике

    Код
    Функция глШтатныеПараметрыПоУмолчанию_Сложение(А = 2, Б = 3) Экспорт
       Возврат А + Б;
    КонецФункции

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

    и тест

    Код
    Процедура Тест_ГлобальнаяФункция_ШтатныеПараметрыПоУмолчанию() Экспорт
       Сам=Сам();
    
       Значение = глШтатныеПараметрыПоУмолчанию_Сложение(4);
       Сам.ПроверитьРавенство(Значение, 7);
    
       Значение = глШтатныеПараметрыПоУмолчанию_Сложение(,4);
       Сам.ПроверитьРавенство(Значение, 6);
    
       Значение = глШтатныеПараметрыПоУмолчанию_Сложение(4,);
       
       Сам.ПропуститьТест(0, "Штатные параметры по умолчанию неверно работают !!"+РазделительСтрок+
          "       Например, глоб. функция глШтатныеПараметрыПоУмолчанию_Сложение(4,) должна вернуть 7, "+РазделительСтрок+
          "       но 1С возвращает 4 :("+РазделительСтрок);
       
       Сам.ПроверитьРавенство(Значение, 7); // БАГ 1С - система возвращает 4
    КонецПроцедуры

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

    Reply
  14. vasilykushnir

    (12) Нет худа без добра — подумал зять, кидая камнем в собаку и попадая в тещу… 🙂

    Reply
  15. artbear

    (12+) Даже где-то на форуме 1cpp.ru есть соответствующая ветка.

    Reply
  16. artbear

    А для 3 и более параметров, как у автора, вообще полные чудеса творятся 🙂

    Reply
  17. artbear

    (12+) Соответственно, работа с методами по умолчанию в классах 1С++ лишена этого недочета 1С — в 1С++ все просто и прозрачно, как в других языках 🙂 Но только в том случае, если обращаться к объекту класса через контекст — типа ОБъект.Метод()

    В ином случае, если, например, внутри класса вызвать просто Метод(), 1С «сильнее» и работает именно ее синтаксис и ее баги 🙂

    Reply
  18. venger

    (9) Abadonna, а про инициализацию формального параметра значением по умолчанию (которое прописано при определении функции), при отсутсвии фактического, что ты можешь сказать, млин? Где тут норма?

    В варианте таком, тоже во второй параметр передается ПУСТОЕ значение:

    ПередачаПараметров1(1,,);

    Но на выходе получим, т.е. Пар2=2, а не «Пустой»:

    Пар1=1

    Пар2=2

    Пар3=»Пустой»

    Reply
  19. Abadonna

    >фактического, что ты можешь сказать, млин?

    А вот, млин, и говорю: первый та передал как 1, второй (раз он между запятыми) — ПустоеЗначение (вот и присвоилось значение =2), третий ты ваще не передал (т.е. не передавал ты туда пустое значение на основании которого он должен был стать=3)

    Reply
  20. artbear

    (19) Ты не прав — явный же изврат получился 🙂

    Reply
  21. Altair777

    Пока реализовывал мысль из (8)

    > Т.е. налицо явно баг, хотя если красиво описать, то будет фича:-)))

    вы уже много чего написать успели 😀

    ===================================

    Ага 🙂

    Например….

    Код
    Функция КолвоЗапятыхВПараметрах(Пар1="это оно!", Пар2="это оно!", Пар3="это оно!") Экспорт      
       Если ПустоеЗначение(Пар3)=1 Тогда   
          Возврат 2;
       ИначеЕсли ПустоеЗначение(Пар2)=1 Тогда   
          Возврат 1;
       ИначеЕсли Пар3<>"это оно!" Тогда   
          Возврат 2;
       ИначеЕсли Пар2<>"это оно!" Тогда   
          Возврат 1;
       Иначе   
          Возврат 0;
       КонецЕсли;   
    КонецФункции      
    //--------------------------      
    Процедура Сформировать()      
       Сообщить(КолвоЗапятыхВПараметрах());   
       Сообщить(КолвоЗапятыхВПараметрах(1));
       Сообщить(КолвоЗапятыхВПараметрах(1,));
       Сообщить(КолвоЗапятыхВПараметрах(1,2));
       Сообщить(КолвоЗапятыхВПараметрах(1,2,));
       Сообщить(КолвоЗапятыхВПараметрах(,,3));
    КонецПроцедуры   
    

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

    Результаты

    0

    0

    1

    1

    2

    2

    ————————-

    Кажется, работает правильно 🙂

    Reply
  22. artbear

    Какие-то у вас примеры некачественные 🙁

    Выкладываю свои юнит-тесты.

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

    Тесты для 2-х параметров я приводил в (13)

    Тесты для 3-х параметров:

    .

    В глобальнике есть функция

    Код
    Функция глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(А = 2, Б = 3, Ц = 5) Экспорт
       Возврат А + Б + Ц;
    КонецФункции

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

    .

    Вот юнит-тест

    Код
    Процедура Тест_ГлобальнаяФункция_ШтатныеПараметрыПоУмолчанию_3Параметра() Экспорт
       Сам=Сам();
    
       Сам.ПропуститьТест(0, "Штатные параметры по умолчанию неверно работают !!"+РазделительСтрок+
          "       Например, глоб. функция глШтатныеПараметрыПоУмолчанию_Сложение(4,) должна вернуть 7, "+РазделительСтрок+
          "       но 1С возвращает 4 :("+РазделительСтрок);
    
       Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4);
       Сам.ПроверитьРавенство(Значение, 12);
    
       Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(,4);
       Сам.ПроверитьРавенство(Значение, 11);
    
       Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4,);
       Сам.ПроверитьРавенство(Значение, 12);
    
       Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4, 1);
       Сам.ПроверитьРавенство(Значение, 10);
    
       Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4, 1, );
       Сам.ПроверитьРавенство(Значение, 10);
    
       Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(, 1);
       Сам.ПроверитьРавенство(Значение, 8);
    
       Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(, 1, );
       Сам.ПроверитьРавенство(Значение, 8);
    КонецПроцедуры

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

    .

    Проверьте результаты и порадуйтесь/погорюйте за 1С 🙂

    Reply
  23. artbear

    (22+) Результаты выполнения кода

    Код
    Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4);
    Сообщить("Значение = <"+Значение+">");
       
    Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(,4);
    Сообщить("Значение = <"+Значение+">");
       
    Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4,);
    Сообщить("Значение = <"+Значение+">");
       
    Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4, 1);
    Сообщить("Значение = <"+Значение+">");
       
    Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4, 1, );
    Сообщить("Значение = <"+Значение+">");
       
    Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(, 1);
    Сообщить("Значение = <"+Значение+">");
       
    Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(, 1, );
    Сообщить("Значение = <"+Значение+">");

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

    равны

    Код
    Значение = <12> это верно, а дальше фигня
    Значение = <11>
    Значение = <9>
    Значение = <10>
    Значение = <5>
    Значение = <8>
    Значение = <3>

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

    Разве это верные/ожидаемые результаты ? 🙂

    Reply
  24. artbear

    Кстати, не обратил внимания сначала — автор написал абсолютно верно

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

    .

    Т.е. разработчик 1С не проверил граничное последнее значение и сделал ошибку, а отсутствие соответствующих юнит-тестов не позволило найти эту ошибку, в результате чего ошибка так и живет до сих пор 🙁

    .

    Именно эти факты и доказывают наши тесты и примеры 🙁

    Reply
  25. JohnyDeath

    Артур, вот это:

    Код
    Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(,4);
    Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4,);
    Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4, 1);

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

    вполне ожидаемые результаты дают (дальше не смотрел).

    Единственное о чём надо помнить, ИМХО, так это про последний параметр.

    Например вот это:

    Код
    глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(, 1);

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

    я читаю как: Первый — по умолчанию (2), во второй — единица (1), последний — по умолчанию (5) = 8

    вот это

    Код
    Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(, 1, );

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

    так: Первый — по умолчанию (2), второй — единица (1), в третий — ПУСТОЕ (0) = 3

    Reply
  26. JohnyDeath

    (24) ну вот, сам же жирным и ответил на все вопросы. Т.е. никакого бага. Всё ожидаемо, КМК.

    Reply
  27. Altair777

    (26) > Т.е. никакого бага.

    Баг есть… у фирмы 1С

    Reply
  28. JohnyDeath

    вот и ветка с форума 1с++ : http://www.1cpp.ru/forum/YaBB.pl?num=1190633545/14

    Reply
  29. venger

    Им (JohnyDeath, Abadonna) просто 1С деньги пошляет, вот они и на защиту встали:-)))

    Reply
  30. Altair777

    И я хатю… Дайте два! 🙂

    Reply
  31. artbear

    (26) Жень, ну сам посуди, где же ожидаемое поведение —

    Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4,);

    9 разве ожидаемо? Т.е. второй пустой, а 3 параметр берется по умолчанию ??

    Изврат полный 🙂

    Reply
  32. artbear

    Кстати, могу в ВК 1С++ или в ФормЕкс исправить данное корявое поведение 1С 🙂

    Т.е. вместо пустых значений при использовании запятой будут выдаваться значения по умолчанию.

    .

    Но представляете, сколько давно работающего кода может оказаться неверным 🙂

    Reply
  33. Altair777

    (32) Будут баги при использовании исправленного бага? 🙂

    Reply
  34. venger

    (10) Я, кстати, не 1С’ник, и за плечами у меня не ассемблер, конечно, но есть много чего, правда многое было давно, в студенческие годы…

    Но раз мы такие опытные, приведите еще один язык (среду), с подобным поведением в передаче параметров.

    Reply
  35. venger

    (10) И много таких примеров Вы наберете? А как в Си, Паскале с этим? И сколько сред отрабатывают действительно ожидаемо?

    Соотношение будет в лучшем для Вас случае: как в 1С — 5%, как НЕ в 1С — 95%. И что ожидаемей по вашему?

    Reply
  36. venger

    (10) А по-поводу кривых рук, я б сказал, да не буду, деятель великий нашелся…

    Reply
  37. venger

    Сорри, пост 36 относится к 11-му посту:-)))

    Reply
  38. venger

    (11) Кстати, чтоб убедиться, что я НЕ чистый 1С’ник, как минимум, я вообще НЕ 1С’ник, глянь в мой профайл, найдешь пару примитивных ВК, с исходниками. Т.е. с другими языками, я точно знаком. Я просто, даже программистом назвать себя не могу, а ты вот не стесняешься и программистом себя считаешь, хотя ни одной операционки не создал или СУБД, или на худой случай среды разработки с языком гениальным, покрасивее, чем С++, например…

    Reply
  39. venger

    (38) Злой я сегодня:-)))

    Reply
  40. Душелов

    А вы тут все — молодцы!

    Reply
  41. venger

    Пошел, покушал, стал добрее. Кушайте люди, помогает от злости:-))

    Я итак на работе не могу заниматься программированием, а когда видишь (я счас не про сайт и не про тех, кто с сайта), что есть куча людей, в том числе и 1С’ников, особенно у франчей. Сидят целыми днями и могут заниматься программированием, а толку, только место занимают. А ты, через силу, после работы или по выходным, усталый и с кучей других проблем, нормально, а даже и получше, тратя гораздо меньше времени и вопреки обстоятельствам успеваешь и изучить, и делать получше, чем они. И с кучей отвлекающих обстоятельств. И ты после этого, так себе, а они супер-пупер прогеры, а зачастую только усидчивостью и берут. ОбЫдно, елы-палы…

    Reply
  42. Душелов

    (41) Учись, студент. И работать, и программить 🙂 И жениться тоже 🙂

    Reply
  43. venger

    (42) Прорвемся, где наша не пропадала:-)

    Я правда только в душе студент, а так давно уже нет, закончил, но это дела не меняет:-))

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

    Reply
  44. Душелов

    (43) Ну если по воспоминаниям… Я свою первую прогу написал в 11 лет, на спектруме, на бейсике… И понеслась 🙂

    Reply
  45. venger

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

    Reply
  46. JohnyDeath

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

    Reply
  47. venger

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

    Reply
  48. venger

    Необязательная установка значения параметра по умолчанию. Параметры с установленными значе­ниями по умолчанию можно располагать в любом месте списка формальных параметров.

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

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

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

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

    Reply
  49. venger

    Я просто решил перелистать описание языка, чтоб систематизировать и закрепить знания, и начал с первой главы…

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

    Reply
  50. CheBurator

    БК, спектрумы и прочее.. — счастливцы.. у вас хоть это было.. а в мое время — не было! и «если бы я не был мальчиком, то у меня даже не было бы в дестве игрушки»…

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

    Reply
  51. Abadonna

    Все непонятки у вас, мужики, из-за того, что вы хотите быть святее папы римского

    Есть определенные правила, как передать ПУСТОЙ параметр.

    Код
    Функция Сумма (А=2,Б=3)
       Возврат А+Б;
    КонецФункции
    
    Процедура Сформировать()
       Сообщить(Сумма()); // оба пустых
       Сообщить(Сумма(,5)); // первый пустой
       Сообщить(Сумма(8));  // второй пустой
    КонецПроцедуры
    

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

    Возвращает как и положено 5, 7, 11

    И только так!!! И никаких извратов типа Сумма(,) и Сумма(8,)

    Reply
  52. Abadonna

    +(51) А вот единственно правильный способ вызова в тремя параметрами

    Код
    Функция Сумма(А=1,Б=2,В=3)
       Возврат А
    Reply
  53. artbear

    (51,52) В других языках написание запятой без следующего параметра будет считаться ошибкой 🙁

    А у 1С все не как у людей 🙂 Поэтому очень даже запросто можно сделать подобную незаметную ошибку и поведение кода изменится 🙁

    Т.е. в данном случае 1С очень недружелюбно относится к синтаксису 🙁

    .

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

    .

    А вообще Сумма(,5) также изврат — как-то более надежно, что параметры по умолчанию могут быть только в конце списка параметров.

    Reply
  54. Abadonna

    (53) Проверю ради интереса на Дельфе. Чё-то как-то не озадачивался до этого…

    Reply
  55. vasilykushnir

    Вагнер, мне даже спорить с тобой лень — не игривое настроение что-то сегодня. А по сути вопросса… Хотя нет — сначала загадка:

    Мальчику дали три яблока. Он два съел. Сколько яблок осталось у мальчика?

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

    Отсюда вывод: ВСЕГДА НАДО ИНИЦИАЛИЗИРОВАТЬ ПЕРЕМЕННЫЕ ДО ИХ ИСПОЛЬЗОВАНИЯ. Тогда не будет возникать никаких глюков и подобных тем.

    Reply
  56. vasilykushnir

    + к (55) Вагнер = Вангер (опечатка — честное слово не нарочно).

    Reply
  57. Abadonna

    (53)+(54)>В других языках написание запятой без следующего параметра будет считаться ошибкой

    function Summa(A:integer=1;B:integer=2):integer;

    begin

    Result:=A+B;

    end;

    Дельфи при компиляции одинаково ругается и на Summa(5,), и на Summa(,5)

    Reply
  58. vasilykushnir

    (57) И правильно ругнется — ибо неча… Всегда надо четко осознавать, что передаешь в функцию — следовательно вправе ожидать адекватной реакции функции. Передашь ерунду — ерунду на выходе и получишь.

    Reply
  59. Crush

    Всем большое спасибо за указание на ошибку.. В последующих текстах буду учитывать подобное поведение.. Но чувствую что голова еще долго будет болеть за ранее написанные программы =))

    Reply
  60. vasilykushnir

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

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

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

    Reply
  61. Altair777

    (51) А кто в данном случае Папа Римский? 🙂

    Налицо с недокументированный 🙂 баг 1С. Вчитайтесь!

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

    На самом деле, опускать можно ЛЮБОЙ параметр… Главное, с запятыми не запутатся.

    (52) >А вот единственно правильный способ вызова в тремя параметрами

    Вы уверены, что перечислили ВСЕ?

    Код
    А то я тут еще 2 нашел
       Сообщить(Сумма(,10,20));   // пустой 1!
       Сообщить(Сумма(5,,20));   // пустой 2!
    

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

    Reply
  62. Abadonna

    (61) Баг не недокументированный, просто плохо документированный.

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

    P.S. Вот у меня почему-то никогда не возникало сомнений, как её правильно вызвать, наверное потому, что никогда документацию

    по таким вопросам не читаю :))))))))

    Reply
  63. Abadonna

    (61)>А кто в данном случае Папа Римский? :-))

    Папа Римский — Бенедикт XVII, кажись ;))))

    Reply
  64. alexqc

    Вообще, мало есть языков, в которых допустима конструкция с пустыми запятыми. Например в с++ нельзя, в делфи/паскале тоже (но тут уже сказали), в яве. Вроде можно в VBA/VBS, но там и именованные параметры задавать можно.

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

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

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

    Разве что так — изначально массив параметров инициализируются пустыми значениями;

    потом идем по списку, и ставим либо параметр вызова, либо параметр по-умолчанию если оного нет. И только потом — заполняем по-умолчанию то что осталось «за скобками». При этом каким-то образом в этой обработке умудрились опустить последний пустой параметр (а ведь он точно обрабатывается, иначе бы и заданные последние параметры опускались)? Тогда опять приходим к тому что для последнего параметра отдельный блок, вне цикла?

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

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

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

    Reply
  65. artbear

    Народ, дело ведь не только в параметрах по умолчанию, а в том, что 1С зачем-то разрешила не задавать параметры явно, а дала возможность пропускать их, просто не указываю 🙁

    .

    Например, есть

    Функция глШтатныеПараметрыПоУмолчанию_Сложение(А, Б)

    ее же можно и так

    глШтатныеПараметрыПоУмолчанию_Сложение(,) 🙁

    .

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

    .

    Другие языки все-таки более качественно отнеслись к этому вопросу и не допускают таких непоняток.

    Reply
  66. Altair777
  67. Abadonna

    (66) Не, вот он http://www.wareznik.net/world/id_53261/

    У Нуралиева скорее всего конфессия другая;)

    Reply
  68. Altair777

    (67) Сейчас отвикипедил 🙂 слово «конфессия»

    Конфе́ссия (лат. confessio — исповедание) — особенность вероисповедания в пределах определённого религиозного учения, а также объединение верующих, придерживающихся этого вероисповедания.

    Второе значение — это прямо про нас.

    Немножко перефразировав Митяева — «а для чего все мы здесь сегодня собрались»

    Так что… своего рода Нуралиев для нас — Папа Римский… 🙂

    Reply
  69. Abadonna

    (68)отвикипедил — плюсссссс!

    Reply
  70. Altair777

    (69) Спасибо за плюсик 🙂

    Самому до сих пор смешно, хотя уже годик-два употребляю этот глагол.

    Ничего военного в этом нет. Простая компиляция по принципу «Гугл — отгуглил».

    Reply
  71. vasilykushnir

    (68) -(70) Ну вы прям словарь сленга создаете;

    гугл = гугнул, отгуглил, гугланул, загуглячил…

    … все = загуглили все

    Полный … = полный яндекс

    Reply
  72. Abadonna

    (71) Забыл еще одно: полный гуглец :)))

    Reply
  73. vasilykushnir

    + к (71)

    — ты не занят.

    — Занят! Но я отвечу на все твои вопроссы. И вообще последнее время, блин!, рядом с тобой я чувствую себя полным гуглом…

    Reply
  74. Vitek

    Имхо «отвикипедил» ближе к созданию статьи в википедии.

    Погуглил, повикипедил, полуркал…

    но это уже полный офф 🙂

    Reply
  75. Altair777

    (74) имхо, Вы не правы… А что тогда «отгуглил»?

    Хакнул робота Гугла и продвинул свой сайт в топы? 🙂

    Reply
  76. Abadonna

    И последний вариант: википедик :))))

    Reply
  77. vip

    (76) :)))))))

    Reply
  78. Altair777

    (76) этот тот, кого википедают? 🙂

    Reply
  79. Abadonna

    (77) Сорри за OFF. Ероха, ты чё в асе скрываешься?

    Reply
  80. sash-ml

    а шо если запятую убрать а?

    Reply
  81. Altair777

    (80) тада усё будить оки )

    Reply
  82. pvase

    Автор не прав, он передает 2 параметра, так как стоит запятая (,). Соответсвенно считается что параметр 1 и параметр 2 пустые.

    Reply
  83. venger

    (83) Значения по умолчанию формальных параметров учли? :-))

    Reply
  84. venger

    (83) Комментарии к статье читали? Там есть еще много различных примеров в дополнение к сказанному в статье. В статье минимум, чтоб понять смысл…

    Reply
  85. venger

    (83) В общем, поверьте на слово, автор прав:-))

    Reply
  86. venger

    (83) Основные расхождения в интерпретации, как всегда, — это баг или не очень:-))

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

    Reply
  87. Altair777

    Спмое забавное, что вариант (,) проходит…

    Хотя первому параметру не присвоено значение по умолчанию.

    Сравните с тем, что вариант () на этапе синтаксиса уже не проходит.

    Вот еще 1 баг 🙂

    Reply
  88. vasilykushnir

    (87)»Основные расхождения в интерпретации, как всегда, — это баг или не очень:-))»

    Наполовину беременна, наполовину нет… 🙂

    Reply
  89. venger

    (89) VasilyKushnir, вообще я не злой:-))

    Кстати, мой ник — это по фамилии на русском — Венгер, на первом слоге ударение, если произносить:-))

    Хотя Вагнер или Бетховен или Бах, тоже приятно, быть композитором в программировании — это исскуство:-))

    Reply
  90. venger

    +(90) Но я не так крут еще:-))

    Reply
  91. CheBurator

    (90) угумс.. был у нас замполит — зАсов и чел с фамилией кОзлов… но больше всего не повезет жене человека с фамилией Вагин….

    Reply
  92. JohnyDeath

    (92) а со мной училась такая 😉

    Reply
  93. CheBurator

    А фамилия чела Воробьев — лучше ее в обществе женщин задом наперед вслух не читать…

    Reply
  94. venger

    Головач Лена, так что обломитесь все:-)

    Reply
  95. alevnev

    1) В случае вызова (,) опущен 1-й фактический параметр, не имеющий значения по-умолчанию. А по документации: «Если параметру задано значение по умолчанию и он является последним в списке…»

    2) Функция ПустоеЗначение() очень часто ведет себя непредсказуемо даже в 27-ом релизе, в частности, с агрегатными типами данных (справочник, документ).

    Reply
  96. nickVZ

    А может стоит бросить привычку ожидать, что реализовано что-то по вашему мнению? А? И в сомнительных случаях просто ставить проверку?

    Reply
  97. vasilykushnir

    (97) Отлично сказано.

    Reply
  98. vasilykushnir

    (97) Быстрее нет, чем да. Просто, как сказано в (97), стараюсь максимально ставить проверки — от греха подальше. Хотя с моими юзверями не всегда спасает… Именно в этой части согласен с (97).

    Reply
  99. venger

    (101) Я вот чего понять не могу, чем эта позиция (ведь у меня такая же) мешает признать, что в 1С немного подошиблись и перекрутили в реализации приема/передачи параметров?

    Reply

Leave a Comment

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