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