При переносе, аварийной выгрузке или сбоях в базе данных 1С:Предприятие 7.7 пользователи нередко сталкиваются с ситуацией, когда в общем журнале документов, специализированных журналах или стандартных отчетах (например, в групповой обработке документов) перестает функционировать фильтр по контрагенту. При этом сами документы и справочники открываются корректно, реквизиты заполнены, но отбор просто не выводит нужные строки или возвращает пустой список. Проанализируем причины такого поведения платформы и разберем по шагам способы восстановления работоспособности механизмов поиска и отбора.
Для понимания корня проблемы выясним, как платформа 1С 7.7 реализует быстрый отбор документов в журналах и отчетах. В отличие от простых выборок с условиями, стандартные отборы журналов (вызываемые платформенным методом УстановитьОтбор) и связи подчиненности работают не через прямое сканирование заголовков документов в таблице 1SJOURN, а через специальную системную таблицу — 1SCRDOC.DBF (и соответствующий индексный файл 1SCRDOC.CDX).
В этой таблице хранятся:
1SCRDOC создаются соответствующие индексные записи.Если в процессе нештатной выгрузки базы, сбоя архиватора или аварийного завершения работы файл 1SCRDOC.DBF оказался поврежден, очищен или не перенесся полностью (например, его размер сократился до нескольких сотен байт), платформа теряет возможность выполнять быстрый поиск по графам отбора. В результате фильтрация по контрагенту перестает находить документы, хотя физически они присутствуют в базе данных.
Рассмотрим основной способ решения проблемы, когда отбор перестал работать массово по всей информационной базе после переноса или сбоя. Так как таблица 1SCRDOC является служебной и формируется платформой на основе данных документов, ее можно безопасно пересоздать с нуля.
Разберем по шагам порядок действий:
1SCRDOC.DBF и 1SCRDOC.CDX. Удалим эти два файла (или переместим их в отдельную временную папку).В процессе пересчета платформа заново создаст файл 1SCRDOC.DBF и просканирует все существующие документы, заполнив записи для всех настроенных граф отбора. Размер файла вырастет до реального объема данных базы, а стандартный фильтр по контрагенту в журналах и отчетах снова начнет находить документы.
Проанализируем другую распространенную ситуацию: фильтр по контрагенту работает для основных накладных и счетов, но не находит документы определенного нового или нетипового вида (например, «Мерчендайзинг»), независимо от того, проведены они или нет. Посмотрим на устройство механизма метаданных платформы 7.7: таблица 1SCRDOC едина для всех видов журналов и документов, однако запись в нее попадает только тогда, когда документ явно привязан к графе отбора в конфигурации.
Выясним возможные причины отсутствия документа в отборе:
Графы отбора и включить его в состав графы «Контрагент», платформа не будет регистрировать данный документ в таблице 1SCRDOC.Справочник.Контрагенты можно включить только реквизит шапки с точно таким же типом. Если у реквизита документа задан составной тип («Неопределенный») или реквизит находится в табличной части, использовать его в стандартных графах отбора 1С 7.7 невозможно.Разберем по шагам, как исправить состав графы отбора в Конфигураторе:
Контрагент), и дважды щелкнем по ней для открытия окна свойств.Если база данных имеет очень большой объем и полное тестирование базы занимает слишком много времени, можно обновить записи в таблице отборов для конкретного проблемного вида документов с помощью внешней обработки. При стандартной перезаписи документа платформа 1С 7.7 автоматически актуализирует связанные с ним строки в таблице 1SCRDOC. При этом проведение документа не требуется — достаточно простой записи объекта.
Посмотрим на пример пакетной перезаписи непроведенных и проведенных документов нужного вида:
Док = СоздатьОбъект("Документ.Мерчендайзинг");
Док.ВыбратьДокументы();
Пока Док.ПолучитьДокумент() = 1 Цикл
// Запись объекта без изменения признака проведения
// инициирует обновление записей в служебной таблице 1SCRDOC
Попытка
Док.Записать();
Исключение
Сообщить("Ошибка при обновлении документа: " + Док.ТекущийДокумент() + " - " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
После циклической перезаписи документов платформа заполнит недостающие строки в графах отбора, и поиск по контрагенту начнет корректно отображать обновленные документы.