"Меньше копипаста!", или как Вася универсальную процедуру писал

0. SeiOkami 1580 04.07.19 10:00 Сейчас в теме
Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

Перейти к публикации

Лучшие комментарии
8. SeiOkami 1580 04.07.19 11:04 Сейчас в теме
Кстати, забыл добавить.
Программист Вася - это кот.
Не спрашивайте почему. Просто так вышло.
user986734; brr; v_den_v; an35@mail.ru; zakiap; Jimbo; Tangram; PRESTRus; shaportoval; chebser; DoctorRoza; waol; Andreeei; user1067792; dock; torbeev; MikeI; nicxxx; denmax; О.Ж; wowik; Nelli_A86; botokash; Teut_Vlad; acanta; +25 1 Ответить
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. leosoft 147 04.07.19 10:10 Сейчас в теме
2. Поручик 4428 04.07.19 10:12 Сейчас в теме
У меня есть что-то подобное. Я тоже люблю универсальные методы, выношу их в отдельные модули, стараюсь улучшать всё вокруг в разумных пределах.. Что в этом плохого?
brr; YPermitin; acanta; pavlov_dv; DenisCh; +5 Ответить
3. SeiOkami 1580 04.07.19 10:14 Сейчас в теме
Что в этом плохого?

(2) ничего плохого, сам их люблю и практикую. В принципе, об этом и статья )
Jimbo; YPermitin; acanta; +3 Ответить
41. Crazy_Max 63 05.07.19 13:11 Сейчас в теме
(2)Возможно, в этом и заключается смысл жизни, между прочим.
Причём, не только человеческой жизни, а и вообще феномена под названием "жизнь"...
4. SlavaKron 04.07.19 10:33 Сейчас в теме
Иногда, при использовании таблицы значений в качестве внешних наборов данных, требуется формировать ее с учетом отборов из НастройкиКомпоновки. Как бы Вася решил эту задачу?
romankoav; +1 Ответить
5. DoctorRoza 04.07.19 10:35 Сейчас в теме
Подобных участков кода можно много привести. И, как вариант, добавлять их в свой шаблон и вызывать по комбинации клавиш. Хорошая статья
6. genayo 04.07.19 10:55 Сейчас в теме
Хороший пример. Поделитесь с общественностью всей своей библиотекой полезностей :))
romankoav; RFP; json; CyberCerber; +4 Ответить
7. acanta 04.07.19 11:02 Сейчас в теме
Вариант с Леней Голубковым как то привычнее.
8. SeiOkami 1580 04.07.19 11:04 Сейчас в теме
Кстати, забыл добавить.
Программист Вася - это кот.
Не спрашивайте почему. Просто так вышло.
user986734; brr; v_den_v; an35@mail.ru; zakiap; Jimbo; Tangram; PRESTRus; shaportoval; chebser; DoctorRoza; waol; Andreeei; user1067792; dock; torbeev; MikeI; nicxxx; denmax; О.Ж; wowik; Nelli_A86; botokash; Teut_Vlad; acanta; +25 1 Ответить
10. Teut_Vlad 04.07.19 11:19 Сейчас в теме
(8)
klaus38; Maxx2008; IVVoronov; donkey; Crazy_Max; DoctorRoza; bulpi; dock; CnupT; SirAlexIT; AlenaR; Marliiin; t.v.s.; wowik; CyberCerber; nporrep; +16 Ответить
9. herfis 372 04.07.19 11:14 Сейчас в теме
А потом приходит Петя. Ему нужно доработать отчет.
Он открывает его и видит вызов нескольких универсальных процедур с тонной возможных параметров. Он начинает погружаться в дебри реализации, пытаясь понять, сможет ли он красиво вклиниться в эту чудесную, красивую и стройную архитектуру, подкупающую своей универсальностью.
Через час он понимает, что из всех предусмотренных этим чудесным швейцарским ножом на тысячи строк кода возможностей, в этом конкретном отчете используется от силы процента три. И они бы уложились в двадцать строк простого, понятного но шаблонного кода, куда бы он без труда смог бы начать добавлять требуемую функциональность уже через секунду после открытия незнакомого ему отчета.
Увы, в итоге он осознает что несколько нужных ему опций в прекрасной подсистеме не предусмотрено. Что же делать? Петя "правильный" программист, и старается выбирать "правильные" пути, а не "простые". Спустя еще час напряженной работы мозга, Петю озаряет как правильно нужно доработать подсистему, чтобы она красиво покрыла его кейсы (а заодно и десяток смежных!). Он добавляет новые опции в подсистему, расширяя ее функциональность и тщательно их документирует. Петя счастлив - он всегда выступал против "велосипедов" и всегда готов поддержать единомышленников. Ведь всем известно, что копипаст - это зло.
Теперь Антон, которому предстоит дорабатывать этот отчет, сможет сделать свою работу еще быстрее и качественнее.
Возможно, в процессе он даже напишет удобный DSL, который выведет универсальность подсистемы на невиданный ранее уровень.
Irwin; Merkalov; memb3r; logarifm; rmIvanT; krukoleg@mail.ru; maldinitaly; fvadim; user774630; astrallight; it_tungus; link_l; estima-1c; bulpi; dock; boln; SirAlexIT; sansys; ids79; Jeka44; qwinter; Xatori111; PowerBoy; lmnlmn; wowik; acanta; CyberCerber; AntonSm; +28 Ответить
21. genayo 04.07.19 12:23 Сейчас в теме
(9) Тут ведь главное - вовремя остановиться :))
23. herfis 372 04.07.19 12:35 Сейчас в теме
(21) Не совсем так. Иногда не стоит и начинать. Когда берется простой, понятный код небольшого размера и "универсализируется" за счет покрытия большого количества кейсов его использования - это как раз тот случай, когда вреда больше чем пользы. ИМХО, конечно.
memb3r; krukoleg@mail.ru; Бубузяка; it_tungus; bulpi; boln; FreeArcher; Krio2; RFP; ids79; qwinter; json; ZOMI; acanta; +14 Ответить
25. acanta 04.07.19 12:39 Сейчас в теме
(23) точно. Пишите на ассемблере. Он для каждого производителя компьютеров и для каждой модели свой.
Нафих кто-то си придумал..
И тем самым прекратил появление новых производителей компьютеров во всем мире и закрытие производства и ликвидацию разработок в бывшем СССР в том числе?
krukoleg@mail.ru; SeiOkami; +2 1 Ответить
26. herfis 372 04.07.19 13:05 Сейчас в теме
(25) Не очень понял комментарий. Типа я против добавления новых абстракций, облегчающих разработку? Вовсе нет. Я хотел сказать, что хорошая абстракция должна быть "глубокая", а не "широкая". Чем абстракция "уже" и "глубже" - тем сильнее она помогает и тем легче с ней работать. Польза "широкой" и "неглубокой" абстракции - минимальна. Вплоть до вреда. Да, экономим несколько строчек кода. Но за счет чего? Не за счет того, что мы инкапсулировали сложную реализацию. А за счет того, что мы засунули несколько вариантов реализации в один пакет и прилепили сверху выбор "программы". Завтра список "программ" захочется расширить еще больше, а послезавтра этим никто не захочет пользоваться, потому что быстрее написать эти несчастные несколько строчек, чем оживлять в мозгу эту неудобную абстракцию.
Irwin; Bazil; memb3r; bulpi; dock; user701287_darkowntheworld; Krio2; RFP; +8 Ответить
27. acanta 04.07.19 13:07 Сейчас в теме
(26) вооо́оо́т. Между завтра и послезавтра вполне может пройти несколько десятков лет.
И на что Вася будет жить все это время?
33. qwinter 624 04.07.19 15:59 Сейчас в теме
(25) А при чем тут ассемблер?
28. genayo 04.07.19 13:20 Сейчас в теме
(23) Ну в этом конкретном случае вроде как раз вовремя :) Хотя как по мне, я бы эту процедуру разбил на более мелкие, но это уже вкусовщина в общем :))
32. palsergeich 04.07.19 14:46 Сейчас в теме
(9) В итоге получается БСП на обслуживание которой через пару лет придется выделить отдел, потому что в 1с что то поменяли и все сломалось
Chai Nic; Lazy_Stranger; krukoleg@mail.ru; boln; the1; +5 Ответить
37. boln 1024 05.07.19 08:09 Сейчас в теме
(9) Ну да. Принцип программиста: LOW COUPLING, HIGH COHESION. А принцип (идеал) одинэсника: одна процедура для всего-всего-всего.
:)))
11. user705698_bursev 04.07.19 11:33 Сейчас в теме
Мне кажется, или в пятом пункте ошибка?

Если мы в качестве параметра НастройкиКомпоновки будем передавать сами настройки компоновки, то переменная ВыполняемыеНастройки будет Неопределено, и соответственно возврат. Думаю, нужно учесть тип данных НастройкиКомпоновкиДанных.
14. SeiOkami 1580 04.07.19 11:36 Сейчас в теме
(11)
в качестве параметра НастройкиКомпоновки будем передавать сами настройки компоновки, то переменная ВыполняемыеНастройки будет Неопределено, и соответственно возврат. Думаю, нужно учесть тип данных НастройкиКомпоновкиДанных.

Большое спасибо, глаз замылился и не заметил косяка. Изначально хотел добавить в статью пункт про "Тестирование", в котором Вася нашёл свой косяк. А потом убрал его, а поправить процедуру забыл) Поправим-с
40. boln 1024 05.07.19 10:57 Сейчас в теме
(11)
Мне кажется, или в пятом пункте ошибка?
Только прожившие полжизни в СССР способны оценить смысл этой фразы :)))
krukoleg@mail.ru; +1 Ответить
12. Synoecium 699 04.07.19 11:34 Сейчас в теме
пока читал, почему-то думал, что Вася в конце сравнит вызов своей процедуры и типовую обвязку для СКД и поймет, что это примерно одно и тоже, только теперь новому программисту ещё придется разбираться с мыслями автора, чтобы вызвать Васину процедуру.
Я не против универсальных процедур, просто всегда стоит задавать вопрос, надо ли городить огород в конкретном случае.
krukoleg@mail.ru; CyberCerber; +2 Ответить
13. shalimski 6 04.07.19 11:34 Сейчас в теме
Параметр НастройкиКомпоновки не поддерживает передачу типа НастройкиКомпоновкиДанных - баг.
krukoleg@mail.ru; +1 Ответить
18. SeiOkami 1580 04.07.19 11:47 Сейчас в теме
15. CyberCerber 621 04.07.19 11:43 Сейчас в теме
Все ждал в конце подвоха, что в конце будет разоблачение Васи, к каким печальным последствиям это привело, но нет... :-)
Еще писали такие универсальные методы?
krukoleg@mail.ru; AllexSoft; boln; +3 Ответить
16. CyberCerber 621 04.07.19 11:44 Сейчас в теме
Получилось решить вопрос с версиями платформы, когда параметры методов зависят от конкретной версии?
19. SeiOkami 1580 04.07.19 11:49 Сейчас в теме
(16) изучаю тему. Думаю собрать все возможные варианты и описать в статье. И сравнить с тем, как это делают в других языках.
17. CyberCerber 621 04.07.19 11:46 Сейчас в теме
И если уж соблюдать все стандартны и правила разработки, то в получившемся методе слишком много параметров. Кажется, максимум 5 допускается. Иначе нужно объединять в структуры. Я сам для себя еще не решил, было бы мне это удобнее, но стандарт говорит так.
20. YPermitin 9697 04.07.19 11:59 Сейчас в теме
22. acanta 04.07.19 12:32 Сейчас в теме
Это похоже на холивар по поводу использования БСП и функций общих модулей в доработках.
И по поводу замков на объектах метаданных типовых конфигураций.
29. herfis 372 04.07.19 13:24 Сейчас в теме
Да, забыл добавить. Я не против непосредственно авторской процедуры. Она вполне себе нормальная. Хоть я ее использовать и не буду. Но это вкусовщина уже. У меня есть что-то подобное, выполняющее простую компоновку в табличный документ, но для специальных задач. В простых отчетах я ничего такого не использую.
Если бы я увидел эту процедуру как готовую в качестве просто "вот такие инструменты я использую" - ну, норм, чо...
Меня зацепил именно не очень удачный выбор ее в качестве иллюстрации к процессу создания новых абстракций, потому что описанный путь может очень легко увести несколько не туда :) "ДополнительныеПараметры" в этой процедуре еще в рамках, но уже на грани. И имеют большой потенциал, методика реализации которого излагается в статье :)
30. denmax 239 04.07.19 13:41 Сейчас в теме
У вас в коде копипаста? Значит у вас есть проблема! Для решения проблемы добавили универсальный метод? Теперь у вас две проблемы!
Merkalov; memb3r; krukoleg@mail.ru; bulpi; boln; acanta; +6 Ответить
31. cuztam 04.07.19 13:49 Сейчас в теме
Отлично, жду новых похождений кота Василия по миру 1С
SeiOkami; acanta; +2 Ответить
34. qwinter 624 04.07.19 17:12 Сейчас в теме
Неправильные аксиомы = неправильные решения = неправильные события.
krukoleg@mail.ru; boln; +2 Ответить
35. riposte 303 04.07.19 18:32 Сейчас в теме
Существует 15 шаблонов для копипасты кода программного вывода отчета на СКД.
Так нельзя! Нужно универсальную функцию! Рррряя!
Существует 16 шаблонов для копипасты кода программного вывода отчета на СКД.

Шутка. Лойс за многофункциональные комбайны с трехтомником инструкций и поллитрой в комплекте.
CyberCerber; boln; +2 Ответить
36. muskul 05.07.19 05:18 Сейчас в теме
Походу такие васи типовые конфигурации и пишут. В результате при простом поиске где же заполняняется Фамилия ипэшника в УПД открывается 10 модулей в которые прыгаешь туда сюда. куча временных менеджеров запросов из которых толком не выделить блок получения ответсвенных лиц и посмотреть что же его не устраивает.
Slypower; MulderCelica; XACHAPURIN; memb3r; AurumFlare; ids79; Lazy_Stranger; krukoleg@mail.ru; asg.aleks; CoolSpawn; itozersk; 1cdevelopment; Pryanishnikov_Vladimir; Crazy_Max; CyberCerber; СаморезикРу; the1; bulpi; boln; user701287_darkowntheworld; +20 Ответить
38. CnupT 57 05.07.19 08:27 Сейчас в теме
(36) это как в детстве было "ставь лайк, если любишь маму", теперь "ставь плюсик, если тоже задрался искать где формируется ФИО ИПшника" :)
46. ids79 5726 14.07.19 07:59 Сейчас в теме
(36)А еще любят методы платформы в свои оборачивать. Например СообщениеПользователю. Зачем? Мне не понятно.
Проще от этого не становится. Вместо того, чтобы методы платформы изучать,
приходится изучать методы БСП, которые не сильно проще. А если не подходит этот метод, по какой-то причине, то приходится все равно дополнительно разбираться с методами платформы.
Написать 6 строк кода, если знать, что пишешь - минута времени.
Зато хоть понимаешь, ЧТО ты пишешь. И, если нужно сделать что-то не совсем стандартное, делаешь это быстро. А Вася то забудет через пару месяцев как отчет программно формируется, и зависнет, если метод его не подойдет по какой-то причине.

Но пусть Вася на меня не обижается, это просто мое мнение, а статья очень веселая и позитивная.
Chai Nic; +1 Ответить
39. zqzq 21 05.07.19 10:42 Сейчас в теме
Давно уже использую подобную процедуру для СКД. Очень удобно. Нет этого низкоуровнего мусора от 1С (по формированию СКД) в основных модулях.
42. AllexSoft 05.07.19 13:52 Сейчас в теме
В данной функции параметр НастройкиКомпоновки надо бы по умолчанию Неопределено сделать, а что если мне нужно с настройками компоновки по умолчанию сформировать схему? Зачем мне инициализировать компановщик где то и передавать его процедуре.. недоработка в общем )
Имею аналогичную функцию, только параметров побольше, и универсальности то же) из нужного: можно передавать параметры и отборы в виде структуры, и не париться с НастройкамиКомпановки, ну и отладка, можно возвращать результирующие запросы (скомпанованные СКД) для целей отладки
43. SeiOkami 1580 05.07.19 14:37 Сейчас в теме
(42) СкомпоноватьРезультатОтчета(Результат, СКД, СКД.НастройкиПоУмолчанию);
44. AllexSoft 05.07.19 15:04 Сейчас в теме
(43) как вариант должно прокатить
45. jekichan 12.07.19 11:22 Сейчас в теме
Спасибо, интересно. Ждем следующих новелл
47. skv_79 214 02.08.19 14:59 Сейчас в теме
Хороший пример того, как нужно писать универсальные процедуры.
48. awk 718 04.09.19 12:05 Сейчас в теме
А я бы переписал этот кусок:

    //Определяем тип генератора
    Если ТипЗнч(Результат) = Тип("ТаблицаЗначений") ИЛИ ТипЗнч(Результат) = Тип("ДеревоЗначений") Тогда
        ВыводВКоллекциюЗначений = Истина;
        ТипГенератораВывода     = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
    Иначе
        ВыводВКоллекциюЗначений = Ложь;
        ТипГенератораВывода     = Тип("ГенераторМакетаКомпоновкиДанных");
    КонецЕсли;
Показать

Как:
    //Определяем тип генератора
    ВыводВКоллекциюЗначений = Ложь;
    ТипГенератораВывода     = Тип("ГенераторМакетаКомпоновкиДанных");

    Если Результат = Неопределено Тогда
        Результат = Новый ТабличныйДокумент;
    ИначеЕсли ТипЗнч(Результат) <> Тип("ТабличныйДокумент") Тогда
        ВыводВКоллекциюЗначений = Истина;
        ТипГенератораВывода     = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
    КонецЕсли;
Показать
49. herfis 372 06.09.19 09:52 Сейчас в теме
(48) Теорема Эскобара, как по мне. Я бы переделал процедуру на функцию, а требуемый тип результата вынес в необязательные параметры.
50. DoctorRoza 25.10.19 13:51 Сейчас в теме
Понял, я понял, где тут ошибка. В начале речь идет о Васе, а уже в конце нужно писать об Василии Ивановиче! ))
51. logarifm 1080 12.05.20 10:07 Сейчас в теме
А еще здесь не хватает программного создания саомй схемы компоновки данных. То-есть посмотреть если ТипПараметра СхемаКомпоновки = Неопределенно следовательно вызвать инициализацию создания самой схемы компоновки.
Оставьте свое сообщение
Вопросы с вознаграждением