Разбор кода HTTP Сервиса 1С

Записывайтесь на следующий поток курса «Чистый код на 1С» по ссылке: codeway.school/?...
Отправим ссылку на сайт курса в телеграмм бота.
Разбираю код подписчика. Это HTTP сервис на 1С, который встраивает чат в любое окно.
Какие еще аспекты кода стоит разобрать? Полезны ли такие разборы? Пишите в комментарии
Заявку на разбор кода оставляйте здесь: forms.gle/duwvQhoWNtbeZLBh9
НАВИГАЦИЯ
00:00 - О задаче
01:00 - Рекомендации по коду новичкам
08:22 - Рекомендации для опытных 1С программистов
08:35 - Авторизацию стоит делать через JWT токены
09:27 - Конструктор структур
10:40 - Обработка ошибок через Исключения
14:00 - Убираем глаголы из названий функций
15:15 - Использование Попытка-Исключение
16:00 - Под ошибки создаем отдельные функции
16:39 - Для ошибок задаем свои заголовки
19:29 - Формируем верный HTTP ответ
21:30 - Правильное оформление обработчиков
22:05 - Использование областей
23:45 - Правильный роутер HTTP сервиса
27:50 - Неправильная структура хранения данных
30:20 - Не мешаем бизнес логику и адаптер
32:10 - Не используем слово Получить в именах функций
32:35 - Для роутера нужно передавать весь запрос
33:10 - Пример хорошего обработчика роутера
46:30 - Не меняем структуру после создания
47:58 - Заключение
==========
Информационные площадки "Жёлтого клуба":
Телеграмм канал: t.me/+h2Ipfl1Gdms3OGYy
Телеграм чат: t.me/yellowclub_vrn
Группа ВКонтакте: vk: yellowclub_official
Подписывайся на канала Желтого клуба, чтобы не пропустить интересных гостей
/ @yellow_club

Пікірлер: 141

  • @KonstantinShilov
    @KonstantinShilov7 ай бұрын

    Спасибо за видео, подскажите, пожалуйста, какой шрифт используется в конфигураторе? выглядит отлично

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Делаем красивенькое оформление кода в конфигураторе: 1. Табуляция от Федькина: - Символ табуляции "│" (code 2502) - Цвет конструкции "Прочее" стиль: Линия отчета #CCC085 2. Шрифт по Волокитину: - JetBrains Mono, 10 (www.jetbrains.com/lp/mono/) 3. Текущий идентификатор: - стиль: Цвет активности #FACC1F

  • @user-ix7yc3ev8w

    @user-ix7yc3ev8w

    7 ай бұрын

    @@yellow_club только ради этого поста стОило этот ролик выкладывать. А есть что-то ещё подобное? - моё мнение, что серифные шрифты лучше: я уже старенький, глаза хочется поберечь.

  • @user-jq3ev5ez7s

    @user-jq3ev5ez7s

    7 ай бұрын

    Это скорее всего шрифт jetbrains

  • @PTolkachev

    @PTolkachev

    7 ай бұрын

    @@user-ix7yc3ev8w мне больше нравится Cascadia Code из Visual Studio 2022. Я его и в конфигураторе 1С использую, и в продуктах от JetBrains (IntelliJ IDEA, CLion, ну и на основе от Google в Android Studio) их "дефолтный" шрифт заменил на этот.

  • @Lex_Liven
    @Lex_Liven7 ай бұрын

    А какой смысл был генерировать исключения, чтобы потом все вызовы функции оборачивать в попытки? На мой взгляд, в идеале пользователь НИКОГДА не должен видеть сообщение об ошибке от платформы 1С. Если есть возможность обработать ошибку кодом - это должно быть сделано. ВызватьИсключение хороша только в серверной части - в фоновых заданиях, web и http-сервисах и т.д. Чтобы ошибка точно записалась в журнал для последующего анализа и исправления.

  • @user-iq8jk7qi7v
    @user-iq8jk7qi7v7 ай бұрын

    По больше бы таких выпусков. Очень полезно.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Будем стараться. Какие ещё темы интересны?

  • @MrGranDi1
    @MrGranDi17 ай бұрын

    Заставки к видео буквально иллюстрирует заповедь: "Пиши код так, как будто читать его будет маньяк, который знает где ты живёшь" ))

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Ахаха) так и есть) от себя не убежишь)

  • @user-oz2ct6mo6o
    @user-oz2ct6mo6o7 ай бұрын

    прямо подарок в пятницу... спасибо!

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Рад, что полезно

  • @olegkrivoruchko517
    @olegkrivoruchko5177 ай бұрын

    Спасибо за видео!

  • @user-xf9ps9rt4n
    @user-xf9ps9rt4n7 ай бұрын

    Очень интересный формат. Спасибо!!

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Рад что понравилось. Какие сложности есть с кодом? Какие моменты стоит рассмотреть?

  • @user-xf9ps9rt4n

    @user-xf9ps9rt4n

    7 ай бұрын

    @@yellow_club сложностей с кодом много для Джуна. Но формат огонь, брать в дальнейшем такие самописки, и так же делать код ревью. Такого формата ещё не было. И вы реально по факту, по делу. Очень интересно было смотреть

  • @podkina
    @podkina7 ай бұрын

    Спасибо, отлично, даже несколько моментов записал.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Какие темы ещё раскрыть? В каких моментах сложно красивый код написать?

  • @pataninpavel
    @pataninpavel7 ай бұрын

    Супер выпуск

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Рад, что понравилось

  • @denispinskii1297
    @denispinskii12977 ай бұрын

    Спасибо. Познавательно. Интересны приемы изоляции данных при разработке кода. Типовые приемы.

  • @commonaccount6453
    @commonaccount64537 ай бұрын

    хороший формат

  • @user-oq5gt3pj3j
    @user-oq5gt3pj3j7 ай бұрын

    Формат видео очень интересный, как раз сейчас учусь писать правильно структурированный и понятный код, побольше бы такого материала. По стандартам 1С не советуют писать так " Возврат ОтветЧат(..........)", лучше предварительно поместить в переменную.

  • @PTolkachev
    @PTolkachev7 ай бұрын

    38:06 Эта "заглушка" для контекстной подсказки, чтобы конфигуратор "знал", что переменная "Ссылка" - это Справочник "Сок_Чаты". Вот так вот без EDT люди "мучаются" :)

  • @user-jl8ix3hy7m
    @user-jl8ix3hy7m7 ай бұрын

    Свой роутер я делал недавно, но не по своей воле) У заказчика так было описано API что разные действия должны идти по одному url а уже в теле запроса в json есть поле с описанием команды.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Жуть)

  • @You2Ber42

    @You2Ber42

    7 ай бұрын

    @@yellow_clubэто называется JSON RPC вполне удобно так же как и использоваение GraphQL. В системах которые чуть сложнее чем просто интернет ларек подобные механизмы позволяют сильно упростить и ускорить разработку и доработку. т.е. это не жуть а просто другой подход.

  • @RuslanEdokov
    @RuslanEdokov7 ай бұрын

    Отличный разбор, есть интересные моменты. Только я бы сначала написал бы тестов, которые бы подтверждали работоспособность обработки, а потом уже вносил изменения. А то внося достаточно существенные изменения мы не контролируем стабильность результата.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Согласен. Для изначальной версии обработки написать тесты сложно. Тк полная каша в коде. Код не приспособлен для тестов

  • @KarlayThe
    @KarlayThe7 ай бұрын

    Женя, перед началом видео, когда находишь косяки, совет: Через Alt+F2 можешь понаставить меток, чтобы потом уже в процессе видео не искать где очередной косяк, будешь просто переходить по ним нажатием F2.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Спасибо. Отличный совет

  • @user-bs9tx4vl1p
    @user-bs9tx4vl1p3 ай бұрын

    Чтобы обрамить "=" пробелами во всем модуле надо сделать 2 замены. Заменить везде "=" на " = ", а потом " = " на " = ".

  • @ilya2184
    @ilya21847 ай бұрын

    Полезный разбор. Обращаться к структурам через квадратные скобки и ковычки - поясните почему? Особенно при наличии конструкторов объектов.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Отличный вопрос! Из таких соображений: 1. Глядя на свойства а не строки хочется видеть имена которые используются этой программой, в то время как строками хочется видеть имена формата. 2. Часто строки формата не соответствуют правилам именования 1С а могут быть даже нелегальными ключами, например ключ "1" легален для Json а вот структуру Результат.1 не исполнить. 3. Если программа планирует локализацию на другой язык то хочется точно понимать это строка нуждается в переводе или нет, для свойств это понять сложнее чем для строк.

  • @user-kq9zl3ct7q
    @user-kq9zl3ct7q7 ай бұрын

    Стоит разрешение экрана делать покрупнее - очень мелкий текст для телефона. Спасибо за видео.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Не ожидал, что кто-то будет смотреть с телефона. Попробую в следующий раз увеличить экран. Спасибо за совет

  • @yan-digger

    @yan-digger

    7 ай бұрын

    @@yellow_club Я тоже смотрю с телефона

  • @VelikiiYA

    @VelikiiYA

    7 ай бұрын

    только с телефона и смотрю.

  • @tiniji86
    @tiniji867 ай бұрын

    Спасибо за видео. Узнал несколько интересных вещей. Но в одной части видео говорится что не будет использовать выделение в отдельную функцию, т.к. используется один раз, но при этом создаются НовыйДанныеАвторизации и подобные функции которые используются один раз ?

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Конструкторы структур лучше всегда делать

  • @user-ts6js1ev7d
    @user-ts6js1ev7d7 ай бұрын

    хорошо бы в 1440p. Материал годный. Спасибо.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Нет технической возможности в 1440 снимать

  • @mol4unkin
    @mol4unkin2 ай бұрын

    Свой "роутер" необходим только если набор "методов сервиса" зависит от внутренней логики программы. Например через сервис обращаемся к торговому оборудованию с размыми API. Например ""POST .../{DaviceID}/{method}/*" Для 1 вида оборудывания набор методов [print(id)]; для другого ["Start","PrintLine","Finish", "Rollback"]. Так же динамичесткая маршрутизация применятся, когда невозможно согласовать набор методов со второй стороной. НО это актуально только для SOAP сервисов (на 2ой строрнt необходимо обновить WSDL при каждом изменении структуры). Для HTTP сервисов такой проблемы не существует, поэтому правильнее менять шаблоны в объектах платформы.

  • @EvilBloodEye
    @EvilBloodEye7 ай бұрын

    Просто вызов исключений в контексте HTTP-сервиса вернет 500 ошибку, если не перехватывать. А если перехватывать - надо как-то анализировать вид исключения. Это можно сделать начиная с платформы 8.3.21, где появились новые возможности по работе с исключениями. Просто подавлять любое исключение в функции и считать это ошибкой авторизации небезопасно т.к. любая опечатка внутри метода будет отображаться как ошибка авторизации, хотя ей не является.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Спасибо! Хорошее замечание

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Как тебе вариант: краткую ошибку возвращать, а подробную ошибку писать в ЖР? И дальше по ЖР разбирать проблему?

  • @EvilBloodEye

    @EvilBloodEye

    7 ай бұрын

    @@yellow_club кажется это несколько другая задача. Нам нужно как-то различать внутри функции ошибки авторизации (для формирования 401 ответа) и внутренние ошибки (для формирования 500 ответа). Если не рассчитывать на функциональность 21 платформы, то можно возвращать структуру с кодом и текстом ошибки. То есть написать "Возврат ОписаниеОшибкиАвторизации(ТекстОшибки)", внутри которой формировать структуру с кодом и текстом. А 500 тогда будут действительно при внутренних ошибках и не спрячутся в 401. А по краткой, в целом ошибки http-сервисов не пишутся в журнал автоматом, поэтому на мой взгляд принципа "краткую ошибку возвращать, а подробную ошибку писать в ЖР" нужно всегда придерживаться =)

  • @tetraren

    @tetraren

    7 ай бұрын

    Да, верно. REST API вышел из чата.

  • @zeegin

    @zeegin

    7 ай бұрын

    ​@@EvilBloodEyeкак безопасник я с тобой категорически не согласен. Возвращая 500 а методах авторизации ты даёшь возможность прощупывать твою систему пентестами на наличие скрытых дефектов в методах авторизации, а это недопустимо. Для других методов (не авторизации) ты прав.

  • @user-mm2wi3bt6q
    @user-mm2wi3bt6q7 ай бұрын

    Спасибо за работу! Прошу рассказать для особо одарённых почему нужно обращаться через квадратные скобки к элементу структуры, а не через точку.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Через точку можно и нужно обращаться, если ключи на том же языке, что и код. Если ключи на английском, а код на русском, то лучше через скобки

  • @user-jo6hk7vp6w
    @user-jo6hk7vp6w7 ай бұрын

    Терпеть не могу, когда пробелы и табуляцию не ставят. Отпадает всякое желание вникать в код

  • @user-bf2us9ow5c
    @user-bf2us9ow5c6 ай бұрын

    Привет! Я бы еще в запросе изменил названия полей выборки, что бы потом в цикле через функцию ЗаполнитьЗначенияСвойств(), заполнил структуру. Так было бы более правильнее чем обращаться через точку к свойствам

  • @PTolkachev
    @PTolkachev7 ай бұрын

    По поводу "неправильной структуры хранения данных" (27:50 - 30:20). Нормальная структура, одним запросом всё можно выбрать, правда, понадобится временная таблица значений, которую необходимо поместить во временную таблицу пакета запросов. Что так же позволит не реализовывать собственную сортировку массива с чатами, как в конце оригинальной функции. Вот такая получилась у меня процедура "ПолучитьТелоОтветаЧатыСписок" (в моём варианте она называется "СписокЧатовПользователя"): Функция СписокЧатовПользователя(Пользователь) Результат = Новый Массив; Запрос = Новый Запрос(ТекстЗапросаСписокЧатовПользователя()); Запрос.УстановитьПараметр("Пользователь", Пользователь); Запрос.УстановитьПараметр("ДатыПоследнихСообщений", ДатыПоследнихПрочитанныхСообщенийПользователя(Пользователь)); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Чат = НовыйСтруктураЧата(); // ориг. ПолучитьСтруктуруЧата Чат["id"] = Строка(Выборка.Чат.УникальныйИдентификатор()); Чат["isGroupChat"] = Выборка.ЭтоГрупповойЧат; // В строке ниже, по всей видимости, тоже "запрос в цикле". Зная исходный код функции "ПредставлениеЧата" // (ориг. "ПолучитьПредставлениеЧата"), это тоже можно получить в основном запросе. Чат["represent"] = Сок_Чат.ПредставлениеЧата(Выборка.Чат, Пользователь); Чат["lastMessage"] = ПредставлениеПоследнегоСообщенияЧата(Выборка, Пользователь); Чат["lastMessageDate"] = Выборка.ДатаПоследнегоСообщения; Чат["unreadMessagesCnt"] = Выборка.КоличествоНепрочитанных; Результат.Добавить(Чат); КонецЦикла; Возврат Результат; КонецФункции

  • @PTolkachev

    @PTolkachev

    7 ай бұрын

    Процедура выше, конечно, получалась лаконичной, но теперь текст запроса превратился в "портянку": Функция ТекстЗапросаСписокЧатовПользователя() Возврат "//////////////////////////////////////////////////////////////////////////////// |// 1. Помещение таблицы дат последних прочитанных сообщений во временную таблицу |// ВТ_ДатыПоследнихПрочитанныхСообщений для последующего подсчёта количества |// непрочитанных сообщений. | |ВЫБРАТЬ | ДатыПоследнихСообщений.Чат КАК Чат, | ДатыПоследнихСообщений.Дата КАК Дата |ПОМЕСТИТЬ ВТ_ДатыПоследнихПрочитанныхСообщений |ИЗ | &ДатыПоследнихСообщений КАК ДатыПоследнихСообщений | |ИНДЕКСИРОВАТЬ ПО | Чат, | Дата |; | |//////////////////////////////////////////////////////////////////////////////// |// 2. Помещение чатов пользователя во временную таблицу ВТ_Чаты для последующей |// обработки. | |ВЫБРАТЬ РАЗЛИЧНЫЕ | Чаты.Ссылка КАК Ссылка, | Чаты.Ссылка.ЭтоГрупповойЧат КАК ЭтоГрупповойЧат |ПОМЕСТИТЬ ВТ_Чаты |ИЗ | Справочник.Сок_Чаты.Участники КАК Чаты |ГДЕ | Чаты.Участник = &Пользователь | И НЕ Чаты.Ссылка.ПометкаУдаления | |ИНДЕКСИРОВАТЬ ПО | Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |// 3. Определение дат последних сообщений чатов пользователя и помещение их во |// временную таблицу ВТ_ДатыПоследнихСообщений. | |ВЫБРАТЬ | Сообщения.Основание КАК Чат, | МАКСИМУМ(Сообщения.Дата) КАК Дата |ПОМЕСТИТЬ ВТ_ДатыПоследнихСообщений |ИЗ | РегистрСведений.Сок_СообщенияЧатов КАК Сообщения | |СГРУППИРОВАТЬ ПО | Сообщения.Основание | |ИНДЕКСИРОВАТЬ ПО | Чат, | ДатаПоследнегоСообщения |; | |//////////////////////////////////////////////////////////////////////////////// |// 4. Возможна ситуация, когда в одну и ту же дату с точностью до секунды пришло |// два сообщения. Поэтому необходима ещё одна временная таблица |// ВТ_УИДПоследнихСообщений, где последнее сообщение из нескольких с одинаковой |// датой определяется по максимальному УИД. | |ВЫБРАТЬ | Сообщения.Основание КАК Чат, | МАКСИМУМ(Сообщения.УИД) КАК УИД |ПОМЕСТИТЬ ВТ_УИДПоследнихСообщений |ИЗ | РегистрСведений.Сок_СообщенияЧатов КАК Сообщения | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ДатыПоследнихСообщений КАК ДатыПоследнихСообщений | ПО Сообщения.Основание = ДатыПоследнихСообщений.Чат | И Сообщения.Дата = ДатыПоследнихСообщений.Дата | |СГРУППИРОВАТЬ ПО | Сообщения.Основание | |ИНДЕКСИРОВАТЬ ПО | Чат, | УИД |; | |//////////////////////////////////////////////////////////////////////////////// |// 5. Получение данных последнего сообщения (чат, дата, автор и т.п.) и |// помещение их во временную таблицу ВТ_ПоследниеСообщения. | |ВЫБРАТЬ | Сообщения.Основание КАК Чат, | Сообщения.Дата КАК Дата, | Сообщения.Автор КАК Автор, | Сообщения.Автор.Наименование КАК АвторПредставление, | Сообщения.Сообщение КАК Сообщение |ПОМЕСТИТЬ ВТ_ПоследниеСообщения |ИЗ | РегистрСведений.Сок_СообщенияЧатов КАК Сообщения | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_УИДПоследнихСообщений КАК УИДПоследнихСообщений | ПО Сообщение.Чат = УИДПоследнихСообщений.Чат | И Сообщение.УИД = УИДПоследнихСообщений.УИД | |ИНДЕКСИРОВАТЬ ПО | Чат |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВТ_УИДПоследнихСообщений |; | |//////////////////////////////////////////////////////////////////////////////// |// 6. Подсчет количества непрочитанных сообщений по данным временной таблицы |// ВТ_ДатыПоследнихСообщений и помещение результата во временную таблицу |// ВТ_КоличествоНепрочитанныхСообщений. | |ВЫБРАТЬ | Сообщения.Основание КАК Чат, | КОЛИЧЕСТВО(РАЗЛИЧНЫХ Сообщения.УИД) КАК Количество |ПОМЕСТИТЬ ВТ_КоличествоНепрочитанныхСообщений |ИЗ | РегистрСведений.Сок_СообщенияЧатов КАК Сообщения | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ДатыПоследнихСообщений КАК ДатыПоследнихСообщений | ПО Сообщение.Основание = ДатыПоследнихСообщений.Чат | И (Сообшение.Дата > ДатыПоследнихСообщений.Дата) | |ИНДЕКСИРОВАТЬ ПО | Чат |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВТ_ДатыПоследнихСообщений |; | |//////////////////////////////////////////////////////////////////////////////// |// 7. Соединение данных временных таблиц в один результат запроса. | |ВЫБРАТЬ | Чаты.Ссылка КАК Чат, | Чаты.ЭтоГрупповойЧат КАК ЭтоГрупповойЧат, | ЕСТЬNULL(ПоследниеСообщения.Дата, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаПоследнегоСообщения, | ЕСТЬNULL(ПоследниеСообщения.Автор, ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)) КАК АвтоПоследнегоСообщения, | ЕСТЬNULL(ПоследниеСообщения.АвторПредставление, """") КАК АвтоПоследнегоСообщенияПредставление, | ЕСТЬNULL(ПоследниеСообщения.Сообщение, """") КАК ТекстПоследнегоСообщения, | ЕСТЬNULL(КоличествоНепрочитанныхСообщений.Количество, 0) КАК КоличествоНепрочитанных |ИЗ | ВТ_Чаты КАК Чаты | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПоследниеСообщения КАК ПоследниеСообщения | ПО Чаты.Ссылка = ПоследниеСообщения.Чат | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_КоличествоНепрочитанныхСообщений КАК КоличествоНепрочитанныхСообщений | ПО Чаты.Ссылка = КоличествоНепрочитанныхСообщений.Чат | |УПОРЯДОЧИТЬ ПО | ЕСТЬNULL(ПоследниеСообщения.Дата, ДАТАВРЕМЯ(1, 1, 1))"; КонецФункции

  • @PTolkachev

    @PTolkachev

    7 ай бұрын

    Ну и вспомогательные функции: Функция ДатыПоследнихПрочитанныхСообщенийПользователя(Пользователь) Если Не ЗначениеЗаполнено(Пользователь) Тогда Возврат НовыйДатыПоследнихСообщений(); КонецЕсли; ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( Пользователь.ИдентификаторПользователяИБ ); НастройкиФормыМессенджер = ХранилищеОбщихНастроек.Загрузить("Сок_Чаты", "ОбщиеНастройкиФормыМессенджера"); Если НастройкиФормыМессенджер Неопределено Тогда Возврат НастройкиФормыМессенджер.ДатыПоследнихПрочитанныхСообщений; Иначе Возврат НовыйДатыПоследнихСообщений(); КонецЕсли; КонецФункции Функция НовыйДатыПоследнихСообщений() Результат = Новый ТаблицаЗначений; Результат.Колонки.Вставить("Чат", Новый ОписаниеТипов("СправочникСсылка.Сок_Чаты")); Результат.Колонки.Вставить("Дата", Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя))); Возврат Результат; КонецФункции Функция ПредставлениеПоследнегоСообщенияЧата(Чат, Пользователь) ПоследнееСообщение = ""; Если Чат.ЭтоГрупповойЧат Тогда ПоследнееСообщение = ?(Чат.АвтоПоследнегоСообщения = Пользователь, НСтр("ru='Вы'"), Чат.АвтоПоследнегоСообщенияПредставление ) + ": "; КонецЕсли; ПоследнееСообщение = ПоследнееСообщение + СтроковыеФункцииКлиентСервер.ИзвлечьТекстИзHTML(Чат.ТекстПоследнегоСообщения); Возврат ПоследнееСообщение; КонецФункции

  • @PTolkachev

    @PTolkachev

    7 ай бұрын

    p.s. Если кто-то захочет лучше ознакомиться с исходным кодом, то просто создайте внешнюю обработку и поместите в неё весь код из комментариев выше.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Спасибо за код. Есть сложность ДатаПоследнегоПрочитаногоСообщения зависит не только от пользователя, но и от конкретного чата

  • @PTolkachev

    @PTolkachev

    7 ай бұрын

    @@yellow_club ну я всё писал "вручную" (в том числе и запросы) по стоп-кадру видео, т.к. лень было добавлять соответствующие объекты конфигурации для проверки. Там ещё и синтактические ошибки могут быть. Пытался передать суть. А по делу, добавить в таблицу значений "ДатыПоследнихПрочитанныхСообщений" колонку "Пользователь", заполнять её текущим пользователем, ну и соединение в запросе с этой таблицей по пользователю добавить.

  • @Gesperid
    @Gesperid7 ай бұрын

    Топ контент. Свои роутеры запросов в куче конф. Многие чуть ли не за стандарт считают. Откуда это пошло?!

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Не понимают как надо делать. Может в ранних типовых подсмотрели плохие примеры

  • @shrayky

    @shrayky

    7 ай бұрын

    @@yellow_club а если у меня роутер во внешней обработке? Потому что лень сотню рибов обновлять ради небольших изменений в api...

  • @yellow_club

    @yellow_club

    7 ай бұрын

    @shrayky сочувствую) ненавижу риб 😭

  • @shrayky

    @shrayky

    7 ай бұрын

    ​@@yellow_clubу всего есть свои плюсы и минусы😂

  • @SergiyDalishchinskiy

    @SergiyDalishchinskiy

    7 ай бұрын

    Я за "свой" роутер. Нормальный сервис со всеми методами выглядит монструозно и менее читабельно, кто бы не говорил. Даже ваш пример. Вот есть у нас "Чаты". Когда создаешь методы стандартно метадаными в конфе СписокЧатов, ДобавитьЧат и ИнфоЧата - оно потом раскидано. Добавь еще несколько (СписокУчастников и т.п.) и там вакханалия получиться. А вот создав просто "Чаты" и там себе обрабатывай методы внутри. Отдельно "Участники", отдельно "Чаты". Но насчет маршруты отдельно, логика отдельно это однозначно +. А внутреняя система роутинга конфигуратора, на мой вкус "-" Если 1С добавит подмаршруты(как подсистемы например) в метаданые тогда я перейду на роутер из коробки, а так пока свой.

  • @arshanskiysergey2791
    @arshanskiysergey27917 ай бұрын

    после запятых пробелы надо ставить

  • @user-kv9zn6dx7m
    @user-kv9zn6dx7m7 ай бұрын

    А как реализованны эти полоски между структурами если и циклы. Которые ведут от нчала к концу, и пробелы выделены какойто точкой (звездочкой)

  • @yellow_club

    @yellow_club

    7 ай бұрын

    В ответах на закреплённый комментарий есть ответ

  • @AndrewZED84
    @AndrewZED847 ай бұрын

    Если я не ошибаюсь, имена процедур и функций написаны в SnakeCase стиле, а ортодоксальные 1С-ники пишут в стиле CamelCase))

  • @avbolshakov

    @avbolshakov

    7 ай бұрын

    ПаскальКейс. кемелКейс.

  • @PTolkachev

    @PTolkachev

    7 ай бұрын

    есть snake_case и два camelCase / CamelCase. Для последних двух тоже есть уточняющие названия: UpperCamelCase и lowerCamelCase.

  • @hren_hrenov
    @hren_hrenov7 ай бұрын

    Именно с таким лицом, как на обложке, только побольше ярости, я лезу в конфигуратор😂😂😂

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Да, в конфигураторе не удобно работать) ярость иногда просачивается)

  • @Kharieste_Ang

    @Kharieste_Ang

    7 ай бұрын

    @@yellow_clubа где вы программируете, если не в конфигураторе?

  • @artur_webdesigngevorgyan5771
    @artur_webdesigngevorgyan57717 ай бұрын

    Этот код http сервис он уникален или каждый разработчик по своему пишет ?

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Каждый сервис пишется под конкретную задачу

  • @info_infoman
    @info_infoman7 ай бұрын

    Народ, а как вы изучаете внутрянку например ЕРП не имея конфы ЕРП в открытом доступе? Кто как выкручивается?

  • @olegshpilevoy

    @olegshpilevoy

    7 ай бұрын

    А на руборде в варезнике сейчас добрые люди перестали выкладывать конфы?

  • @info_infoman

    @info_infoman

    7 ай бұрын

    @@olegshpilevoy там все хуже и хуже если бесплатно...

  • @ru21ru1

    @ru21ru1

    7 ай бұрын

    ​@@olegshpilevoyзачем ты сдал такой ресурс. Щас прикроют

  • @user-xh5hd3my4t
    @user-xh5hd3my4t7 ай бұрын

    услышал: "Создать функцию "Получить...". Стандарты 1с вроде бы говорят не начинать функции с этого слова?) или я ошибаюсь

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Послышалось) Получить не стоит использовать

  • @Mr_Kitaev
    @Mr_Kitaev7 ай бұрын

    В ОтветЧат можно было (и стоило) оставить выборку. Зачем выгрузка в таблицу? Данные не меняются, а память съедается

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Для больших таблиц верное замечание. Если в таблице меньше 1000, то разница не ощутима.

  • @Gesperid
    @Gesperid7 ай бұрын

    Хорошо бы шрифт покрупнее и окно конфигуратора на весь экран, а себя в уголок поставить.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    А что не удалось прочитать?

  • @Gesperid

    @Gesperid

    7 ай бұрын

    @@yellow_club Удалось, но. 1. Приходится прилагать усилия - переводить взгляд с двигающегося тебя на код. Себя лучше справа внизу. 2. Приходится всматриваться в мелкий код, сложнее сфокусировать взгляд.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    @Gesperid размер кода не страдает. Он ровно такой, как у полностью развёрнутого конфигуратора.

  • @Gesperid

    @Gesperid

    7 ай бұрын

    @@yellow_club Мы читаем слева направо, а когда слева мельтешение - я начинаю читать следующую строку кода начиная с тебя.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Согласен! Спасибо 🙏 перемещусь вправо

  • @panfilovandrey
    @panfilovandrey2 ай бұрын

    Здравый разбор, есть к чему придраться, но это мелочи...

  • @timurdanilenko3582
    @timurdanilenko35827 ай бұрын

    ТоляЯЯЯЯЯЯЯ. Ты опять пробелов понаставил?))))) 6 лет лет уже прошло, до сих пор не отлегло)

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Не понял тебя) что не так с пробелами?)

  • @timurdanilenko3582

    @timurdanilenko3582

    7 ай бұрын

    @@yellow_club да нет же. Работал с одним Толиком, у того разбег между функциями\процедурами был в полэкрана. На вопрос зачем ты так делаешь (пустые строки вставляешь намеренно), отвечал, что если придет еще мысль - дописать. Типа как на листочке, оставляешь место, чтоб дописать

  • @yellow_club

    @yellow_club

    7 ай бұрын

    @@timurdanilenko3582 ахаха) интересный способ)

  • @timurdanilenko3582

    @timurdanilenko3582

    7 ай бұрын

    @@yellow_club тебе смешно (и мне сейчас), а человек серьезно говорил.

  • @user-um3hd5ds1l
    @user-um3hd5ds1l5 ай бұрын

    Бывает так, что тебе накидают задач, которые нужно сделать прямо сейчас, и времени на написание по фэншую нет. Думаешь, что потом все исправишь, а потом поступают новые задачи и т.д.

  • @TresModiosVir
    @TresModiosVir7 ай бұрын

    Использование исключения вместо условных операторов - один из признаков плохого кода

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Почему?

  • @Fellarin

    @Fellarin

    7 ай бұрын

    @@yellow_club потому что при отладке с установленным "останавливать по ошибке" получаешь кучу срабатываний на исключениях. Это тупо бесит

  • @alexivanov8180
    @alexivanov81807 ай бұрын

    Код, в 1с, ору))))

  • @yellow_club

    @yellow_club

    7 ай бұрын

    А что смешного?

  • @kaaasteeenTV
    @kaaasteeenTV7 ай бұрын

    41:05, очень не рекомендуется, использовать имя переменной "Строка", так как это зарезервировано системой, далее может привести к ошибкам. Поэтому вместо "Для каждого Строка Из Данные Цикл", лучше "Для каждого СтрокаДаных Из Данные Цикл". Понимаю, что для многих это привычка, но постарайтесь этого не делать. Тоже самое касается пресловутой переменной "Стр" в циклах.

  • @Gesperid

    @Gesperid

    7 ай бұрын

    И чем может навредить использование в качестве имен переменных "Строка" и "Стр"?

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Знаю метод Строка(), но вот чтобы слово Строка было зарезервированным не видел такого

  • @kaaasteeenTV

    @kaaasteeenTV

    7 ай бұрын

    @@yellow_club, Это я имел ввиду. Неправильно использовать переменные, которые называются так же как и методы.

  • @kaaasteeenTV

    @kaaasteeenTV

    7 ай бұрын

    ​@@Gesperid, вред от СТР такой же как и от переменных с именами Объект1, Элемент 2. Это максимально неинформативно и не читаемо со стороны другого программиста. Ведь именно на это сделали упор в данном видео при разборе кода)

  • @Gesperid

    @Gesperid

    7 ай бұрын

    ​​@@kaaasteeenTVДля чего раздувать в локальном контексте имена переменных Строка до СтрокаДанных?! Не надо раздувать тело цикла, тогда все будет кристально понятно.

  • @vladyan01
    @vladyan017 ай бұрын

    Почему разрабы bsl сделали "", вместо "!=". Это же неудобно, вроде они 1С на С++ писали, а там "!=", откуда они "" нашли непонятно)

  • @TresModiosVir

    @TresModiosVir

    7 ай бұрын

    из математики

  • @vladyan01

    @vladyan01

    7 ай бұрын

    @@TresModiosVir в математике же знак "≠"

  • @vladyan01

    @vladyan01

    7 ай бұрын

    возможно из паскаля кстати взяли

  • @arshanskiysergey2791
    @arshanskiysergey27917 ай бұрын

    4:10 поправлять форматирование встроенными средствами 1С опасно, т.к. если есть перенос строки то конфигуратор новую строку поставит без дополнительного отступа

  • @user-et7iu5qm2e
    @user-et7iu5qm2e7 ай бұрын

    Не очень хорошо вызывать функцию для создания структуры. Инициализацию проводить при создании структуры!!! 1.Для того чтобы увидеть внутренности этой структуры нужно перейти в эту функцию, хорошо когда она близко и кода на пару сотен строк, а если её расположили в какой-нибудь области "инициализации", то расставлять закладки и прыгать как блоха. 2.При передаче объектов из функции в функцию, что происходит? правильно - копирование объектов... давайте посмотрим как тормозит наш замечательный продукт.

  • @Lex_Liven

    @Lex_Liven

    7 ай бұрын

    1. Согласен. 2. А вот тут неверно. Чтобы 1С скопировала параметр - его нужно специально прописывать с ключевым словом Знач. По умолчанию она их передает по ссылке. И это иногда самое подлое, когда внутри функции втихаря какие-то параметры меняют.

  • @user-ut8lq8zb2r
    @user-ut8lq8zb2r7 ай бұрын

    Все равно Павел Королев топ, даже не обсуждается.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Конечно. Павел Королев круче всех.

  • @You2Ber42
    @You2Ber427 ай бұрын

    3:10 Тут же все написано ИмяПользователя, ПарольВходящий. Что не понятно тебе ? Плодить функции которые вызываются один раз и состоят из одной 2х строк, тоже не лучший выход. Конкретно по этому куску кода ключевая проблема что проверка на пустой токен первый раз выполняется уже ближе к средине кода, когда уже мы поискали по справочнику пользоваетелей. Если уж и придераться к понятности кода то логично сделать отдельно функцию парсера токена, которая вернет структуру токена авторизации и отдельно уже поискать по справочникам. Ну или хотя бы в рамках одной процеуры разнести отдельно парсинг токена и работу с ИБ (поиск пользователя, хеширование пароля). Сейчас же это выглядит как поток сознания записанный в код, как человек в голове решал задачу в том поряке и записал. 5:15 Тут вообще цирк. Из контекста понятно что эта процедура вызывается часто. Справочник пользователи может содержать и 300-400 записей спокойно. И вот вместо того что бы в цикле прочитать по индексу (т.е. мгновенно, бесплатно) несколько ссылок (по количеству участников чата) ты предлагаешь каждый раз вычитывать условно весь справочник из базы. Это бред. Максимум если предположить что есть большие чаты с 100-200 участников то есть смысл подумать об использовании ПовтИсп модуля для получения + переиспользование сеансов. В целом после просмотра твоего разбора создалось впечатление что ты сам слабо понимаешь в разработке и за плечами нет 5-7 лет разработки, так как придераешься в основном к тому что написано в стандартах разработки (для этого ума не надо) не понимая сути того что написано там.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Спасибо за мнение

  • @user-gu5ty9zq3m

    @user-gu5ty9zq3m

    7 ай бұрын

    Это видео рассчитано на начинающих разработчиков как и весь канал. Никто не погружался толком в это все я уверен. А вообще отдельный плюс за то что указано что огороды городить не надо и есть JWT токены готовые. НУ или Open id технология. В целом обычный рефакторинг из нечитаемого в что то более или менее сносное. Кому надо тот оценит. Такого контента маловато.

  • @You2Ber42

    @You2Ber42

    7 ай бұрын

    @@user-gu5ty9zq3m 70% из того что говорит блогер тебе скажет сонар куб, не удивлюсь если он перед записью видео прогнал его по этому коду и пересказывает его выдачу. Это не то чем нужно забивать голву джунам, и вообще разработчикам. Там по коду большое количество реальных проблем, которые остались не замеченными. Примеры этих проблем я привел в своем сообщении. Я плотно работаю с джунами, и заметил тенденцию что если раньше джуны бездумно писали сложные запросы в циклах, то теперь они так же бездумно вычитывают весь справочник перед циклом на 4-5 итераций для обработки 4 строк, потому что "запрос в цикле это плохо". И теперь примерно понятно откуда это все берется.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    @@user-gu5ty9zq3m а почему ты считаешь, что ЖК - канал для начинающих?

  • @user-gu5ty9zq3m

    @user-gu5ty9zq3m

    7 ай бұрын

    @@yellow_club выше оратор уже ответил. Я давно с ним солидарен.

  • @Mrnuctoh
    @Mrnuctoh6 ай бұрын

    Ох уж эти любители функций ради одной строки! Но чтобы это не смотрелось так мелочно, мы эту одинокую строку заменим четырьмя! А знает ли уважаемый спикер, что 1С - язык интерпретируемый, а это значит, что движение курсора интерпретации от строки к строке с инициализацией и входом в функцию снижает производительность вашей конфигурации. Звучит как крохоборство, да? На больших циклах такое размазывание кода может дать ощутимое снижение производительности вплоть до того, что будет занимать больше времени, чем бизнес-логика. Ну и о распухании конфигурации не молчим. УПП - 1,5 млн строк кода, ERP - уже 7,5. Пока индекс поиска построится, поседеть можно. И последнее - запрятав структуру в функцию, мы ухудшили читабельность нашей довольно компактной процедуры. До этого структура нашей структуры (пардон) была перед глазами, а теперь надо спускаться в функцию, чтобы ее себе напомнить, плюс мы сломали контекстную подсказку и замедлили себе работу. В общем, на первых же минутах рекомендаций опытным происходит такой бррр. Дизлайк-отписка.

  • @yellow_club

    @yellow_club

    6 ай бұрын

    Ну это ничего) просто у вас пока стадия: гнев) Желаю побыстрее дойти до стадии «принятие»

  • @Mrnuctoh

    @Mrnuctoh

    6 ай бұрын

    @@yellow_club О, не волнуйтесь. За 15 лет стажа я только укрепился в своих словах. Мы сначала напишем в соглашении о качестве кода "Функция длиной более двух экранов требует декомпозиции", затем ниже "Любой результат вычислений требуется помещать в переменную" и "тернарный оператор запрещается". В результате вместо одной строки типа "Текст = ?(Показатель1*Показатель2 > Показатель3, "Текст 1", "Текст 2")" мы напишем шесть, наша функция раздуется, и мы начнем думать - как же упаковать ее в два экрана? Начнем декомпозировать, а у нас ОЙ сложная бизнес-логика, мы начнем изобретать какие-то немыслимые переменные, куда будем складывать контекст выполнения, которые нам придется протаскивать по этим декомпозирующим функциям, мы обязательно будем забывать какие свойства есть у этих переменных с контекстом. Мы изнасиловали себя стеками вроде СотрудникиКлиентБазовый.СотрудникиОбработкаОповещения() СотрудникиКлиентРасширенный.СотрудникиОбработкаОповещения() СотрудникиКлиентВнутренний.СотрудникиОбработкаОповещения() СотрудникиКлиент.СотрудникиОбработкаОповещения() и загнали себя провалами в этот ад при отладке, и тут выходите вы, весь в белом фраке, и заявляете, что инициализация структур через функции - наш путь. Ну окей. Вместо 15 минут на функцию я потрачу час. А разраб, который придет после меня смотреть в эту функцию, вместо 30 минут потратит 2 часа на анализ этих макаронных фабрик. Что не выгодно никому - ни самому разрабу, у которого качество кода снижается, ни заказчику, который за это платит. Нет, я не заявляю, что надо писать простыни на тысячи строк. Надо придерживаться принципа разумной достаточности. Которого, к сожалению, нет ни в стандартах разработки 1С (раз они рождают шедевры типа ERP, по количеству строк кода бОльшую, чем сумма строк УПП, УТ, БП и ЗУП вместе взятых, при том что у трех последних БСП общая) ни в ваших рекомендациях.

  • @iamok4770
    @iamok47707 ай бұрын

    Как он бесит меня.Если этот чувак вас бесит ставим лайк.

  • @yellow_club

    @yellow_club

    7 ай бұрын

    Поддерживаю😂 лайк поставил

Келесі