К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Вопрос по расширению конфигурации

Гость
0 - 15.03.2017 - 12:05
Ситуация: создал процедуру в расширении формы документа, вызываемую после команды формы. Но поскольку в команде вызывается длительная операция, мой код срабатывает раньше, чем отработает полностью штатная команда. Как добиться срабатывания своего алгоритма после полного завершения команды?
Вот код вызова:
&НаСервере
Процедура Расш1_ЗаполнитьПослеНаСервере()

МассивСтрок = Новый Массив;
МассивСотр = Новый Массив;
ТЗ_Док = Новый ТаблицаЗначений;
ТЗ_Сотр = Новый ТаблицаЗначений;
ТЗ_Док = Объект.НачисленияПерерасчет.Выгрузить();
ТЗ_Сотр = Объект.НачисленияПерерасчет.Выгрузить(,"Сотрудник" );
МассивСотр = ТЗ_Сотр.ВыгрузитьКолонку("Сотрудник");

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КадроваяИсторияСотрудниковСрезПоследних.Сотрудник
|ИЗ
| РегистрСведений.КадроваяИсторияСотрудников.СрезПос ледних(
| &Период,
| Сотрудник В (&СЗ_Сотр)
| И ВидСобытия = &Уволен) КАК КадроваяИсторияСотрудниковСрезПоследних";

Запрос.УстановитьПараметр("Период", Объект.Дата);
Запрос.УстановитьПараметр("СЗ_Сотр", МассивСотр);
Запрос.УстановитьПараметр("Уволен", Перечисления.ВидыКадровыхСобытий.Увольнение);

РезультатЗапроса = Запрос.Выполнить();

УволенныеСотрудники = РезультатЗапроса.Выгрузить();

Для каждого СтрокаТЗ Из ТЗ_Док Цикл
Если УволенныеСотрудники.Найти(СтрокаТЗ.Сотрудник)=Неоп ределено Тогда //Сотрудник не уволен
МассивСтрок.Добавить(СтрокаТЗ);
КонецЕсли;
КонецЦикла;
НоваяТЗ_Док = Новый ТаблицаЗначений;
НоваяТЗ_Док = Объект.НачисленияПерерасчет.Выгрузить(МассивСтрок) ;
Объект.НачисленияПерерасчет.Загрузить(НоваяТЗ_Док) ;

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

&НаКлиенте
Процедура Расш1_ЗаполнитьПосле(Команда)

Расш1_ЗаполнитьПослеНаСервере();

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



Гость
1 - 15.03.2017 - 17:26
А не надо вызывать свою хрень несколько раз.

Оставь одно расширение: к тому событию, что уже есть. Которое на сервере.
И лучше запросы в модуль формы не запсочивать: сделай отдельный общий модуль для этого.
Гость
2 - 15.03.2017 - 17:45
(1) Так общий модуль только с изменением конфы можно вставить. Я ж с расширением замутил, чтобы не трогать типовую. А что я несколько раз вызываю? Я в расширении добавил постобработку команды Заполнить(Команда) и начинается она на клиенте с вызовом серверной процедуры. Тут все отрабатывает нормально, только вперед паровоза.
Гость
3 - 15.03.2017 - 18:00
(2) Используй &Вместо и вставь в конец вызов своей процедуры.
Гость
4 - 16.03.2017 - 06:13
а с добавленным общим модулем конфа разве не останется типовой ?
Гость
5 - 16.03.2017 - 08:51
(3) Пробовал. Те же яйца, вид сбоку.
(4) Обновление будет уже не full-автомат. Да и не хочется идти таким путем. Наверняка это можно решить в модуле расширения.
Гость
6 - 16.03.2017 - 10:12
2-US1C > Общий модуль никак не мешает обновлениям. Оне его не замечают.
Обновлениям мешают токмо изменения метаданных, содержащихся в типовой конфе. Собственный общий модуль просто обходится в таблице сравнения.
Вот рабочий пример:
&НаСервере
Процедура Расш1_ПослеЗаписиНаСервереПосле(ТекущийОбъект, ПараметрыЗаписи)
ОЗГ_ОбщийМодуль.КорректировкаВесаПродукцииПроизвод ственногоОтчета(ТекущийОбъект);
КонецПроцедуры

&НаКлиенте
Процедура Расш1_ПродукцияКоличествоПриИзмененииПосле(Элемент )
ТекущиеДанные = Элементы.Продукция.ТекущиеДанные;
ТекущиеДанные.Вес = ТекущиеДанные.Количество*ОЗГ_ОбщийМодуль.Определен иеВесовогоКоэффициента(ТекущиеДанные.Номенклатура) ;
КонецПроцедуры

&НаКлиенте
Процедура Расш1_ПродукцияНоменклатураПриИзмененииПеред(Элеме нт)
ТекущиеДанные = Элементы.Продукция.ТекущиеДанные;
ТекущиеДанные.Вес = ТекущиеДанные.Количество*ОЗГ_ОбщийМодуль.Определен иеВесовогоКоэффициента(ТекущиеДанные.Номенклатура) ;
КонецПроцедуры
Гость
7 - 16.03.2017 - 10:22
(3) каким образом "мой код срабатывает раньше"? Это какая то особенная 1С?
Гость
8 - 16.03.2017 - 10:39
(6) Это понятно, что в таблице сравнения внесенный модуль будет отсутствовать в обновлении и не будет помечен, но сам факт вывода сравнения конфигураций не даст отработать /UpdateCfg на автомате.
(7) Да нет, обычная 1С. Просто команда запускает длительную операцию в фоне и дальше передает эстафету моей процедуре. Но данных, которые должна моя процедура обработать, еще нет - длительная операция не успевает отработать. Отсюда и вопрос, как наверняка дождаться завершения длительной процедуры и выполнить мой код?
Гость
9 - 16.03.2017 - 11:07
8-US1C > Используй 1С Обновлятор. Он еще автоматом БД сохраняет перед обновлением. И пользователей выкидывает.
Гость
10 - 16.03.2017 - 11:25
Цитата:
Сообщение от US1C Посмотреть сообщение
длительную операцию в фоне
Где то ж есть "Оповестить" - вставляй туда. Нет сделай сам свое "Оповестить".
Гость
11 - 21.03.2017 - 00:35
(0)Как свой код может сработать раньше?
Гость
12 - 21.03.2017 - 15:59
(11) см.8
Гость
13 - 22.03.2017 - 00:23
(12)А транзакции нельзя использовать?
Гость
14 - 22.03.2017 - 09:20
(13) Смысл транзакции в моем случае?


К списку вопросов






Copyright ©, Все права защищены