Где в 1С журнал регистрации, обычно спрашивают, когда что-то уже сломалось: документ не проводится, обмен встал, пользователь не может войти. Журнал один на всю информационную базу, открыть его можно из раздела администрирования, через функции для технического специалиста или из конфигуратора. Ниже — пути для БП, ЗУП, УТ и КА, отборы, которые быстро находят нужную ошибку, и код: ошибки за сутки одной кнопкой, сводка повторяющихся ошибок и проверка настроек журнала.
Журнал регистрации 1С 8.3 — механизм платформы: записи везде одни и те же, а где найти журнал регистрации, зависит от конфигурации и режима запуска.
| Где | Путь |
|---|---|
| УТ 11.4, КА 2.5 | НСИ и администрирование → Администрирование → Обслуживание → Журнал регистрации |
| БП 3.0, ЗУП 3.1 | Администрирование → Обслуживание → Журнал регистрации |
| Любая конфигурация на управляемых формах | Главное меню → Функции для технического специалиста → Стандартные → Журнал регистрации |
| Конфигуратор | Администрирование → Журнал регистрации |
| Обычные формы (УТ 10.3 и другие старые конфигурации) | Сервис → Журнал регистрации |
Команды «Функции для технического специалиста» по умолчанию в меню нет: включите флажок «Режим технического специалиста» в разделе Главное меню → Сервис → Параметры. В старых версиях платформы это «Все функции» и флажок «Отображать команду "Все функции"». Флажок действует при одноимённом праве: в УТ 11.4 и КА 2.5 его дают роли «Администратор системы» и «Режим технического специалиста».
Сам журнал открывается только при праве «Журнал регистрации»: у администратора оно есть, обычному пользователю в УТ 11.4 и КА 2.5 добавляют роль «Просмотр журнала регистрации». Нет пункта меню — не хватает прав.
Ещё один вход — Обслуживание → Активные пользователи: выделите пользователя и нажмите «Журнал регистрации», откроются события только по нему.
1Cv8Log в каталоге базы, рядом с 1Cv8.1CD.srvinfo\reg_1541\<GUID базы>\1Cv8Log, где 1541 — порт менеджера кластера по умолчанию.1Cv8.lgf и файлы *.lgp) или старый SQLite (один файл 1Cv8.lgd). Конфигуратор 8.3.27 для SQLite предупреждает, что поддержка формата ограничена, и предлагает «Перейти на последовательный формат (рекомендуется)».Руками файлы не удаляйте: журнал уменьшают кнопкой «Сократить» в настройке журнала, о ней ниже.
Отдельного журнала регистрации ошибок в 1С нет: ошибки — это записи с важностью «Ошибка». Ниже — форма журнала из БСП (сверено по УТ 11.4 и КА 2.5); стандартная форма платформы устроена похоже.
Самые нужные события. В форме видно представление, в коде нужен идентификатор:
| Событие | Идентификатор | Когда смотреть |
|---|---|---|
| Ошибка выполнения | _$PerformError$_ | ошибки выполнения кода, которые записала платформа |
| Фоновое задание. Ошибка выполнения | _$Job$_.Error | упали регламентные и фоновые задания: обмены, загрузки, рассылки |
| Сеанс. Ошибка аутентификации | _$Session$_.AuthenticationError | пользователь не может войти; комментарий пустой, данные попытки — в окне события |
| Доступ. Отказ в доступе | _$Access$_.AccessDenied | «Нарушение прав доступа»: какое право нарушено |
| Данные. Изменение, Проведение, Удаление | _$Data$_.Update, _$Data$_.Post, _$Data$_.Delete | кто и когда менял, проводил или удалял объект |
| Информационная база. Изменение конфигурации базы данных | _$InfoBase$_.DBConfigUpdate | «после обновления всё сломалось» — когда обновляли |
События «Данные…» пишутся не с уровнем «Ошибка», поэтому при отборе по ошибкам их не видно: для истории документа ставьте «Все события». Как по отказу в доступе найти недостающую роль — в статье «1С нарушение прав доступа».
{ОбщийМодуль.Имя.Модуль(125)} и цепочкой «по причине:»: щёлкните в поле, Ctrl+A, Ctrl+C. Добавьте дату, пользователя и событие.Если ошибки пересылают регулярно, удобнее кнопка: она читает журнал на сервере и отдаёт текст, готовый для письма. Код — для формы внешней обработки или любой формы конфигурации. Запись своих событий разобрана в статье «Запись в журнал регистрации 1С программно», здесь только чтение.
// Модуль формы внешней обработки «Ошибки из журнала» (или любой формы конфигурации).
// Команды ПоказатьОшибкиЗаСутки, ОшибкиПользователяЗаСутки и СкопироватьОшибкиЗаСутки
// выведите на форму кнопками. Нужно право «Журнал регистрации».
&НаКлиенте
Процедура ПоказатьОшибкиЗаСутки(Команда)
ОткрытьТекстОшибок(ТекстОшибокЖурнала(24, "", 100), "Ошибки журнала регистрации за сутки");
КонецПроцедуры
&НаКлиенте
Асинх Процедура ОшибкиПользователяЗаСутки(Команда)
// Имя для входа в базу, как в списке пользователей ИБ, а не ФИО.
ИмяДляОтбора = "";
ИмяДляОтбора = Ждать ВвестиСтрокуАсинх(ИмяДляОтбора, "Имя пользователя ИБ", 100);
Если Не ЗначениеЗаполнено(ИмяДляОтбора) Тогда
Возврат;
КонецЕсли;
ОткрытьТекстОшибок(ТекстОшибокЖурнала(24, ИмяДляОтбора, 100), "Ошибки пользователя " + ИмяДляОтбора);
КонецПроцедуры
&НаКлиенте
Асинх Процедура СкопироватьОшибкиЗаСутки(Команда)
Текст = ТекстОшибокЖурнала(24, "", 100);
// Буфер обмена из кода: платформа 8.3.24 и новее.
Элемент = Новый ЭлементБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.Текст, Текст);
Скопировано = Ждать СредстваБуфераОбмена.ПоместитьДанныеАсинх(Элемент);
Если Скопировано = Истина Тогда
ПоказатьОповещениеПользователя("Ошибки скопированы", , "Вставьте текст в письмо или задачу программисту");
Иначе
ОткрытьТекстОшибок(Текст, "Ошибки журнала регистрации за сутки");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьТекстОшибок(Текст, Заголовок)
// Отдельное окно с текстом: Ctrl+A, Ctrl+C — и в письмо.
ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.УстановитьТекст(Текст);
ТекстДок.Показать(Заголовок);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ТекстОшибокЖурнала(Часов, ИмяПользователяИБ, МаксимумЗаписей)
// Журнал хранит время сервера, поэтому период считаем от ТекущаяДата() на сервере.
КонецПериода = ТекущаяДата();
Отбор = Новый Структура;
Отбор.Вставить("ДатаНачала", КонецПериода - Часов * 3600);
Отбор.Вставить("ДатаОкончания", КонецПериода);
Отбор.Вставить("Уровень", УровеньЖурналаРегистрации.Ошибка);
Если ЗначениеЗаполнено(ИмяПользователяИБ) Тогда
Отбор.Вставить("Пользователь", ИмяПользователяИБ);
КонецЕсли;
// Только нужные колонки и не больше МаксимумЗаписей последних событий.
События = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(События, Отбор,
"Дата,ИмяПользователя,Компьютер,ПредставлениеСобытия,ПредставлениеМетаданных,ПредставлениеДанных,Комментарий",
, МаксимумЗаписей);
// Первая строка — что за база: программисту не придётся переспрашивать.
Инфо = Новый СистемнаяИнформация;
Строки = Новый Массив;
Строки.Добавить(СтрШаблон("%1 %2, платформа %3. Время — по часам сервера.",
Метаданные.Синоним, Метаданные.Версия, Инфо.ВерсияПриложения));
Если События.Количество() = 0 Тогда
Строки.Добавить(СтрШаблон("Ошибок за последние %1 ч. нет.", Формат(Часов, "ЧГ=0")));
КонецЕсли;
Для Каждого Событие Из События Цикл
Строки.Добавить("");
Строки.Добавить(СтрШаблон("=== %1 | %2 | %3",
Формат(Событие.Дата, "ДФ='дд.ММ.гггг ЧЧ:мм:сс'"), Событие.ИмяПользователя, Событие.Компьютер));
Строки.Добавить("Событие: " + Событие.ПредставлениеСобытия);
// У событий доступа здесь массив представлений, у остальных — строка.
ИмяОбъекта = Событие.ПредставлениеМетаданных;
Если ТипЗнч(ИмяОбъекта) = Тип("Массив") Тогда
ИмяОбъекта = СтрСоединить(ИмяОбъекта, ", ");
КонецЕсли;
Если ЗначениеЗаполнено(ИмяОбъекта) Тогда
Строки.Добавить("Объект: " + ИмяОбъекта + " " + Событие.ПредставлениеДанных);
КонецЕсли;
// Полный текст ошибки: место в коде и цепочка «по причине:».
Строки.Добавить(Событие.Комментарий);
КонецЦикла;
Возврат СтрСоединить(Строки, Символы.ПС);
КонецФункции
Разбор ключевых строк:
&НаСервереБезКонтекста — ВыгрузитьЖурналРегистрации доступна на сервере, в толстом клиенте и во внешнем соединении. В тонком клиенте нет ни метода, ни перечисления УровеньЖурналаРегистрации.ТекущаяДата() — журнал хранит время сервера. Форма БСП пересчитывает его в часовой пояс сеанса, а функция выводит время сервера и пишет об этом в первой строке.МаксимумЗаписей, по справке ограничивает выборку последними по времени событиями. Без периода и лимита метод читает журнал целиком.Пользователь — идентификатор, для текста нужна ИмяПользователя.Отбор.Пользователь — имя пользователя ИБ строкой или ПользовательИнформационнойБазы; удалённых пользователей ищут только по имени.СредстваБуфераОбмена — платформа 8.3.24 и новее, на старой оставьте окно с текстом.Сотня одинаковых ошибок регламентного задания прячет одну настоящую. Функция группирует ошибки за период по событию и первой строке комментария и сортирует по количеству. Запускайте её из внешней обработки или серверного общего модуля; как устроены сами задания — в статье «Фоновое задание 1С».
// Сводка ошибок журнала за период: какая ошибка сколько раз повторилась
// и когда была последний раз. Серверный код: общий модуль с флагами
// «Сервер» и «Вызов сервера» или модуль объекта внешней обработки.
Функция СводкаОшибокЖурнала(Знач ДатаНачала, Знач ДатаОкончания) Экспорт
Отбор = Новый Структура;
Отбор.Вставить("ДатаНачала", ДатаНачала);
Отбор.Вставить("ДатаОкончания", ДатаОкончания);
Отбор.Вставить("Уровень", УровеньЖурналаРегистрации.Ошибка);
// Не больше 10 000 последних ошибок, чтобы не читать огромный журнал целиком.
События = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(События, Отбор, "Дата,ПредставлениеСобытия,Комментарий", , 10000);
Сводка = Новый ТаблицаЗначений;
Сводка.Колонки.Добавить("Событие", Новый ОписаниеТипов("Строка"));
Сводка.Колонки.Добавить("Ошибка", Новый ОписаниеТипов("Строка"));
Сводка.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Сводка.Колонки.Добавить("Последняя", Новый ОписаниеТипов("Дата"));
Для Каждого Запись Из События Цикл
// Группируем по первой строке комментария: обычно там модуль, номер строки и текст.
ПерваяСтрока = Лев(СокрЛП(СтрПолучитьСтроку(Запись.Комментарий, 1)), 300);
Ключ = Новый Структура("Событие, Ошибка", Запись.ПредставлениеСобытия, ПерваяСтрока);
Найденные = Сводка.НайтиСтроки(Ключ);
Если Найденные.Количество() = 0 Тогда
СтрокаСводки = Сводка.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаСводки, Ключ);
Иначе
СтрокаСводки = Найденные[0];
КонецЕсли;
СтрокаСводки.Количество = СтрокаСводки.Количество + 1;
СтрокаСводки.Последняя = Макс(СтрокаСводки.Последняя, Запись.Дата);
КонецЦикла;
Сводка.Сортировать("Количество Убыв");
Возврат Сводка;
КонецФункции
// Пример вызова: сводка за 7 дней в окно сообщений.
Процедура СообщитьСводкуОшибокЗаНеделю() Экспорт
Сводка = СводкаОшибокЖурнала(ТекущаяДата() - 7 * 86400, ТекущаяДата());
Для Каждого СтрокаСводки Из Сводка Цикл
Сообщить(СтрШаблон("%1 раз, последний %2 | %3 | %4",
Формат(СтрокаСводки.Количество, "ЧГ=0"), Формат(СтрокаСводки.Последняя, "ДЛФ=DT"),
СтрокаСводки.Событие, СтрокаСводки.Ошибка));
КонецЦикла;
КонецПроцедуры
В конфигурациях на БСП свою форму журнала писать не нужно: ЖурналРегистрацииКлиент.ОткрытьЖурналРегистрации открывает стандартную с отбором. Три типовые кнопки — история документа, ошибки за сутки и ошибки заданий за неделю:
// Модуль формы документа в конфигурации на БСП (сверено по УТ 11.4 и КА 2.5).
// Команды открывают стандартную форму журнала БСП с готовым отбором.
&НаКлиенте
Процедура ИсторияДокументаВЖурнале(Команда)
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
ПоказатьПредупреждение(, "Документ ещё не записан, в журнале по нему ничего нет.");
Возврат;
КонецЕсли;
// Все события по этому документу: кто создал, менял, проводил, распроводил.
Отбор = Новый Структура;
Отбор.Вставить("Данные", Объект.Ссылка);
// Без даты начала форма покажет только сегодняшние события.
Отбор.Вставить("ДатаНачала", НачалоДня(Объект.Дата) - 31 * 86400);
ЖурналРегистрацииКлиент.ОткрытьЖурналРегистрации(Отбор, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОшибкиЗаСуткиВЖурнале(Команда)
Отбор = Новый Структура;
// Уровень — строкой: перечисление УровеньЖурналаРегистрации на клиенте недоступно.
Отбор.Вставить("Уровень", "Ошибка");
Отбор.Вставить("ДатаНачала", ОбщегоНазначенияКлиент.ДатаСеанса() - 86400);
ЖурналРегистрацииКлиент.ОткрытьЖурналРегистрации(Отбор, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОшибкиЗаданийЗаНеделю(Команда)
// В отбор идут идентификаторы событий, а не их представления.
События = Новый Массив;
События.Добавить("_$Job$_.Error"); // Фоновое задание. Ошибка выполнения
События.Добавить("_$Job$_.Terminate"); // Фоновое задание. Принудительное завершение
Отбор = Новый Структура;
Отбор.Вставить("СобытиеЖурналаРегистрации", События);
Отбор.Вставить("ДатаНачала", НачалоДня(ОбщегоНазначенияКлиент.ДатаСеанса()) - 7 * 86400);
ЖурналРегистрацииКлиент.ОткрытьЖурналРегистрации(Отбор, ЭтотОбъект);
КонецПроцедуры
Уровень передают строкой «Ошибка» — форма БСП сама превратит её в значение перечисления. Без ДатаНачала форма откроется за сегодняшний день. По документу отбираем по полю «Данные»: видно, кто его создал, менял, проводил и распроводил, если в настройке журнала включена регистрация информации.
Пустой журнал — чаще настройка, чем сбой. В конфигураторе: Администрирование → Настройка журнала регистрации, переключатель «Регистрировать в журнале события» — от «Не регистрировать» до «Регистрировать ошибки, предупреждения, информацию, примечания», там же кнопка «Сократить». В режиме предприятия это окно есть в ветке «Стандартные» функций для технического специалиста (нужно право администрирования). Функция отвечает на вопрос «почему пусто» за один вызов:
// Почему журнал пустой: есть ли право, какие уровни пишутся, за какой период
// есть записи и сколько ошибок с начала суток. Серверный код.
Функция ДиагностикаЖурналаРегистрации() Экспорт
Итог = Новый Массив;
Если Не ПравоДоступа("ЖурналРегистрации", Метаданные) Тогда
Итог.Добавить("Нет права «Журнал регистрации»: чтение журнала даст «У пользователя недостаточно прав на доступ к журналу регистрации».");
Возврат СтрСоединить(Итог, Символы.ПС);
КонецЕсли;
// Пустой массив — в настройке выбрано «Не регистрировать».
Уровни = ПолучитьИспользованиеЖурналаРегистрации();
Если Уровни.Количество() = 0 Тогда
Итог.Добавить("Регистрация событий выключена.");
ИначеЕсли Уровни.Найти(УровеньЖурналаРегистрации.Ошибка) = Неопределено Тогда
Итог.Добавить("Ошибки в журнал не пишутся.");
Иначе
Имена = Новый Массив;
Для Каждого Уровень Из Уровни Цикл
Имена.Добавить(Строка(Уровень));
КонецЦикла;
Итог.Добавить("Регистрируются уровни: " + СтрСоединить(Имена, ", ") + ".");
КонецЕсли;
// Метод есть с платформы 8.3.20.
Период = ПолучитьПериодЖурналаРегистрации();
Если Период.Начало = Неопределено Тогда
Итог.Добавить("В журнале нет ни одной записи.");
Иначе
Итог.Добавить(СтрШаблон("Записи с %1 по %2 (время сервера).",
Формат(Период.Начало, "ДЛФ=DT"), Формат(Период.Конец, "ДЛФ=DT")));
КонецЕсли;
Отбор = Новый Структура;
Отбор.Вставить("ДатаНачала", НачалоДня(ТекущаяДата()));
Отбор.Вставить("Уровень", УровеньЖурналаРегистрации.Ошибка);
Ошибки = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(Ошибки, Отбор, "Дата");
Итог.Добавить("Ошибок с начала суток: " + Формат(Ошибки.Количество(), "ЧН=0; ЧГ=0") + ".");
Возврат СтрСоединить(Итог, Символы.ПС);
КонецФункции
ПолучитьПериодЖурналаРегистрации() появилась в платформе 8.3.20 — на более старой уберите этот блок.
&НаКлиенте. Перенесите чтение в серверную функцию.ВыгрузитьЖурналРегистрации вызвали без даты начала и лимита на журнале за несколько лет. Задавайте период и количество.Нет права «Журнал регистрации». В УТ 11.4 и КА 2.5 его даёт роль «Просмотр журнала регистрации» — добавьте её в профиль группы доступа пользователя. Если раздела администрирования у него нет, журнал можно открыть кнопкой на форме из листинга выше.
В отборе журнала укажите «Данные» — сам документ, а если он уже удалён, «Метаданные» — вид документа; важность — «Все события». Ищите «Данные. Изменение», «Данные. Проведение» и «Данные. Удаление»: в строке будут пользователь, компьютер и время. Что документ записал в регистры — другой вопрос, см. «Движения документа 1С».
Да. Программисту удобнее всего прислать «Выгрузить в файл...» (XML) или копию папки 1Cv8Log. У ВыгрузитьЖурналРегистрации четвёртый параметр — имя входного файла: тогда метод читает журнал из файла, а не из текущей базы.
Не стоит: пропадёт вся история, а при работающей базе файлы могут быть заняты. Журнал уменьшают кнопкой «Сократить» в окне настройки журнала регистрации. Если история может понадобиться, сначала скопируйте папку 1Cv8Log.
Журнал регистрации — события базы: кто вошёл, что изменил, какие ошибки записал код. Технологический журнал — низкоуровневый лог процессов 1С (запросы, блокировки, исключения), его включают файлом logcfg.xml, когда 1С тормозит или падает без понятной ошибки.
Если ошибка в журнале есть, а что с ней делать — непонятно, или она возвращается после каждого обновления, передайте программисту текст из журнала и шаги, после которых она появляется. Разместите задачу на площадке — оценка бесплатная, ответ в течение рабочего дня. Ошибки прав разбирают в рамках услуги «Права доступа 1С», остальные доработки — в списке услуг.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.