Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по месту выполнения процедур
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
x25
Добрый день, коллегам по 1с.
Решил написать вопрос и результат анализа по теме место выполнения процедур и функций , директив 1с.
Имеем: 1С УПП 1.3.49
Документ: ТабельРабочегоВремени.
В обработке проведения ОбработкаПроведения() есть запуск процедуры ПроведениеПоРегиструРасчета(ВыборкаПоШапкеДокумента)
Эта же процедура заполняет данные вот тут
ВыборкаПериодыПропусков = СформироватьЗапросДляРегистраРасчета(ВыборкаПоШапкеДокумента).Выбрать();

Я хотел попробовать эту процедуру СформироватьЗапросДляРегистраРасчета() перевести для выполнения на сервер.
Там запрос к данным БД.

Но ,вот что в итоге получаю:

Создаю ОбщийМодуль MyUnit, устанавливаю у него свойства Сервер, Вызов Сервера. Переношу туда процедуру с запросом+ необходимые переменные передаю ей.

Пытаюсь вызвать эту процедуру: Ошибка, процедура не найдена. Причина: Если модуль чисто серверный, то он не будет скомпилирован на клиенте, и тогда мы не можем его вызывать.

Ставлю свойство клиентского приложения у модуля. В итоге получается , что мы опять же на клиентском уровне работаем.
Используя #Если СерверТогда .. #КонецЕсли
Пытаюсь перевести выполнение на сервер, но получаю ошибку того ,что текст всей процедуры или её части заключенный в эту конструкцию не виден при таком запуске.

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

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

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


 ! 

Правила, п.5
 
alex040269
Цитата(x25 @ 12.02.14, 10:41) необходимо зарегистрироваться для просмотра ссылки
вдруг найдется ошибка в моих умозаключениях.

ошибка таки есть! что бы ее найти нужны точные сообщения 1С + режим в каком 1С выдает эти сообщения (Конфигуратор,Предприятие).
logist
Цитата(x25 @ 12.02.14, 11:41) необходимо зарегистрироваться для просмотра ссылки
Ошибка, процедура не найдена.

Может вопрос глупый, но у вас в конце названия процедуры и параметров указано "Экспорт"?
x25
Цитата(alex040269 @ 12.02.14, 12:40) необходимо зарегистрироваться для просмотра ссылки
ошибка таки есть! что бы ее найти нужны точные сообщения 1С + режим в каком 1С выдает эти сообщения (Конфигуратор,Предприятие).

Хм, сейчас попробовал ещё раз выполнить свои манипуляции (модуль с директивой на сервере, и этой процедурой ) и получил вот такую ошибку:
Попытка передачи с клиента на сервер мутабельного значения 1-го параметра.
Сейчас попробую решить этот вопрос.
x25
На текущий момент, передача процедуры на выполнение на сервере получилось.
Вот сравнение до и после:

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

А вот проведение документа при количестве человек больше 50 человек выявило самое больное место в проведении этого документа :



Что по коду там от 1С

    НаборГрафикиРаботыПоВидамВремени = РегистрыСведений.ГрафикиРаботыПоВидамВремени.СоздатьНаборЗаписей();
                    
    НаборГрафикиРаботыПоВидамВремени.Отбор.Месяц.Установить(ВыборкаПоШапкеДокумента.ПериодРегистрации);
        НаборГрафикиРаботыПоВидамВремени.Отбор.План.Установить(Ложь);

    НаборГрафикиРаботыПоВидамВремени.Отбор.ГрафикРаботы.Установить(ВыборкаПоОтработанноеВремя.Сотрудник);
    СтруктураПоиска.Вставить("ГрафикРаботы", ВыборкаПоОтработанноеВремя.Сотрудник);
    НаборГрафикиРаботыПоВидамВремени.Прочитать();
    ТаблицаНабора = НаборГрафикиРаботыПоВидамВремени.Выгрузить();

        Движение = ТаблицаНабора.Добавить();
        Движение.ГрафикРаботы = ВыборкаПоОтработанноеВремя.Сотрудник;
            Движение.ВидУчетаВремени = ВидУчетаВремениПоЧасам;
        Движение.Дата = ДатаМесяца;
            Движение.Месяц = ВыборкаПоШапкеДокумента.ПериодРегистрации;
            Движение.План = Ложь;
            Движение.Документ = ПустойДокумент;

        НаборГрафикиРаботыПоВидамВремени.Загрузить(ТаблицаНабора);
        НаборГрафикиРаботыПоВидамВремени.Записать();



НаборЗаписей заполняется путем загрузки, что оптимально , но занимает много времени по причине большого количества записей.
И запись в регитстр записей тоже затрагивает много времени.


PS Согласен с пунктам 5 правил, исправлюсь.
Vofka
Цитата(x25 @ 12.02.14, 14:40) необходимо зарегистрироваться для просмотра ссылки
На текущий момент, передача процедуры на выполнение на сервере получилось.

Так и в чем была ошибка?
x25
Цитата(Vofka @ 12.02.14, 15:06) необходимо зарегистрироваться для просмотра ссылки
Так и в чем была ошибка?

Модуль был с параметрами и сервер и клиент, я также пытался использовать директиву #Если Сервер
В этом случае, он при запуске толстого клиента, этот текст не компилировался и соотвественно вызывали ошибку, мы находились в контексте клиентского приложения и тд.

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

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.