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

  Рет қаралды 14,221

Желтый клуб — 1С программирование

Желтый клуб — 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
@KonstantinShilov 8 ай бұрын
Спасибо за видео, подскажите, пожалуйста, какой шрифт используется в конфигураторе? выглядит отлично
@yellow_club
@yellow_club 8 ай бұрын
Делаем красивенькое оформление кода в конфигураторе: 1. Табуляция от Федькина: - Символ табуляции "│" (code 2502) - Цвет конструкции "Прочее" стиль: Линия отчета #CCC085 2. Шрифт по Волокитину: - JetBrains Mono, 10 (www.jetbrains.com/lp/mono/) 3. Текущий идентификатор: - стиль: Цвет активности #FACC1F
@user-ix7yc3ev8w
@user-ix7yc3ev8w 8 ай бұрын
@@yellow_club только ради этого поста стОило этот ролик выкладывать. А есть что-то ещё подобное? - моё мнение, что серифные шрифты лучше: я уже старенький, глаза хочется поберечь.
@user-jq3ev5ez7s
@user-jq3ev5ez7s 8 ай бұрын
Это скорее всего шрифт jetbrains
@PTolkachev
@PTolkachev 8 ай бұрын
@@user-ix7yc3ev8w мне больше нравится Cascadia Code из Visual Studio 2022. Я его и в конфигураторе 1С использую, и в продуктах от JetBrains (IntelliJ IDEA, CLion, ну и на основе от Google в Android Studio) их "дефолтный" шрифт заменил на этот.
@Lex_Liven
@Lex_Liven 8 ай бұрын
А какой смысл был генерировать исключения, чтобы потом все вызовы функции оборачивать в попытки? На мой взгляд, в идеале пользователь НИКОГДА не должен видеть сообщение об ошибке от платформы 1С. Если есть возможность обработать ошибку кодом - это должно быть сделано. ВызватьИсключение хороша только в серверной части - в фоновых заданиях, web и http-сервисах и т.д. Чтобы ошибка точно записалась в журнал для последующего анализа и исправления.
@user-iq8jk7qi7v
@user-iq8jk7qi7v 8 ай бұрын
По больше бы таких выпусков. Очень полезно.
@yellow_club
@yellow_club 8 ай бұрын
Будем стараться. Какие ещё темы интересны?
@MrGranDi1
@MrGranDi1 8 ай бұрын
Заставки к видео буквально иллюстрирует заповедь: "Пиши код так, как будто читать его будет маньяк, который знает где ты живёшь" ))
@yellow_club
@yellow_club 8 ай бұрын
Ахаха) так и есть) от себя не убежишь)
@denispinskii1297
@denispinskii1297 7 ай бұрын
Спасибо. Познавательно. Интересны приемы изоляции данных при разработке кода. Типовые приемы.
@user-bs9tx4vl1p
@user-bs9tx4vl1p 3 ай бұрын
Чтобы обрамить "=" пробелами во всем модуле надо сделать 2 замены. Заменить везде "=" на " = ", а потом " = " на " = ".
@user-oz2ct6mo6o
@user-oz2ct6mo6o 8 ай бұрын
прямо подарок в пятницу... спасибо!
@yellow_club
@yellow_club 8 ай бұрын
Рад, что полезно
@olegkrivoruchko517
@olegkrivoruchko517 8 ай бұрын
Спасибо за видео!
@podkina
@podkina 8 ай бұрын
Спасибо, отлично, даже несколько моментов записал.
@yellow_club
@yellow_club 8 ай бұрын
Какие темы ещё раскрыть? В каких моментах сложно красивый код написать?
@user-oq5gt3pj3j
@user-oq5gt3pj3j 8 ай бұрын
Формат видео очень интересный, как раз сейчас учусь писать правильно структурированный и понятный код, побольше бы такого материала. По стандартам 1С не советуют писать так " Возврат ОтветЧат(..........)", лучше предварительно поместить в переменную.
@PTolkachev
@PTolkachev 8 ай бұрын
38:06 Эта "заглушка" для контекстной подсказки, чтобы конфигуратор "знал", что переменная "Ссылка" - это Справочник "Сок_Чаты". Вот так вот без EDT люди "мучаются" :)
@user-xf9ps9rt4n
@user-xf9ps9rt4n 8 ай бұрын
Очень интересный формат. Спасибо!!
@yellow_club
@yellow_club 8 ай бұрын
Рад что понравилось. Какие сложности есть с кодом? Какие моменты стоит рассмотреть?
@user-xf9ps9rt4n
@user-xf9ps9rt4n 8 ай бұрын
@@yellow_club сложностей с кодом много для Джуна. Но формат огонь, брать в дальнейшем такие самописки, и так же делать код ревью. Такого формата ещё не было. И вы реально по факту, по делу. Очень интересно было смотреть
@pataninpavel
@pataninpavel 8 ай бұрын
Супер выпуск
@yellow_club
@yellow_club 8 ай бұрын
Рад, что понравилось
@commonaccount6453
@commonaccount6453 8 ай бұрын
хороший формат
@mol4unkin
@mol4unkin 2 ай бұрын
Свой "роутер" необходим только если набор "методов сервиса" зависит от внутренней логики программы. Например через сервис обращаемся к торговому оборудованию с размыми API. Например ""POST .../{DaviceID}/{method}/*" Для 1 вида оборудывания набор методов [print(id)]; для другого ["Start","PrintLine","Finish", "Rollback"]. Так же динамичесткая маршрутизация применятся, когда невозможно согласовать набор методов со второй стороной. НО это актуально только для SOAP сервисов (на 2ой строрнt необходимо обновить WSDL при каждом изменении структуры). Для HTTP сервисов такой проблемы не существует, поэтому правильнее менять шаблоны в объектах платформы.
@user-mm2wi3bt6q
@user-mm2wi3bt6q 7 ай бұрын
Спасибо за работу! Прошу рассказать для особо одарённых почему нужно обращаться через квадратные скобки к элементу структуры, а не через точку.
@yellow_club
@yellow_club 7 ай бұрын
Через точку можно и нужно обращаться, если ключи на том же языке, что и код. Если ключи на английском, а код на русском, то лучше через скобки
@KarlayThe
@KarlayThe 8 ай бұрын
Женя, перед началом видео, когда находишь косяки, совет: Через Alt+F2 можешь понаставить меток, чтобы потом уже в процессе видео не искать где очередной косяк, будешь просто переходить по ним нажатием F2.
@yellow_club
@yellow_club 8 ай бұрын
Спасибо. Отличный совет
@ilya2184
@ilya2184 8 ай бұрын
Полезный разбор. Обращаться к структурам через квадратные скобки и ковычки - поясните почему? Особенно при наличии конструкторов объектов.
@yellow_club
@yellow_club 8 ай бұрын
Отличный вопрос! Из таких соображений: 1. Глядя на свойства а не строки хочется видеть имена которые используются этой программой, в то время как строками хочется видеть имена формата. 2. Часто строки формата не соответствуют правилам именования 1С а могут быть даже нелегальными ключами, например ключ "1" легален для Json а вот структуру Результат.1 не исполнить. 3. Если программа планирует локализацию на другой язык то хочется точно понимать это строка нуждается в переводе или нет, для свойств это понять сложнее чем для строк.
@user-bf2us9ow5c
@user-bf2us9ow5c 7 ай бұрын
Привет! Я бы еще в запросе изменил названия полей выборки, что бы потом в цикле через функцию ЗаполнитьЗначенияСвойств(), заполнил структуру. Так было бы более правильнее чем обращаться через точку к свойствам
@user-jl8ix3hy7m
@user-jl8ix3hy7m 8 ай бұрын
Свой роутер я делал недавно, но не по своей воле) У заказчика так было описано API что разные действия должны идти по одному url а уже в теле запроса в json есть поле с описанием команды.
@yellow_club
@yellow_club 8 ай бұрын
Жуть)
@You2Ber42
@You2Ber42 8 ай бұрын
@@yellow_clubэто называется JSON RPC вполне удобно так же как и использоваение GraphQL. В системах которые чуть сложнее чем просто интернет ларек подобные механизмы позволяют сильно упростить и ускорить разработку и доработку. т.е. это не жуть а просто другой подход.
@RuslanEdokov
@RuslanEdokov 8 ай бұрын
Отличный разбор, есть интересные моменты. Только я бы сначала написал бы тестов, которые бы подтверждали работоспособность обработки, а потом уже вносил изменения. А то внося достаточно существенные изменения мы не контролируем стабильность результата.
@yellow_club
@yellow_club 8 ай бұрын
Согласен. Для изначальной версии обработки написать тесты сложно. Тк полная каша в коде. Код не приспособлен для тестов
@user-kq9zl3ct7q
@user-kq9zl3ct7q 8 ай бұрын
Стоит разрешение экрана делать покрупнее - очень мелкий текст для телефона. Спасибо за видео.
@yellow_club
@yellow_club 8 ай бұрын
Не ожидал, что кто-то будет смотреть с телефона. Попробую в следующий раз увеличить экран. Спасибо за совет
@yan-digger
@yan-digger 7 ай бұрын
@@yellow_club Я тоже смотрю с телефона
@VelikiiYA
@VelikiiYA 7 ай бұрын
только с телефона и смотрю.
@EvilBloodEye
@EvilBloodEye 8 ай бұрын
Просто вызов исключений в контексте HTTP-сервиса вернет 500 ошибку, если не перехватывать. А если перехватывать - надо как-то анализировать вид исключения. Это можно сделать начиная с платформы 8.3.21, где появились новые возможности по работе с исключениями. Просто подавлять любое исключение в функции и считать это ошибкой авторизации небезопасно т.к. любая опечатка внутри метода будет отображаться как ошибка авторизации, хотя ей не является.
@yellow_club
@yellow_club 8 ай бұрын
Спасибо! Хорошее замечание
@yellow_club
@yellow_club 8 ай бұрын
Как тебе вариант: краткую ошибку возвращать, а подробную ошибку писать в ЖР? И дальше по ЖР разбирать проблему?
@EvilBloodEye
@EvilBloodEye 8 ай бұрын
@@yellow_club кажется это несколько другая задача. Нам нужно как-то различать внутри функции ошибки авторизации (для формирования 401 ответа) и внутренние ошибки (для формирования 500 ответа). Если не рассчитывать на функциональность 21 платформы, то можно возвращать структуру с кодом и текстом ошибки. То есть написать "Возврат ОписаниеОшибкиАвторизации(ТекстОшибки)", внутри которой формировать структуру с кодом и текстом. А 500 тогда будут действительно при внутренних ошибках и не спрячутся в 401. А по краткой, в целом ошибки http-сервисов не пишутся в журнал автоматом, поэтому на мой взгляд принципа "краткую ошибку возвращать, а подробную ошибку писать в ЖР" нужно всегда придерживаться =)
@tetraren
@tetraren 8 ай бұрын
Да, верно. REST API вышел из чата.
@zeegin
@zeegin 8 ай бұрын
​@@EvilBloodEyeкак безопасник я с тобой категорически не согласен. Возвращая 500 а методах авторизации ты даёшь возможность прощупывать твою систему пентестами на наличие скрытых дефектов в методах авторизации, а это недопустимо. Для других методов (не авторизации) ты прав.
@user-ts6js1ev7d
@user-ts6js1ev7d 8 ай бұрын
хорошо бы в 1440p. Материал годный. Спасибо.
@yellow_club
@yellow_club 8 ай бұрын
Нет технической возможности в 1440 снимать
@tiniji86
@tiniji86 8 ай бұрын
Спасибо за видео. Узнал несколько интересных вещей. Но в одной части видео говорится что не будет использовать выделение в отдельную функцию, т.к. используется один раз, но при этом создаются НовыйДанныеАвторизации и подобные функции которые используются один раз ?
@yellow_club
@yellow_club 8 ай бұрын
Конструкторы структур лучше всегда делать
@Gesperid
@Gesperid 8 ай бұрын
Топ контент. Свои роутеры запросов в куче конф. Многие чуть ли не за стандарт считают. Откуда это пошло?!
@yellow_club
@yellow_club 8 ай бұрын
Не понимают как надо делать. Может в ранних типовых подсмотрели плохие примеры
@shrayky
@shrayky 8 ай бұрын
@@yellow_club а если у меня роутер во внешней обработке? Потому что лень сотню рибов обновлять ради небольших изменений в api...
@yellow_club
@yellow_club 8 ай бұрын
@shrayky сочувствую) ненавижу риб 😭
@shrayky
@shrayky 8 ай бұрын
​@@yellow_clubу всего есть свои плюсы и минусы😂
@SergiyDalishchinskiy
@SergiyDalishchinskiy 8 ай бұрын
Я за "свой" роутер. Нормальный сервис со всеми методами выглядит монструозно и менее читабельно, кто бы не говорил. Даже ваш пример. Вот есть у нас "Чаты". Когда создаешь методы стандартно метадаными в конфе СписокЧатов, ДобавитьЧат и ИнфоЧата - оно потом раскидано. Добавь еще несколько (СписокУчастников и т.п.) и там вакханалия получиться. А вот создав просто "Чаты" и там себе обрабатывай методы внутри. Отдельно "Участники", отдельно "Чаты". Но насчет маршруты отдельно, логика отдельно это однозначно +. А внутреняя система роутинга конфигуратора, на мой вкус "-" Если 1С добавит подмаршруты(как подсистемы например) в метаданые тогда я перейду на роутер из коробки, а так пока свой.
@arshanskiysergey2791
@arshanskiysergey2791 8 ай бұрын
после запятых пробелы надо ставить
@panfilovandrey
@panfilovandrey 2 ай бұрын
Здравый разбор, есть к чему придраться, но это мелочи...
@user-kv9zn6dx7m
@user-kv9zn6dx7m 8 ай бұрын
А как реализованны эти полоски между структурами если и циклы. Которые ведут от нчала к концу, и пробелы выделены какойто точкой (звездочкой)
@yellow_club
@yellow_club 8 ай бұрын
В ответах на закреплённый комментарий есть ответ
@PTolkachev
@PTolkachev 8 ай бұрын
По поводу "неправильной структуры хранения данных" (27:50 - 30:20). Нормальная структура, одним запросом всё можно выбрать, правда, понадобится временная таблица значений, которую необходимо поместить во временную таблицу пакета запросов. Что так же позволит не реализовывать собственную сортировку массива с чатами, как в конце оригинальной функции. Вот такая получилась у меня процедура "ПолучитьТелоОтветаЧатыСписок" (в моём варианте она называется "СписокЧатовПользователя"): Функция СписокЧатовПользователя(Пользователь) Результат = Новый Массив; Запрос = Новый Запрос(ТекстЗапросаСписокЧатовПользователя()); Запрос.УстановитьПараметр("Пользователь", Пользователь); Запрос.УстановитьПараметр("ДатыПоследнихСообщений", ДатыПоследнихПрочитанныхСообщенийПользователя(Пользователь)); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Чат = НовыйСтруктураЧата(); // ориг. ПолучитьСтруктуруЧата Чат["id"] = Строка(Выборка.Чат.УникальныйИдентификатор()); Чат["isGroupChat"] = Выборка.ЭтоГрупповойЧат; // В строке ниже, по всей видимости, тоже "запрос в цикле". Зная исходный код функции "ПредставлениеЧата" // (ориг. "ПолучитьПредставлениеЧата"), это тоже можно получить в основном запросе. Чат["represent"] = Сок_Чат.ПредставлениеЧата(Выборка.Чат, Пользователь); Чат["lastMessage"] = ПредставлениеПоследнегоСообщенияЧата(Выборка, Пользователь); Чат["lastMessageDate"] = Выборка.ДатаПоследнегоСообщения; Чат["unreadMessagesCnt"] = Выборка.КоличествоНепрочитанных; Результат.Добавить(Чат); КонецЦикла; Возврат Результат; КонецФункции
@PTolkachev
@PTolkachev 8 ай бұрын
Процедура выше, конечно, получалась лаконичной, но теперь текст запроса превратился в "портянку": Функция ТекстЗапросаСписокЧатовПользователя() Возврат "//////////////////////////////////////////////////////////////////////////////// |// 1. Помещение таблицы дат последних прочитанных сообщений во временную таблицу |// ВТ_ДатыПоследнихПрочитанныхСообщений для последующего подсчёта количества |// непрочитанных сообщений. | |ВЫБРАТЬ | ДатыПоследнихСообщений.Чат КАК Чат, | ДатыПоследнихСообщений.Дата КАК Дата |ПОМЕСТИТЬ ВТ_ДатыПоследнихПрочитанныхСообщений |ИЗ | &ДатыПоследнихСообщений КАК ДатыПоследнихСообщений | |ИНДЕКСИРОВАТЬ ПО | Чат, | Дата |; | |//////////////////////////////////////////////////////////////////////////////// |// 2. Помещение чатов пользователя во временную таблицу ВТ_Чаты для последующей |// обработки. | |ВЫБРАТЬ РАЗЛИЧНЫЕ | Чаты.Ссылка КАК Ссылка, | Чаты.Ссылка.ЭтоГрупповойЧат КАК ЭтоГрупповойЧат |ПОМЕСТИТЬ ВТ_Чаты |ИЗ | Справочник.Сок_Чаты.Участники КАК Чаты |ГДЕ | Чаты.Участник = &Пользователь | И НЕ Чаты.Ссылка.ПометкаУдаления | |ИНДЕКСИРОВАТЬ ПО | Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |// 3. Определение дат последних сообщений чатов пользователя и помещение их во |// временную таблицу ВТ_ДатыПоследнихСообщений. | |ВЫБРАТЬ | Сообщения.Основание КАК Чат, | МАКСИМУМ(Сообщения.Дата) КАК Дата |ПОМЕСТИТЬ ВТ_ДатыПоследнихСообщений |ИЗ | РегистрСведений.Сок_СообщенияЧатов КАК Сообщения | |СГРУППИРОВАТЬ ПО | Сообщения.Основание | |ИНДЕКСИРОВАТЬ ПО | Чат, | ДатаПоследнегоСообщения |; | |//////////////////////////////////////////////////////////////////////////////// |// 4. Возможна ситуация, когда в одну и ту же дату с точностью до секунды пришло |// два сообщения. Поэтому необходима ещё одна временная таблица |// ВТ_УИДПоследнихСообщений, где последнее сообщение из нескольких с одинаковой |// датой определяется по максимальному УИД. | |ВЫБРАТЬ | Сообщения.Основание КАК Чат, | МАКСИМУМ(Сообщения.УИД) КАК УИД |ПОМЕСТИТЬ ВТ_УИДПоследнихСообщений |ИЗ | РегистрСведений.Сок_СообщенияЧатов КАК Сообщения | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ДатыПоследнихСообщений КАК ДатыПоследнихСообщений | ПО Сообщения.Основание = ДатыПоследнихСообщений.Чат | И Сообщения.Дата = ДатыПоследнихСообщений.Дата | |СГРУППИРОВАТЬ ПО | Сообщения.Основание | |ИНДЕКСИРОВАТЬ ПО | Чат, | УИД |; | |//////////////////////////////////////////////////////////////////////////////// |// 5. Получение данных последнего сообщения (чат, дата, автор и т.п.) и |// помещение их во временную таблицу ВТ_ПоследниеСообщения. | |ВЫБРАТЬ | Сообщения.Основание КАК Чат, | Сообщения.Дата КАК Дата, | Сообщения.Автор КАК Автор, | Сообщения.Автор.Наименование КАК АвторПредставление, | Сообщения.Сообщение КАК Сообщение |ПОМЕСТИТЬ ВТ_ПоследниеСообщения |ИЗ | РегистрСведений.Сок_СообщенияЧатов КАК Сообщения | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_УИДПоследнихСообщений КАК УИДПоследнихСообщений | ПО Сообщение.Чат = УИДПоследнихСообщений.Чат | И Сообщение.УИД = УИДПоследнихСообщений.УИД | |ИНДЕКСИРОВАТЬ ПО | Чат |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВТ_УИДПоследнихСообщений |; | |//////////////////////////////////////////////////////////////////////////////// |// 6. Подсчет количества непрочитанных сообщений по данным временной таблицы |// ВТ_ДатыПоследнихСообщений и помещение результата во временную таблицу |// ВТ_КоличествоНепрочитанныхСообщений. | |ВЫБРАТЬ | Сообщения.Основание КАК Чат, | КОЛИЧЕСТВО(РАЗЛИЧНЫХ Сообщения.УИД) КАК Количество |ПОМЕСТИТЬ ВТ_КоличествоНепрочитанныхСообщений |ИЗ | РегистрСведений.Сок_СообщенияЧатов КАК Сообщения | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ДатыПоследнихСообщений КАК ДатыПоследнихСообщений | ПО Сообщение.Основание = ДатыПоследнихСообщений.Чат | И (Сообшение.Дата > ДатыПоследнихСообщений.Дата) | |ИНДЕКСИРОВАТЬ ПО | Чат |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВТ_ДатыПоследнихСообщений |; | |//////////////////////////////////////////////////////////////////////////////// |// 7. Соединение данных временных таблиц в один результат запроса. | |ВЫБРАТЬ | Чаты.Ссылка КАК Чат, | Чаты.ЭтоГрупповойЧат КАК ЭтоГрупповойЧат, | ЕСТЬNULL(ПоследниеСообщения.Дата, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаПоследнегоСообщения, | ЕСТЬNULL(ПоследниеСообщения.Автор, ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)) КАК АвтоПоследнегоСообщения, | ЕСТЬNULL(ПоследниеСообщения.АвторПредставление, """") КАК АвтоПоследнегоСообщенияПредставление, | ЕСТЬNULL(ПоследниеСообщения.Сообщение, """") КАК ТекстПоследнегоСообщения, | ЕСТЬNULL(КоличествоНепрочитанныхСообщений.Количество, 0) КАК КоличествоНепрочитанных |ИЗ | ВТ_Чаты КАК Чаты | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПоследниеСообщения КАК ПоследниеСообщения | ПО Чаты.Ссылка = ПоследниеСообщения.Чат | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_КоличествоНепрочитанныхСообщений КАК КоличествоНепрочитанныхСообщений | ПО Чаты.Ссылка = КоличествоНепрочитанныхСообщений.Чат | |УПОРЯДОЧИТЬ ПО | ЕСТЬNULL(ПоследниеСообщения.Дата, ДАТАВРЕМЯ(1, 1, 1))"; КонецФункции
@PTolkachev
@PTolkachev 8 ай бұрын
Ну и вспомогательные функции: Функция ДатыПоследнихПрочитанныхСообщенийПользователя(Пользователь) Если Не ЗначениеЗаполнено(Пользователь) Тогда Возврат НовыйДатыПоследнихСообщений(); КонецЕсли; ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( Пользователь.ИдентификаторПользователяИБ ); НастройкиФормыМессенджер = ХранилищеОбщихНастроек.Загрузить("Сок_Чаты", "ОбщиеНастройкиФормыМессенджера"); Если НастройкиФормыМессенджер Неопределено Тогда Возврат НастройкиФормыМессенджер.ДатыПоследнихПрочитанныхСообщений; Иначе Возврат НовыйДатыПоследнихСообщений(); КонецЕсли; КонецФункции Функция НовыйДатыПоследнихСообщений() Результат = Новый ТаблицаЗначений; Результат.Колонки.Вставить("Чат", Новый ОписаниеТипов("СправочникСсылка.Сок_Чаты")); Результат.Колонки.Вставить("Дата", Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя))); Возврат Результат; КонецФункции Функция ПредставлениеПоследнегоСообщенияЧата(Чат, Пользователь) ПоследнееСообщение = ""; Если Чат.ЭтоГрупповойЧат Тогда ПоследнееСообщение = ?(Чат.АвтоПоследнегоСообщения = Пользователь, НСтр("ru='Вы'"), Чат.АвтоПоследнегоСообщенияПредставление ) + ": "; КонецЕсли; ПоследнееСообщение = ПоследнееСообщение + СтроковыеФункцииКлиентСервер.ИзвлечьТекстИзHTML(Чат.ТекстПоследнегоСообщения); Возврат ПоследнееСообщение; КонецФункции
@PTolkachev
@PTolkachev 8 ай бұрын
p.s. Если кто-то захочет лучше ознакомиться с исходным кодом, то просто создайте внешнюю обработку и поместите в неё весь код из комментариев выше.
@yellow_club
@yellow_club 8 ай бұрын
Спасибо за код. Есть сложность ДатаПоследнегоПрочитаногоСообщения зависит не только от пользователя, но и от конкретного чата
@PTolkachev
@PTolkachev 8 ай бұрын
@@yellow_club ну я всё писал "вручную" (в том числе и запросы) по стоп-кадру видео, т.к. лень было добавлять соответствующие объекты конфигурации для проверки. Там ещё и синтактические ошибки могут быть. Пытался передать суть. А по делу, добавить в таблицу значений "ДатыПоследнихПрочитанныхСообщений" колонку "Пользователь", заполнять её текущим пользователем, ну и соединение в запросе с этой таблицей по пользователю добавить.
@AndrewZED84
@AndrewZED84 8 ай бұрын
Если я не ошибаюсь, имена процедур и функций написаны в SnakeCase стиле, а ортодоксальные 1С-ники пишут в стиле CamelCase))
@avbolshakov
@avbolshakov 8 ай бұрын
ПаскальКейс. кемелКейс.
@PTolkachev
@PTolkachev 8 ай бұрын
есть snake_case и два camelCase / CamelCase. Для последних двух тоже есть уточняющие названия: UpperCamelCase и lowerCamelCase.
@user-um3hd5ds1l
@user-um3hd5ds1l 6 ай бұрын
Бывает так, что тебе накидают задач, которые нужно сделать прямо сейчас, и времени на написание по фэншую нет. Думаешь, что потом все исправишь, а потом поступают новые задачи и т.д.
@user-jo6hk7vp6w
@user-jo6hk7vp6w 8 ай бұрын
Терпеть не могу, когда пробелы и табуляцию не ставят. Отпадает всякое желание вникать в код
@user-xh5hd3my4t
@user-xh5hd3my4t 8 ай бұрын
услышал: "Создать функцию "Получить...". Стандарты 1с вроде бы говорят не начинать функции с этого слова?) или я ошибаюсь
@yellow_club
@yellow_club 8 ай бұрын
Послышалось) Получить не стоит использовать
@info_infoman
@info_infoman 8 ай бұрын
Народ, а как вы изучаете внутрянку например ЕРП не имея конфы ЕРП в открытом доступе? Кто как выкручивается?
@olegshpilevoy
@olegshpilevoy 8 ай бұрын
А на руборде в варезнике сейчас добрые люди перестали выкладывать конфы?
@info_infoman
@info_infoman 8 ай бұрын
@@olegshpilevoy там все хуже и хуже если бесплатно...
@ru21ru1
@ru21ru1 8 ай бұрын
​@@olegshpilevoyзачем ты сдал такой ресурс. Щас прикроют
@artur_webdesigngevorgyan5771
@artur_webdesigngevorgyan5771 8 ай бұрын
Этот код http сервис он уникален или каждый разработчик по своему пишет ?
@yellow_club
@yellow_club 8 ай бұрын
Каждый сервис пишется под конкретную задачу
@hren_hrenov
@hren_hrenov 8 ай бұрын
Именно с таким лицом, как на обложке, только побольше ярости, я лезу в конфигуратор😂😂😂
@yellow_club
@yellow_club 8 ай бұрын
Да, в конфигураторе не удобно работать) ярость иногда просачивается)
@Kharieste_Ang
@Kharieste_Ang 8 ай бұрын
@@yellow_clubа где вы программируете, если не в конфигураторе?
@Mr_Kitaev
@Mr_Kitaev 8 ай бұрын
В ОтветЧат можно было (и стоило) оставить выборку. Зачем выгрузка в таблицу? Данные не меняются, а память съедается
@yellow_club
@yellow_club 8 ай бұрын
Для больших таблиц верное замечание. Если в таблице меньше 1000, то разница не ощутима.
@timurdanilenko3582
@timurdanilenko3582 8 ай бұрын
ТоляЯЯЯЯЯЯЯ. Ты опять пробелов понаставил?))))) 6 лет лет уже прошло, до сих пор не отлегло)
@yellow_club
@yellow_club 8 ай бұрын
Не понял тебя) что не так с пробелами?)
@timurdanilenko3582
@timurdanilenko3582 8 ай бұрын
@@yellow_club да нет же. Работал с одним Толиком, у того разбег между функциями\процедурами был в полэкрана. На вопрос зачем ты так делаешь (пустые строки вставляешь намеренно), отвечал, что если придет еще мысль - дописать. Типа как на листочке, оставляешь место, чтоб дописать
@yellow_club
@yellow_club 8 ай бұрын
@@timurdanilenko3582 ахаха) интересный способ)
@timurdanilenko3582
@timurdanilenko3582 8 ай бұрын
@@yellow_club тебе смешно (и мне сейчас), а человек серьезно говорил.
@Gesperid
@Gesperid 8 ай бұрын
Хорошо бы шрифт покрупнее и окно конфигуратора на весь экран, а себя в уголок поставить.
@yellow_club
@yellow_club 8 ай бұрын
А что не удалось прочитать?
@Gesperid
@Gesperid 8 ай бұрын
@@yellow_club Удалось, но. 1. Приходится прилагать усилия - переводить взгляд с двигающегося тебя на код. Себя лучше справа внизу. 2. Приходится всматриваться в мелкий код, сложнее сфокусировать взгляд.
@yellow_club
@yellow_club 8 ай бұрын
@Gesperid размер кода не страдает. Он ровно такой, как у полностью развёрнутого конфигуратора.
@Gesperid
@Gesperid 8 ай бұрын
@@yellow_club Мы читаем слева направо, а когда слева мельтешение - я начинаю читать следующую строку кода начиная с тебя.
@yellow_club
@yellow_club 8 ай бұрын
Согласен! Спасибо 🙏 перемещусь вправо
@kaaasteeenTV
@kaaasteeenTV 8 ай бұрын
41:05, очень не рекомендуется, использовать имя переменной "Строка", так как это зарезервировано системой, далее может привести к ошибкам. Поэтому вместо "Для каждого Строка Из Данные Цикл", лучше "Для каждого СтрокаДаных Из Данные Цикл". Понимаю, что для многих это привычка, но постарайтесь этого не делать. Тоже самое касается пресловутой переменной "Стр" в циклах.
@Gesperid
@Gesperid 8 ай бұрын
И чем может навредить использование в качестве имен переменных "Строка" и "Стр"?
@yellow_club
@yellow_club 8 ай бұрын
Знаю метод Строка(), но вот чтобы слово Строка было зарезервированным не видел такого
@kaaasteeenTV
@kaaasteeenTV 8 ай бұрын
@@yellow_club, Это я имел ввиду. Неправильно использовать переменные, которые называются так же как и методы.
@kaaasteeenTV
@kaaasteeenTV 8 ай бұрын
​@@Gesperid, вред от СТР такой же как и от переменных с именами Объект1, Элемент 2. Это максимально неинформативно и не читаемо со стороны другого программиста. Ведь именно на это сделали упор в данном видео при разборе кода)
@Gesperid
@Gesperid 8 ай бұрын
​​@@kaaasteeenTVДля чего раздувать в локальном контексте имена переменных Строка до СтрокаДанных?! Не надо раздувать тело цикла, тогда все будет кристально понятно.
@TresModiosVir
@TresModiosVir 8 ай бұрын
Использование исключения вместо условных операторов - один из признаков плохого кода
@yellow_club
@yellow_club 8 ай бұрын
Почему?
@Fellarin
@Fellarin 7 ай бұрын
@@yellow_club потому что при отладке с установленным "останавливать по ошибке" получаешь кучу срабатываний на исключениях. Это тупо бесит
@vladyan01
@vladyan01 8 ай бұрын
Почему разрабы bsl сделали "", вместо "!=". Это же неудобно, вроде они 1С на С++ писали, а там "!=", откуда они "" нашли непонятно)
@TresModiosVir
@TresModiosVir 8 ай бұрын
из математики
@vladyan01
@vladyan01 8 ай бұрын
@@TresModiosVir в математике же знак "≠"
@vladyan01
@vladyan01 8 ай бұрын
возможно из паскаля кстати взяли
@arshanskiysergey2791
@arshanskiysergey2791 8 ай бұрын
4:10 поправлять форматирование встроенными средствами 1С опасно, т.к. если есть перенос строки то конфигуратор новую строку поставит без дополнительного отступа
@alexivanov8180
@alexivanov8180 8 ай бұрын
Код, в 1с, ору))))
@yellow_club
@yellow_club 8 ай бұрын
А что смешного?
@user-et7iu5qm2e
@user-et7iu5qm2e 8 ай бұрын
Не очень хорошо вызывать функцию для создания структуры. Инициализацию проводить при создании структуры!!! 1.Для того чтобы увидеть внутренности этой структуры нужно перейти в эту функцию, хорошо когда она близко и кода на пару сотен строк, а если её расположили в какой-нибудь области "инициализации", то расставлять закладки и прыгать как блоха. 2.При передаче объектов из функции в функцию, что происходит? правильно - копирование объектов... давайте посмотрим как тормозит наш замечательный продукт.
@Lex_Liven
@Lex_Liven 8 ай бұрын
1. Согласен. 2. А вот тут неверно. Чтобы 1С скопировала параметр - его нужно специально прописывать с ключевым словом Знач. По умолчанию она их передает по ссылке. И это иногда самое подлое, когда внутри функции втихаря какие-то параметры меняют.
@You2Ber42
@You2Ber42 8 ай бұрын
3:10 Тут же все написано ИмяПользователя, ПарольВходящий. Что не понятно тебе ? Плодить функции которые вызываются один раз и состоят из одной 2х строк, тоже не лучший выход. Конкретно по этому куску кода ключевая проблема что проверка на пустой токен первый раз выполняется уже ближе к средине кода, когда уже мы поискали по справочнику пользоваетелей. Если уж и придераться к понятности кода то логично сделать отдельно функцию парсера токена, которая вернет структуру токена авторизации и отдельно уже поискать по справочникам. Ну или хотя бы в рамках одной процеуры разнести отдельно парсинг токена и работу с ИБ (поиск пользователя, хеширование пароля). Сейчас же это выглядит как поток сознания записанный в код, как человек в голове решал задачу в том поряке и записал. 5:15 Тут вообще цирк. Из контекста понятно что эта процедура вызывается часто. Справочник пользователи может содержать и 300-400 записей спокойно. И вот вместо того что бы в цикле прочитать по индексу (т.е. мгновенно, бесплатно) несколько ссылок (по количеству участников чата) ты предлагаешь каждый раз вычитывать условно весь справочник из базы. Это бред. Максимум если предположить что есть большие чаты с 100-200 участников то есть смысл подумать об использовании ПовтИсп модуля для получения + переиспользование сеансов. В целом после просмотра твоего разбора создалось впечатление что ты сам слабо понимаешь в разработке и за плечами нет 5-7 лет разработки, так как придераешься в основном к тому что написано в стандартах разработки (для этого ума не надо) не понимая сути того что написано там.
@yellow_club
@yellow_club 8 ай бұрын
Спасибо за мнение
@user-gu5ty9zq3m
@user-gu5ty9zq3m 8 ай бұрын
Это видео рассчитано на начинающих разработчиков как и весь канал. Никто не погружался толком в это все я уверен. А вообще отдельный плюс за то что указано что огороды городить не надо и есть JWT токены готовые. НУ или Open id технология. В целом обычный рефакторинг из нечитаемого в что то более или менее сносное. Кому надо тот оценит. Такого контента маловато.
@You2Ber42
@You2Ber42 8 ай бұрын
@@user-gu5ty9zq3m 70% из того что говорит блогер тебе скажет сонар куб, не удивлюсь если он перед записью видео прогнал его по этому коду и пересказывает его выдачу. Это не то чем нужно забивать голву джунам, и вообще разработчикам. Там по коду большое количество реальных проблем, которые остались не замеченными. Примеры этих проблем я привел в своем сообщении. Я плотно работаю с джунами, и заметил тенденцию что если раньше джуны бездумно писали сложные запросы в циклах, то теперь они так же бездумно вычитывают весь справочник перед циклом на 4-5 итераций для обработки 4 строк, потому что "запрос в цикле это плохо". И теперь примерно понятно откуда это все берется.
@yellow_club
@yellow_club 8 ай бұрын
@@user-gu5ty9zq3m а почему ты считаешь, что ЖК - канал для начинающих?
@user-gu5ty9zq3m
@user-gu5ty9zq3m 8 ай бұрын
@@yellow_club выше оратор уже ответил. Я давно с ним солидарен.
@Mrnuctoh
@Mrnuctoh 7 ай бұрын
Ох уж эти любители функций ради одной строки! Но чтобы это не смотрелось так мелочно, мы эту одинокую строку заменим четырьмя! А знает ли уважаемый спикер, что 1С - язык интерпретируемый, а это значит, что движение курсора интерпретации от строки к строке с инициализацией и входом в функцию снижает производительность вашей конфигурации. Звучит как крохоборство, да? На больших циклах такое размазывание кода может дать ощутимое снижение производительности вплоть до того, что будет занимать больше времени, чем бизнес-логика. Ну и о распухании конфигурации не молчим. УПП - 1,5 млн строк кода, ERP - уже 7,5. Пока индекс поиска построится, поседеть можно. И последнее - запрятав структуру в функцию, мы ухудшили читабельность нашей довольно компактной процедуры. До этого структура нашей структуры (пардон) была перед глазами, а теперь надо спускаться в функцию, чтобы ее себе напомнить, плюс мы сломали контекстную подсказку и замедлили себе работу. В общем, на первых же минутах рекомендаций опытным происходит такой бррр. Дизлайк-отписка.
@yellow_club
@yellow_club 7 ай бұрын
Ну это ничего) просто у вас пока стадия: гнев) Желаю побыстрее дойти до стадии «принятие»
@Mrnuctoh
@Mrnuctoh 7 ай бұрын
@@yellow_club О, не волнуйтесь. За 15 лет стажа я только укрепился в своих словах. Мы сначала напишем в соглашении о качестве кода "Функция длиной более двух экранов требует декомпозиции", затем ниже "Любой результат вычислений требуется помещать в переменную" и "тернарный оператор запрещается". В результате вместо одной строки типа "Текст = ?(Показатель1*Показатель2 > Показатель3, "Текст 1", "Текст 2")" мы напишем шесть, наша функция раздуется, и мы начнем думать - как же упаковать ее в два экрана? Начнем декомпозировать, а у нас ОЙ сложная бизнес-логика, мы начнем изобретать какие-то немыслимые переменные, куда будем складывать контекст выполнения, которые нам придется протаскивать по этим декомпозирующим функциям, мы обязательно будем забывать какие свойства есть у этих переменных с контекстом. Мы изнасиловали себя стеками вроде СотрудникиКлиентБазовый.СотрудникиОбработкаОповещения() СотрудникиКлиентРасширенный.СотрудникиОбработкаОповещения() СотрудникиКлиентВнутренний.СотрудникиОбработкаОповещения() СотрудникиКлиент.СотрудникиОбработкаОповещения() и загнали себя провалами в этот ад при отладке, и тут выходите вы, весь в белом фраке, и заявляете, что инициализация структур через функции - наш путь. Ну окей. Вместо 15 минут на функцию я потрачу час. А разраб, который придет после меня смотреть в эту функцию, вместо 30 минут потратит 2 часа на анализ этих макаронных фабрик. Что не выгодно никому - ни самому разрабу, у которого качество кода снижается, ни заказчику, который за это платит. Нет, я не заявляю, что надо писать простыни на тысячи строк. Надо придерживаться принципа разумной достаточности. Которого, к сожалению, нет ни в стандартах разработки 1С (раз они рождают шедевры типа ERP, по количеству строк кода бОльшую, чем сумма строк УПП, УТ, БП и ЗУП вместе взятых, при том что у трех последних БСП общая) ни в ваших рекомендациях.
@user-ut8lq8zb2r
@user-ut8lq8zb2r 8 ай бұрын
Все равно Павел Королев топ, даже не обсуждается.
@yellow_club
@yellow_club 8 ай бұрын
Конечно. Павел Королев круче всех.
@iamok4770
@iamok4770 8 ай бұрын
Как он бесит меня.Если этот чувак вас бесит ставим лайк.
@yellow_club
@yellow_club 8 ай бұрын
Поддерживаю😂 лайк поставил
Разбор загрузки из Excel для мидлов и сеньоров
23:16
Желтый клуб — 1С программирование
Рет қаралды 16 М.
Рекомендации по улучшению хорошего кода на 1С
32:00
Желтый клуб — 1С программирование
Рет қаралды 14 М.
Pokey pokey 🤣🥰❤️ #demariki
00:26
Demariki
Рет қаралды 6 МЛН
顔面水槽をカラフルにしたらキモ過ぎたwwwww
00:59
はじめしゃちょー(hajime)
Рет қаралды 36 МЛН
Eccentric clown jack #short #angel #clown
00:33
Super Beauty team
Рет қаралды 21 МЛН
Варианты работы базой 1С:  файловый и клиент-серверный
27:05
Разбор загрузки из Excel для джунов
9:24
Желтый клуб — 1С программирование
Рет қаралды 10 М.
Как эффективно использовать 1С:БСП
2:19:17
Желтый клуб — 1С программирование
Рет қаралды 22 М.
Суть 1С программирования за 25 минут
26:44
Желтый клуб — 1С программирование
Рет қаралды 318 М.
Курс «Разработчик 1С» от Яндекс Практикума: плюсы и минусы!/ Кому подойдет курс?
25:27
Практика чистого кода на 1С
3:42:51
Желтый клуб — 1С программирование
Рет қаралды 61 М.
ПОЧЕМУ IT НЕ СДЕЛАЕТ ТЕБЯ БОГАТЫМ?
12:51
Pokey pokey 🤣🥰❤️ #demariki
00:26
Demariki
Рет қаралды 6 МЛН