Ситуация, когда после планового обновления конфигурации 1С:Зарплата и Управление персоналом 3.1 (особенно начиная с версий ветки 3.1.11 и выше) пользователи обнаруживают «пропажу» документов, является довольно распространенной. Примечательно, что документы не исчезают бесследно: они доступны в специализированных списках (например, «Приемы, переводы, увольнения»), по ним сформированы корректные движения в регистрах, но в общих журналах, таких как Кадровые документы или Все начисления, их нет. Рассмотрим подробно причины этого поведения и разберем по шагам методы исправления ситуации.
Для начала разберем внутреннюю архитектуру современных типовых решений на платформе 1С:Предприятие 8.3. В конфигурации ЗУП 3.1 для оптимизации производительности при работе с большими объемами данных разработчики отказались от прямого обращения к таблицам документов в динамических списках общих журналов. Вместо этого используется механизм вспомогательных регистров, таких как РегистрСведений.РеестрДокументов и РегистрСведений.СоставДокументовЗарплатаКадры.
Когда вы открываете журнал Кадровые документы, система выполняет запрос не к таблице Документ.ПриемНаРаботу, а к вышеупомянутым регистрам. Проанализируем пример запроса, который лежит в основе динамического списка:
ВЫБРАТЬ
ЖурналДокументовКадровыеДокументы.Ссылка КАК Ссылка,
ЖурналДокументовКадровыеДокументы.Дата КАК Дата,
// ... другие поля ...
ИЗ
ЖурналДокументов.КадровыеДокументы КАК ЖурналДокументовКадровыеДокументы
{ГДЕ
(ИСТИНА В
(ВЫБРАТЬ ПЕРВЫЕ 1
ИСТИНА
ИЗ
РегистрСведений.СоставДокументовЗарплатаКадры КАК СоставДокументовЗарплатаКадры
ГДЕ
СоставДокументовЗарплатаКадры.ФизическоеЛицо = &ФизическоеЛицо
И ЖурналДокументовКадровыеДокументы.Ссылка = СоставДокументовЗарплатаКадры.ДокументФизическогоЛица))}
Как мы видим, в запросе используется соединение с вспомогательными регистрами. Если в процессе обновления базы данных произошел сбой синхронизации между основным документом и записью в этих регистрах, документ исчезает из журнала. Основным «виновником» такой рассинхронизации часто выступают расширения конфигурации, которые добавляют в документы собственные реквизиты. При обновлении платформы или конфигурации механизм реструктуризации таблиц может некорректно обработать объекты, затронутые расширением, что приводит к «выпадению» записей из индекса журнала.
Этот метод является наиболее радикальным, но и самым эффективным, если проблема вызвана некорректной реструктуризацией. Рассмотрим его по шагам:
ВыгрузкаЗагрузкаДанныхXML. Выгрузите только те объекты, которые содержат данные из расширения.Администрирование — Печатные формы, отчеты и обработки — Расширения и полностью удалите расширение, которое вносит изменения в структуру «пропавших» документов.Администрирование — Тестирование и исправление. Выберите пункты:
Проанализируем ситуацию: после удаления расширения и проведения ТиИ система восстанавливает связи в Реестре документов, так как структура объектов становится «чистой» с точки зрения типовой конфигурации.
Если вы не хотите прибегать к удалению расширения, можно попробовать инициировать обновление вспомогательных данных программным путем. Выясним причину: часто достаточно просто перезаписать документ, чтобы сработал подписка на событие, обновляющая Реестр документов.
Рассмотрим пример кода на встроенном языке 1С, который можно запустить во внешней обработке для принудительного обновления:
Процедура ОбновитьРеестрДокументов()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриемНаРаботу.Ссылка КАК Ссылка
|ИЗ
| Документ.ПриемНаРаботу КАК ПриемНаРаботу
|ГДЕ
| ПриемНаРаботу.Проведен = ИСТИНА";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбъектДок = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
Попытка
// Используем режим записи без проведения, чтобы не менять движения
ОбъектДок.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Обновлен документ: " + ОбъектДок);
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
При выполнении метода Записать() платформа вызывает стандартные механизмы БСП (Библиотеки стандартных подсистем), которые отвечают за актуализацию данных в журналах. В большинстве случаев это возвращает «пропавшие» записи в списки.
В ЗУП 3.1 предусмотрены встроенные механизмы для исправления подобных коллизий. Рассмотрим подробнее работу с формой «Обслуживание».
Администрирование — Обслуживание.Обновление программы и выберите Результаты обновления и дополнительные процедуры.Обновление вспомогательных данных (она доступна через консоль функций или через поиск в «Все функции»). Она позволяет принудительно запустить пересчет данных для конкретных объектов метаданных.Выясним, как избежать подобных проблем в будущем. Критически важно при создании расширений соблюдать следующие правила:
Проанализируем итог: проблема отсутствия документов в журналах 1С 8.3 — это почти всегда проблема индексации данных в реестрах, а не физическая пропажа объектов. Использование реструктуризации и программной перезаписи объектов позволяет полностью восстановить работоспособность системы без потери данных.