Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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='\

72 Comments

  1. CyberCerber

    Да, интересно

    Но можно еще проще так директиву написать:

    #Если Ложь Тогда

    &НаСервере

    #Иначе

    &НаКлиентеНаСервереБезКонтекста

    #КонецЕсли;

    Reply ↓
  2. tormozit

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

    #Если Ложь

    #Если Истина

    #Если Штаны

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

    Reply ↓
  3. spacecraft

    (2)

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

    Похоже они таки услышали. Причем буквально.

    Такой код даже не компилируются:

    #Если ИСТИНА Тогда
    Сообщить(«Истина»);
    #КонецЕсли
    #Если Ложь Тогда
    Сообщить(«Ложь»);
    #КонецЕсли
    

    Зато спокойно компилируется и отрабатывает вот такой код:

    #Если Не МишкаКосолапый Тогда
    Сообщить(«Фигня»);
    #КонецЕсли
    

    платформа еще 8.3.8

    Reply ↓
  4. tormozit

    (3) Под «считать такие выражения некорректными» имелось ввиду, что препроцессор будет выдавать ошибки. Сейчас он их не выдает и просто считает все неизвестное равным ЛОЖЬ.

    Reply ↓
  5. spacecraft

    (4) когда должен выдавать ошибки препроцессор?

    Если выдает ошибки при сохранении. Если сохранить, то при открытии:

    «Ошибка в операторе препроцессора

    #Если <<?>>ИСТИНА Тогда

    Пропущен оператор препроцессора Если (If)»

    Это кто ошибку дает?

    Reply ↓
  6. tormozit

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

    Reply ↓
  7. spacecraft

    (6) ок. Еще раз.

    когда должен выдавать ошибки препроцессор?

    Если выдает ошибки при сохранении.

    Ошибка при сохранении:


    {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(5,8)}: Ошибка в операторе препроцессора

    #Если <<?>>ИСТИНА Тогда (Проверка: Сервер)

    {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(7,3)}: Пропущен оператор препроцессора Если (If)

    #<<?>>КонецЕсли (Проверка: Сервер)

    {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(5,8)}: Ошибка в операторе препроцессора

    #Если <<?>>ИСТИНА Тогда (Проверка: Тонкий клиент)

    {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(7,3)}: Пропущен оператор препроцессора Если (If)

    #<<?>>КонецЕсли (Проверка: Тонкий клиент)
    Reply ↓
  8. Dzenn

    Колдун!!! 😉

    Reply ↓
  9. nvv1970

    (1) Не прокатывает такой вариант. Ложь — не нравится. Мишка косолапый в Штанах — лучше, но не то )

    (0) Раз пошла такая пьянка, то можно вообще упроститься до

    #Если Сервер Или Не Сервер Тогда
    //#Если Клиент Или Не Клиент Тогда <<или так
    &НаКлиентеНаСервереБезКонтекста
    #КонецЕсли

    Платформа будто бы говорит «ой, всё! да вот вам чертов серверный контекст и не дурите голову!», предполагая что когда-нибудь этот бред все-таки не выполнится))

    Reply ↓
  10. tormozit

    (7) Проверил. Ты прав. Действительно теперь препроцессор ругается именно на «истина» и «ложь». Видимо мое пожелание реализовали как то частично (только для самых популярных слов).

    Reply ↓
  11. tormozit

    (9) Проверил свое предположение перед его публикацией? Оно не дает контекстную подсказку.

    Reply ↓
  12. zqzq

    (10) Видимо пожалели таких горе-программистов как я 🙂

    чтобы такой код продолжал работать:

    #Если ДляСинтаксПодсказки #Тогда
    ППП = Документы….Создать();
    #КонецЕсли
    Reply ↓
  13. spacecraft

    (10) они тем самым сделали еще больше проблем.

    Вот такой код будет корректен, но никогда не выполнится:

    #Если Фигня Тогда
    Сообщить(«Фигня»);
    #КонецЕсли
    

    А если перед ним написать:

    Фигня = Истина;

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

    #Если Истина Тогда

    Да и любые комбинации, которые дают логическое значение, так же не будут работать.

    Reply ↓
  14. YanTsys

    Помогите разобраться чем предложенный вариант будет отличаться от:

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    НастроитьЭлементыФормы(ЭтаФорма);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура Реквизит2ПриИзменении(Элемент)
    НастроитьЭлементыФормы(ЭтаФорма);
    КонецПроцедуры
    
    // ———————->>>
    &НаСервере
    Процедура НастроитьЭлементыФормы(ЭтаФорма)
    Элементы = ЭтаФорма.Элементы;
    Элементы.Реквизит1.Видимость = ЭтаФорма.Реквизит2;
    КонецПроцедуры

    Показать

    Reply ↓
  15. tormozit

    (12) Перед «Тогда» решетка не нужна.

    Reply ↓
  16. tormozit

    (14) Тем что будут серверные контекстные вызовы. А в моем варианте их нет.

    Reply ↓
  17. CyberCerber

    (9) Да, действительно плохо проверил

    У меня сработал такой вариант:

    #Если А Тогда
    &НаСервере
    #Иначе
    &НаКлиентеНаСервереБезКонтекста
    #КонецЕсли

    Только минус во всех этих подходах, что подсказка работает, но только для серверных методов, т.к. была объявлена директива &НаСервере.

    Reply ↓
  18. nvv1970

    (11) «Какие будут ваши доказательства?» (С) ))))

    Картинка

    (17)

    Только минус во всех этих подходах, что подсказка работает, но только для серверных методов, т.к. была объявлена директива &НаСервере.

    Это важное замечание.

    Объявлять &НаСервере и не обязательно. Похоже что при наличии любых условий (##) такая директива добавляется в контекстной автоматом как директива по-умолчанию. Попробовал добиться, чтобы были видны клиентские методы (например, ПодключитьОбработчикОжидания) — вообще никак не получилось при любых вариациях с наличием условия (#Если + &НаКлиенте). Только при чистом &НаКлиенте видны.

    Баловство это, но все равно интересно )

    Reply ↓
  19. tormozit

    (18)

    Объявлять &НаСервере и не обязательно

    Продолжаешь заблуждаться. Видимо тебе мало (11) и (17)?

    Reply ↓
  20. nvv1970

    (19) Не понял тебя. Заблуждаться в чем? Поясни примером.

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

    #Если Сервер Или Не Сервер Тогда

    &НаКлиентеНаСервереБезКонтекста

    #КонецЕсли

    Такой пример дает серверную контекстную подсказку без объявления где-либо НаСервере. Отлично бесконтекстно выполняется при и при клиентском и серверном вызове.

    Блин, в чем тут заблуждение????

    Reply ↓
  21. tormozit

    (20) Возможно ты прав, но просто какие то еще влияющие инструкции не показал. Покажи полностью модуль и покажи контекстную подсказку через точку от ЭтаФорма.

    Reply ↓
  22. nvv1970

    (21) Наконец разобрался о чем ты пишешь…

    Т.е. у меня одно есть контекстная подсказка, больше ни у кого нет?

    Оказывается именно так.

    Причина оказалась в версиях платформы.

    Например, На 8.3.6.2390 подсказка в моем примере еще была, на актуальной 8.3.10 — уже нет.

    Reply ↓
  23. tormozit

    (22) Думаю и про 8.3.6.2390 ты заблуждаешься. Ты показывал скрин с подсказкой по локальному контексту, а не через точку от ЭтаФорма.

    Reply ↓
  24. spacecraft

    (21) там весь прикол в том, что конструкция препроцессора не захватывает сам метод:

    #Если Сервер Или Не Сервер Тогда
    &НаКлиентеНаСервереБезКонтекста
    #КонецЕсли

    И в данном случае к контексту подсказки добавляется контекст по-умолчанию для модуля форм, т.е. &Сервер.

    Если же #КонецЕсли будет после метода, то и контекст будет только тот, что указан препроцессору.

    Reply ↓
  25. spacecraft

    (23) я покажу. 1с 8.3.8

    Reply ↓
  26. YanTsys

    (15) Насколько я понимаю неконтекстный вызов функции это когда не передается контекст формы, но вы же его передаете как параметр «ЭтаФорма» ?

    Reply ↓
  27. tormozit

    (26) Контекстный вызов это всегда вызов с клиента на сервер с синхронизацией данных формы. В статье же рассматривается локальный (без передачи управления на сервере) вызов с доступом к контексту формы.

    Reply ↓
  28. wazup666

    А чем не устраивает вызов процедуры НастроитьЭлементыФормы с директивой &НаКлиенте из обработчика ПриОткрытии?

    Reply ↓
  29. tormozit

    (25) Это снегопат. А обсуждение про штатную контекстную подсказку конфигуратора.

    Reply ↓
  30. tormozit

    (27) Тем что вызывать хочется одинаковый код на клиенте и на сервере без серверного вызова.

    Reply ↓
  31. spacecraft

    (29) ок. Вот штатная.

    Reply ↓
  32. tormozit

    (31) Спасибо. Убедил. Согласен, на 8.3.8 так работало. Но на 8.3.10 не работает.

    Reply ↓
  33. YanTsys

    (28) Извините настолько привык пользоваться только &НаСервереБезКонтекста что как-то в упор не увидел что у вас &НаКлиентеНаСервереБезКонтекста и что вызов с клиента вообще не будет трогать сервер… Спасибо за науку 🙂

    Reply ↓
  34. wazup666

    (30) Ваше желание иметь одинаковый код на сервере и на клиенте мне понятно. Не понятно его целесообразность. Как часто вам приходиться настраивать форму с сервера минуя клиента?

    Reply ↓
  35. YanTsys

    …

    Reply ↓
  36. YanTsys

    (34) Денис а разве не для того нужен режим &НаСервере чтобы настраивать форму прямо на сервере до возврата управления клиенту?

    В противном случае нам за глаза хватило бы &НаСервереБезКонтекста передали нужные данные обработали, вернули на клиента и настраиваем форму как хотим 🙂

    Reply ↓
  37. wazup666

    (36) Нет. Сомневаюсь, что сакральный смысл режима &НаСервере настраивать форму для клиента. Зачем занимать ресурсы сервера на настройку формы коли сервер вы вызвали с клиента и туда же вернетесь.

    Reply ↓
  38. YanTsys

    (37) Вот послушали бы сейчас вас в 1с и убрали сразу два режима &НаСервере и &НаКлиентеНаСервереБезКонтекста… И кстати фраза «Зачем занимать ресурсы сервера» целиком и полностью противоречит текущей политике 1с 🙂

    Reply ↓
  39. tormozit

    (34) Реквизиты формы доступны на клиенте и на сервере. Менять их можно на клиенте и на сервере. Поэтому и настраивать свойства элементов формы после их изменения также хочется на клиенте и на сервере по возможности одинаково. Для этого я и делаю такой метод.

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

    Reply ↓
  40. wazup666

    (38)

    Вот послушали бы сейчас вас в 1с и убрали сразу два режима &НаСервере и &НаКлиентеНаСервереБезКонтекста…

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

    (38)

    И кстати фраза «Зачем занимать ресурсы сервера» целиком и полностью противоречит текущей политике 1с 🙂

    Не нужно вырывать фразы из контекста. Речь идет о настройке формы. Например, смена доступности элемента. Или вы считаете, что для этого нужно обязательно бежать на сервер. А о политике 1С ничто не говорит лучше чем их официальные источники: http://v8.1c.ru/o7/201505layout/index.htm

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

    Ни вижу смысла дальше развивать эту тему. Каждый случай индивидуален. И посему откланиваюсь

    Reply ↓
  41. YanTsys
    Не нужно вырывать фразы из контекста. Речь идет о настройке формы. Например, смена доступности элемента. Или вы считаете, что для этого нужно обязательно бежать на сервер.

    Не пытайтесь спорить сами с собой…

    Никто не говорил что нужно ОБЯЗАТЕЛЬНО бежать на сервер.

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

    Reply ↓
  42. Поручик

    (18) С какого-то релиза платформы объявлять &НаСервере стало обязательно, иначе появляются ошибки при вызове РеквизитФормыВЗначение.

    На ошибку нарвался буквально вчера в одной из обработок, которая раьше благополучно работала без этой инструкции..

    Reply ↓
  43. tormozit

    (42) Не заметил такого. Поэтому прошу доказательства.

    Reply ↓
  44. orefkov

    (29)

    В данном конкретном случае снегопат просто выводит в своём списке содержимое штатной контекстной подсказки. Определяется это просто — если рамка вокруг списка толстая — это список, который составляет сам снегопат. Если рамка тонкая — это перехваченный снегопатом штатный список.

    Reply ↓
  45. CyberCerber

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

    А ведь 1С могла решить проблему подсказок одной конструкцией, о которой давно мечтаю — типизированием параметров методов.

    Т.е. чтобы можно было описывать методы как-то так:

    Процедура СделатьЧтоТо(Форма: УправляемаяФорма, Список: СписокЗначений)

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

    Reply ↓
  46. tormozit

    (45) К сожалению, ты не вник в суть. Поэтому и дал такую поверхностную оценку В контекстной подсказке нужна не просто форма, а контекстная форма. Поэтому твоей конструкцией проблему не решить, а нужны именно инструкции (а не декларации) для контекстной подсказки.

    Reply ↓
  47. CyberCerber

    (46) А, в том смысле, что так в подсказке будут все методы и реквизиты формы как класса, но не будет конкретных реквизитов и элементов текущей нужной формы?

    Да, это случай особый, но ту функцию, которую я описал, все равно иметь хочется. 🙂

    Reply ↓
  48. tsukanov

    Прикольно. Спасибо.

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

    Reply ↓
  49. tsukanov

    Раз пошла такая пьянка, то вот коллегам еще фишка:

    В модуле формы можно спокойно объявить несколько функций с одним наименованием, если они все будут с директивой &НаКлиентеНаСервереБезКонтекста

    Обнаружил это случайно при парсинге модулей ERP 2.4

    Там в нескольких отчетах такая копипаста.

    При вызове функции берется вроде как первая объявленная

    Reply ↓
  50. tormozit

    (50) Проверил. Подтверждаю. Это ошибка платформы. На досуге сообщу в 1С.

    Reply ↓
  51. CyberCerber

    (50) Сейчас проверил… Да, действительно, это жесть! Написал три метода:

    &НаКлиентеНаСервереБезКонтекста
    Процедура ОдноИмя()
    Сообщить(1);
    КонецПроцедуры
    
    &НаКлиентеНаСервереБезКонтекста
    Процедура ОдноИмя()
    Сообщить(2);
    КонецПроцедуры
    
    &НаКлиентеНаСервереБезКонтекста
    Процедура ОдноИмя()
    Сообщить(3);
    КонецПроцедуры

    Показать

    Не ругается, при вызове выводит «1». Что-то разработчики платформы вообще «без контекста».

    Reply ↓
  52. Darklight
    Reply ↓
  53. Darklight

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

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

    Reply ↓
  54. Поручик

    (43) Вот. Без директивы &НаСервере будет ошибка

    Процедура УстановитьОграниченияТипа()
    
    Попытка
    ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);
    РегистрационныеДанные = ОбработкаОбъект.СведенияОВнешнейОбработке();
    Исключение
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
    НСтр(«ru = ‘Возможно, обработка (отчет) устарела или не является дополнительной:'»)
    + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
    Возврат;
    КонецПопытки;
    
    КонецПроцедуры
    

    Показать

    Reply ↓
  55. tormozit

    (55) Какая ошибка и на какой версии платформы?

    Reply ↓
  56. Evil Beaver

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

    Reply ↓
  57. tormozit

    (57) Это не совсем так. Смотри (10). Я написал в 1С багрепорт, чтобы это наконец сделали полностью так.

    Reply ↓
  58. tormozit

    (50) Сообщил об этой ошибке в 1С.

    Reply ↓
  59. tsukanov

    (59) Хорошо )

    Reply ↓
  60. Evil Beaver

    (59) Они как-то отреагировали?

    Reply ↓
  61. tsukanov

    (61) на партнерке в теме ни одного коммента

    Reply ↓
  62. dmitro

    (50) Очень не хватает во встроенном языке 1С перегрузки.

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

    Reply ↓
  63. spacecraft

    (63) это можно реализовать общими модулями.

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

    Reply ↓
  64. tormozit

    (61) Проблема пока на рассмотрении https://bugboard.v8.1c.ru/error/000035088.html

    Reply ↓
  65. AlexO

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

    Реквизиты обработки — не видны на форме; реквизиты формы — не найдешь в другой форме и в общем модуле…

    Reply ↓
  66. chebser

    Для начинающих разработчиков нужно сделать специальную директиву компиляции — &НаКлиентеНоЕслиЧёТоИНаСервере

    Reply ↓
  67. maxkrezi

    Если не ставить директиву то будет и на сервере и на клиенте, разве не так?

    Reply ↓
  68. spacecraft

    (68)

    Если не ставить директиву то будет и на сервере и на клиенте, разве не так?

    Не так. Без директивы в модуле формы УФ будет по-умолчанию «НаСервере»(Толстый клиент УФ файлового варианта не рассматриваем). Да, она будет доступна с клиента, но как серверный метод с контекстным вызовом.

    Reply ↓
  69. fredly_nightly

    Хороший «лафхак», только не совсем понятно, как его пропустили гуру-программисты и не закидали помидорами

    Reply ↓
  70. PythonJ

    Может лучше вставить вызов обновления в ПриЧтенииНаСервере, а не ПриСозданииНаСервере? Чтобы сработало даже когда пользователь нажмет «Перечитать».

    Reply ↓
  71. tormozit

    (71) Лучше чем что? Если это к приему из статьи, то это похоже на предложение заменить теплое на мягкое, т.е. предложение способа решения другой задачи.

    Reply ↓
  72. PythonJ

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

    Reply ↓

Leave a Comment

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