Имя: Пароль:
1C
1С v8
Зачем выносить код обработки проведения в модуль менеджера?
0 bahtik
 
29.11.12
22:58
В типовой БП 3.0 например, в документе ВводОстатков весь код по формированию движений вынесен в модуль менеджера. Что это дает?
1 Undefined vs NULL
 
29.11.12
22:59
ничего, они идиоты, не различают понятий статических методов, от методов-объектов
2 zulu_mix
 
29.11.12
23:01
3 Fragster
 
гуру
29.11.12
23:40
(0) не надо создавать объект чтобы сформировать движения, например программно
4 Undefined vs NULL
 
29.11.12
23:41
(3) система такая, она не может нужно-тонких объектов создавать
5 Alex375
 
30.11.12
07:46
Есть еще применение - формирование печатных форм. Если ты запросом получаешь только нужные данные, тогда зачем тебе получать перед этим весь объект? Так что это хорошая вещь.
6 Живой Ископаемый
 
30.11.12
08:20
это лучше чем наоборот. создать объект только для того чтобы воспользоваться экспортными фукнциями его модуля которые выберут много объектов этого и даже других видов и что-то с ними сделают. например проведут.
7 Infsams654
 
30.11.12
08:24
(1) как раз и знают, читай (5), (6)
8 Нуф-Нуф
 
30.11.12
08:25
А все таки в чем прикол? Срабатывает обработка проведения и зачем в ней обращаться к менеджеру документа? Какой смысл? Может быть чтобы потом с помощью процедур менеджера формировать новые движения без перепроведения самого документа?
9 Infsams654
 
30.11.12
08:38
(8) а почему нет ? Ввод остатков, как известно может многое.
По мере его разрастания (в следующих релизах) зачем перепроводить старое.
10 Infsams654
 
30.11.12
08:50
(9)+ пример: документ проводит движения Р1, Р2, Р3. Решили в следующем релизе, что вместо Р3, нужно Р3.1, Р3.2. При переходе на релиз, обновление ИБ выполняет не перепроведение (могут и ручные корректировки быть), а только движение из Р3 в Р3.1 и Р3.2
11 Undefined vs NULL
 
30.11.12
08:51
(7) тогда вообще зачем объект?
по хорошему я должен сам управлять контентом объекта, но увы
12 Infsams654
 
30.11.12
08:59
(11) так это и не отменяется. В менеджер (читай статический метод) передается ссылка на объект, а там уж решается поднимать или нет сам объект, и вызывать любые его экспортные методы.
13 Undefined vs NULL
 
30.11.12
09:23
(12) это все понятно, но как быть если я хочу распечатать массив документов разного типа?
14 Infsams654
 
30.11.12
09:33
(13) так в типовых под УФ (БГУ 2.0, БП 3.0 ...) печать как раз и выведена в менеджер, в (5) об этом. Удобно из формы списка (или распечатать массив документов разного типа).
15 Undefined vs NULL
 
30.11.12
09:39
(14) ты мне пример кода для (13) кинь
16 Infsams654
 
30.11.12
10:12
(15) посмотри для начала в демо БГУ 2.0 - выделяешь в списке документов несколько, Все действия - Печать -.
А если разнотиповые, то примерно так:

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

можно покрасивее сделать, типа, сразу формировать массивы объектов одного типа и вызов печати для них, и т.д.
17 Undefined vs NULL
 
30.11.12
10:35
(16) мне одному кажется, что ты только что поднял объекты полностью?
18 Reset
 
30.11.12
10:47
Ненавидящий говорит об отсутвии менеджера ссылки
19 Нуф-Нуф
 
30.11.12
10:50
Печать в модуле менеджера - это правильный подход. Туда передавать ссылку (массив ссылок) и получать данные для печати запросом без получения объекта.
А вот проведение - имхо под вопросом
20 Infsams654
 
30.11.12
10:51
(17) см. (12). хочешь - поднимай или не поднимай.  
(19) пример в (10)
21 Нуф-Нуф
 
30.11.12
10:55
(20) имхо сомнительный пример
22 Undefined vs NULL
 
30.11.12
10:55
(20) ну так ты приведешь нормальный пример без поднятия объекта для разных видов документов в массиве?
23 SanGvin
 
30.11.12
10:57
(2) спасибо, исчерпывающе
24 Infsams654
 
30.11.12
11:31
(22) а без данных объекта, как думаешь его печатать ? Еще раз объясняю, статический метод позволяет брать от объекта только то, что ему нужно
25 Undefined vs NULL
 
30.11.12
11:36
(24) слив засчитан
26 Reset
 
30.11.12
11:37
(24) Статический метод нельзя нормально вызвать, имея ссылку(и не зная ее тип), только громоздя конструкции иначеЕсли
27 Reset
 
30.11.12
11:38
+(26) или выдергиваением имени из метаданных и манипуляциями с ним, что тоже неудобно
28 Команданте
 
30.11.12
11:39
я делаю так

Процедура ОбработкаПроведения()
ИДокумент.Провести(ЭтотОбъект);
КонецПроцедуры

ИДокумент (или ЯДокумент) - интерфейс, реализованный в виде общего модуля
29 Команданте
 
30.11.12
11:41
+(28)

Процедура Провести(ДокОбъект, Отказ, РежимПроведения) Экспорт
   
   Перем Таблица;
   
   ИмяДок = ДокОбъект.Метаданные().Имя;
   ДокСсылка = ДокОбъект.Ссылка;
   Движения = ДокОбъект.Движения;
   СтрПр = ПолучитьСтрПр(ДокСсылка);
   СоответствиеТаблиц = Документы[ИмяДок].ПолучитьСоответствиеТаблиц();
   
   Для Каждого КлючИЗначение Из СоответствиеТаблиц Цикл
       Выполнить("Таблица = Документы[ИмяДок]." + КлючИЗначение.Ключ + ("(СтрПр);"));
       ОтразитьДвижение(Движения, КлючИЗначение.Значение, Таблица, Отказ);
   КонецЦикла;
   
   ДокОбъект.Движения.Записать();
   
КонецПроцедуры
30 Undefined vs NULL
 
30.11.12
11:53
(29)и в чем прэлесть?
31 Команданте
 
30.11.12
12:13
(30) всё объектно-ориентированно
модуль менеджера документа содержит функции получения таблиц
то есть всё что документ должен сделать это запросы и вернуть эти таблицы в метод Провести()
технология с3.14жжена из ут 11, доработана под ООП
32 Undefined vs NULL
 
30.11.12
12:17
(31) честно говоря - я не вижу тут ООП ну никак
33 Infsams654
 
30.11.12
12:18
(31) с3.14жжена, прикольно: 3.14 - число "пи"
34 Fragster
 
гуру
30.11.12
12:18
(29) за "выполнить" и "вычислить" надо давать по голове
35 Команданте
 
30.11.12
12:20
(29) согласен, но 1с не поддерживает делегатов
36 Команданте
 
30.11.12
12:21
(32) шо ты тут не видишь, а
экземпляр документа, событие
событие вызывает метод интерфейса
статитеский метод документа возвращает таблицы
по-моему ООП тут просто воняет
37 Команданте
 
30.11.12
12:22
(35) к (34)
38 DailyLookingOn Sunset
 
30.11.12
12:22
Зачем, зачем.
Просто разделение на ДокументОбъект и ДокументСсылка весьма условное и иногда нужно проведение для ссылки (данные документа при проведении не меняются же).
39 DailyLookingOn Sunset
 
30.11.12
12:23
А нужно например для актуальности разделов учета, когда по отдельным регистрам движения документа формируются позже, обработкой восстановления актуальности учета.
40 Undefined vs NULL
 
30.11.12
12:44
(36) не впечатлило ни разу
41 Лефмихалыч
 
30.11.12
12:45
(0) это дает возможность перепроведения без получения и записи объекта документа
42 Лефмихалыч
 
30.11.12
12:47
(1) ты бы пальцы чтоль поуже сделал, я не знаю... теперь ведь тебе надо доказать, что метод формирования движений документа обязан быть методом объекта и не может быть статическим методом класса. Иначе ты получается пустую предъяву кинул
43 Undefined vs NULL
 
30.11.12
12:58
(42) я требую (18)
44 Undefined vs NULL
 
30.11.12
13:00
(41) перепроведи мне таким образом массив документов, но документы там разного вида
45 Команданте
 
30.11.12
13:22
чем отличается статический метод от метода экземпляра?
тем, что метод экземпляра оперирует данными экземпляра
впрочем, ничто не мешает все методы экземпляра перевести в статические, используя ссылку на экземпляр

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

касаемо проведения документа, важно как мы построим абстракцию
меня лично всегда удивляло, что метод записи движений документа в базу является методом документа
имхо, это какой-то другой класс, его даже нельзя назвать псевдо-статическим методом
скорее это метод абстрактного класса (или интерфейса), как уже было мною приведено выше

ихь бин не труЪ ООПшник, так что извиняйте, если чо где не так сказал
46 ssh2006
 
30.11.12
13:29
(26) > Статический метод нельзя нормально вызвать, имея ссылку(и не зная ее тип), только громоздя конструкции иначеЕсли

Для разных видов, должна ведь сработать конструкция, если имя процедуры универсальное

Документы[ДокСсылка.Метаданные().Имя].Печать(ДокСсылка)
47 Undefined vs NULL
 
30.11.12
13:35
(46) точно! этот гофнокод меня не радует
отражения в топку!
48 pumbaEO
 
30.11.12
13:43
А меня больше волнует, что при подписки на событие проведения документа никак не смогу отреагировать на вызов доп записи движений из модуля менеджера.

Вроде хитрые алгоритмы выносим из модуля объекта в подписки и обновлять хорошо и т.д., все хорошо. Только вот теперь надо еще смотреть нет ли спец процедурки в модуле менеджера и там по старинке лепить свой вызов процедуры...
49 Команданте
 
30.11.12
13:48
до тех пор пока 1с не станет полноценной ООП-системой, будет продолжаться этот неумолимый срач
50 Undefined vs NULL
 
30.11.12
13:52
(49) вообще то да, но я все равно хочу вкурить цимус (28)+(29)+(45) но чего-то не могу, помоги а?
51 Infsams654
 
30.11.12
15:11
(50) не вкуриваешь, забудь. Делай как все.
52 Undefined vs NULL
 
30.11.12
15:13
(51) не хочу как все
53 Infsams654
 
30.11.12
15:21
(48) pumba, в подписке вызываются методы общих модулей, что и есть "статические" методы с источником в параметре.
54 Infsams654
 
30.11.12
15:27
(52) ну тогда крути мозгами, вроде как все уже выяснили