Имя: Пароль:
1C
1С v8
Вопрос по переходу на клиент-серверный вариант 1С8
,
0 sasha_nik
 
03.06.13
10:07
Добрый день !

Планируем переход на Клиент-Серверный вариант 1С8

Хочу сделать, чтобы в целях ускорения отчета некоторые запросы выполнялись на сервере, а обрабатывались на клиенте.

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

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

#Если клиент тогда    

Процедура ФормированиеЗапросаИОбработкаДанных() // выполняется на клиенте

   Запрос=Новый Запрос;

   Запрос.УстановитьПараметр(«Параметр1», Параметр1) ;
   ….
   Запрос.УстановитьПараметр(«ПараметрN», ПараметрN) ;

   Запрос.Текст= «Выбрать …»;

   ВыборкаИзРезультатаЗапроса=ВыборкаИзРезультатаНаСервере(Запрос);

   //Обработка результата выборки, вывод в табличную часть и т.д.

КонецПроцедуры

#КонецЕсли

#Если Сервер тогда

Функция ВыборкаИзРезультатаНаСервере(Запрос)  Экспорт
//Выполняется на сервере, помещена в общий модуль
   
   Выборка=Запрос.Выполнить().Выбрать();
   Возврат Выборка;

КонецФункции

#КонецЕсли

Вопрос: сработает ли вышеуказанная схема, если нет, то как реализовать схему, чтобы она сработала (по описанию вроде запрос можно передавать на сервер и обратно)?
1 Maxus43
 
03.06.13
10:09
#Если Сервер тогда

Не управляет тем, где будет исполнятся код.

Если надо на сервере точно - общий модуль с галкой Сервер и Вызов сервера
2 Maxus43
 
03.06.13
10:10
да и в клиент сервере все запросы на скуль транслирует сервер 1с всё равно, запросы де факто на сервере только будут
3 fisher
 
03.06.13
10:11
(0) Не. Это чепуха.
То, что ты хочешь - и так происходит по дефолту.
4 fisher
 
03.06.13
10:12
Запросы исполняются на сервере БД, окончательная выборка данных происходит на сервере приложений. На клиента возвращается только результат.
5 Ranger_83
 
03.06.13
10:12
(0) вам нужны УФ,или заказать Такси
6 fisher
 
03.06.13
10:15
Другое дело, если ты дополнительно какие-то алгоритмы хочешь на сервер вынести. В толстом клиенте для этого надо (1) делать. А в тонком многие алгоритмы на клиенте и не получится выполнить :)
7 kiruha
 
03.06.13
10:20
(0)
Странный способ ускорения отчета
Установка параметров и т.п. это доли сек

Сам запрос в 10 раз дольше
Зачем такой огород ?
8 Maxus43
 
03.06.13
10:22
(7) он думает что запрос выполняется на клиенте просто
9 MM
 
03.06.13
10:23
(7) ну, например, чтобы в привилегированный режим перейти, при наличии RLS может дать заметное ускорение.
10 AaNnDdRrEeYy
 
03.06.13
10:28
(9) можно и программно в привелигированный режим перейти, не обязательно в общий модуль выносить.
11 Рэйв
 
03.06.13
10:29
(0)Если не УФ, то фиг ты прикажешь где выполняться коду.
Только если терминально на сервере запустить сессию.Тогда стопудово на нем будет
12 Maxus43
 
03.06.13
10:30
(10) в клиент-сервере привелигированный режим возможен только на сервере. на клиенте он не устанавливается
13 AaNnDdRrEeYy
 
03.06.13
10:31
(12) на толстом клиенте работает.
14 fisher
 
03.06.13
10:33
Можно еще обработку выборки перенести полностью на сервер.
Возвращать, например, только готовый табличный документ на клиента.
Тут на больших отчетах ускорение очень существенное может быть.
Хотя всё это квадратные колеса в свете существования СКД на УФ. Там по дефолту всё примерно так и происходит.
15 Maxus43
 
03.06.13
10:33
(13) В клиент-серверном варианте при выполнении на клиенте данный метод не выполняет никаких действий.
(с)
16 fisher
 
03.06.13
10:37
А тупо выборку на клиента вернуть с сервера кажись и не получится. По-идее должно ругнуться на мутабельность.
17 Maxus43
 
03.06.13
10:39
(16) выборка емнип не мутабельна, собсно она вобще только на чтение
18 sasha_nik
 
03.06.13
11:49
Спасибо всем за ответы. С 1С8 я работаю с 2006 года, а вот с клиент-серверным вариантом стал знакомиться только сейчас.
Все эти годы был файловый вариант, база сейчас весит 5 Гб.

И пока это структуру понимаю плохо. Суть - у нас в сети около 50 ПК, подключенных к базе. Среди них есть как мощные, с процессорами i3 - i5, так и слабенькие типа Celeron 900. Естественно, что для таких слабых клиентов идет подключение через терминальный сервер, который сам выполняет роль клиента, а терминальный сервер будет подключаться к связке 2-х мощных новых серверов (которые будут считаться одним): Сервер 1С8 - сервер баз данных. Мощные же ПК подключаются к связке напрямую, минуя терминальный сервер, и сами выступают клиентом. Мною было написано более 100 различных отчетов и обработок, использующих запросы, которые сейчас на старом сервере в файловом варианте сильно тормозят именно из-за скорости выполнения запросов при большой выборке. Естественно, что перелопачивать все запросы нереально, вот и хотел отделаться малой кровью. Спасибо за Ваши ответы, теперь буду их осмыслять.
19 sasha_nik
 
03.06.13
11:51
Т.е. основная идея - как малой кровью, без серьезных переделок базы, перенести на сервер сложные вычисления, чтобы они выполнялись значительно быстрее.
20 sasha_nik
 
03.06.13
11:54
Хочу добавить - тонкого клиента пока не планируется, будет связка "Толстый клиент " - "Сервер"
21 sasha_nik
 
03.06.13
12:07
Итак, проанализировав написанное, я пришел к выводу (поправьте меня пожалуйста, если я не прав):
1. Непосредственно Запрос в клиент-серверном варианте всегда выполняется только  на сервере, а не на клиенте, поэтому давать ему директиву исполнения на сервере не имеет смысла
2. Для того, чтобы реально ускорить работу, имеет смысл большую часть сложных операций, выполняемых отчетом, перенести на сервер, перенести для выполнения на сервере, убрав из текста процедуры/функции не предназначенные для выполнения на сервере.
22 sasha_nik
 
03.06.13
12:10
А сейчас у нас организована таким образом - все 50 ПК подключены терминально к слабенькому серверу 2006 года выпуска на базе 2-х процессорного ксеона, на сервере база стоит в файловом вариант, естественного, его мощности не хватает, поэтому мы купили два новых мощных сервера и переходим на клиент-серверный вариант.
23 H A D G E H O G s
 
03.06.13
12:12
(21)
1. Нет
2. Нет
24 ptiz
 
03.06.13
12:14
(21) "большую часть сложных операций, выполняемых отчетом" - что за операции такие?
25 ptiz
 
03.06.13
12:15
И, кстати, процессоры в современных ПК намного быстрее серверных. Переводом на сервер можно только всё усугубить.
26 H A D G E H O G s
 
03.06.13
12:16
(25) +500!
27 sasha_nik
 
03.06.13
12:17
3. #Клиент и #Сервер только определяют место исполнения, но не задают его (?Как задать, я пока не понял)
28 H A D G E H O G s
 
03.06.13
12:17
Хотя, покуй.

Все уперается в проведение документов, это единственное узкое место, которое не правиться прямыми руками.
29 acsent
 
03.06.13
12:17
(26) если сервер брали 5 лет назад, то да
30 H A D G E H O G s
 
03.06.13
12:18
(29) Что изменилось за 5 лет?
31 sasha_nik
 
03.06.13
12:20
У нас около 50% ПК старше 5 лет, а новые сервера на базу 2-х 16-ти ядерных процессоров с 32 Гб памяти и жестким диском SSD. Т.е. 50% ПК толстыми клиентами быть не могут никак, для них толстый клиент старый сервак. Поэтому и хочу ускорить. Серверу уже 7 лет.
32 Maxus43
 
03.06.13
12:22
перевод в клиент-сервер не обязательно даст повышение производительности... он даёт параллельность
33 sasha_nik
 
03.06.13
12:23
В общем, я протестирую сегодня и о результатах доложу. Пока могу сказать, что сервер при попытке загрузки базы ругнулся на наличие в общем модуле штатных процедур 1С:
Вопрос
РежимДиалогаВопрос
КодВозвратаДиалога
Предупреждение
Состояние
ОбработкапРерыванияПользователя
ОчиститьСообщения

Видимо, нужно весь текст можуля поместить в #Если Клиент тогда #КонецЕсли
34 Maxus43
 
03.06.13
12:23
(31) короче искуственный вывод запроса в серверный модуль мало что даст, и не стоит оно того
35 Maxus43
 
03.06.13
12:23
(33) тут да
36 sasha_nik
 
03.06.13
12:27
В общем, буду тестировать, посмотрим, что получится.
37 Maxus43
 
03.06.13
12:52
(36) чначала разберись что делает #Если Сервер тогда и др. а то наворотишь
38 sasha_nik
 
03.06.13
13:47
А что тут можно напортить - я же все на копии делаю
39 sasha_nik
 
21.06.13
09:52
Итак, мой вариант не работает. Иекст показал, что старые отчеты в клиент-серверном варианте выполняются в 2-3 раза быстрее, чем в  старом терминальном. Но ускорить мне удалось. Что я сделал для ускорения:
40 sasha_nik
 
21.06.13
09:53
1.    Ускорена структура подчиненности.
Общая форма «Структура подчиненности» была скопирована из УПП 1.3,  также были скопированы связанные с ней функции (в глобальный модель), и связанный с ней критерий отбора «Связанные документы» (в интерфейсах кнопку «Перейти», меню «а Связанные докумнеты»). Критерий отбора был доработан для наших условий, теперь структура подчиненности формируется всего несколько секунд даже на нашем терминальном сервере, т.к. введение критериев отбора позволяет не проверять типы метаданных для каждого документа, попавшего в выборку.

У трех пользователей новая структура подчиненности выдавала ошибку, помогла чистка КЭШа 1С8 на терминальном сервере. Причина мне неизвестна.
41 sasha_nik
 
21.06.13
09:54
2.    Мне удалось выяснить, что все запросы в клиент-серверном варианте всегда формируются на сервере, но для ускорения выполнения требуется оптимизация кода запроса.

Поэтому в выражений «ОстаткиИОбороты», «Обороты», «Остатки» при выборке информации из регистров накопления я ввел, где это возможно, критерии отбора по измерениям регистра
Но критерии отбора вводятся только там, где присутствует отбор по измерениям

Например, при отборе по регистру «ОстаткиТоваровНаСкладах» по группе номенклатуры:

Было  

«Выбрать * Из РегистрСведений.ОстаткиТоваровНаСкладах.Остатки(&Дата1)
|Где Номенклатура в Иерархии(&ВыбГруппа)»
«Выбрать * Из РегистрСведений.ОстаткиТоваровНаСкладах.Обороты(&Дата1,&Дата2,Регистратор)
|Где Номенклатура в Иерархии(&ВыбГруппа)»
РегистрСведений.ОстаткиТоваровНаСкладах.ОстаткиИОбороты(&Дата1,&Дата2,Регистратор)
|Где Номенклатура в Иерархии(&ВыбГруппа)»

Стало

«Выбрать * Из РегистрСведений.ОстаткиТоваровНаСкладах.Остатки(&Дата1,Номенклатура в Иерархии(&ВыбГруппа))»
«Выбрать * Из РегистрСведений.ОстаткиТоваровНаСкладах.Обороты(&Дата1,&Дата2,Регистратор, Номенклатура в Иерархии(&ВыбГруппа))»
РегистрСведений.ОстаткиТоваровНаСкладах.ОстаткиИОбороты(&Дата1,&Дата2,Регистратор,, Номенклатура в Иерархии(&ВыбГруппа))»
42 sasha_nik
 
21.06.13
09:56
Т.е. после ускорения отчеты стали работать на терминальном сервере в 2-3 раща быстрее, а в клиент-серверном варианте еще в 3-3 раза быстрее.
43 kiruha
 
21.06.13
11:06
Все это замечательно но к идее темы
"на клиенте будет формироваться текст запроса и устанавливаться его параметры, далее  на сервере формируется выборк" отношения не имеет
Стандартная оптимизация
44 sasha_nik
 
28.06.13
10:18
В общем, у меня получилось следующее:

Оптимальный и проверенный мною вариант перевода выполнения отчета на сервер:
//-------------------------------------------
Форма диалога отчета (содержит поля отбора «ДатаНачала, ДатаКонца, Контрагент, Менеджер, ТМЦ)

Процедура СформироватьПечатнуюФорму() //расположена в форме диалога отчета,  может быть также расположена и в модуле отчета, выполняется на клиенте
   //1. Проверим правильность заполнения критериев отбора, если    неправильно, то возврат
   //2. Получим таблицу значений для дальнейшего вывода в печатную форму
   С использованеим функции, расположенной в модуле,    «ПроцедурыИФункцииДляВыполненияНаСервере»
   ТабЗ=ПолучитьДанныеДляФормированияПечатнойФормыОтчета_НаКлиенте(ДатаНачала, ДатаКонца, Контрагент, Менеджер, ТМЦ);
   //Напрямую на сервер передавать данные и получать оттуда из формы диалога нельзя, нужно использовать промежуточную функцию, выполняемую на клиенте, но расположенную в том же общем модуле, что и функция, выполняемая на сервере. А уже эта промежуточная функция вызывает функцию, выполняемую на сервере
   //3. используя данные из полученной таблицы значений «ТабЗ», сформируем    и выведем на экран печатную форму
КонецПроцедуры
//--------------------------------------------

Модуль общего назначения «ПроцедурыИФункцииДляВыполненияНаСервере»
(обязательно должны стоять галочки «Сервер», «Клиент» и «Вызов сервера»)

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

&НаСервере
Функция ПолучитьДанныеДляФормированияПечатнойФормыОтчета_НаСервере(ДатаНачала, ДатаКонца, Контрагент, Менеджер, ТМЦ)
   //Формируем нужную нам таблицу значений, можно использовать оптимизированные запросы, таблицы значений, списки значений, вложенные таблицы и списки значений и т.д., но таблица значений не должна содержать мутабельных значений (т.е. ссылок на элементы формы, строки таблиц значений и т.д., также внутри тела функции, выполняющейся на сервере, не должно быть выражений типа).:
   Вопрос
   РежимДиалогаВопрос
   КодВозвратаДиалога
   Предупреждение
   Состояние
   ОбработкаПрерыванияПользователя
   ОчиститьСообщения
//ТЗ может содержать справочники-ссылки, документы-ссылки, количества, //строковые выражения, а также вложенные таблицы, содержащие справочники-//ссылки, документы-ссылки, количества, строковые выражения.

   Возврат ТЗ;

КонецФункции
45 sasha_nik
 
28.06.13
10:20
Эта штука работает, один отчет я перевел, стал выполняться значительно быстрее при больших объемах выборки
46 sasha_nik
 
28.06.13
10:40
ПроцедурыИФункцииДляВыполненияНаСервере - это общий модель