Как найти, что перезаполняет или очищает регистр сведений в 1С

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

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

Метод 1. Внедрение диагностического кода в модуль набора записей

Если глобальный поиск по имени регистра не дал результатов, это не значит, что кода не существует. Он может обращаться к регистру динамически. Самый надежный способ поймать событие очистки — это заставить сам регистр «рассказать», кто к нему обращается. Для этого мы воспользуемся модулем набора записей регистра.

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


Процедура ПередЗаписью(Отказ, Замещение)
	Если Замещение И ЭтотОбъект.Количество() = 0 Тогда
		// Похоже на очистку регистра
		ТекстСообщения = "Регистр очищен. Пользователь: " + ПараметрыСеанса.ТекущийПользователь;
		ТекстСообщения = ТекстСообщения + " Стек вызовов: " + ПодробноеПредставлениеОшибки(Новый ИнформацияОбОшибке);
		
		// Запишем в журнал регистрации
		ЗаписьЖурналаРегистрации("Отладка.ОчисткаРегистра", УровеньЖурналаРегистрации.Предупреждение, , , ТекстСообщения);
		
		// Если нужно более оперативно — запишем в текстовый файл на сервере
		Текст = Новый ЗаписьТекста("C:\temp\log_register.txt", КодировкаТекста.UTF8, , Истина);
		Текст.ЗаписатьСтроку(ТекущаяДата() + " : " + ТекстСообщения);
		Текст.Закрыть();
	КонецЕсли;
КонецПроцедуры

Использование функции ПодробноеПредставлениеОшибки внутри блока Попытка...Исключение или просто генерация стека вызовов позволяет увидеть всю цепочку процедур и функций, которые привели к вызову записи регистра. Это поможет найти место даже в том случае, если используется метод Выполнить() или обращение через Метаданные.

Метод 2. Анализ дополнительных отчетов и обработок

В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) программный код может храниться вне самой конфигурации. Проверим справочник ДополнительныеОтчетыИОбработки. Часто разработчики создают внешние обработки, которые подключаются в пользовательском режиме и настраиваются на выполнение по расписанию.

Рассмотрим, почему их сложно найти:

Чтобы проверить этот вариант, перейдем в раздел Администрирование — Обслуживание — Дополнительные отчеты и обработки. Внимательно изучим список обработок, у которых настроено расписание (колонку "Публикация" или статус выполнения).

Метод 3. Поиск динамических вызовов и обращений через Метаданные

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

  1. Поиск по части имени: если регистр называется ЦеныНоменклатуры, попробуйте искать просто "Цены" или фрагменты уникальной части имени.
  2. Поиск использования метаданных: найдите вхождения Метаданные.РегистрыСведений. Возможно, код перебирает все регистры в цикле и очищает те, которые соответствуют определенному критерию (например, по префиксу или наличию определенного реквизита).
  3. Функции исполнения: поищите ключевые слова Выполнить( и Вычислить(. Очистка может быть зашита в строку, которая собирается конструктором типа "РегистрыСведений." + ИмяРегистра + ".СоздатьНаборЗаписей()".

Метод 4. Использование Технологического журнала (ТЖ)

Если программные методы в 1С не помогают, мы можем опуститься на уровень взаимодействия платформы с базой данных. Для этого настроим Технологический журнал. Нам интересно событие SDBL (язык запросов к базе данных 1С).

Разберем алгоритм действий:

  1. Узнаем имя таблицы регистра в СУБД. Это можно сделать с помощью функции ПолучитьСтруктуруХраненияБазыДанных() или через консоль запросов.
  2. Настроим logcfg.xml для сбора событий SDBL, отфильтровав их по имени нашей таблицы.
  3. В логах ТЖ мы увидим не только сам факт удаления записей, но и контекст выполнения (свойство Context), который покажет стек вызовов в коде 1С.

Пример настройки фильтра в файле конфигурации ТЖ:


<event filter="SDBL">
    <contains name="Func" value="Delete"/>
    <contains name="Data" value="ИМЯ_ТАБЛИЦЫ_В_БД"/>
</event>

Метод 5. Проверка типовых механизмов очистки БСП

В типовой УТ 11 существуют встроенные механизмы автоматической очистки данных. Рассмотрим возможность того, что регистр очищается не специально написанным кодом, а штатной настройкой:

Метод 6. Анализ на уровне СУБД (SQL)

В крайнем случае, если подозрение падает на прямую работу с базой данных (что нарушает лицензионное соглашение, но иногда практикуется "умельцами"), можно воспользоваться инструментами SQL Server Profiler или Extended Events (для MS SQL). Настройте отслеживание команд DELETE или TRUNCATE для конкретной таблицы. Это позволит зафиксировать точное время и системный процесс (SPID), который выполняет очистку, что в дальнейшем поможет сопоставить это с конкретным сеансом в консоли администрирования 1С.

Важное примечание: При расследовании не забудьте проверить собственные расширения. Часто поиск в конфигураторе по умолчанию ищет только в основной конфигурации, игнорируя код в расширениях. Используйте выгрузку конфигурации и расширений в файлы (Конфигурация - Выгрузить конфигурацию в файлы) для последующего текстового поиска через внешние утилиты.

← На главную