Идея дня
- Единые уровни:
Debug,Info,Warn,Error. - Короткий тег (модуль/операция): помогает фильтровать логи.
- Лаконичное сообщение + при необходимости структурные данные (структуры/массивы).
- Guard-паттерны: логируем причину раннего выхода (см. День 10).
Базовые вызовы
Метка = "Day21";
// Информационные события
A1sLog.Info(Метка, "Импорт прайса начат");
// Отладочные детали (шумные — включайте по необходимости)
A1sLog.Debug(Метка, "Параметры", Новый Структура("Источник,Лимит", "File.csv", 100));
// Предупреждение о некритичной проблеме
A1sLog.Warn(Метка, "Некоторые строки пропущены из-за пустых артикулов");
// Ошибка с контекстом
A1sLog.Error(Метка, "Не удалось записать документ", Новый Структура("Номер", "000123"));
Формат вызова держим единым по проекту: Уровень(Тег, Сообщение[, Данные]).
Логирование шагов операции
Процедура ИмпортНоменклатуры(ПутьКФайлу) Экспорт
Тег = "ИмпортНом";
A1sLog.Info(Tег, "Старт", Новый Структура("Файл", ПутьКФайлу));
Таб = ПрочитатьCSV(ПутьКФайлу); // ваша реализация
Если A1sO.Empty(Таб) Тогда
A1sLog.Warn(Tег, "Файл пустой или не разобран");
Возврат;
КонецЕсли;
Всего = Таб.Количество();
Ok = 0; Bad = 0;
Для каждого Стр Из Таб Цикл
Код = A1sS.AsString(Стр.Код);
Имя = A1sS.AsString(Стр.Наименование);
Если A1sO.Empty(Имя) Тогда
Bad = Bad + 1;
A1sLog.Debug(Tег, "Пропуск: пустое наименование", Стр);
Продолжить;
КонецЕсли;
Попытка
Эл = Справочники.Номенклатура.НайтиПоКоду(Код);
Если A1sO.Empty(Эл) Тогда
Э = Справочники.Номенклатура.СоздатьЭлемент();
Иначе
Э = Эл.ПолучитьОбъект();
КонецЕсли;
Данные = Новый Структура("Код,Наименование", Код, Имя);
A1sO.FillObject(Э, Данные); // День 14
Э.Записать();
Ok = Ok + 1;
Исключение
Bad = Bad + 1;
A1sLog.Error(Tег, "Ошибка записи элемента", Данные);
КонецПопытки;
КонецЦикла;
A1sLog.Info(Tег, "Готово", Новый Структура("Всего,Успешно,Ошибок", Всего, Ok, Bad));
КонецПроцедуры
Данные передаём структурой/массивом — так их легко сериализовать и искать в логах.
Логирование запросов (A1sQ)
Функция НайтиПоМаске(Маска, Лимит = 20) Экспорт
Тег = "ПоискНом";
Если A1sO.Empty(Маска) Тогда
A1sLog.Warn(Tег, "Пустая маска — ранний выход");
Возврат Новый ТаблицаЗначений;
КонецЕсли;
ТекстQ = "
|ВЫБРАТЬ ПЕРВЫЕ &Лимит
| Ном.Ссылка КАК ID,
| Ном.Наименование КАК Name
|ИЗ Справочник.Номенклатура КАК Ном
|ГДЕ Ном.Наименование ПОДОБНО &Маска
|УПОРЯДОЧИТЬ ПО Name
";
A1sLog.Debug(Tег, "Запрос", Новый Структура("Лимит,Маска", Лимит, Маска));
Рез = A1sQ.Unload(ТекстQ, Лимит, Маска); // позиционные параметры
A1sLog.Info(Tег, "Найдено", Новый Структура("Строк", Рез.Количество()));
Возврат Рез;
КонецФункции
Не логируем весь текст запроса на проде (шум), достаточно ключевых параметров и итогов.
Соглашения по тегам и сообщениям
- Короткий тег:
Продажи/ИмпортНом/SyncCRM. - Сообщение в повелительной форме или результат: «Старт», «Прочитано N», «Готово», «Ошибка записи».
- Данные — только то, что поможет в разборе; избегайте персональных данных там, где не требуется.
Анти-паттерны
- Лить в
Infoвсе отладочные детали — используйтеDebug. - Логировать секреты (пароли, токены) — маскируйте или не логируйте вовсе.
- Сообщения без контекста: «Ошибка» — добавляйте хотя бы ключ/номер, а лучше структурные данные.
Практика (15–30 минут)
- Определите теги операций вашего модуля (3–5 штук) и замените «размытые» метки.
- Внедрите логирование шагов в одной длительной процедуре: старт → ключевые этапы → итоги.
- Добавьте структурные данные к 2–3 сообщениям (
Новый Структура(...)), уберите лишний шум изInfo. - В функциях с ранним выходом (guard) пишите причину в
Warn.
Что дальше
День 22: A1sJ — Работа с JSON — сериализация/десериализация и конвейеры подготовки данных.
Примечание
Код и тексты на этой странице сгенерированы ИИ. Возможны неточности и ошибки. Перед использованием проверяйте и адаптируйте примеры под вашу версию платформы 1С и сборку библиотеки A1sCode.