Ситуация, когда в базу данных ошибочно записывается документ с некорректной датой (например, из далекого прошлого — 0020 год, или далекого будущего), является довольно распространенной. Основная сложность заключается в том, что пользователь может не запомнить, какой именно вид документа он создавал, а стандартные журналы из-за установленных фильтров по периоду или виду операции не отображают «потеряшку». В рамках этой статьи мы разберем по шагам, как вычислить такой объект в конфигурации «1С:Управление торговлей 11».
Проанализируем самый надежный способ, который работает даже в том случае, если документ не был проведен, а просто записан. Журнал регистрации фиксирует все действия пользователей в системе. Если вы знаете примерное время, когда произошла ошибка, или имя пользователя, это значительно сузит область поиска.
Для этого выполним следующие действия:
Этот метод хорош тем, что он не зависит от даты самого документа, так как фиксирует дату реального внесения записи в базу данных.
В современных редакциях УТ 11 (начиная с 11.2 и выше) существует специальный регистр, предназначенный для оптимизации списков. Разберем работу с регистром ДанныеПервичныхДокументов. В нем хранятся ключевые реквизиты всех первичных документов системы: дата, номер, организация и ссылка на сам объект.
Посмотрим, как им воспользоваться:
ДанныеПервичныхДокументов.Если же документ проведен и должен влиять на расчеты, проанализируем блоки заданий, например, ЗаданияКРасчетуСебестоимости. Проведенный документ с некорректной датой обязательно «засветится» в этих очередях, так как система попытается пересчитать итоги с начала времен.
Если поиск через интерфейс не дал результатов, воспользуемся мощью встроенного языка 1С. Мы можем написать скрипт, который автоматически «прочешет» все существующие в конфигурации виды документов и выведет те, чья дата попадает в аномальный диапазон. Рассмотрим пример кода, который можно запустить через консоль кода или внешнюю обработку:
Для Каждого МетаДокумент Из Метаданные.Документы Цикл
// Выбираем документы в диапазоне дат первого столетия
Выборка = Документы[МетаДокумент.Имя].Выбрать(Дата('00010101'), Дата('01010100'));
Пока Выборка.Следующий() Цикл
Сообщить("Найден аномальный документ: " + Выборка.Ссылка + " | Дата документа: " + Выборка.Дата);
КонецЦикла;
КонецЦикла;
Этот алгоритм последовательно обращается к каждой таблице документов в базе. Преимущество метода в том, что нам не нужно знать тип документа — Метаданные.Документы содержит полный список всех возможных объектов системы.
Выясним, как решить задачу с помощью запросов. Если мы не хотим писать цикл, мы можем использовать консоль запросов для быстрого сканирования конкретных групп документов. Проблема в том, что в языке запросов 1С нельзя написать ВЫБРАТЬ * ИЗ Документ.*. Нужно указывать конкретную таблицу.
Однако мы можем объединить несколько вероятных типов документов. Например:
ВЫБРАТЬ Ссылка, Дата ИЗ Документ.ЗаказКлиента ГДЕ Дата < ДАТАВРЕМЯ(2000, 1, 1)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Ссылка, Дата ИЗ Документ.ПриобретениеТоваровУслуг ГДЕ Дата < ДАТАВРЕМЯ(2000, 1, 1)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Ссылка, Дата ИЗ Документ.РеализацияТоваровУслуг ГДЕ Дата < ДАТАВРЕМЯ(2000, 1, 1)
Рассмотрим этот способ как вспомогательный, если круг «подозреваемых» типов документов сужен до 5–10 наиболее часто используемых.
Проанализируем возможность глобального поиска. В 1С:Предприятие 8 реализован механизм полнотекстового поиска. Если документ был записан, его данные (включая дату в строковом представлении) попадают в индекс.
Важно: этот метод сработает только в том случае, если индекс полнотекстового поиска актуален. Проверить это можно в разделе Администрирование — Поддержка и обслуживание — Управление полнотекстовым поиском. Если индекс не обновлен, следует нажать кнопку «Обновить индекс».
Рассмотрим нестандартное применение этой обработки. Хотя её основная цель — замена ссылок, встроенные в неё фильтры позволяют искать объекты по реквизитам во всей базе данных. В поле «Что искать» мы можем настроить отбор по реквизиту Дата, установив условие «Меньше» или «Равно» нашей ошибочной дате. Система просканирует метаданные и выведет список найденных ссылок.
Если ваша база работает на MS SQL Server или PostgreSQL, и у вас есть доступ к СУБД, задачу можно решить молниеносно. В SQL все документы имеют поле _Date_Time. Несмотря на то, что даты в 1С хранятся с определенным смещением (обычно +2000 лет), запрос на поиск записей с минимальными значениями в колонках дат по всем таблицам _Document позволит найти виновника за считанные секунды.
Однако помните, что прямое обращение к таблицам СУБД — это крайняя мера, которую стоит использовать только опытным системным администраторам, так как она требует понимания структуры имен таблиц 1С (например, через ПолучитьСтруктуруХраненияБазыДанных).
Подводя итог, можно сказать, что самым быстрым и доступным способом для обычного пользователя будет Журнал регистрации, а для технического специалиста — небольшой скрипт по метаданным. Выбор метода зависит от ваших прав доступа в системе и сложности ситуации.