Имя: Пароль:
1C
1С v8
Как правильно реализовать инкапсуляцию в 1С на вот таком примере
,
0 jsmith82
 
06.06.13
15:31
Допустим, есть документ "Расходная накладная"
Её нужно заполнить на основании документа "Заказ покупателя"
Делаем процедуру "ЗаполнитьПоЗаказу" в модуле объекта
В этой процедуре происходит вызов функции "ПолучитьТоварыПоЗаказу", которая находится в модуле менеджера

Если действие происходит в форме, то надо выполнить код
ДокОбъект = РеквизитФормыВЗначение("Объект");
ДокОбъект.ЗаполнитьПоЗаказу();
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");

Но никак не Объект.Товары.Загрузить(Документы.РасходнаяНакладная.ПолучитьТоварыПоЗаказу(Объект.Заказ));

Чо думаете
1 acsent
 
06.06.13
15:32
в чем проблема то?
2 jsmith82
 
06.06.13
15:33
(1) в модуле менеджера
3 acsent
 
06.06.13
15:33
ты хочешь в форме писать
Объект.Товары.Загрузить(Документы.РасходнаяНакладная.ПолучитьТоварыПоЗаказу(Объект.Заказ));
4 jsmith82
 
06.06.13
15:34
(3) нет. я спрашиваю, правильно ли вынести функцию получения товаров в модуль менеджера
5 acsent
 
06.06.13
15:34
Если нигде не используется кроме заполнения то нет смысла
6 acsent
 
06.06.13
15:35
Тогда уж у заказа должна быть такая функция
7 jsmith82
 
06.06.13
15:35
Вот код из ут 11 в форме документа
Документы.РеализацияТоваровУслуг.ЗаполнитьПоОстаткамЗаказов(
       Объект,
       Объект.Товары,
       Объект.СкидкиНаценки,
       Склад,
       МассивЗаказов,
       Истина
   );
8 jsmith82
 
06.06.13
15:36
Причём "Объект" это ДанныеФормыКоллекция
9 jsmith82
 
06.06.13
15:38
А если я хочу заполнить программно, то мне надо будет открыть форму (как в ветке про жестяную жесть БИТа)
Имхо, реализация в ут 11 не совсем кошерна с точки зрения SOLID
10 rs_trade
 
06.06.13
15:42
В модуле менеджера по замыслу 1С, должны содержатся методы которые относятся не к конкретному экземпляру объекта базы данных, а к самому объекту конфигурации.
11 jsmith82
 
06.06.13
15:50
(10) Имхо, те методы, которые не модифицируют объект
Потому что та же Печать берёт данные экземпляров
Модуль менеджера это не совсем статические методы класса, они почти всегда используют данные объекта
12 Ненавижу 1С
 
гуру
06.06.13
15:51
(11) то бишь те, что у С++ обызваются const-методами?
13 jsmith82
 
06.06.13
15:52
(12) да
14 jsmith82
 
06.06.13
15:53
например, нужна групповая модификация документа
у каждого документа должен быть метод в модуле объекта МодифицироватьСебяТакТо()
а процедура групповой обработки вызывает этот метод в цикле и находится в модуле менеджера
15 Ненавижу 1С
 
гуру
06.06.13
15:53
(13) странно это все однако, непонятна философия развития языка 1С последнее время
16 jsmith82
 
06.06.13
15:55
(15) куда как больший баттхёрт вызывает использование этого языка в типовых конфигурациях
низкая инкапсуляция классов
то объект модифицируется в модуле объекта, то в модуле менеджера, то вообще модификация происходит путём отправки реквизита формы в модуль менеджера или общий модуль
17 Ненавижу 1С
 
гуру
06.06.13
15:56
(16) да с УФ стало жить гораздо веселее
18 oleg_km
 
06.06.13
15:57
(13) Для этого случая мне кажется в 1С могли бы предусмотреть модуль ссылки: типа объект, реквизиты когорого нельзя поменять. Собственно объект ссылка уже есть разрешили бы добавить в него методы и переменные пользователя
19 jsmith82
 
06.06.13
15:58
(18) согласен. получается модуль менеджера несёт две нагрузки: статические методы и константны методы
20 Hmster
 
06.06.13
16:05
просто 1С убрала ОБЪЕКТ из форм и из-за этого получается такое недопонимание
может в будущем что-нибудь подправят
21 Ненавижу 1С
 
гуру
06.06.13
16:10
(18) в свое время народ сказал "нет" v8: Модуль ссылки
22 Defender aka LINN
 
06.06.13
16:11
(0) Все правильно, но только ровно наоборот.
23 jsmith82
 
06.06.13
16:11
в принципе если форма имее расширение объекта, то, конечно же, форма является одним из видом существования объекта....
поэтому, видимо, дублирование методов в модуле объекта и в модуле формы оправдано
например, ЗаполнитьПоЗаказу() будет и в модуле объекта и в модуле формы
24 Defender aka LINN
 
06.06.13
16:13
(23) О_о
25 Ненавижу 1С
 
гуру
06.06.13
16:13
(23) эзотерика какая-то
ДокументОбъект это тип такой, ну или класс
ФормаДокумента - тоже тип, но совсем другой, не продолжение, просто другой
26 jsmith82
 
06.06.13
16:15
(25) это форма существования объекта, её данные привязаны к объекту
предположим, есть процедура ЗаполнитьРеквизитыПоДоговору()
Можно передевать вызов в модуль объекта, а можно разместить прямо в форме
но от этого эта процедура не станет чужой модулю объекта
код-то будет одинаковый!
27 jsmith82
 
06.06.13
16:16
кстати, в 8.1 можно было вызвать процедуру модуля объекта без лишних напрягов наотмашь
в 8.2 приходится делать медитативные РеквизитФормыВЗначение и ЗначениеВРеквизитФормы
28 Ненавижу 1С
 
гуру
06.06.13
16:17
(26) станет чужой, ибо:
1. объект не знает про форму
2. форм может быть несколько у одного объекта
3. форм у объекта может и не быть вовсе
29 Ненавижу 1С
 
гуру
06.06.13
16:17
(27) это только в Managed режиме
30 jsmith82
 
06.06.13
16:17
и вот, предположим, если взять модуль какого-нибудь документа из УТ 10.3 и везде, где есть вызов модуля объекта, вставить эту медитацию РеквизитФормыВЗначение и ЗначениеВРеквизитФормы, то что получится?
31 Defender aka LINN
 
06.06.13
16:18
(26) "код-то будет одинаковый!" - особенно когда его поменяют
(27) Вообще-то для этого существует модуль менеджера. Но половина мистюков при виде него начинают орать умные слова и биться в истерике - лишь бы им не пользоваться
32 jsmith82
 
06.06.13
16:19
вообще в ут 11 РеквизитФормыВЗначение и ЗначениеВРеквизитФормы используются в форме крайне редко
33 jsmith82
 
06.06.13
16:19
не более 3-4 вызовов в форме документа ЗаказКлиента И Реализация
34 shadowfiend10
 
06.06.13
16:20
я все общие для формы и модуля процедуры и функции запихиваю в менеджер
35 Defender aka LINN
 
06.06.13
16:21
(34) Ну хоть кто-то
36 Ненавижу 1С
 
гуру
06.06.13
16:23
(34) и там образуется некоторая свалка
37 shadowfiend10
 
06.06.13
16:25
(36) это в основном процедуры заполнения на основании, которые относятся к текущему типу объекта, по-моему это логичнее чем в общий модуль совать потом распределять по типам значений
38 jsmith82
 
06.06.13
16:25
давайте исходить из того, что мы не пользуемся дружественными классами и считаем, что модификация должна происходить из метода класса
поэтому, если в модуле формы происходит модификация документа, то эта процедура является методом класса...
сказал и не могу понять, бред это или правда
39 jsmith82
 
06.06.13
16:27
вот в 8.1 модуль объекта использовался вовсю
а в 8.2 вовсю используются дружественные классы (общие модули)
почему так? непонятно