Имя: Пароль:
1C
1С v8
Оцените красоту кода / пятничное.
🠗 (Волшебник 22.04.2016 13:34)
0 Feunoir
 
22.04.16
11:52
1. Это божественно! 60% (6)
2. Это больше, чем божественно! 40% (4)
Всего мнений: 10

Выношу на всеобщее обсуждение красоту и утончённость кода. Писал сотрудник франчайзи.


Процедура ЗаписьОбИстеченииСрокаДокументаТС() Экспорт
    
    ПравоНастройка = ПланыВидовХарактеристик.уатПраваИНастройки.ДниДоОкончанияДействияДокументовТС;    
    СписокПользователей = Новый Массив;
        
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Пользователи.Ссылка
        |ИЗ
        |    Справочник.Пользователи КАК Пользователи";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий()Цикл
         СписокПользователей.Добавить(Выборка.Ссылка);
    КонецЦикла;
    
    СписокДиспетчеров = ОтобратьДиспетчеровПоОрганизации(СписокПользователей);    
    
    ЗапросНастроек = Новый Запрос;
        ЗапросНастроек.Текст =
                     "ВЫБРАТЬ
                     |    уатПраваИНастройки.Объект,
                     |    уатПраваИНастройки.ПравоНастройка,
                     |    уатПраваИНастройки.Значение
                     |ИЗ
                     |    РегистрСведений.уатПраваИНастройки КАК уатПраваИНастройки
                     |ГДЕ
                     |    уатПраваИНастройки.ПравоНастройка = &ПравоНастройка";
                                         
        ЗапросНастроек.УстановитьПараметр("ПравоНастройка", ПравоНастройка);
        ТаблНастроек = ЗапросНастроек.Выполнить().Выгрузить();
                 
    ЗапросОрганизаций = Новый Запрос;
        ЗапросОрганизаций.Текст =
                    "ВЫБРАТЬ
                    |    Организации.Ссылка
                    |ИЗ
                    |    Справочник.Организации КАК Организации";
    ТаблОрганизаций = ЗапросОрганизаций.Выполнить().Выгрузить();
            Для Каждого СтрокаОрганизаций Из ТаблОрганизаций Цикл
                
                Организация = СтрокаОрганизаций.Ссылка;
                
                Для Каждого СтрокаНастроек из ТаблНастроек Цикл
                    Если Организация = СтрокаНастроек.Объект Тогда
                        ДатаОкончания = ТекущаяДата() + СтрокаНастроек.Значение * 86400;
                    КонецЕсли;
                КонецЦикла;
                
                ЗапросДокументов = Новый Запрос;
                    ЗапросДокументов.Текст =
                        "ВЫБРАТЬ
                        |    уатДокументыТС.ВидДокумента,
                        |    уатДокументыТС.Номер,
                        |    уатДокументыТС.ТС,
                        |    уатДокументыТС.ДатаОкончания,
                        |    уатДокументыТС.ТС.Организация
                        |ИЗ
                        |    РегистрСведений.уатДокументыТС КАК уатДокументыТС
                        |ГДЕ
                        |    уатДокументыТС.ДатаОкончания <= &ДатаОкончания";
                    
                    ЗапросДокументов.УстановитьПараметр("ДатаОкончания", ДатаОкончания);    
                    ТаблДокументов = ЗапросДокументов.Выполнить().Выгрузить();
                                        
                    Для Каждого Диспетчер из СписокДиспетчеров Цикл
                        Индекс = 0;
                        
                    ЗапросГруппы = Новый Запрос;
                        ЗапросГруппы.Текст =  
                                    "ВЫБРАТЬ
                                    |    ГруппыПользователей.Ссылка
                                    |ИЗ
                                    |    Справочник.ГруппыПользователей КАК ГруппыПользователей";
                        Группы = ЗапросГруппы.Выполнить().Выгрузить();
                        МассивГрупп = Новый Массив;
                        Для каждого СтрокаГруппы из Группы Цикл
                                
                                Для каждого Стр из СтрокаГруппы.Ссылка.Состав Цикл
                                Если Стр.Пользователь = Диспетчер Тогда
                                    МассивГрупп.Добавить(СтрокаГруппы);
                                КонецЕсли;
                            КонецЦикла;    
                                
                        КонецЦикла;
                            
                        //Выбираем записи из регистра с группами в которые входит выбранный пользователь
                        ЗапросДоступа = Новый Запрос;
                        ЗапросДоступа.Текст =        
                                    "ВЫБРАТЬ
                                    |    ордс_НастройкаПравДоступаПользователей.ОбъектДоступа
                                       |ИЗ
                                    |    РегистрСведений.ордс_НастройкаПравДоступаПользователей КАК ордс_НастройкаПравДоступаПользователей
                                    |ГДЕ
                                    |    ордс_НастройкаПравДоступаПользователей.Пользователь В (&МассивГрупп)";
                              
                        ЗапросДоступа.УстановитьПараметр("МассивГрупп", МассивГрупп);
                        РезультатДоступа = ЗапросДоступа.Выполнить().Выгрузить();                            
                        МассивДоступа = Новый Массив;
                        Для Каждого СтрокаДоступа Из РезультатДоступа Цикл
                            МассивДоступа.Добавить(СтрокаДоступа.ОбъектДоступа);
                        КонецЦикла;
                        
                        Для Каждого СтрокаДокументов Из ТаблДокументов Цикл
                            Для Каждого ЭлементДоступа Из МассивДоступа Цикл
                                Если ЭлементДоступа = СтрокаДокументов.ТС.Организация И
                                Организация = СтрокаДокументов.ТС.Организация Тогда
                                МенеджерЗаписи = РегистрыСведений.НапоминанияПользователя.СоздатьМенеджерЗаписи();
                                МенеджерЗаписи.Пользователь = Диспетчер;
                                МенеджерЗаписи.ВремяСобытия = ТекущаяДата() + Индекс;
                                МенеджерЗаписи.СрокНапоминания = ТекущаяДата() + Индекс;
                                МенеджерЗаписи.Описание = "Внимание! " + Строка(СтрокаДокументов.ДатаОкончания) +
                                    " Истекает срок документа " + Строка(СтрокаДокументов.ВидДокумента) +  
                                    " № " + Строка(СтрокаДокументов.Номер) +
                                    " ТС " + Строка(СтрокаДокументов.ТС);
                                МенеджерЗаписи.Записать();
                                Индекс = Индекс + 1;
                            КонецЕсли;
                        КонецЦикла;
                    КонецЦикла;
                КонецЦикла;
            КонецЦикла;
    
КонецПроцедуры    
1 Fragster
 
гуру
22.04.16
11:53
2 Маратыч
 
22.04.16
11:54
Ичоичо. Обычный го#нокод.
3 Feunoir
 
22.04.16
11:54
У меня самого нет слов, чтобы описать своё восхищение в тот момент, когда я его читаю.

Это божественно!
4 Fragster
 
гуру
22.04.16
11:55
(0) попросите вернуть деньги за нарушение http://its.1c.ru/db/v8std
5 Feunoir
 
22.04.16
11:55
(1) Там регистрироваться надо - лень.
6 Господин ПЖ
 
22.04.16
11:55
я запрос в цикле где-то и в типовом коде упп видел
7 Timon1405
 
22.04.16
11:56
(5) за вами уже выехали
8 zak555
 
22.04.16
11:56
(4) что за нарушение ?
9 Feunoir
 
22.04.16
11:57
(4) Не-е-е. Во-первых, там копейки. А во-вторых после этого у меня не будет морального права говорить им что они генерят го$но в огромных количествах.
10 asady
 
22.04.16
11:57
(0) подумаешь - запрос в цикле - да в типовых этого тоже немало есть - ну и чо?
11 zak555
 
22.04.16
11:57
(0) перепиши код на один запрос и загрузку его в МенеджерЗаписи
12 Mort
 
22.04.16
11:58
Пф.. Видали и не такое.
13 Cyberhawk
 
22.04.16
11:59
В трех словах, что плохого в коде? Бегло посмотрел, поиска по кодам и наименованиям не увидел, значит уже хорошо
14 Timon1405
 
22.04.16
11:59
Если код работает за время, которое устраивает заказчика, делает то, что нужно заказчику, и бабло, оплаченное за разработку устроило заказчика, что в чем вообще проблема?
где вариант КГ/АМ?
15 Fish
 
22.04.16
12:01
Для франча вполне нормально.
16 Mort
 
22.04.16
12:02
(14) Этим отличаются настоящие программисты - фанатики от проходимцев в профессии.
17 Mort
 
22.04.16
12:04
(13) Запрос не просто в цикле, а в цикле в цикле.
18 Timon1405
 
22.04.16
12:05
чем этим:осознанием своей акуенности?
чувак копирнул откуда-то/набросал за часок код, выставил 5 часов, срубил бабла, свалил.
попутно подкинул братишке работу по оптимизации своего кода и возможность пообсуждать код на мисте. все в плюсах
19 Heckfy
 
22.04.16
12:06
Ни асилил :(

Это божественно!
20 zva
 
22.04.16
12:13
Работает - не трожь!!!
Хотя нужно взять на заметку креативчик в цикле:
МенеджерЗаписи.ВремяСобытия = ТекущаяДата() + Индекс;
Индекс = Индекс + 1;
21 Serg_1960
 
22.04.16
12:13
Не франч, поэтому и не осилил :)
22 Mort
 
22.04.16
12:17
(18) Хирурги убивающие пациентов на ровном месте и стоматологи рвущие здоровые зубы нас почему-то возмущают, а те же самые бездари в программировании как-то не очень.
И вправду, программирование есть последнее прибежище идиотов.
23 aleks_default
 
22.04.16
12:18
(20) На трех документах и двух пользователях может и работает, а если их будет больше? На ночь оставлять?
24 cons74
 
22.04.16
12:20
Обычный индусский код (в части раздувания оного).
А вы так и пишИте обработку за 15 минут вместо 2 часов. Парень скоро мульонером станет %-)

Это божественно!
25 Timon1405
 
22.04.16
12:20
хирург учится зашивать на апельсинах/манекенах, а программист франча (так уж вышло исторически) на клиентах.
26 Масянька
 
22.04.16
12:22
(22) Действительно, пятнично...
Люди, обслуживающие программу, в которой после обновления (кстати, не бесплатного) вылезает куча ошибок, ратуют за "чистоту профессии"...
Пятница...
27 Мэс33
 
22.04.16
12:22
А мне конец понравился:

                            КонецЕсли;
                        КонецЦикла;
                    КонецЦикла;
                КонецЦикла;
            КонецЦикла;
КонецПроцедуры
28 Джинн
 
22.04.16
12:23
Да нормально все! Чего докопались?

Я бы еще запросов добавил с пяток и пару-тройку циклов.
29 Маратыч
 
22.04.16
12:23
(26) Бгг, а что, надо преумножать гомнокод и ошибки? :)
30 Мэс33
 
22.04.16
12:24
"Надо больше концов циклов" (с)
                                                КонецЦикла;
                                            КонецЦикла;
                                        КонецЦикла;
                                    КонецЦикла;
                                КонецЦикла;
                            КонецЦикла;
                        КонецЦикла;
                    КонецЦикла;
                КонецЦикла;
            КонецЦикла;
КонецПроцедуры
31 Локи-13
 
22.04.16
12:25
(30) это пять!

Это божественно!
32 Мэс33
 
22.04.16
12:26
Говорят, кто-то так закончил свой опус:

                                                ЗафиксироватьТранзакцию;
                                            ЗафиксироватьТранзакцию;
                                        ЗафиксироватьТранзакцию;
                                    ЗафиксироватьТранзакцию;
                                ЗафиксироватьТранзакцию;
                            ЗафиксироватьТранзакцию;
                        ЗафиксироватьТранзакцию;
                    ЗафиксироватьТранзакцию;
                ЗафиксироватьТранзакцию;
            ЗафиксироватьТранзакцию;
КонецПроцедуры
33 sitex
 
naïve
22.04.16
12:29
Жесть !

Это божественно!
34 Serg_1960
 
22.04.16
12:29
Поделюсь своим украшением коллекции. Это алмаз божественной красоты достался мне от коллектива группы внедрения. Озвучу только часть алгоритма из печатной формы документа (там их много):

Функция Печать() Экспорт
...
    Если   ЗначениеЗаполнено(КонтактноеЛицо) Тогда
            УважаемыйФИО = "Уважаемый  "+ СТРОКА(КонтактноеЛицо);
            ДолжностьУважаемого = СТРОКА(КонтактноеЛицо.Должность)+ Символы.ПС
            + СТРОКА(КонтактноеЛицо);
    Иначе
            УважаемыйФИО = "Уважаемый  ";
            ДолжностьУважаемого = "";
    КонецЕсли;
        

    ОбластьМакета = Макет.ПолучитьОбласть("ОбращениеУважаемый");
        Если ВвестиСтроку(УважаемыйФИО,"ФИО у  контактного лица (в Дат.Пад.  - КОМУ)",  0, Истина) Тогда
            // запомнить текст напоминания
        КонецЕсли;
    ОбластьМакета.Параметры.Текст = УважаемыйФИО;
    
        Если ВвестиСтроку(ДолжностьУважаемого,"Уточните должность у  контактного лица(в Дат.Пад.  - КОМУ)",  0, Истина) Тогда
            // запомнить текст напоминания
        КонецЕсли;
        
        
    ОбластьМакета.Параметры.ДолжностьУважаемого = ДолжностьУважаемого;
...
35 Господин ПЖ
 
22.04.16
12:30
goto не хватает
36 Господин ПЖ
 
22.04.16
12:31
(34) розница?

что желаем, уважаемый? прямо как на рынке
37 Feunoir
 
22.04.16
12:31
(11) Г-но вопрос:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ордс_НастройкаПравДоступаПользователей.ОбъектДоступа КАК ОбъектДоступа,
    ГруппыПользователейСостав.Пользователь КАК Пользователь,
    ДокументыНаКонтроль.ТС КАК ТС,
    ДокументыНаКонтроль.ДатаОкончания КАК ДатаОкончания,
    ДокументыНаКонтроль.ВидДокумента КАК ВидДокумента,
    ДокументыНаКонтроль.Номер КАК Номер,
    ДокументыНаКонтроль.Серия КАК Серия
ИЗ
    РегистрСведений.ордс_НастройкаПравДоступаПользователей КАК ордс_НастройкаПравДоступаПользователей
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав
        ПО (ордс_НастройкаПравДоступаПользователей.Пользователь = ГруппыПользователейСостав.Ссылка)
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            уатДокументыТС.ТС.Организация КАК Организация,
            уатДокументыТС.ТС КАК ТС,
            уатДокументыТС.ДатаОкончания КАК ДатаОкончания,
            уатДокументыТС.ВидДокумента КАК ВидДокумента,
            уатДокументыТС.Номер КАК Номер,
            уатДокументыТС.Серия КАК Серия
        ИЗ
            РегистрСведений.уатДокументыТС КАК уатДокументыТС
        ГДЕ
            уатДокументыТС.ДатаОкончания <> ДАТАВРЕМЯ(1, 1, 1)
            И уатДокументыТС.ДатаОкончания < &ДатаОкончания
            И НЕ уатДокументыТС.Архив) КАК ДокументыНаКонтроль
        ПО (ордс_НастройкаПравДоступаПользователей.ОбъектДоступа = ДокументыНаКонтроль.Организация)
ГДЕ
    ордс_НастройкаПравДоступаПользователей.Запись
    И ГруппыПользователейСостав.Пользователь В (&СписокПользователей)


Сначала в СписокПользователей подобрать тех пользователей, кому надо выводить напоминания. К сожалению роли из запросов вроде как недоступны, так что придётся пробежать по списку пользователей ИБ. Потом единым циклом сразу выгружаешь. Хоть через менеджер записи, хоть через набор записей.
38 Serg_1960
 
22.04.16
12:32
(36) УПП :)
39 33554432
 
22.04.16
12:33
любой код можно лучше написать, если убить кучу времени. Но времени то нет, как правило. Либо результат, либо красота, приходится выбирать.
40 Маратыч
 
22.04.16
12:34
(39) Ну не до такой же степени. К тому же, умеючи хотя бы немного в запросы, написание сего поделия заняло бы гораздо меньше времени.
41 Serg_1960
 
22.04.16
12:37
Если я чешу в затылке -
          Не беда,
В голове моей опилки,
          Да-да-да!
Но хотя там и опилки,
Но кричалки, и вопилки,
А также шумилки,
Пыхтилки и сопилки...
Сочиняю я неплохо
          Иногда!
              Да!
42 Feunoir
 
22.04.16
12:38
(20) Ну как сказать, "работает"... Оно каждый день формирует новую запись напоминания для пользователя. Поэтому 10 дней, десять одинаковых напоминаний. Да ещё и не умеет учитывать бессрочные документы, да ещё и не понимает архивные документы. Я так то сначала только по сроку и по архиву хотел поправить. Но когда залез и увидел _ЭТО_, то понял что как настоящий русский программист должен всё полностью переписать.
43 Pro-tone
 
22.04.16
12:41
Был свидетелем, когда франь за добавление нового измерения в РН "Менеджер", плюс одна строчка кода в движении по нему
Движение.Менеджер = ПараметрыСеанса.ТекущийПользователь и добавлении его в типовой отчет по продажам взял 15000р за это творчество, работы на 3 минуты. А вы говорите в стране только во власти бардак...
44 Timon1405
 
22.04.16
12:43
короче, алгоритм ясен.
1. пишешь/находишь плохой код
2. исправляешь его
2а. можешь наоборот, сначала написать хороший код, а потом специально наделать запросов в цикле
3.(очень важный пункт) ждешь пятницы.(хороший код держишь наготове)
4. пятница- день икс, создаешь тему на мисте, вываливаешь плохой код, делаешь вброс про франча
5. ждешь предложений подтвердить что ты там ДАртаньян
6. твой выход, показываешь свой код
7. принимаешь поздравления/ахи-охи "с кем же приходится работать"
45 Alex S D
 
22.04.16
12:45
(43) какие еще 3 минуты.. надо провести анализ конфы на предмет ненаруешения логики
46 nordbox
 
22.04.16
12:47

Это больше, чем божественно!
47 33554432
 
22.04.16
12:49
предлагаю сделать на мисте рубрику - гвнокод. Гвнокодеры будут туда свои шедевры выкладывать, а все остальные их править.
48 lubitelxml
 
22.04.16
12:50
вот

Это больше, чем божественно!
49 фобка
 
22.04.16
12:52
(43) 3 минуты простукивания 100 рублей, знание где ударить 14900
50 manc88
 
22.04.16
12:58
7.7 стайл помоему

Это божественно!
51 ptiz
 
22.04.16
13:16
Нормальный код в (0). Вы, наверное, плохого кода не видели настоящего. Примеры того, в чем я копаюсь ежедневно:

1) Взрыв мозга
....
Массив.ЗначениеСкидкиНаценки = Рез.ЗначениеСкидкиНаценки;
    
всё потому, что перед этим:
Массив = Новый Структура;


2) Пара мелких

...
СтрЗаменить(Формат(ЧислоНадо, "ЧЦ=20; ЧДЦ=" + ЧислоЗнаковПослеЗапятой + "; ЧРГ=""_"""), "_", "")
...
УчитыватьМинСумму = Не Объект.ПолучитьФорму().ЭлементыФормы.БезУчетаМинимальныхСуммПоставщиков.Значение;
52 ejikbeznojek
 
22.04.16
13:26
Я вот часто что-то в этом роде вижу

Функция СформироватьПечатнуюФормуТест(МассивОбъектов, ОбъектыПечати)

УстановитьПривилегированныйРежим(Истина);

ТабличныйДокумент = Новый ТабличныйДокумент;

ТабличныйДокумент.АвтоМасштаб = Истина;

Если ПривилегированныйРежим() Тогда
  УстановитьПривилегированныйРежим(Ложь);
КонецЕсли;

Возврат ТабличныйДокумент;
КонецФункции
53 EvgeniuXP
 
22.04.16
13:31
(52) чукча не читатель, чукча писатель
54 la luna llena
 
22.04.16
13:31
(47) я б поучаствовала
55 1Снеговик
 
гуру
22.04.16
13:31
Если работает, какие претензии?

З.Ы. Я из франча :)

Это больше, чем божественно!
56 timurhv
 
22.04.16
13:36
(43) Работы 3 минуты, согласование внесения в рабочую конфигурацию, создание резервной копии, выставление счета на оплату...
Это из разряда сколько времени потребуется, чтобы внести 50 пользователей в БД по 10 филиалам? Работы на час, а найти контакты, обзвонить их всех, найти нужного человека, потом он 2 дня будет составлять список, потом внести их, разослать всем письма...
57 Starhan
 
22.04.16
13:38
(55)Я вот тоже не понимаю этих претензий чувак по любому либо в мыле делал, либо у него еще опыта не хватало, а его кинули на серьезное дело.

Вот если бы это был всеми уважаемый дядька про кодер, тогда понятно.

Это больше, чем божественно!
58 sonne666
 
22.04.16
13:40
У меня вот тоже хранится, от "программиста с 10летним стажем", 1с7:

СпрСклады = СоздатьОбъект("Справочник.МестаХранения");
СпрСклады.НайтиПоКоду("56"); // Основной склад
Склад = СпрСклады.ТекущийЭлемент();
        
СпрСклады.НайтиПоКоду("78"); // Вертуальный склад
Склад = СпрСклады.ТекущийЭлемент();

Если (Склад="56") и (Склад="78") Тогда
     СпрСклад = СоздатьОбъект("Справочник.МестаХранения");
     СпрСклад.НайтиПоКоду(Склад);
     ВыбСклад = СпрСклад.ТекущийЭлемент();
КонецЕсли;
59 фобка
 
22.04.16
13:50
(58) красиво. Но это код новичка
60 tixis
 
22.04.16
13:51
(58) Что за...х..ня
(15)Я хз про какие вы франчи, у нас во франче так не пишут. У нас наверное неправильный франч, мы работаем не по принципу срубить бабла и свалить от клиента.
61 tixis
 
22.04.16
13:53
+(60), А код из (0) только неопытный сотрудник так напишет, но за ним проверят и подскажут как исправить