Имитация директивы компиляции &НаКлиентеНаСервере в форме, с полными контекстами и минимальными "костылями"

04.12.22

Разработка - Универсальные функции

То, о чем долго мечтали: Имитация директивы компиляции &НаКлиентеНаСервере в форме через объявление разных процедур для каждого контекста с единым кодом исполнения. Для тех, кому удобство применения на практике превыше запретов стандартов.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Обработка с директивой компиляции почти &НаКлиентеНаСервере.
.epf 6,17Kb
0
0 Скачать (1 SM) Купить за 1 850 руб.

С удивлением для себя обнаружил, что интерпретатор 1С вне зависимости от версии платформы позволяет в инструкции препроцессора отделить наименование объявляемой процедуры от её параметров и "тела". Именно это и позволяет написать единое "тело" процедуры для обоих контекстов, подставив это "тело" в разные для клиента и для сервера процедуры (объявить эти процедуры с разными наименованиями, по одной для каждого контекста).

Также параметры этих процедур можно сделать как зависящим от директивы компиляции (оставить их после наименования процедуры внутри инструкции препроцессора), так и независящими (оставить их после инструкции препроцессора перед "телом" процедуры).

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Реквизит1 = "123";
	Реквизит2 = "";
	Реквизит1Заполнен = Ложь;
	Реквизит2Заполнен = Истина;
	Реквизит1ПриИзмененииНаСервере();
	Реквизит2ПриИзмененииНаСервере();
КонецПроцедуры

#Область Реквизит1ПриИзменении
// Вариант процедуры с разным составом параметров.
#Если НаКлиенте Тогда 
	// Обработчик события ПриИзменении элемента Реквизит1.
	&НаКлиенте 
	Процедура Реквизит1ПриИзменении(Элемент)
#Иначе 
	&НаСервере 
	Процедура Реквизит1ПриИзмененииНаСервере()
#КонецЕсли
	Реквизит1Заполнен = ЗначениеЗаполнено(Реквизит1);
КонецПроцедуры
#КонецОбласти //Реквизит1ПриИзменении.


#Область Реквизит2ПриИзменении
// Вариант процедуры с единым составом параметров.
#Если НаКлиенте Тогда 
	// Обработчик события ПриИзменении элемента Реквизит2.
	&НаКлиенте 
	Процедура Реквизит2ПриИзменении(
#Иначе 
	&НаСервере 
	Процедура Реквизит2ПриИзмененииНаСервере(
#КонецЕсли
	Элемент = NULL)
	Реквизит2Заполнен = ЗначениеЗаполнено(Реквизит2);
КонецПроцедуры
#КонецОбласти // Реквизит2ПриИзменении.

Даже процедура "Реквизит1ПриИзменении" доступна для выбора в палитре свойств элемента Реквизит1 для события "ПриИзменении". В варианте "с единым составом" процедуру "Реквизит2ПриИзменении" в палитре свойств для события "При изменении" необходимо будет "заполнять текстом", так как в списке выбора будет только процедура "Реквизит1ПриИзменении".

Основной минус - это то, что синтаксис помощник не сможет правильно сгруппировать начало-конец процедуры, примечания и инструкции препроцессора; поэтому рекомендую объединять эту конструкцию в область, чтобы хоть как-то понять границы "блока процедуры".

Должен отметить, что данный способ противоречит пункту 3 стандарта Соглашению по написанию кода/Использование директив компиляции и инструкций препроцессора:

3. Не следует разрывать инструкциями препроцессора ... объявления и места вызова процедур и функций.

Хоть конкретного примера "неправильного" разрыва инструкцией объявления процедуры в этой статье и не приведено, но все-равно применять или нет это способ имитации &НаКлиентеНаСервере каждый должен решать для себя "на свой страх и риск".

Альтернативное решение предложено в статье Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере, где контекст передается параметром ЭтаФорма в единую серверную процедуру "без контекста", а все производимые изменения процедуры выполняются в значении этого параметра.

Тестировалось на платформе 8.3.22.1709.

В приложении к статье находится обработка с кодом из листинга этой статьи.

Директива компиляции НаКлиентеНаСервере инструкция препроцессора

См. также

Универсальные функции Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    25047    dimanich70    82    

149

Универсальные функции Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

18.03.2024    4495    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    25324    atdonya    25    

58

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    6058    ke.92@mail.ru    17    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    16517    YA_418728146    8    

170

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    4252    73    progmaster    10    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 1C:Бухгалтерия 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    19122    180    sapervodichka    112    

136
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ixijixi 1979 04.12.22 18:36 Сейчас в теме
Интересно, и даже забавно. Но практического применения не предвижу)
2. Glebis 13 04.12.22 18:43 Сейчас в теме
(1) Одно применение точно есть и оно приведено в листинге статьи: вызывать клиентскую процедуру настройки состояния элементов формы (особенно видимость с её скрытым вызовом сервера) при выполнении события ПриСозданииНаСервере вместо клиентской ПриОткрытии.
3. ixijixi 1979 04.12.22 20:26 Сейчас в теме
(2) Традиционно это делается по-другому
4. Glebis 13 04.12.22 20:41 Сейчас в теме
(3) А где можно посмотреть на эту традицию?
6. ixijixi 1979 05.12.22 10:02 Сейчас в теме
(4) Любую типовую открыть
5. tormozit 7250 04.12.22 22:57 Сейчас в теме
Описанный способ имеет много недостатков по сравнению с монолитным. Например редактор не покажет параметры в подсказке по параметрам и т.д. Так что рекомендация в ИТС имеет веские причины. Я его не использовал и не буду использовать и другим не рекомендую, исключая желание поэскпериментировать.
Прикрепленные файлы:
12. triviumfan 98 12.12.22 12:00 Сейчас в теме
(5) Думал, edt будет умнее, но нет, тут даже хуже.
В этом "тестовом редакторе на стероидах" не просто контекстная подсказка не видит обработчик, но ещё и сам матом ругается.
Прикрепленные файлы:
14. Glebis 13 16.12.22 13:05 Сейчас в теме
(5) Да, при выносе параметров процедуры из блока инструкций (2й вариант) не отображаются параметры. Если параметры оставить рядом с наименованием объявляемой процедуры (вариант 1), то подсказка работает исправно.
7. triviumfan 98 05.12.22 14:13 Сейчас в теме
Согласен с предыдущими коментариями, чувствуется какая-то опасность.
8. Glebis 13 05.12.22 15:17 Сейчас в теме
(7) Пока не понял чем это опасно. При тестировании все работает идентично коду:
&НаКлиенте 
Процедура Реквизит1ПриИзменении(Элемент)
	Реквизит1Заполнен = ЗначениеЗаполнено(Реквизит1);
КонецПроцедуры

&НаСервере 
Процедура Реквизит1ПриИзмененииНаСервере()
	Реквизит1Заполнен = ЗначениеЗаполнено(Реквизит1);
КонецПроцедуры
Показать


Даже Экспорт процедур работает.
9. triviumfan 98 05.12.22 17:10 Сейчас в теме
(8) Да что-то очково. Проверял это на веб/мобильном/толстом клиентах? Где-то тут подвох.
Прикрепленные файлы:
10. Glebis 13 11.12.22 01:04 Сейчас в теме
(9) Пока только на толстом клиенте проверил, работает без проблем. Перенес в один из продактов на работе.

P.s. Коллеги, а за что вы без аргументации ставите минусы статье?
11. triviumfan 98 12.12.22 11:44 Сейчас в теме
(10) Я не ставил, т.к. заструдняюсь оценивать, просто подозрительно нестандартное решение.
Ещё добавил скрины из EDT
13. Glebis 13 16.12.22 12:47 Сейчас в теме
(11) EDT позволяет выбрать обе процедуры в качестве обработчиков событий формы даже в таком написании. Синтаксис контроль ругается, но форма работает исправно.
К огромному моему сожалению, после (ниже по коду) такой конструкции EDT отказывается вообще показывать контекстовую подсказку. Но если вызов этих процедур сделать до объявления процедур, то все работает: и переход к определению и подсказка о параметрах.
Прикрепленные файлы:
Оставьте свое сообщение