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




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

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 не будет опубликован. Обязательные поля помечены *