Имя: Пароль:
1C
1C 7.7
v7: Можно ли записать документ, переданный по ссылке...
0 warkan
 
05.03.12
10:02
День добрый!
Задача: сделать процедуру-Экспорт в ГлМодуле, которая будет рассчитывать данные документа и сохранять этот документ с измененными значениями. И чтобы её можно было использовать и в модуле формы этого документа, и в обработке группового проведения таких документов.
Т.е., создаём процедуру в глобальном модуле:
Процедура ЗасчетДокумента(Док) Экспорт

 Док.Зарплата = Док.Часы * Док.Сотрудник.Тариф; // Зарплата, Часы, Сотрудник - поля документа "Док"

 ...
 //* можно ли в теле этой процедуры созранить изменения в переданном ей, как параметр, документе "Док"? Как? Док.Записать(); не работает :(

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

//* Можно конечно результат расчетов возвращать как набор параметров, а потом присваивать их текущему документу и потом его сохранять.
1 Rie
 
05.03.12
10:04
(0)
Документ = СоздатьОбъект("Документ."+Док.Вид());
Документ.НайтиДокумент(Док);
// и делай с ним что хошь
Документ.Записать();
2 xXeNoNx
 
05.03.12
10:04
Найти документ сначала... НЕ?
3 warkan
 
05.03.12
10:05
А более развёрнуто? Для непосвященных...
4 warkan
 
05.03.12
10:06
Аааааа!!!!!!! :)))))))))))) Вабэни! Шеф, Вы - ГЕНИЙ!!!
5 warkan
 
05.03.12
10:06
спасибо! :)
6 warkan
 
05.03.12
10:07
Тогда попутный - А оно даст записать открытый документ? Если вызвать процедуру ГлМода из модуля формы этого же документа?
8 Rie
 
05.03.12
10:26
(6) Нет.
9 Rie
 
05.03.12
10:37
+(8) Но можно передать ей контекст формы документа.
Можно даже снабдить дополнительным параметром, в зависимости от которого либо СоздатьОбъект и НайтиДокумент - либо в переданном контексте записывать.
10 warkan
 
05.03.12
10:42
Контекст формы документа и так передаётся.
Не может выполнить: Конт.НайтиДокумент(ТекДок)
То есть не может найти документ ,который на данный момент открыть интерактивно и из его модуля формы вызывается процедура ГлМода с параметром "Контекст",  в которой и выполняется Конт.НайтиДокумент(ТекДок)   (Пытается выполняться :) )
11 viktor_vv
 
05.03.12
10:45
(10) Так ты в контекст сразу и пиши.

Конт.Зарплата = Конт.Часы * Конт.Сотрудник.Тариф;
12 warkan
 
05.03.12
10:54
То есть, проверять, что есть переданный параметр? Если "Контекст" - продолжить работу и писать в контекст:
Процедура РасчетЗарплаты(Конт)
 Конт.Зарплата = Конт.Часы * Конт.Сотрудник.Тариф;
 ...

А если Конт.ТипЗначения() = 12 // документ
Ищем его
ТекДок = СоздатьОбъект("Документ.РасчетЗарплаты");
Тек.Док.НайтиДокумент(Конт);

...и уже после этого считаем всё дальше, как обычно.
Так?
13 warkan
 
05.03.12
10:58
*ТипЗначения(Конт) = 12
14 Rie
 
05.03.12
11:23
(12) Проверять - оно конечно... Но, IMHO, лучше явно укажи.
Поскольку возможно

док = СоздатьОбъект("Документ.ЧегоТоТам");
док.НайтиПоНомеру("12345",РабочаяДата());
ТвояПроцедура(док);

то есть, передан не контекст формы - но писать всё равно можно.
15 Rie
 
05.03.12
11:25
(13) 12 - это документ. Который может быть разным - или ссылкой, поля которой изменять нельзя, или объектом (созданным по СоздатьОбъект, к примеру), поля которого можно менять.
16 warkan
 
05.03.12
11:35
Я понял. Спасибо всем большое!!!
Всё получилось лучшим образом (А я хотел со списком значений заморачиваться...)

Спасибо за науку.
17 warkan
 
05.03.12
11:35
Процедура Зарплата_докПутЛистАвто(Конт, Записывать=1, Проводить=0) Экспорт
   
   Если ТипЗначения(Конт) = 12 Тогда
       ТекДок = Конт;
       Конт = СоздатьОбъект("Документ.ПутевойЛистАвтомобиля");
       Если Конт.НайтиДокумент(ТекДок) = 0 Тогда
           Сообщить("Позиционирование на "+ТекДок+" не произведено!","!");
           Возврат;
       КонецЕсли;
   КонецЕсли;
       ...
18 Анатоль
 
05.03.12
11:42
(17) не сказал бы я что это лучшим образом

Процедура Зарплата_докПутЛистАвто(Конт, Записывать=1, Проводить=0) Экспорт
   
   Если ТипЗначения(Конт) = 12 Тогда
       Если ТипЗначенияСтр(Конт) <> "ГрупповойКонтекст" Тогда
           ТекДок = Конт;
           Конт = СоздатьОбъект("Документ.ПутевойЛистАвтомобиля");
           Если Конт.НайтиДокумент(ТекДок) = 0 Тогда
               Сообщить("Позиционирование на "+ТекДок+" не произведено!","!");
               Возврат;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;
19 warkan
 
05.03.12
14:51
Спасибо. Учту.