Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Вопрос по расширению конфигурации (http://forums.kuban.ru/f1040/vopros_po_rasshireniyu_konfiguracii-8240420.html)

US1C 15.03.2017 12:05

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

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

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

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

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

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

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

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

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

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

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

VZ 15.03.2017 17:26

А не надо вызывать свою хрень несколько раз.

Оставь одно расширение: к тому событию, что уже есть. Которое [em]на сервере[/em].
И лучше запросы в модуль формы не запсочивать: сделай отдельный общий модуль для этого.

US1C 15.03.2017 17:45

(1) Так общий модуль только с изменением конфы можно вставить. Я ж с расширением замутил, чтобы не трогать типовую. А что я несколько раз вызываю? Я в расширении добавил постобработку команды Заполнить(Команда) и начинается она на клиенте с вызовом серверной процедуры. Тут все отрабатывает нормально, только вперед паровоза.

akaFynjy 15.03.2017 18:00

(2) Используй &Вместо и вставь в конец вызов своей процедуры.

USSR 16.03.2017 06:13

а с добавленным общим модулем конфа разве не останется типовой ?

US1C 16.03.2017 08:51

(3) Пробовал. Те же яйца, вид сбоку.
(4) Обновление будет уже не full-автомат. Да и не хочется идти таким путем. Наверняка это можно решить в модуле расширения.

VZ 16.03.2017 10:12

2-US1C > Общий модуль никак не мешает обновлениям. Оне его не замечают.
Обновлениям мешают токмо изменения метаданных, содержащихся в типовой конфе. Собственный общий модуль просто обходится в таблице сравнения.
Вот рабочий пример:
[em]&НаСервере
Процедура Расш1_ПослеЗаписиНаСервереПосле(ТекущийОбъект, ПараметрыЗаписи)
ОЗГ_ОбщийМодуль.КорректировкаВесаПродукцииПроизводственногоОтчета(ТекущийОбъект);
КонецПроцедуры

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

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

akaFynjy 16.03.2017 10:22

(3) каким образом "мой код срабатывает раньше"? Это какая то особенная 1С?

US1C 16.03.2017 10:39

(6) Это понятно, что в таблице сравнения внесенный модуль будет отсутствовать в обновлении и не будет помечен, но сам факт вывода сравнения конфигураций не даст отработать /UpdateCfg на автомате.
(7) Да нет, обычная 1С. Просто команда запускает длительную операцию в фоне и дальше передает эстафету моей процедуре. Но данных, которые должна моя процедура обработать, еще нет - длительная операция не успевает отработать. Отсюда и вопрос, как наверняка дождаться завершения длительной процедуры и выполнить мой код?

VZ 16.03.2017 11:07

8-US1C > Используй 1С Обновлятор. Он еще автоматом БД сохраняет перед обновлением. И пользователей выкидывает.

akaFynjy 16.03.2017 11:25

[quote=US1C;43917573]длительную операцию в фоне[/quote] Где то ж есть "Оповестить" - вставляй туда. Нет сделай сам свое "Оповестить".

newreactive 21.03.2017 00:35

(0)Как свой код может сработать раньше?

US1C 21.03.2017 15:59

(11) см.8

newreactive 22.03.2017 00:23

(12)А транзакции нельзя использовать?

US1C 22.03.2017 09:20

(13) Смысл транзакции в моем случае?


Текущее время: 16:40. Часовой пояс GMT +3.