В процессе эксплуатации связки программ 1С:Зарплата и Управление Персоналом 3 (ЗУП) и 1С:Бухгалтерия предприятия 3 (БУХ) часто возникают ситуации, когда после физического удаления документа из обеих баз, система при повторном заполнении данных продолжает учитывать удаленный объект. Особенно остро это проявляется в сложных расчетах, таких как Начисление оценочных обязательств. Давайте разберем, по каким «адресам» в памяти системы сохраняются следы обмена и как корректно очистить базу от «призраков» удаленных документов.
Первое, что нам необходимо проанализировать — это работа планов обмена. Когда в одной из баз происходит любое действие с объектом (создание, изменение или удаление), это событие фиксируется в таблице регистрации изменений. Рассмотрим подробнее, как это устроено.
Если вы удаляете документ, в плане обмена создается запись специального типа — УдалениеОбъекта. Эта запись содержит только уникальный идентификатор (GUID) удаленного объекта. Проблема часто заключается в следующем: если вы удалили документ вручную в обеих базах «в обход» штатного механизма синхронизации, базы могут «потерять» информацию о том, что это удаление было согласованным.
Разберем ситуацию по шагам:
УдалениеОбъекта для отправки в БУХ.УдалениеОбъекта для отправки в ЗУП.Если в этот момент происходит сбой или очистка регистрации изменений вручную через обработку Регистрация изменений для обмена, информация о том, что объект больше не существует в другой базе, может не зафиксироваться корректно в служебных таблицах номеров сообщений.
Это «сердце» синхронизации. Именно здесь хранится связка между УникальнымИдентификатором (GUID) документа в ЗУП и его GUID в БУХ. Даже если сам документ удален, запись в этом регистре может остаться «висеть».
Проанализируем структуру этого регистра:
Если при формировании нового документа Начисление оценочных обязательств алгоритм ЗУП обращается к этому регистру и видит, что для определенного периода или условий расчет уже «сопоставлен» с каким-то объектом в БУХ, он может ошибочно исключить эти данные из заполнения. Для решения проблемы необходимо найти записи в этом регистре по старому идентификатору документа (если он известен) или по косвенным признакам и удалить их.
Одной из наиболее вероятных причин, почему ЗУП «помнит» удаленный документ при заполнении нового, является некорректное удаление движений. Документ Начисление оценочных обязательств делает записи в несколько критически важных регистров:
Оценочные обязательстваОценочные обязательства по сотрудникамРасчеты по оценочным обязательствамЕсли документ был удален программно (без использования метода Удалить() с проверкой замещения) или произошел сбой в транзакции, записи в этих регистрах могли остаться без документа-регистратора (так называемые «битые» ссылки или записи-сироты). При автоматическом заполнении нового документа система выполняет запрос к остаткам и оборотам по этим регистрам. Видя, что за прошлый месяц обязательства уже начислены (согласно «зависшим» записям), система просто не включает их в новый расчет.
Для проверки этой гипотезы выполните следующие действия:
Регистратор которых написано <Объект не найден>, — это и есть причина вашей проблемы.В современных версиях ЗУП 3 и БУХ 3 используется формат EnterpriseData. Здесь задействован еще один механизм — Публичные идентификаторы объектов.
Рассмотрим, как работает сопоставление через регистр сведений Публичные идентификаторы объектов. В отличие от старых способов обмена, здесь система может хранить кэш идентификаторов для предотвращения дублирования при повторных выгрузках. Если вы создаете новый документ, который по ключевым полям (Номер, Дата, Организация) похож на старый, система может попытаться «подтянуть» старый идентификатор, считая, что это тот же самый объект.
Для программиста 1С решением будет написание небольшой обработки, которая проверит целостность данных. Разберем пример логики поиска «зависших» соответствий:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Соответствия.СобственныйОбъект,
| Соответствия.УникальныйИдентификаторИсточника,
| Соответствия.УникальныйИдентификаторПриемника
|ИЗ
| РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК Соответствия
|ГДЕ
| Соответствия.ТипИсточника = &ТипДокумента";
Запрос.УстановитьПараметр("ТипДокумента", "ДокументОбъект.НачислениеОценочныхОбязательств");
Результат = Запрос.Выполнить().Выгрузить();
Для Каждого Строка Из Результат Цикл
Если Строка.СобственныйОбъект.ПолучитьОбъект() = Неопределено Тогда
// Найден "битый" хвост обмена для удаленного документа
// Здесь должен быть код по очистке записи регистра
КонецЕсли;
КонецЦикла;
Чтобы окончательно «очистить память» системы и заставить ЗУП заполнять документ правильно, придерживайтесь следующего плана:
Регистрация изменений для обмена нет записей по объекту Начисление оценочных обязательств, которые помечены как «измененные», но фактически отсутствуют.Соответствия объектов информационных баз. В современных версиях это также может быть регистр Публичные идентификаторы объектов.Выяснив причину и место хранения данных, вы сможете избежать подобных проблем в будущем. Помните, что физическое удаление объектов в 1С (особенно участвующих в обмене) — это крайняя мера. Правильнее использовать стандартную пометку на удаление с последующим запуском регламентного задания по удалению помеченных объектов, что гарантирует очистку всех связанных регистров и записей обмена.