Почему не работает фильтр и поиск по контрагенту в документах 1С 7.7 и как это исправить?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Назначение служебной таблицы 1SCRDOC и механизм отборов в 1С 7.7

Для понимания корня проблемы выясним, как платформа 1С 7.7 реализует быстрый отбор документов в журналах и отчетах. В отличие от простых выборок с условиями, стандартные отборы журналов (вызываемые платформенным методом УстановитьОтбор) и связи подчиненности работают не через прямое сканирование заголовков документов в таблице 1SJOURN, а через специальную системную таблицу — 1SCRDOC.DBF (и соответствующий индексный файл 1SCRDOC.CDX).

В этой таблице хранятся:

  1. Значения граф отбора: для каждого документа конфигурации, реквизиты которого включены в состав хотя бы одной графы отбора (например, «Контрагент»), в 1SCRDOC создаются соответствующие индексные записи.
  2. Иерархия подчиненных документов: связи между документами-основаниями и подчиненными им объектами.

Если в процессе нештатной выгрузки базы, сбоя архиватора или аварийного завершения работы файл 1SCRDOC.DBF оказался поврежден, очищен или не перенесся полностью (например, его размер сократился до нескольких сотен байт), платформа теряет возможность выполнять быстрый поиск по графам отбора. В результате фильтрация по контрагенту перестает находить документы, хотя физически они присутствуют в базе данных.

Способ 1. Восстановление служебной таблицы 1SCRDOC через Тестирование и исправление

Рассмотрим основной способ решения проблемы, когда отбор перестал работать массово по всей информационной базе после переноса или сбоя. Так как таблица 1SCRDOC является служебной и формируется платформой на основе данных документов, ее можно безопасно пересоздать с нуля.

Разберем по шагам порядок действий:

  1. Обязательно создадим резервную копию каталога информационной базы перед выполнением любых сервисных операций.
  2. Убедимся, что в базе нет активных пользовательских сессий, и закроем все процессы 1С.
  3. Перейдем в каталог информационной базы через проводник и найдем файлы 1SCRDOC.DBF и 1SCRDOC.CDX. Удалим эти два файла (или переместим их в отдельную временную папку).
  4. Запустим 1С:Предприятие 7.7 в режиме Конфигуратор монопольно.
  5. Откроем главное меню Администрирование и выберем пункт Тестирование и исправление ИБ....
  6. В открывшемся окне снимем все отметки и оставим включенным только пункт Пересчет служебных данных. При необходимости проверки ссылочной целостности можно также включить проверку логической целостности.
  7. Нажмем кнопку Выполнить и дождемся завершения процедуры.

В процессе пересчета платформа заново создаст файл 1SCRDOC.DBF и просканирует все существующие документы, заполнив записи для всех настроенных граф отбора. Размер файла вырастет до реального объема данных базы, а стандартный фильтр по контрагенту в журналах и отчетах снова начнет находить документы.

Способ 2. Проверка состава граф отбора для отдельных видов документов

Проанализируем другую распространенную ситуацию: фильтр по контрагенту работает для основных накладных и счетов, но не находит документы определенного нового или нетипового вида (например, «Мерчендайзинг»), независимо от того, проведены они или нет. Посмотрим на устройство механизма метаданных платформы 7.7: таблица 1SCRDOC едина для всех видов журналов и документов, однако запись в нее попадает только тогда, когда документ явно привязан к графе отбора в конфигурации.

Выясним возможные причины отсутствия документа в отборе:

  1. Реквизит не включен в графу отбора: если разработчик добавил новый документ или новый реквизит контрагента в шапку, но забыл зайти в ветку Графы отбора и включить его в состав графы «Контрагент», платформа не будет регистрировать данный документ в таблице 1SCRDOC.
  2. Ограничения типов данных: в графу отбора типа Справочник.Контрагенты можно включить только реквизит шапки с точно таким же типом. Если у реквизита документа задан составной тип («Неопределенный») или реквизит находится в табличной части, использовать его в стандартных графах отбора 1С 7.7 невозможно.
  3. Состав журнала: если поиск выполняется в дополнительном журнале документов, проверим его свойства. В состав журнала на закладке «Документы» обязательно должен быть включен проверяемый вид документа.

Разберем по шагам, как исправить состав графы отбора в Конфигураторе:

  1. Откроем дерево метаданных конфигурации и развернем ветку Графы отбора.
  2. Найдем графу, по которой не работает поиск (обычно это Контрагент), и дважды щелкнем по ней для открытия окна свойств.
  3. В списке состава графы найдем проблемный вид документа и проверим, выбран ли напротив него соответствующий реквизит шапки. Если привязка отсутствует, укажем нужный реквизит контрагента.
  4. Сохраним конфигурацию.
  5. Выполним пересчет служебных данных через Тестирование и исправление ИБ, как описано в первом способе, чтобы платформа заполнила исторические записи по обновленному составу графы отбора.

Программное обновление записей отбора без полного пересчета базы

Если база данных имеет очень большой объем и полное тестирование базы занимает слишком много времени, можно обновить записи в таблице отборов для конкретного проблемного вида документов с помощью внешней обработки. При стандартной перезаписи документа платформа 1С 7.7 автоматически актуализирует связанные с ним строки в таблице 1SCRDOC. При этом проведение документа не требуется — достаточно простой записи объекта.

Посмотрим на пример пакетной перезаписи непроведенных и проведенных документов нужного вида:


Док = СоздатьОбъект("Документ.Мерчендайзинг");
Док.ВыбратьДокументы();
Пока Док.ПолучитьДокумент() = 1 Цикл
    // Запись объекта без изменения признака проведения
    // инициирует обновление записей в служебной таблице 1SCRDOC
    Попытка
        Док.Записать();
    Исключение
        Сообщить("Ошибка при обновлении документа: " + Док.ТекущийДокумент() + " - " + ОписаниеОшибки());
    КонецПопытки;
КонецЦикла;

После циклической перезаписи документов платформа заполнит недостающие строки в графах отбора, и поиск по контрагенту начнет корректно отображать обновленные документы.

← На главную