Имя: Пароль:
1C
1С v8
Своё поведение кнопки Сформировать. СКД.
0 Wobland
 
28.05.12
11:23
1. не костыль 63% (5)
2. костыль 25% (2)
3. затрудняюсь ответить 13% (1)
4. всё равно 0% (0)
Всего мнений: 8

Исходная задача: показать диаграмму, используя в качестве данных свою ТЗ. Почему так и нельзя ли сделать по-человечески пока трогать не будем, просто есть ТЗ. Как это сделать? Берём СКД, подсовываем ей в качестве объекта нашу ТЗ - опля, готово.
Это была преамбула, амбула такова. "Подсовывание" и все последующие действия делаются программно. Соответственно, нужна своя кнопка. Плюс свойство у формы Автоотображение состояния. Коллега утверждает, что такие вот вещи - это "костыль", ибо мы не победили отчёт, а убрали/подменили лишнее своим.
Теперь вопрос: своя кнопка Сформировать и запрет отображения состояние - это костыль или использование штатных механизмов СКД?
1 DrShad
 
28.05.12
11:25
штатно имхо
2 DrShad
 
28.05.12
11:26
и собственно

не костыль
3 Cube
 
28.05.12
11:26
Голосовалку прикрути))))))))
Своя кнопка "Сформировать" - это не костыль. Самолеты летают на автопилоте, но можно ведь и вручную управлять - это тоже костыли?)
4 Cube
 
28.05.12
11:27
О, голосовалка!)

не костыль
5 Wobland
 
28.05.12
11:27
моё имхо, ждём оппонента ;)

не костыль
6 Cube
 
28.05.12
11:28
(5) Ник? Ну чтоб знать, кого какашками закидывать... :)
7 Wobland
 
28.05.12
11:29
(6) мда.. об этом я не подумал ;)
8 Любопытная
 
28.05.12
11:31
(6) Меня закидывайте, я оппонент.

К сожалению, решить проблему я не смогла, пришлось изворачиваться.

Нифига это не штатно - прятать стандартные кнопки и вместо них свои рисовать.

костыль
9 Любопытная
 
28.05.12
11:33
(3) Ты не то сравниваешь. Представь, что тебе надо перепрограммировать автопилот. Но ты не смог этого сделать, поэтому прикрутил свой, а кнопку для включения дефолтного закрасил в цвет панели, чтобы летчик не увидел. Считаешь это нормальным решением?
10 Cube
 
28.05.12
11:33
(8) А что по твоему штатно? когда вот так: http://files.rsdn.ru/20998/c0f0832ccca5.jpg ?
Ты же макет не сама рисуешь...
11 Cube
 
28.05.12
11:35
(9) Хорошо, погнали в эту тему.
Ты не доконца рассказала историю. Ведь автопилот не получилось запрограммировать не потому, что умений не хватило, а потому, что это самолет для авиашоу в честь ВВС - нужно всякие бочки вертеть, мертвые петли и т.п. Автопилот не справится, нужно ручное управление. Это не костыли.
12 Любопытная
 
28.05.12
11:36
(11) А я считаю, что у меня именно умения не хватило
13 Wobland
 
28.05.12
11:37
(12) конструкторы автопилота не могут в принципе предусмотреть всяческие бочки, мёртвые петли и т.п. поэтому умелый пилот берёт напильник, допиливает автопилот на земле под себя и спокойно взлетает
14 Cube
 
28.05.12
11:39
(12) Ну, возможно, твоё кунг-фу ещё не достаточно сильное, чтобы убивать противника с одного удара и приходится бить два раза, но это всё равно кунг-фу. Ты же не бьешь противника костылем... :)
15 Любопытная
 
28.05.12
11:40
(11) Это не ручное управление
16 Конфигуратор1с
 
28.05.12
11:40
(12) не совсем правильный подход. Заполнение скд из таблицы значений рисуется программно, в чем костыль? было бы у скд реквизит - брать данные из этой таблицы, было бы другое дело.
17 Cube
 
28.05.12
11:42
(15) А ручное управление самолетом - это не штатная функция управления самолетом что-ли?)) Я же свои тросики для управления закрылками не протягиваю. Все рычаги и кнопки с завода изготовителя... Всё штатно.
18 Любопытная
 
28.05.12
11:45
Хорошо. Тогда расскажите мне, гуру-специалисты.
Для чего используется метод ПриКомпоновкеРезультата(), предусмотренный в модуле отчета?
19 Cube
 
28.05.12
11:55
(18) Ну как тебе объяснить... Вот для чего используется метод ПриОткрытии() в формах? Однозначного ответа нет. Так и тут. Для чего приспособишь, для того и будет. Ну вот, например:
http://inq-brc.ru/index.php/ugol-prog/732-kak-zafiksirovat-maket-skd
http://www.miko.ru/blogs/metalblog/138
20 Любопытная
 
28.05.12
11:58
(19) Этот метод отрабатывает при нажатии стандартной кнопки Сформировать. Почему оттуда у меня отчет не формируется? Код проходит без ошибок, но отчет не формируется
21 SoulPower
 
28.05.12
12:01
ПриКомпоновкеРезультата() решает задачу в (0). Тч в этом случае конечно

костыль
22 Cube
 
28.05.12
12:04
(20) "Пилите, Шура, пилите. Она золотая!" (c)
23 Megas
 
28.05.12
12:04
Не костыль конечно, любой более менее сложный отчёт на СКД приходится выводить программно.
В типовых говорят сплошь и рядом (БП 8.2)

не костыль
24 Wobland
 
28.05.12
12:05
(20) а ты где-то при стандартном пути подсунула свою ТЗ?
25 SoulPower
 
28.05.12
12:08
+(21) Насчет отображения состояния не костыль кстати. Но вот нафига кнопку рисовать не ясно.
26 Любопытная
 
28.05.12
12:08
(24) Естественно! Я процедуру заполнения ТЗ перетащила в модуль объекта и она чудесно заполняется. Я же говорю - код отрабатывается без ошибок, но результата не дает
27 Wobland
 
28.05.12
12:09
(25) кнопку я придумал, чтобы генерировать ТЗ и отдавать её в СКД. можно без своей кнопки?
28 Любопытная
 
28.05.12
12:09
(25) А как без кнопки?
29 Wobland
 
28.05.12
12:09
(26) откуда у тебя СКД прознало про твою ТЗ?
30 Любопытная
 
28.05.12
12:10
(23) У меня простой отчет
31 Любопытная
 
28.05.12
12:10
(29) она реквизит отчета.
32 Wobland
 
28.05.12
12:12
(31) и чо? пусть их будет 80. какую брать?
33 Любопытная
 
28.05.12
12:15
(32) которую я сказала, в чем проблема?
34 Wobland
 
28.05.12
12:16
(33) в этом и заключался вопрос
35 Любопытная
 
28.05.12
12:19
(34) в чем?
36 Wobland
 
28.05.12
12:21
-откуда у тебя СКД прознало про твою ТЗ?
-она реквизит отчета.
-какую из имеющихся брать?
-которую я сказала
-откуда ты это сказала?
37 Любопытная
 
28.05.12
12:22
Ну так может кто-нибудь поможет разобраться ПриКомпоновкеРезультата()?
Хочу таки через нее отчет вывести
38 acsent
 
28.05.12
12:22
в 8.2 есть событие модуля ПриКомпоновке
39 Любопытная
 
28.05.12
12:23
(36) Я заполнила ТЗ, потом подложила это ТЗ в ВнешниеНаборыДанных.Вставить(). Разве не так?
40 Любопытная
 
28.05.12
12:23
(38) оно и есть
41 Cube
 
28.05.12
12:27
Собсна этим, надеюсь, я ответил на все вопросы:

Файл отчета без формы, но с внешним набором данных: http://files.mail.ru/3F4WJX

А вот и единственная процедура из модуля этого отчета:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
   
   СтандартнаяОбработка = Ложь;
   
   МояТЗ = Новый ТаблицаЗначений;
   МояТЗ.Колонки.Добавить("Поле1", Новый ОписаниеТипов("Строка"));
   Для Сч = 1 По 25 Цикл
       НоваяСтрока = МояТЗ.Добавить();
       НоваяСтрока.Поле1 = "Строка " + Сч;
   КонецЦикла;
   
   ДокументРезультат.Очистить();
   ВнешниеНаборыДанных = Новый Структура;
   ВнешниеНаборыДанных.Вставить("МояТЗ", МояТЗ);
   КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
   Настройки = КомпоновщикНастроек.ПолучитьНастройки();
   МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

   ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
   ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

   ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
   ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

   ПроцессорВывода.НачатьВывод();

   Пока Истина Цикл
      ЭлементРезультата = ПроцессорКомпоновки.Следующий();
      Если ЭлементРезультата = Неопределено Тогда
         Прервать;
      Иначе
         ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
      КонецЕсли;
   КонецЦикла;

   ПроцессорВывода.ЗакончитьВывод();
   
КонецПроцедуры //ПриКомпоновкеРезультата()
42 Cube
 
28.05.12
12:28
+(41) Абсолютно то же самое, можно сделать в форме отчета, нарисовав свою кнопку "Сформировать". И оба этих варианта - штатные механизмы. Никаких костылей тут нет и быть не может.
43 Любопытная
 
28.05.12
12:29
(41) А если без НачатьВывод() и ЗакончитьВывод()?
44 Wobland
 
28.05.12
12:31
(41) спасибо, поучил
45 Cube
 
28.05.12
12:31
(43) не понял вопроса.
46 Wobland
 
28.05.12
12:31
(43) аллах запрещает?
47 Cube
 
28.05.12
12:32
(44) Сам в первый раз делал, до этого я кнопу "Сформировать" рисовал :)
48 Wobland
 
28.05.12
12:32
(47) я не заметил ДокументРезультат в параметрах ;)
49 Любопытная
 
28.05.12
12:33
(41) Мне не нравится цикл для вывода. Можно пачкой всю ТЗ вывести?)
50 Wobland
 
28.05.12
12:34
действительно, а зачем там циклический вывод? не проще ль
   ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
   ПроцессорВывода.УстановитьДокумент(Результат);
   ПроцессорВывода.Вывести(ПроцессорКомпоновки);
51 Wobland
 
28.05.12
12:34
(50) ну, не Результат...
52 sanja26
 
28.05.12
12:34
ПроцессорВывода.НачатьВывод();

   Пока Истина Цикл
      ЭлементРезультата = ПроцессорКомпоновки.Следующий();
      Если ЭлементРезультата = Неопределено Тогда
         Прервать;
      Иначе
         ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
      КонецЕсли;
   КонецЦикла;

   ПроцессорВывода.ЗакончитьВывод();

какой смысл?
53 Cube
 
28.05.12
12:37
(50) Да пожалуйста, я не против) Просто я взял свой старый отчет со своей кнопкой "Сформировать" и внешним набором данных и скопипастил код.

Работает? Работает! Фигли докопались?))
54 Cube
 
28.05.12
12:38
+(53) Кстати, этот код я не сам придумал. Может из Хрусталевой взял?...
55 SoulPower
 
28.05.12
12:39
(27)(28) -> (41)
56 Любопытная
 
28.05.12
12:39
Всем грандиозное спасибо!
Cube, отдельное спасибо за наводку!
Макс, спасибо за ветку! :-*
57 Cube
 
28.05.12
12:40
(55) Спасибо, кэп!))
58 SoulPower
 
28.05.12
12:41
(57) Спросили, ответил. И да, пожалуйста.
59 Cube
 
28.05.12
12:41
(56) Ну так это, ты всё ещё считаешь, что своя кнопка "Сформировать" это костыли?)
60 Wobland
 
28.05.12
12:41
я вот тут подумал... до этого я делал свою кнопку, заставлял её работать по-своему. а можно проще - перехватить компоновку, наделать там нужного и отдать обратно. так что ...

затрудняюсь ответить
61 Любопытная
 
28.05.12
12:41
(60) Воооот! Таки на мой взгляд, это правильнее.
(59) Смотри (60) :)

не костыль
62 Cube
 
28.05.12
12:42
(60) (61) А какая разница, где мы это делаем? Механизмы юзаем одни и те же. Так что, это одно и то же.
63 Cube
 
28.05.12
12:43
+(62) Код один и тот же...
64 Любопытная
 
28.05.12
12:43
(63) но в разных местах
65 PiVa123
 
28.05.12
12:43
(61) Если бы еще показали - как впихнуть эти самые "ВнешниеНаборыДанных", а остальное не делать (т.е. Вывод - пусть сам делается) тогда было бы круто.
66 Любопытная
 
28.05.12
12:44
(65) А вот это уже невозможно, на сколько я поняла
67 PiVa123
 
28.05.12
12:45
(66) Скажем так, я тоже пока не знаю. :)
68 Wobland
 
28.05.12
12:45
(62) в первом случае я вотнул свой рычаг и перевязал на него тросики, во втором случае я (ты) подшаманил под приборной панелью, чтоб тот же тросик и тот же рычаг чуть по-другому работали... не?
69 Cube
 
28.05.12
12:45
(64) То есть, если ты сначала чай налила в кружку, а потом сахару насыпала, а я сахар сыплю одновременно с наливанием воды, то у меня костыли, а у тебя типовой функционал? Ну-ну))
70 Wobland
 
28.05.12
12:46
(65) Cube в (10) уже показывал
71 Любопытная
 
28.05.12
12:49
(69) Если тебе так хочется - да, ты умнее меня. Гордись этим, но я останусь при своем мнении
72 Cube
 
28.05.12
12:53
(71) Что-то разговор не в то русло пошел... Никто никого не умней. Какие есть способы впихать свою ТЗ в СКД? Он один. И при подмене кнопки и в процедуре мы делаем одно и то же - мы не используем автоматический вывод отчета, мы пишем свой вывод. Но это штатная функция, так задумано разработчиками платформы.

Поймите, в обоих вариантах происходит абсолютно одно и то же.
73 Wobland
 
28.05.12
12:59
(72) >происходит абсолютно одно и то же
не спорю, только как-то перехват события выглядит элегантней, нежели своя кнопка имхо
74 Любопытная
 
28.05.12
12:59
(72) Я понимаю, что происходит одно и тоже. Я понимаю, что есть вариант, когда используется стандартная команда, а есть не очень красивый вариант с перерисовыванием кнопок и изменением свойств элементов формы. Телодвижений больше получается
75 Cube
 
28.05.12
13:04
(73) (74) Не, я тоже считаю, что в процедуре красивее, но вопрос-то был что своя кнопка "Сформировать" это костыль или нет?
Я считаю, что своя кнопка "Сформировать" это тоже самое, что написать "СтандартнаяОбработка = Ложь;" в какой-нибудь предопределенной процедуре. Поэтому, если кнопка "Сформировать" это костыль, то все конфигурации на костылях))
76 Любопытная
 
28.05.12
13:05
(75) Мы думаем явно по-разному)
77 Cube
 
28.05.12
13:09
(76) Ну почему же? Вот смотри:

1). Своя кнопка "Сформировать". Мы отказываемся от автоматической обработки нажатия на эту кнопку и пишем свою процедуру.

2). "СтандартнаяОбработка = Ложь;". Этим мы отказываемся от автоматической обработки этого метода и пишем свой код.

Ну, 1 и 2 не похоже совсем?)) Ну что, ни капельки? Ну ё-маё... :)))
78 Wobland
 
28.05.12
13:09
Костыль — средство добавления недостающей функциональности или исправления серьёзных дыр без должного редизайна системы.
http://lurkmore.to/Костыль
если принять это определение, то да, вся конфигурация на костылях ;)
79 Wobland
 
28.05.12
13:10
Синонимом кода, состоящего из костылей чуть более, чем полностью, является индусский код.
ох уж мне эта 1С...
80 Cube
 
28.05.12
13:12
(78) В нашем примере происходит добавление функциональности, которое не требует редизайна системы, поэтому под статью "Костыль" наш пример не попадает, за отсутствием состава преступления))
81 Cube
 
28.05.12
13:13
(79) А откуда вообще пошла байка, что 1С разрабатываю индусы?))
82 Cube
 
28.05.12
13:14
+(81) Имею ввиду платформу.
83 SoulPower
 
28.05.12
13:22
(77)

1)Мы отказываемся от автоматической обработки нажатия на эту кнопку и пишем свою процедуру.

2)Мы не отказываемся и ничего не пишем. Пользуемся стандартным механизмом.

Так что это скорее не костыль, а  http://lurkmore.to/Изобретать_велосипед
84 Любопытная
 
28.05.12
13:26
(77) Это одинаково в том случае, если мы не будем прятать стандартную кнопку. А если прячем, тогда уже не одинаково
85 Wobland
 
28.05.12
13:26
чуствую, будет сотня...
(81) байку не слыхал
86 Cube
 
28.05.12
13:33
(83) "Мы не отказываемся и ничего не пишем. Пользуемся стандартным механизмом."
То есть, ты утверждаешь, что после строки "СтандартнаяОбработка = Ложь;" у тебя отрабатывает стандартный механизм? вот это новости... А попоробуй-ка эту строку убрать и удивишься... :)
87 Cube
 
28.05.12
13:34
(84) А я её не прячу никуда, я просто переназначаю у неё процедуру... Кнопка на месте.
88 Wobland
 
28.05.12
13:35
(87) у стандартной кнопки переназначаешь обработчик?
89 Cube
 
28.05.12
13:38
(88) Угу. А чем она от других кнопок отличается? Обычная кнопка...
90 Wobland
 
28.05.12
13:42
(89) свойствов нету у неё. http://dl.dropbox.com/u/64196148/20120528_164241.jpg
91 Cube
 
28.05.12
13:45
(90) Так это в УФ, я то в обычных формах процедуру у неё заменял))
92 Wobland
 
28.05.12
13:47
93 Cube
 
28.05.12
13:47
(92) Свойство "Действие".
94 Wobland
 
28.05.12
13:48
(93) от я чукча, ни разу не догадался там руками что-то прописать ;)
95 Cube
 
28.05.12
13:50
(94) :) Ниче-ниче. Вот выйдет 8.3, там ещё что-нибудь новенького придумают))
96 SoulPower
 
28.05.12
13:55
(86) Причем тут "СтандартнаяОбработка = Ложь;"?
Что ты приплетаешь абсолютно несвязные вещи. Ты убрал стандартную кнопку и прописал её действие заново. Хотя мог обработать стандартное событие ПриКомпоновкеРезультата().
Это по-твоему аналог, того что ты в стандартном обработчике пишешь "СтандартнаяОбработка = Ложь;"?
Ты кнопку лишнюю кнопку зачем-то нарисовал. По-моему это велосипед.
97 Cube
 
28.05.12
13:59
(96) Вот именно: "убрал стандартную кнопку и прописал её действие заново" против "отказался от стандартной обработки процедуры и прописал её действие заново".
Что там мы отказываемся от стандартной обработки, что здесь - одно и то же.
98 SoulPower
 
28.05.12
14:01
(97) Если для тебя одно и тоже, то ок. Не вижу смысла спорить, рисуй дальше свои кнопки.
99 Cube
 
28.05.12
14:03
(98) ну, если ты закрыл газа и считаешь, что если ты никого не видишь, значит никого нет, то да, спорить с тобой смысла тоже не вижу...
100 Cube
 
28.05.12
14:04
Сотка!!!
101 SoulPower
 
28.05.12
14:04
(100) читерская сотка, кстати.
102 SoulPower
 
28.05.12
14:06
(99) Ты не видишь разницы в реализации своей кнопки и её отсутствием. При том что остальной алгоритм пишется одинаково. Донести до тебя это не получилось. И аналогии у тебя не правильные.
103 Wobland
 
28.05.12
14:07
Ты убрал стандартную кнопку и прописал её действие заново
...
Это по-твоему аналог, того что ты в стандартном обработчике пишешь "СтандартнаяОбработка = Ложь;"?

имхо да. только в первом случае речь об элементах формы, а во втором - о коде.
104 Cube
 
28.05.12
14:07
(101) Наглая ложь и клевета! Я честно сотку отработал! :D
105 Cube
 
28.05.12
14:09
(102) Если бы стандартную процедуру кнопки можно было в коде описать и написать там "СтандартнаяОбработка = Ложь;", то так бы и делал. Такого разработчики не предусмотрели, поэтому считаю, что замена процедуры у кнопки и есть та самая "СтандартнаяОбработка = Ложь;".
106 SoulPower
 
28.05.12
14:11
(105) Разработчики зато предусмотрели ПриКомпоновкеРезультата()
107 Cube
 
28.05.12
14:18
(106) Но и там и там ты пишешь абсолютно один и тот же код. Просто в первом варианте у тебя этот код работает только когда пользователь жмет на кнопку, но не работает при программном формировании отчета (то есть ты рулишь процессом всегда), а во втором случае у тебя этот код работает всегда и когда пользователь жмет на кнопку и при программном формировании отчета (то есть ты уже не рулишь этим процессом). А для каких задач какой способ использовать - это уже от задачи зависит.
108 Cube
 
28.05.12
14:20
Всё, рабочий день кончается, больше отвечать сегодня не смогу.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.