Имя: Пароль:
1C
1С v8
Мозговой штурм в код-ревью
0 happysan
 
04.05.26
15:36
Всем доброго времени суток!
Прилагаю скрин: https://dropmefiles.com/uAjZc , на котором есть неоптимальный (некорректный) код. Попутно тоже буду приводить замечания по коду, но и буду благодарен полезным комментариям со стороны сообщества. Сейчас данная задача популярна на собеседованиях и хотелось бы максимально изучить данный вопрос и ничего не упустить. Всем заранее спасибо за позитивное и эффективное участие!
1 Гипервизор
 
04.05.26
15:15
Скрин-то сюда прилагаете?
2 happysan
 
04.05.26
15:36
Прилагался, но не пропустило. Сейчас ещё раз попытаемся. JPG не пропускает? На всякий случай ещё здесь: https://dropmefiles.com/uAjZc
3 ads55
 
04.05.26
15:22
(2) Да вставьте вы это поделие просто текстом.

Мне этот код уже не нравится.... :)
4 rozer76
 
04.05.26
15:28
(2) мы... вы там всем отделом сейчас собес проходите в рилтайме что ли...))
5 happysan
 
04.05.26
15:37
В (0) и (2) добавлена ссылка на скрин.
6 Garykom
 
гуру
04.05.26
15:37
// При изменении элемента формы "Контрагент"
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)

    // Получим пометку удаления
    ПометкаУдаления = ПолучитьПометкуУдаленияНаСервере(Контрагент);
    Если ПометкаУдаления = Истина Тогда

        ТекстВопроса = "Контрагент помечен на удаление. Очистить?";
        Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
        Если Ответ = КодВозвратаДиалога.Да Тогда
            Контрагент = Неопределено;
        КонецЕсли;

    КонецЕсли;

    // Если контрагент пустой, заполним сумму договора
    Если НЕ ЗначениеЗаполнено(Контрагент) Тогда

        Для Каждого СтрокаДоговора Из Объект.ТаблицаДоговоров Цикл
            СтрокаДоговора.СуммаДоговора = ПолучитьСуммуДоговора(СтрокаДоговора.ДоговорКонтрагента);
        КонецЦикла;

    КонецЕсли;

КонецПроцедуры // КонтрагентПриИзменении()

&НаСервере
Функция ПолучитьПометкуУдаленияНаСервере(ТекущийКонтрагент)

    Возврат ТекущийКонтрагент.ПометкаУдаления;

КонецФункции // ПолучитьПометкуУдаленияНаСервере()

&НаСервере
Функция ПолучитьСуммуДоговора(ДоговорКонтрагента)

    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ДоговорКонтрагента", ДоговорКонтрагента);
    Запрос.Текст = ".........."; 
    /// Выполнение запроса, обработка результата
    Возврат Выборка.СуммаДоговора;

КонецФункции // ПолучитьСуммуДоговора()
7 happysan
 
04.05.26
15:38
(3) (4) )))
8 Garykom
 
гуру
04.05.26
15:38
Говнокод + ИИ-код
9 happysan
 
04.05.26
15:39
(6) Спасибо, а то был только скрин)
10 Garykom
 
гуру
04.05.26
15:43
1. ПолучитьПометкуУдаленияНаСервере() - нахер отдельно если там внутри одна строка, да еще без запросов
2. = Вопрос() - все современные конфы давно отказ от модальности/синхронности
3. = ПолучитьСуммуДоговора() - в цикле? и внутри запрос? мдя
11 spiller26
 
04.05.26
15:40
(0) Цикл с запросами на каждого контрагента уже плохо.
12 happysan
 
04.05.26
15:40
(8) Полностью согласен, но полезно разобрать по пунктам.
13 RomanYS
 
04.05.26
15:43
(10) " нахер отдельно если там внутри одна строка"
Вроде очевидно - на клиенте поле недоступно)
14 RomanYS
 
04.05.26
15:44
(10) +
4. Контекстный вызов без необходимости
15 happysan
 
04.05.26
15:44
(0)(6) Вызов серверной функции ПолучитьСуммуДоговора(ДоговорКонтрагента) с клиента в цикле - неоптимально и некорректно.
16 RomanYS
 
04.05.26
15:47
Ещё непонятно откуда изменяется Объект.ТаблицаДоговоров.
17 ads55
 
04.05.26
15:49
(6) это вот такое сейчас на собесах дают? Да, обмельчал кандидат....

Ну самое первое - зачем вы запрос в цикл кидаете? Получите все договору контра и с ними работайте.
Сократить можно код, убрав нафиг, в данном случае, не нужные комментарии. Да и проверку "=Истина" зачем?
Вопрос() - ПоказатьВОпрос().

PS. Ого, тут уже написали... А всё то же самое....
18 Garykom
 
гуру
04.05.26
15:50
(13) Это понятно, почему не объединить?
Зачем делать для одной пометки когда можно свою ЗначениеРеквизитаОбъекта/ЗначенияРеквизитовОбъекта сразу сделать?
19 happysan
 
04.05.26
15:54
(18) Всё верно, я тоже этот вариант фиксировал: использовать функцию БСП ОбщегоНазначения.ЗначениеРеквизитаОбъекта().
20 happysan
 
04.05.26
15:57
(6) Функция ПолучитьСуммуДоговора(ДоговорКонтрагента) - нужно вызывать без контекста.
21 RomanYS
 
04.05.26
15:59
(19) только это не избавляет от серверной (без контекста конечно) обертки.
Ну и про наличии БСП в задании ни слова, хотя и открыта собственно конфигурация БСП)
22 happysan
 
04.05.26
15:59
(6) Использовать ПоказатьВопрос(<ОписаниеОповещенияОЗавершении>, <ТекстВопроса>, <Кнопки>, <Таймаут>, <КнопкаПоУмолчанию>, <Заголовок>, <КнопкаТаймаута>)
23 happysan
 
04.05.26
16:02
(21) Можно два варианта, я лично, два вариант озвучивал на собеседованиях. И, кстати, всё, что здесь люди сообщили, я тоже озвучивал, но пытливые соискатели ещё чего-то хотели, вот я и решил убедиться, что ничего не упущено.
24 Garykom
 
гуру
04.05.26
16:17
Если честно то код рабочий, для джуна пойдет на ура
И даже мидл/сеньор сможет отмазаться с таким

Ну типа запрос в цикле, потому что есть готовая функция и один хрен по одному контрагенту в ТЧ будет 1-2 договора, нет смысла оптимизировать
25 RomanYS
 
04.05.26
16:18
(24) код рабочий ... по одному контрагенту в ТЧ будет 1-2 договора

Тогда ответь на (16). Поменялся контрагент, идёт обработка ТЧ. А что должно было поменять эту ТЧ!?
26 Radion
 
04.05.26
16:21
(24) если этот контрагент некое общее физическое лицо, через которое идут сотни покупок
27 Garykom
 
гуру
04.05.26
16:25
(25) Это уже вне задачи :)
28 Федя Тяпкин
 
04.05.26
16:38
Если ПометкаУдаления = Истина Тогда
убрать "= Истина"
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой