1С и AI, полезные инструменты и сервисы, стандарты и паттерны
2.25K subscribers
66 photos
11 videos
8 files
144 links
1С и AI - инструменты и сервисы, стандарты разработки и паттерны, нейронки, cursor, mcp, docker, шаблоны кода и т.д.
Обратная связь, публикации: @usefultools1c_bot
Download Telegram
Forwarded from 1С:Борщ🥘
Кстати, к вопросу последовательности работы обработчиков записи объекта, у меня есть хорошая картинка, которая наглядно это все описывает🔥
👍18
#ИИ #Халява
Сегодня меня угостили вот такой вещицей. Проверил, делюсь.

Google дарит месяц бесплатной подписки Gemini Enterprise!

Что в плюсах:
До 10 видео в день через Veo 3.
Собственный ИИ‑агент: пишет тексты в стиле вашего бренда.
Deep Research: 200 отчётов/день (вместо 5–20 в месяц на стандартных тарифах!).
Увеличенное контекстное окно модели.

Регистрация тут

Работает без карты и лишних телодвижений!

П.С. Из РФ не работает.
👍1
Обращения к виртуальным таблицам

🟡Все условия, относящиеся к виртуальной таблице, передавайте в ее параметры, а не в ГДЕ.

🟡Так СУБД быстрее выберет план и не обработает лишние записи.

🟡В параметрах используйте простые условия вида Измерение = Значение.

🟡Подзапросы и соединения в параметрах — только в исключениях и по строгим правилам.

🟡Если условий с подзапросами много — оставьте одно самое фильтрующее, остальные перенесите наружу или используйте временную таблицу.

#std657
https://v8std.ru/std/657/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Forwarded from 1Cnik
🧩 Визуальная шпаргалка по выбору модуля для размещения кода

Часто ли вы задумываетесь: в каком модуле лучше разместить этот кусочек кода? Чтобы не гадать, следуйте золотому правилу размещения кода: стандарту 486. Более подробно про модули можно почитать в методических рекомендациях ИТС:
🔘Программные модули в 1С:8
Или в статье на IS:
🔘Модули платформы 1С

Пруф: myblog-1c.ru

#НачинающимНаЗаметку #Практика1С
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
Ввожу небольшую рубрику — База по AI ✍️

Первой темой будет MCP и MCP серверы:

MCP (Model Context Protocol) — это open-source стандарт, который позволяет приложениям с LLM "общаться" с внешними приложениями 📞

Приложение с LLM по MCP обращается к специальному серверу, который в свою очередь будет обращаться к какому-то внешнему приложению. Это и есть MCP-сервер. У MCP-серверов есть 3 возможности:

⚙️ Инструменты (tools) — с их помощью LLM может вызвать API методы приложений или выполнить какой-нибудь код. То есть отдельный tool — отдельный сценарий действий;

ℹ️ Ресурсы (resources) — получение пассивных данных, тут доступно только чтение. Например чтение одного лог файла;

💬 Промпты (prompts) — предварительно созданные шаблоны инструкций, указывающие модели, как работать с конкретными инструментами и ресурсами.

Во время общения пользователя с LLM приложением, которое подключено к такому MCP-серверу, LLM будет получать, помимо промпта пользователя, информацию о всех доступных tools, resources и prompts и будет вкурсе всех возможностей, которые сможет сделать.

Этот подход унифицирует подключение приложений с LLM или AI-клиентов к внешним системам. С MCP делаешь один сервер, и он может работать с разными клиентами.

Разберем пример:

Пользователь обращается к привычному LLM чату в интернете и говорит — "Поставь встречу с клиентом на завтра в 5 часов вечера" 👨‍💻

LLM чат без MCP сервера придумает какой-то ответ, может сохранить это только в рамках диалога, но ничего фактически не сделает ☝️

LLM чат, подключенный к MCP серверу для Google календаря, дополнительно к вопросу пользователя получит от MCP сервера такой блок текста:
[MCP контекст от сервера "gcal-mcp"]

TOOLS:
1) calendar.check_free
Что делает: проверяет, свободно ли время.
Вход: date, time_from, time_to

2) calendar.create_event
Что делает: создает событие в календаре.
Вход: title, date, time_from, time_to

RESOURCES (read-only):
- calendar.timezone
Что это: таймзона пользователя (например, Irkutsk)

PROMPTS:
- prompt: schedule_meeting
Инструкция модели:
1) Возьми timezone из ресурса calendar.timezone.
2) Если длительность не указана — ставь 30 минут.
3) Сначала проверь свободно ли через calendar.check_free.
4) Если свободно — создай событие через calendar.create_event.
5) Если занято — попроси пользователя выбрать другое время


И имея такой контекст LLM сделает следующее:
1️⃣читает ресурс calendar.timezone → "Irkutsk"

2️⃣интерпретирует запрос:
- завтра = (конкретная дата в Irkutsk)
- 17:00
- длительность не указана → 30 минут → 17:00–17:30


3️⃣ вызывает tool calendar.check_free:
calendar.check_free(date=завтра, time_from=17:00, time_to=17:30)

MCP-сервер → ответ:
free=true


4️⃣ вызывает tool calendar.create_event:
calendar.create_event(
title="Встреча с клиентом",
date=завтра,
time_from=17:00,
time_to=17:30,
)

MCP-сервер → ответ: created=true

LLM → финальный ответ пользователю:
"Готово! Поставил встречу на завтра с 17:00 до 17:30."


И в итоге получаем ответ + действие в реальном мире. Пользователь доволен 😃

Например уже сейчас, при помощи расширения от Владимира Харина можно превратить свою 1С в один большой MCP сервер, при помощи стороннего прокси, которое будет вызывать tools прямо внутри вашей 1С и делать всё что нужно в рамках вашей конфигурации!

А по MCP советую изучить официальную документацию 👀

Если вы хотите посмотреть какие вообще существуют MCP сервера для 1С и что они делают, мы с командой BenchLabs добавили новый раздел с MCP серверами на наш сайт и собрали для вас 18 MCP серверов в удобном месте, смотрите подробнее в группе нашего проекта:

Пост с 18 MCP серверами для 1С 😍
➡️ Уже тут

Новый раздел на сайте 🖥
➡️ https://benchlabs.ru/mcp-servers
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Всем привет! 🖐

Продолжаем ковырять типовую конфигурацию в рубрике #ПодКапотомERP

⭐️ Начнем с общего модуля ПартнерыИКонтрагенты.
➡️ПолучитьКонтрагентаПартнераПоУмолчанию
➡️ПолучитьВсехКонтрагентовПартнера
➡️ПолучитьНижестоящихПартнеров
Все это - удобный интерфейс для манипуляций связкой Партнер - Контрагент и иерархией Партнеров.
➡️Когда-то может и "потеряшка" ДенежныеСредстваСервер.ПолучитьПартнераПоКонтрагенту найдет путь к своим собратьям.

⭐️ Дальше у нас РаботаСКурсамиВалютУТ
➡️ПолучитьКоэффициентПересчетаИзВалютыВВалюту
➡️ПолучитьКурсВалюты
➡️ПолучитьКоэффициентыПересчетаВалюты
➡️ПересчитатьВВалюту

Как же много "Получить" в этом посте 😁
Тем не менее, методы от этого менее полезными не становятся 🙃
➡️СформироватьСуммуПрописью - хотя я думаю, что те кто часто делают печатные формы, и так с ним уже знакомы.

⭐️ Еще один интересный зверь - общий модуль СхемыЗапросов.
Знаю много противников использования схем, скажете что даю вредные советы и будете правы - но я не смог обойти его мимо 😁

➡️НайтиЗапросРезультата - Находит в схеме первый запрос, выбирающий результативные данные (то есть, не создающий и не уничтожающий временные таблицы).
❗️ Обратите внимание, что возвращаемое значение - Структура, описание точки схемы запроса, выбирающего данные.
Ну совершенно точно следует раскурить этот модуль целиком )

➡️УстановитьПомещениеВоВременнуюТаблицу - Устанавливает ключевое слово ПОМЕСТИТЬ и имя временной таблицы в текст запроса
➡️УстановитьИндексациюПолейЗапроса - Устанавливает индексацию в выборке
➡️УстановитьВыборкуРазрешенныхЗаписей, УстановитьВыборкуРазрешенныхЗаписейВоВсемЗапросе - Устанавливает в секцию ВЫБРАТЬ ключевое слово "РАЗРЕШЕННЫЕ"

Используйте с умом 😉

А на этом сегодня все 🤘

Знали про эти методы или пишете свои?
👍 - узнали что-то новое
🤝 - не в этот раз
🔥 - у меня свой велопарк, зато без "Получить" без именах методов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🤔2
1️⃣🔤 Количество соединений на процесс

Есть такой параметр в свойствах Рабочего сервера 1С.
По умолчанию он равен 256, но в некоторых сценариях его необходимо менять и вот тут не всё так просто.

Кому можно менять этот параметр?
Всем, и ПРОФ и КОРП лицензии это позволяют (Многие путают этот параметр с параметром "Количество ИБ на процесс", вот он доступен только для КОРП)

Когда стоит менять этот параметр?

❗️Самый частый сценарий, это когда у вас на сервере 1С более одной NUMA-ноды.

Рабочий процесс работает только в рамках одной NUMA-ноды и если на сервере их 2, то мы получаем что сервер загружен максимум на 50% процессорной мощности, а при этом у пользователей ощущаются тормоза.

Распределением процессов по NUMA занимается операционная система и мы можем только увеличить вероятность равномерного распределения увеличив количество процессов.

Нам нужно настроить работу сервера 1С так, чтобы количество Рабочих процессов было хотя бы в 2 раза больше количества NUMA-нод.

Соответственно при 2х NUMA-нодах нам нужно обеспечить наличие минимум 4х Рабочих процессов при стандартной нагрузке на систему.

Практически единственный вариант это сделать – поменять количество соединений на процесс.

И вот тут начинаются тонкости:

1. Соединение не равно сеанс (рис. 1 и рис. 2). Т.е. ориентироваться на кол-во сеансов будет не совсем корректно, на рисунках мы видим что при 66 сеансах у нас 119 соединений
2. В свойствах Рабочего процесса есть поле «Соединений», на рис. 3 видим, что там 119 соединений, также, как и на рис. 2.
3. При этом в вычислении механикой Кластера 1С количества соединений для рабочего процесса НЕ учитываются соединения с номером 0

В нашем примере надо делить не 119 на 4, а 57 (именно столько соединений с ненулевым номером) и получим примерно 16.

❗️Менее частый сценарий - это когда количество соединений получается пограничное.
Т.е. у нас то чуть меньше 256, например 255 соединений, то чуть больше 256, например 259. Ну или чуть меньше и чуть больше текущего значения Количества соединений на процесс.

В итоге мы получаем очень частые старты Рабочих процессов для обслуживания новых соединений, свыше 256, а потом остановку этих же процессов, когда соединения закончили свою работу.

Старт рабочего процесса по требованию кластера это всегда старт с загрузкой контекста баз, а это достаточно тяжёлая операция для ЦПУ и соответственно "дорогая", и надо стремиться к тому чтобы таких операций было не много.

Тут уже подход к количеству соединений не по какой-то формуле, а просто в сторону НЕ кратного уменьшения или увеличения текущего количества соединений, чтобы Рабочие процессы если уж стартанули, то работали долго и счастливо.

Таким образом для корректной настройки параметра Количества соединений на процесс нужно взять только соединения с ненулевым номером.
Быстро это сделать можно выполнив экспорт списка соединений из консоли администрирования 1С в csv файл.

Имейте в виду эти тонкости при настройке своих серверов 1С для сбалансированной работы!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🤔1
Forwarded from DevOps в 1с
Media is too big
VIEW IN TELEGRAM
Всем привет.

Редко сюда пишу, но сегодня реально есть что показать — наконец-то допинал до релиза свою интерпретацию консоли кода для 1С.

Изначально хотелось инструмент, который можно нормально встроить в свою обработку или форму без долгой возни. Базовая интеграция занимает буквально 4 вызова. Подключил — и у тебя на форме уже не просто текстовое поле, а полноценный редактор.

Что в итоге получилось:
• несколько режимов подсветки из коробки: BSL, запросы 1С, СКД, YAML, JSON и XML;
• автодополнение не только по самому языку, но и по метаданным конфигурации;
• возможность формировать свой контекст подсказок, например добавлять переменные, функции и поля структур;
• выполнение BSL-кода прямо из консоли;

Ну и самое вкусное — полноценный режим отладки. С точками останова, пошаговым выполнением, остановками по ошибке, процедурами, функциями.


Код конечно-же открыт:
https://github.com/Segate-ekb/code_editor
👍26
Сегодня доделаны все стандарты с v8std

Сайт в десктопе улучшен

Добавлены диагностики от bslls, АПК и EDT с перекрестными ссылками на стандарты
👍11
Forwarded from Накидка
Возвращаясь после долгого затишья, хочу поделиться с вами демо-версией моего нового проекта — идейного продолжения «Накидки». Это редактор конфигурации 1С.Предприятие в виде YAML, а также в ещё одном формате, близком к «Накидке».

Пока это очень ранняя версия: в ней реализована лишь базовая работа со справочниками и формами. Тем не менее, надеюсь, она позволит составить представление о том, какое решение я разрабатываю.

Буду рад обратной связи!

Ссылка на проект: https://github.com/crimsongoldteam/nkdk

Ниже прикладываю несколько коротких видео с демонстрацией работы.
👍13
Forwarded from Никита Арипов | 1С, DevExp (Никита Арипов)
Гайд для создания форм на 1С

Сейчас в разгаре обсуждение и внедрение нового интерфейса 8.5. Но это способ отображения, принципы построения интерфейса остаются прежними.

Главный принцип - пользователю должно быть удобно. Идеальный интерфейс - это когда пользователь его даже не замечает.

У меня есть вот такой дизайн-гайд 1С. Он охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В нем содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты.

Предоставляются также примеры и антипримеры для наглядного понимания принципов построения формы

Как только сформируются основные подходы к интерфейсу 8.5 - актуализирую его. А пока с помощью него можете делать крутые приложения на интерфейсе Такси.

От вас требуется:
1. Поставить звездочку репозиторию Дизайн-гайд 1С
2. Поделиться с коллегой
3. По возможности, поддержать развитие гайда на boosty
👍8
РУБРИКА «ЧёПоСтандартам»
Имя, синоним, комментарий

Стандарт большой, но подсвечу важные моменты, которые будет полезно вспомнить опытным программистам или узнать новичкам:
#std474
...
Например, неправильно: «Загрузка данных из Эксель», «Загрузка данных из MS Excel»,
правильно: «Загрузка данных из Microsoft Excel».
....
1.5. При этом для стандартных реквизитов Родитель и Владелец, следует всегда указывать синонимы, отличные от синонимов по умолчанию.

Для справочника Файлы:
правильно
вложить в синоним прикладной смысл: «Папка» или «Папка с файлом».

Другой пример. В то время как для стандартного реквизита Наименование некоторых справочников может вполне подойти синоним по умолчанию «Наименование», в случае со справочником Файлы целесообразнее назначить синоним «Имя файла», а для справочника ФизическиеЛица – дать синоним «ФИО».

1.6. В случае, когда есть два (или более) объекта метаданных со схожим назначением, необходимо, чтобы синонимы каждого объекта полностью описывали каждый объект.

Например, неправильно давать справочникам следующие синонимы:
Банковские счета,
Банковские счета контрагентов

правильно:
Банковские счета организаций,
и Банковские счета контрагентов

2.3. Имена объектов метаданных не должны превышать 80 символов.

3.1. Комментарий задается только в тех случаях, когда необходимо дать участнику разработки конфигурации какие-либо пояснения по данному объекту конфигурации. Например, комментарий к реквизиту справочника может быть таким: "Индексирование поставлено для оптимизации отчетов с отбором по виду контрагента", или: "Используется в регламентированном учете".

4. В именах, синонимах и комментариях не допускается использовать букву "ё".


По пункту 1.5, а кто-то менял синоним у стандартного реквизита "Владелец"?) 💬

Ну и не забываем про поле "Комментарий" у объектов метаданных, практически никогда не встречал его заполнение, а иногда очень хотелось бы, чтобы там была важная информация, отвечающая на вопрос "нафига оно так?")

В дополнение к этому стандарту можно почитать #std468 Пользовательские представления объектов

P.S. Полное описание стандарта по ссылке в начале поста
#ЧёПоСтандартам #std474
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3👎1
Решил тут немного освежить базу по транзакциям. Вообще правила работы с транзакциями хорошо описаны в стандарте 783. Но как показывает практика, не все достаточно хорошо знакомы с этим стандартом, и следуют его рекомендациям. Давайте разберем несколько ключевых особенностей при работе с транзакциями.

В 1С вложенных транзакций не бывает. Вы можете написать сколь угодно большую вложенность

НачатьТранзакцию() - счётчик 1
НачатьТранзакцию() - счётчик 2
НачатьТранзакцию() - счётчик 3


Всё это будет одна транзакция. На сервере приложений будет лишь увеличен счетчик количества транзакций. Фактически транзакция завершиться, когда вы напишите

ЗафиксироватьТранзацию() - счётчик 2
ЗафиксироватьТранзацию() - счётчик 1
ЗафиксироватьТранзацию() - счётчик 0 - транзакция фактически будет зафиксирована


В процессе работы, транзакция может завершиться и ошибкой. Причины могут быть самые разные. Поэтому работу с транзакциями нужно оборачивать в попытку. Важно НачатьТранзакцию() должно быть сразу перед Попыткой.

 НачатьТранзакцию();
    Попытка
        ДокументОбъект.Записать()
        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
        ВызватьИсключение;
    КонецПопытки;


ВызватьИсключение - рекомендуется вызывать после отмены транзакции, чтобы в случае если наша транзакция является внутренней, пробросить исключение на внешнюю транзакцию, и не дать ей зафиксироваться. В противном случае если этого не сделать, когда мы выйдем на внешнюю транзакцию и попробуем обратиться к базе данных (записать или прочитать), то получим очень веселую ошибку "В данной транзакции уже происходили ошибки". Эта ошибка которую очень сложно отловить, поэтому лучше сразу работать с транзакциями правильно, т.к эта ошибка 100% результат некорректной работы с транзакциями со стороны разработчика.

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

Как вы думаете будет ли записан элемент ?

НачатьТранзакцию();

Попытка

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Новый";
НовыйЭлемент.Записать();

ВызватьИсключение "Какая-то ошибка";

ЗафиксироватьТранзакцию();

Исключение

КонецПопытки;

ЗафиксироватьТранзакцию();


Да, элемент будет записан. Но так делать не следует, это демонстрационный пример. Так как исключение не связано с базой данных, мы можем дальше продолжить работу с транзакцией. В случае, если в строке НовыйЭлемент.Записать() - у нас выпадет исключение, например перед записью сработала проверка, и мы установили "Отказ = Истина", то это будет расценено как ошибка при работе с базой данных, и соответственно будет являться "невосстановимой ошибкой". Транзакция будет помечена испорченной, и единственное, что мы должны сделать это отменить ее. Если мы дальше попробуем обратиться к базе данных, даже банально прочитать представление ссылки, то получим уже знакомую ошибку "В данной транзакции уже происходили ошибки".

Ну и на последок, транзакции никак не влияют на значения переменных в оперативной памяти.

НоменклатураОбъект = Справочники.Номенклатура.СоздатьЭлемент();  
НоменклатураОбъект.Наименование = "Тест1";
НоменклатураОбъект.Записать();
НачатьТранзакцию();
НоменклатураОбъект.Наименование = "Тест2";
НоменклатураОбъект.Записать();
ОтменитьТранзакцию();


Что выведут методы ?

Сообщить(НоменклатураОбъект.Наименование); 
Сообщить(НоменклатураОбъект.Ссылка.Наименование);

В нижеприведенном примере НоменклатураОбъект - объект в оперативной памяти. И после отмены транзакции данные в базу данных записаны не будут, но "Тест2" будет сохранен в оперативной памяти, и Сообщить(НоменклатураОбъект.Наименование); выведет "Тест2", а Сообщить(НоменклатураОбъект.Ссылка.Наименование); выведет "Тест1".

Отличная статья Андрея Овсянкина про транзакции на хабре.
👍10
🔥 Андрей Соколов: «Как съесть XML с JSON, и не поперхнуться»

Как правильно работать с XML и JSON в 1С-интеграциях? Андрей Соколов (ведущий разработчик KORUS Consulting) разобрал оба формата с нуля — и это настоящая кладезь практики:

▶️Что внутри:

🔵История форматов и модели данных
🔵Схемы и конвертация — от простого к сложному
🔵Потоковое чтение больших файлов без утечек памяти
🔵XDTO — когда нужен жёсткий контроль структуры
🔵Производительность и подводные камни, на которых ломаются интеграции
🔵И многое другое

▶️Кому будет полезно:

Всем, кто хотя бы раз мучился с парсингом XML или JSON в 1С. Особенно — тем, кто проектирует интеграции с внешними системами.

▶️Смотреть:

🔜 YouTube: https://youtu.be/o8ras_BflLk

➡️ ВКонтакте: https://vkvideo.ru/video-232435421_456239041

Ставьте лайки, комментируйте, делитесь с коллегами — и следите за каналом: скоро выложу и другие доклады с Жёлтого клуба!

❓А какие темы интеграции вам были бы ещё интересны? Пишите в комментариях — соберём идеи для следующих встреч! 👇


#event@it_lunch

🔥 Подписывайся на IT Ланч!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Forwarded from 1Cnik
🧩 Привилегированный общий модуль в расширениях

Всем знаком модуль, способный выполнять операции с неограниченными правами: для этого достаточно поставить галочку: Привилегированный. На одном из моих проектов такой модуль удобно задействован для логирования.

У привилегированного режима есть разные нюансы, например:
▪️не отключает RLS для некоторых видов объектов, включённый перед пакетным запросом с временными таблицами (8.3.11)
▪️мог вызвать падение СУБД (8.3.12)
▪️не срабатывает во внешних обработках (до сих пор):
УстановитьПривилегированныйРежим(Истина); // Отключаем проверку прав доступа

ПривилегированныйРежим() вернёт Ложь

Так вот, Dmitry Kinash поделился ещё одним непредсказуемым поведением платформы, дословно:
А вы знали, что если перехватывать в расширении процедуры из привилегированного модуля, то они выполняются в режиме без привилегий? Дело в том, что в общих модулях в расширениях не предусмотрели свойство "Привилегированный" (Privileged), а потому механизм расширений выполняет код как обычный. Если у вас далее по коду есть проверка привилегий и вы не хотите получить ошибку, то вам придется явно повысить привилегии:

#Insert
SetPrivilegedMode(True);
#EndInsert

Учитывайте данные нюансы при проектировании архитектуры.

#Практика1С #Лайфхак1Снику
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Зацените какой прикол раскопал в платформе

Пытаюсь запустить сеанс 1С:Предприятие из конфигуратора, запущенного из EDT. Да, я знаю толк в матрёшках.э 😂
А оно не запускается с ошибкой:

Существуют активные сеансы работы с данной информационной базой, использующие Платформу 1С:Предприятия другой версии.
Используйте для подключения к информационной базе платформу версии 8.3.27.1859.


А я как бы на 8.3.27.1859 и запускаю. Именно эта версия у меня обозначена в конфигураторе, эта же версия указана в EDT.
А ошибка есть.

Знаете в чём косяк? А в том, что в списке баз 1С для этой базы прописана другая версия. И EDT на эту настройку в списке баз кладёт болт и запускает конфигуратор версии, которая указана в EDT. А конфигуратор, запущенный на другой версии, как дурачок пытается выполнить это невыполнимое требование и запускает Предприятие на невалидной платформе.

Мммм, покупка нового кресла всё ближе и ближе...


P.S. Ну и если я какой-то текст до конца дочитываю, то никогда не обломаюсь поставить свой царский лайк, а, возможно, даже подпишусь на автора
👍25🤔6👎1
Информирование пользователей

Грамотное общение с пользователем посредством интерфейса - это про умение продумывать сценарии, логику работы и формулировать мысли.


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

Давайте посмотрим на простом примере

Есть платёжный документ, который надо отправить на согласование. Одна из основных проверок любого платёжного документа - предполагаемая дата оплаты, она же дата платежа.
Пользователь нажимает на кнопочку «Отправить на согласование» и получает ошибку
Некорректная дата платежа

«Чё ты доебался?» - спросит кто-то, ведь понятно же, что накосячили в дате платежа. Ну ок. А в чём именно? Как исправить? Каким должно быть значение, чтобы всё прошло на ура?

Сравните.
Указанная дата платежа - 22.04.2026 - не совпадает с установленными платёжными периодами для <Организации>/<Контрагента>/<Типа операции>. Измените дату платежа таким образом, чтобы она совпадала с платёжным периодом. Ближайший доступный период 27-30.04.2026. Или измените статус платежа на «срочный»

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

В целом, для классических правил описания ошибки не хватает только начать с «Ошибка согласования документа». Но подобное я считаю необходимым только для отложенных или многосоставных действий.

На этой стадии ещё неплохо обеспечить согласованность интерфейса со сценарием исправления ошибки, создавайте у пользователя прямую связь с элементом интерфейса. Да, слово "изменить" - универсальное, но всё же
👉если для каждого статуса у вас предусмотрена собственная кнопка - используйте название этой кнопки (предположим, в информации для пользователя можно написать "или используйте опцию "срочный платёж")
👉если для изменения статуса используется чек-бокс, используйте глагол «установите»

При проверках на корректность заполнения не стоит заставлять пользователя изменять данные по очереди: по возможности, проверяйте все данные при каждой попытке выполнения операции, если только проверки не зависят от заполненности данных: если вам надо проверить какие-то свойства счета — сначала проверьте, что счёт указан, и только если да - что он, к примеру, не закрыт. Но если необходимо проверять два независимых свойства (те же дату платежа и счёт) — выполните обе проверки сразу в любом случае, вне зависимости от исхода одной из них (это пример нелогичного использования принципа «ранний возврат»).

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

Не вводите пользователя в заблуждение - очищайте историю сообщений.

Говорят, что лучшее сообщение об ошибке - его отсутствие. В том плане, что при проведении какой-либо операции можно исправлять ошибки автоматически.

Я с этим не то, чтобы согласен: оставлять пользователя в неведении относительно внесённых изменений не очень хорошо. Лучше обеспечить эту логику при выполнении пользовательских действий, когда от изменения одних данных меняются другие.

При этом, если изменяемые по зависимости данные уже заполнены, пользователя лучше об этом информировать:
👉предупреждением до изменения, если данные объемные (таблицы)
👉если изменяемые по зависимости данные
▪️находятся в поле видения, но разнесены с изменяемыми пользователем — краткосрочным выделением цветом
▪️находятся вне видимости (на другой странице) —сообщением об изменении
👉сообщением о сбросе значений

Еще небольшой чек-лист:
▪️если сценарий подразумевает выполнение исчислимого количества операций в фоне - информируйте пользователя о ходе прогресс-баром
▪️если сценарий подразумевает выполнение в фоне — сообщайте об окончании процесса так, чтобы это было заметно из любой формы

ну наверное в
#медвежийкодстайл
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤔1