Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C

Публикация № 891857

Разработка - Практика программирования

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

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

Начиная с платформы 8.2 (далее управляемое приложение), разработчикам стала доступна возможность самим определять, где будет выполняться код, на севере или на клиенте. Такая необходимость возникла в связи с появлением "тонкого клиента" и "веб-клиента", которые могут работать через интернет, что несомненно накладывает определенные ограничения на передачу данных.

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

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


Директивы компиляции

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

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

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

Существует пять различных директив:

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


Рассмотрим их подробнее:
Директива &НаКлиенте указывает на то, что код функций/процедур будет выполняться в контексте клиентского приложения, где будут доступны только элементы, параметры и реквизиты формы.
Доступны вызовы любых процедур модуля формы.

При указании директивы &НаСервере, для процедур/функций будут доступны не только данные формы, но и возможность обращаться к данным базы. Выполнение кода будет происходить на сервере.
Обращение к процедурам на клиенте уже не доступно. Т.е., находясь на сервере, нельзя инициировать вызов клиентских процедур и функций.

Начиная с платформы 8.3.10 стала доступна возможность получать данные с клиента на сервере, используя систему взаимодействия.

Если указана директива &НаСервереБезКонтекста, это означает, что код будет выполняться на сервере, но доступа к контексту формы (реквизиты, параметры, элементы) уже не будет.
Доступны вызовы только внеконтекстных процедур и функций.

Директива &НаКлиентеНаСервереБезКонтекста необходима, если требуется выполнение процедуры/функции и на сервере и на клиенте. Данная директива используется редко, но является полезной и позволяет вместо двух процедур, для выполнения в разных контекстах, указать всего одну.

Последняя директива &НаКлиентеНаСервере по сути аналогична &НаКлиентеНаСервереБезКонтекста, но доступна она только в модуле команд.

Если по ошибке не указать директиву, то платформа сама ее поставит. По умолчанию это директива &НаСервере.

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

Контекстные и внеконтекстные вызовы

Разобравшись с тем, что такое директивы, разберем понятие контекста.

"Контекст" - это так называемое окружение, в котором доступны определенные свойства, методы, набор объектов встроенного языка, а также процедуры и функции.

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

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

Если для процедуры/функции указать директиву &НаСервере, то при ее вызове будет происходить передача всей формы на сервер, т.е. все реквизиты, параметры и элементы формы будут специальным образом упакованы и переданы на сервер. На сервере полученный "контейнер" распаковывается и дальше происходит инициализация модуля формы.

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

Для уменьшения объема передаваемых данных на сервер как раз и используется внеконтекстный вызов, процедуры/функции при этом должны быть помечены директивой &НаСервереБезКонтекста.

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


Выбор контекста для общих модулей

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

  • Модуль управляемого приложения
  • Модуль обычного приложения
  • Модуль сеанса
  • Модуль внешнего соединения
  • Общие модули
  • Модули команд
  • Модули менеджера
  • Модуль объекта

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

Общие модули существуют отдельно, как объекты конфигурации и предназначены для процедур и функций, объединенных по сходным функциональным назначениям.
Для них определен следующий набор свойств: Клиент (Управляемое приложение), Клиент (Обычное приложение) Сервер, Внешнее соединение, Вызов сервера, Привилегированный, Глобальный.

Если установить флаг Клиент (Управляемое приложение), то все процедуры и функции будут выполняться в контекстах "тонкого клиента", веб-клиента и "толстого клиента" в режиме управляемого приложения, при этом явно указывать директиву компиляции &НаКлиенте не требуется.

Установка флага Клиент (Обычное приложение) означает использование кода в "толстом клиенте" в режиме обычного приложения.

Установка флага Сервер позволяет выполнять код в контексте сервера и указание директивы &НаС ервере также не требуется.

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

Свойство Внешнее соединение используется для выполнения процедур и функций при подключении внешним источником, например COM.

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

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

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

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


Оптимизация клиент-серверного взаимодействия в управляемых формах

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

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

В рамках статьи приведем несколько примеров оптимизации.

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


Итак, рассмотрим несколько вариантов решения: 
Первый: Создадим общий модуль "РаботаСТЧ" и установим у него галочки Сервер и Вызов сервера. В него добавим экспортную функцию, возвращающую данные по передаваемой в нее ссылке.

Функция ПолучитьДанные(Ссылка, ИмяРеквизита) Экспорт
      Возврат Ссылка[ИмяРеквизита];
КонецФункции

В модуле формы, в обработчике события ПриИзменении() для поля Номенклатура добавим код, в котором и будем вызывать экспортную процедуру из общего модуля.

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    ДанныеТекСтроки = Элементы.Товары.ТекущиеДанные;
    Номенклатура = ДанныеТекСтроки.Номенклатура;
    
    ДанныеТекСтроки.Артикул = РаботаСТЧ.ПолучитьДанные(Номенклатура,"Артикул");
    ДанныеТекСтроки.ЕдиницаИзмерения = РаботаСТЧ.ПолучитьДанные(Номенклатура,"ЕдиницаИзмерения");
    ДанныеТекСтроки.Цена = РаботаСТЧ.ПолучитьДанные(Номенклатура,"Цена");
КонецПроцедуры

Второй: В процедуре ПриИзменении() сделаем теперь вызов функции, которая вернет структуру со всеми нужными реквизитами.

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    ДанныеТекСтроки = Элементы.Товары.ТекущиеДанные;
    РеквизитыТовара = РаботаСТЧ.ПолучитьДанные(ДанныеТекСтроки.Номенклатура);
    
    ДанныеТекСтроки.Артикул = РеквизитыТовара.Артикул;
    ДанныеТекСтроки.ЕдиницаИзмерения = РеквизитыТовара.ЕдиницаИзмерения;
    ДанныеТекСтроки.Цена = РеквизитыТовара.Цена;
КонецПроцедуры

В экспортную функцию так же внесем поправки.


Функция ПолучитьДанные(Ссылка) Экспорт
      ДанныеРеквизитов = Новый Структура;
      ДанныеРеквизитов.Вставить("Артикул",Ссылка.Артикул);
      ДанныеРеквизитов.Вставить("ЕдиницаИзмерения",Ссылка.ЕдиницаИзмерения);
      ДанныеРеквизитов.Вставить("Цена",Ссылка.Цена);
      
      Возврат ДанныеРеквизитов;
КонецФункции

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

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

Рассмотрим примеры: 
Первый: Так как нам необходим доступ к базе, то получать данные мы будем с сервера, а значит можно сразу, все что нужно, сделать на сервере. В модуле формы, в обработчике события ПриИзменении() обратимся к серверной процедуре в этом же модуле.

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    ЗаполнитьЦенуНаСервере()    
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьЦенуНаСервере()
    ТекущаяСтрока = Элементы.Товары.ТекущаяСтрока;
    ДанныеТекСтроки = Объект.Товары.НайтиПоИдентификатору(ТекущаяСтрока);
    
    Отбор = Новый Структура;
    Отбор.Вставить("Номенклатура", ДанныеТекСтроки.Номенклатура);
    
    ТекЦена = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(Объект.Дата, Отбор);
    ДанныеТекСтроки.Цена = ТекЦена.Цена;
КонецПроцедуры


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

Второй: В данном варианте мы изменим процедуру ПриИзменении(). Теперь будем подставлять цену не на сервере, а на клиенте. Функцию получения цены выполним, используя директиву &НаСервереБезКонтекста. Таким образом, на сервер будут переданы всего два значения, а не весь контекст формы.

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    ДанныеТекСтроки = Элементы.Товары.ТекущиеДанные;
    ДанныеТекСтроки.Цена = ЗаполнитьЦенуНаСервере(ДанныеТекСтроки.Номенклатура, Объект.Дата)    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЗаполнитьЦенуНаСервере(Номенклатура, ДатаДокумента)
    Отбор = Новый Структура;
    Отбор.Вставить("Номенклатура", Номенклатура);
    
    ТекЦена = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ДатаДокумента, Отбор);
    Возврат ТекЦена.Цена;
КонецФункции


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


Заключение

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

Для более подробного изучения вопросов оптимизации рекомендую к прочтению книгу "Разработка интерфейса прикладных решений на платформе "1С:Предприятие 8".

Спасибо за внимание, надеюсь данный материал оказался для Вас полезным! 

Специальные предложения

Вознаграждение за ответ
Показать полностью
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. leosoft 147 24.08.18 09:12 Сейчас в теме
Ссылка на архитектуру "битая"
2. Rain88 301 24.08.18 09:38 Сейчас в теме
(1) спасибо. Чуть позже исправлю.
3. PerlAmutor 107 25.08.18 08:18 Сейчас в теме
Спасибо за статью. Стоит ли ожидать следующей части, где будет раскрыта суть вопроса передачи разных типов данных между клиентом и сервером? Мне например интересно как правильно осуществлять безконтекстный серверный вызов процедуры из клиентского общего модуля имея ссылку на УФ, в которой находится ТЧ типа ДанныеФормыСтруктура. Кроме варианта перебора в цикле, создания структур и копирования всего в Массив я ничего не нашел. Несмотря на то, что ДанныеФормыСтруктура существует и на сервере - невозможно в качестве параметра передать ссылку на неё, т.к. 1С при этом начинает ругаться, что данные не предназначены для изменения.
4. Rain88 301 25.08.18 08:51 Сейчас в теме
(3) Спасибо за отзыв. Продолжения пока не планировала, но подумаю)
41. miha0713 02.08.19 20:16 Сейчас в теме
(4) Отличная статья. Было бы здорово увидеть продолжение про "передачу разных типов данных между клиентом и сервером"
42. Rain88 301 03.08.19 19:30 Сейчас в теме
(41) Спасибо. К сожалению график работы пока не позволяет заниматься чем-то, кроме работы.
5. Rain88 301 25.08.18 11:01 Сейчас в теме
(3) По поводу
как правильно осуществлять безконтекстный серверный вызов процедуры из клиентского общего модуля имея ссылку на УФ
, просто передать значения с типом ДанныеФормыСтруктура или ДанныеФормыКоллекция нельзя, так как при возврате из процедуры или функции будет производится попытка их перезаписи, что недопустимо. Чтобы такого не происходило, можно, например, в вызываемой процедуре или функции указать ключевое слово "Знач", которое будет означать, что параметр будет передан как значение, а не ссылка и ошибки уже не будет. Но в любом случае нужно смотреть, какая реализация кода будет более оптимальной, возможно, что передача массива строк из табличной части будет более производительнее.
Если данная тема будет востребована, то продолжение точно напишу.
6. PerlAmutor 107 25.08.18 11:48 Сейчас в теме
(5) Спасибо. Тоже появилась такая мысль после того как сделал через массив, но проверять не стал. Думал еще капнуть в сторону КопированиеДанныхФормы, но в этом случае непонятно как программно создать приемник.
7. Rain88 301 26.08.18 09:45 Сейчас в теме
(6)
сторону КопированиеДанныхФормы
копируете объект формы в переменную, передаете на сервер, там делаете заполнение, при выходе из процедуры заполнения, осуществляете копирование через "КопированиеДанныхФормы".
8. PerlAmutor 107 26.08.18 10:20 Сейчас в теме
(7) Скорее всего копировать объект формы целиком и гонять его с клиента на сервер и обратно должно быть накладно. Так то можно и через сериализацию данные перегнать. Стоит ли оно того.
9. Rain88 301 26.08.18 10:27 Сейчас в теме
(8) Я лишь привела пример одного из вариантов решения задачи.
10. sereginseregin 15 29.08.18 11:06 Сейчас в теме
(8)Экспериментировал с простыми вычислениями (типа 1+1) на клиенте, на сервере или в БД с вызовами между ними
Тут рассмотрены разные варианты взаимодействия клиента и сервера.
Но больше расстроило, что вызов клиентом сервера без контекста (п.1.3.) в 3!!! раза оказался медленнее обращения сервера к БД (п.2.1.).
12. PerlAmutor 107 29.08.18 13:41 Сейчас в теме
(10) Я это уже заметил достаточно давно. В типовых конфигурациях хорошо видно, как разработчики перекладывают вычислительный функционал на SQL.
34. Helsk 18.10.18 12:25 Сейчас в теме
(10) можете скинуть свою обработку для теста?
11. herfis 372 29.08.18 11:26 Сейчас в теме
Оформление отличное и конкретные примеры тоже будут полезны новичкам.
Но название статьи предполагает более концептуальный охват, с которым по моему мнению гораздо лучше справилась статья "Под капотом управляемых форм".
13. Rain88 301 29.08.18 17:02 Сейчас в теме
(11) Возможно Вы правы и стоило бы более подробно расписать некоторые механизмы, например, "жизненный цикл формы", но я решила не перегружать статью.
Указанная Вами статья включает в себя не на много много больше информации ("и воды там достаточно") и читать, ИМХО, ее было тяжело. Также, стоит заметить, что автор не пытался раскрыть тему оптимизации, а лишь рассказывал, что представляют из себя управляемые формы.
Считаю, что для базовой основы, информации здесь вполне достаточно, единственное, думаю стоило бы добавить еще несколько примеров в конце.
14. dr2c 40 31.08.18 10:20 Сейчас в теме
Спасибо! Но не совсем понял ремарку- "Не рекомендуется создавать клент-серверные общие модули"?
15. Rain88 301 31.08.18 17:00 Сейчас в теме
(14)
не совсем понял ремарку
Если для процедуры в клиент-серверном общем модуле не указать директиву, то процедура будет скомпилирована в обоих контекстах, при этом надо следить, чтобы код в этой процедуре был написан с учетом его доступности в контекстах модуля. Также, немало важным является то, что процедура на клиенте из общего модуля может обратиться только к экспортной процедуре серверного общего модуля с галочкой "вызов сервер", т.е. расположить в одном общем модуле процедуры НаКлиенте и НаСервере с вызовом друг друга, как например в модуле форм, не получится. Поэтому общие модули разделяют на Клиентские и на Серверные, а вот клиент-серверные используются не часто, для каких то общих действий, например, для простых вычислительных операций.
16. LordKim 04.09.18 17:20 Сейчас в теме
(15)
Или для подписок на события...
17. Rain88 301 05.09.18 15:55 Сейчас в теме
(16) В общих модулях происходит определение процедур и функций, которые требуются для выполнения каких-то действий. Подписки, сами по себе не содержат код, а обращаются к процедурам из общих модулей, поэтому не совсем корректно говорить о том, что клиент-серверные общие модули используются для подписок.
Если заглянуть в типовые общие модули, то можно увидеть, что там производятся какие-то общие простые операции, например, определение типов значений, работа с числами, строками, массивами и с теми встроенными процедурами/функциями, которые доступны и на клиенте и на сервере.
19. LordKim 05.09.18 18:53 Сейчас в теме
(17)
не совсем корректно говорить о том, что клиент-серверные общие модули используются для подписок


А что же используется?
Подписка - всего лишь триггер для выполнения куска кода, этот кусок кода можно расположить где-нибудь кроме общего модуля?

А теперь представим подписку ПередЗаписью для справочника, и запись этого справочника выполняется в фоновом задании (Сервер), в толстом клиенте и еще во внешнем соединении.

Если флажки (все три) на ОМ стоять не будут - будет "красный крест", нет?)
20. Rain88 301 05.09.18 19:57 Сейчас в теме
(19) Да при чем тут вообще подписки, если речь шла про процедуры и функции, с которыми могут возникнуть проблемы, если в них что-то не так написать или поставить не те галочки у общего модуля? Поэтому и написала, что в контексте моего сообщения, говорить про подписки было бы некорректно.
21. LordKim 05.09.18 20:31 Сейчас в теме
(20)
Подписки - часть общих модулей, как и (например) регламентные задания. И в клиент-серверном режиме - поведение отличается.
Это точно такие же процедуры как и все остальные

Статья называется "Основные понятия и механизмы клиент-серверного взаимодействия в 1C" - мне показалось, что особенности поведения РЗ и триггеров должны быть включены (или хотя бы упомянуты)

Тем более, что идет пояснение вашей фразы "Не рекомендуется создавать клент-серверные общие модули" и вашего ответа "а вот клиент-серверные используются не часто", и в качестве примера выприводите только вычисления, я всего лишь уточнил, что модули с флагами клиент и сервер имеет смысл так же создавать для реализации подписок на события (и для начинающих - это наверное, важная инфо про КС механику)

Возможно, я неверно истолковал название статьи, и название должно интерпретироваться как "Особенности работы с управляемыми формами" или "Особенности оптимизации работы управляемых форм в клиент-серверном режиме", no aggression
22. Rain88 301 05.09.18 21:13 Сейчас в теме
(21)
модули с флагами клиент и сервер имеет смысл так же создавать для реализации подписок на события
чтобы произвести какие-то простые действия, например вычисления)

(21)
Возможно, я неверно истолковал название статьи
скорее не Вы неправильно истолковали, а я наверно неправильно назвала статью и ее действительно надо было назвать по-другому, потому что акцент сделан именно на механизмы оптимизации.
18. herfis 372 05.09.18 16:29 Сейчас в теме
(14) Я понял ее как "Не рекомендуется создавать клент-серверные общие модули, все равно вы не умеете их готовить"
Поручик; +1 Ответить
23. AlX0id 12.10.18 11:49 Сейчас в теме
серверным процедурам и функциям, которые используются привилегированный режим.


Небольшой косячок в тексте
24. AlexPC 12.10.18 12:15 Сейчас в теме
Очень напоминает выдержки из книги "Разработка интерфейса прикладных решений на платформе "1С:Предприятие 8". Примеров оптимизации приведено всего два, в книге намного больше.
25. Поручик 4428 13.10.18 00:57 Сейчас в теме
ДанныеРеквизитов.Вставить("Артикул",Ссылка.Артикул);
ДанныеРеквизитов.Вставить("ЕдиницаИзмерения",Ссылка.ЕдиницаИзмерения);

Это капец, да.
А использовать ОбщегоНазначения.ЗначенияРеквизитовОбъекта() не по-пацански.

ДанныеРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "Артикул, ЕдиницаИзмерения");
29. Rain88 301 15.10.18 01:31 Сейчас в теме
(25)
Это капец, да.
как Вы могли заметить, про этот "капец" в статье есть пояснение, что через точку лучше не обращаться к данным базы, если конечно Вы это имели ввиду.

А по поводу
А использовать ОбщегоНазначения.ЗначенияРеквизитовОбъекта()
в статье ведь не разбирается использование стандартных функций БСП.
26. logarifm 1080 14.10.18 11:12 Сейчас в теме
могу только отминусовать автора за то что статья по факту практически видоизменено с ИТС. Это смешно как слова перековерканы но смысл с книжки 1в 1. Особенно ЗАКЛЮЧЕНИЕ. Модераторы следует обратить на это внимание.
Прикрепленные файлы:
28. Rain88 301 15.10.18 01:26 Сейчас в теме
(26)
но смысл с книжки 1в 1
позвольте Вас спросить, а Вы наверно черпаете знания "с потолка"? Конечно же был прочитан не один материал, включая и ИТС, прежде чем появилась данная статья, в которой как раз и попыталась собрать в кучу все ключевые, как мне показалось, моменты.

смешно как слова перековерканы
Особенно ЗАКЛЮЧЕНИЕ.
видимо заключение для Вас явилось прям каким-то камнем преткновения, раз решили заминусовать статью))

А вообще да, идея была взята из книги "Разработка интерфейса прикладных решений на платформе 1С:Предприятие 8", где все подробно расписано, но не каждый захочет ее прочитать всю. Моей ошибкой было не указать ее в тексте, критика ведь для этого и нужна, чтобы выявлять ошибки)
30. logarifm 1080 15.10.18 10:50 Сейчас в теме
(28) минус схлопотали из-за того, что статья эта не собственная и очень много буковок именно из этой книги. Значит и следовательно статью требовалось назвать как-то иначе и в обязательном характере упомянуть основной источник. Ведь даже примеры от туда только скрины другие. смешно не иначе.

ЗЫ, На будущее сравните написание статей других авторов. Я не понимаю зачем делать копи пасты из книги и менять состав слов и говорить это мой труд!?

Вот что не сказать про эту статью https://infostart.ru/public/682305/ раскрыто намного больше и собственной терминологией, а не книжной из ИТС. Поэтому однозначно МИНУС.
33. Rain88 301 17.10.18 10:22 Сейчас в теме
(30)
Я не понимаю зачем делать копи пасты из книги и менять состав слов и говорить это мой труд!? Поэтому однозначно МИНУС
Ну, как говорится, для всех мил не будешь. Поставили минус, Ваше право, но я останусь при свое мнении, что вычленение чего-то существенного из общей массы текста и перефразирование в более понятный язык для начинающих - это тоже труд.
27. webester 33 14.10.18 17:54 Сейчас в теме
Кому лень читать, вся статья сводится к двум советам: Если у тебя много серверных вызовов, попробуй уменьшить их количество. Не тащи на сервер весь контекст формы без необходимости, это как минимум глупо. Собственно все. Вместо вступительной теоретической части, стоит просто оставить Вот эту ссылку тут у автора получилось подробнее и лучше, хотя можно просто оставить эту ссылку, добавлять ничего не надо, все, что написано в этой статье, больше и интереснее, есть по ссылке. Про использование ключевого слова "Знач" при передаче данных на сервер сознательно не стали упоминать?
androgin; berezdetsky; rozer; win-l; +4 Ответить
31. Makcum32 16.10.18 09:30 Сейчас в теме
Начиная с платформы 8.3.10 стала доступна возможность получать данные с клиента на сервер, используя систему взаимодействия.


Автор скорее всего хотела сказать "передача данных с сервера на клиент"
32. Rain88 301 17.10.18 10:16 Сейчас в теме
(31) Я еще думала, может написать по другому, возможно моя формулировка будет непонятна, смысл то получается одинаковый)
39. androgin 19.07.19 15:52 Сейчас в теме
(32) совсем не одинаковый!
Нельзя передать данные на клиент по желанию сервера без системы взаимодействия!
35. Glebis 11 19.10.18 16:42 Сейчас в теме
Уменьшается ли объем данных (трафик) ответа сервера клиенту если использовать для параметров "Знач" при клиент-серверном вызове серверной функции?
36. shalimski 6 25.02.19 10:21 Сейчас в теме
(35)
Уменьшается ли объем данных (трафик) ответа сервера клиенту если использовать для параметров "Знач" при клиент-серверном вызове серверной функции

конечно уменьшаются, данные обратно на клиент не поедут.
37. user1218675 11.05.19 23:53 Сейчас в теме
Благодарю за обсуждение и ответ, как новичку в 1с было полезно прочитать ответы, хотя некоторые аспекты до конца мне не понятны.
38. MSK_Step 21 18.07.19 19:01 Сейчас в теме
Иногда лучше вызывать сервер, без лишний обрашений. Так как при первом обращение объект кешируется 1с (так написано на сайте ИТС в разделе разработчики.)
Оптимизация 1с сводится к правильному написанию кода, особенно запросы, а клиент сервер это все мелочи, которые не заметишь на производительности.
40. oleganatolievich 146 19.07.19 21:46 Сейчас в теме
одним вызовом возвращать больше данных из номенклатуры, это логично.
по сути весь смысл статьи - чем меньше вызовов сервера, тем лучше. больше кэшируем данных, используем функции с повт. использованием. НаСервереБезКонтекста > НаСервере.
по поводу БСП - общегоназначениясервер постоянно дергает метаданные, собирает запрос. может быть накладнее отдельной процедуры. но это мы уже в спор о балансе оптимизации / рефакторинга.
43. NikolayTsibov 13.01.20 11:35 Сейчас в теме
Добрый день, а вот если для процедуры ПолучитьДанные указать директиву на СервереБезКонтекста, то при вызове этой процедуры из Общего модуля РаботаСТЧ будет ошибка (Метод объекта не обнаружен (ПолучитьДанные)
). Почему так, судя по примеру должно работать.
44. Rain88 301 13.01.20 22:30 Сейчас в теме
(43) Здравствуйте! Была допущена опечатка, в общем модуле доступны только две директивы компиляции: &НаКлиенте и &НаСервере.
45. user990756 29.01.20 17:27 Сейчас в теме
46. user862569 31.01.20 11:27 Сейчас в теме
Спасибо большое за статью, понимаю что все описать не возможно, "Оптимизация клиент-серверного взаимодействия" особо щепетильный пункт как раз которым на данный момент занимаюсь. Было очень познавательно и появились мысли о размышление.
Оставьте свое сообщение

См. также

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    37313    unichkin    74    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    26111    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    23403    John_d    22    

Последовательности событий. Шпаргалка

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    17941    kuzyara    33    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

15.10.2018    30185    tormozit    100    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    16925    YPermitin    72    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    8328    Sibars    19    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    32894    Yashazz    50    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    77940    tormozit    131    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

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

06.09.2019    49272    rpgshnik    63    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    48966    ids79    54    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    28150    YPermitin    24    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    48318    tormozit    41    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

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

03.09.2019    25407    YPermitin    80    

Иерархия без "В ИЕРАРХИИ"

Математика и алгоритмы v8 Бесплатно (free)

Говорится о том, как эффективно представлять иерархию в СУБД, как получать и использовать эти представления при решении задач в запросной технике. Уточняются и дополняются запросы из статьи "Уровни, глубина, прародители, циклы и аналоги запросом" [https://infostart.ru/public/160707/].

22.08.2019    12337    ildarovich    19    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

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

17.08.2019    31311    ids79    16    

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

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

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

10.09.2017    44731    tormozit    74    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    81097    ids79    49    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

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

02.08.2019    34957    avalakh    22    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    59045    ids79    11    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

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

25.04.2019    16039    m-rv    2    

Обработчики событий при записи объектов. Зачем и что за чем?

Математика и алгоритмы v8 Бесплатно (free)

Программисту, имеющему немного опыта на платформе 1С 8.3, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта.... Эта шпаргалка была создана в процессе обучения и реального опыта с целью разложить всё по полочкам, чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи и проведении документов. Данная статья будет полезна в большей степени начинающим разработчикам. Но и опытным позволит освежить информацию, упорядочить её.

25.07.2019    50008    AlbinaAAA    28    

Управление качеством кода

Математика и алгоритмы Рефакторинг и качество кода v8 Бесплатно (free)

О SonarQube, АПК, EDT. Какие преимущества дает их использование. Для каких команд подходит.

22.07.2019    16405    Stepa86    33    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    35632    ids79    27    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    20219    m-rv    17    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    25954    YPermitin    14    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    19612    SeiOkami    50    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    52180    ids79    25    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    30567    m-rv    21    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    24968    dmurk    145    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    42786    YPermitin    30    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    35273    ellavs    126    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

05.12.2017    28228    itriot11    34    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    27352    ellavs    89    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    31287    YPermitin    53    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

Практика программирования Vanessa Automation v8 Россия Бесплатно (free)

Формируем отчетность о результатах выполнения сценариев. Автоматизируем запуск.

26.02.2019    21903    Vladimir Litvinenko    27    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    76314    Serginio    108    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    39310    ids79    9    

EnterpriseData – часть 2. Процесс выгрузки данных

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    26776    ids79    31    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    34671    ids79    40    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    41392    ids79    72    

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации

Практика программирования Обмен через XML v8 v8::УФ БП3.0 УТ11 Россия Бесплатно (free)

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    36928    ids79    42    

Программное заполнение пользовательских параметров и отборов СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

13.11.2018    47278    Unk92    25    

Тестер: частые вопросы Промо

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    29202    grumagargler    28    

Произвольный код в фоновом режиме

Практика программирования v8 1cv8.cf Бесплатно (free)

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

03.09.2018    27949    zarankony    42    

Работаем с дополнительными реквизитами на форме

Практика программирования v8 Бесплатно (free)

Пара полезных процедур для работы с дополнительными реквизитами на форме. Далее в статье: 1. Как называются дополнительные реквизиты на форме и в какой момент они появляются на форме? 2. Как проверить до записи корректность заполнения пользователем дополнительного реквизита? 3. Как заполнить значение дополнительного реквизита по другому событию и обновить данные на форме? 4. Как расположить дополнительный реквизит в указанном месте на форме?

15.07.2018    34861    papche    42    

Как работает серверный вызов в 1С Промо

Математика и алгоритмы v8::УФ Бесплатно (free)

Клиент-серверная архитектура заложена в платформе изначально — со времен «1С:Предприятие 8.0». Однако при разработке на 8.0 и 8.1 о разделении кода на клиентскую и серверную часть можно было не заботиться, поскольку на клиенте (на толстом клиенте) был доступен тот же функционал, что и на сервере. Всё изменилось с выходом платформы «1С:Предприятие 8.2», когда появился тонкий клиент. Теперь на клиенте доступен один функционал, на сервере — другой. Клиент и сервер «общаются» между собой с помощью серверного вызова. Конечно, это усложнило процесс разработки, но с другой стороны – можно создавать более оптимальные (быстрые) решения, поскольку все сложные задачи выполняются на сервере.

18.11.2017    55834    pahich    82