Как было дело.
Возникла необходимость отладки обмена между узлами РИБ.
Подключил к хранилищу давно неиспользуемую демо-базу.
Сделал копию этой демо-базы и соответствующим образом её настроил для использования в качестве подчинённого узла.
При запуске в главном узле фонового задания на выгрузку в периферийный узел РИБ получил (при выполнении метода ПланыОбмена.ЗаписатьИзменения) ошибку :
Ошибка SDBL:
Ожидается имя таблицы (pos=6)
При попытке выяснить (в толстом клиенте) какие же изменения зарегистрированы в узел-приёмник (при выполнении метода ПланыОбмена.ВыбратьИзменения) получил ту же ошибку.
---
Возникло предположение: а не зарегистрировано ли в узел что-либо не то?
Решил попробовать удалить все изменения в узел.
При выполнении ПланыОбмена.УдалитьРегистрациюИзменений() получил другую ошибку (назовём её ошибкой №2):
Недопустимое значение параметра (параметр номер '2')
Поиск в сети действенного метода лечения не дал.
Однако, было интуитивно ясно, что проблема - с таблицами изменений. Через консоль запросов быстро нашёл, что ошибка возникает уже при выполнении запроса к таблице изменений константы ВалютаМеждународногоУчёта. Способ лечения был достаточно очевиден. Убрал эту константу из состава всех планов обмена, обновил конфигурацию БД, затем восстановил эту константу в составе тех же ПО, и снова обновил конфигурацию БД.
Смысл описанных действий следующий: при первом обновлении платформа удаляет таблицу изменений константы, при втором - создаёт, новую и безглючную (таблицу изменений).
Далее через консоль запросов обнаружил, что ошибка возникает также при выполнении запроса к таблице изменений следующей константы: ВалютаУправленческогоУчёта.
Досадной особенностью такого поиска было то, что при возникновении ошибки платформа не просто сообщала об ошибке, а ещё и аварийно завершала работу. К тому же перебрать руками все таблицы изменений - это путь не для программиста. Поэтому: была написана обработка, выполняющая тестовое чтение всех таблиц изменений по очереди.
Писалась она не за один подход, и в промежутках между ними я ещё попробовал найти решение проблемы в сети. Удалось его найти на ИТС, только поиском решения для ошибки №2, а не для основной, с которой всё началось (с ошибки SDBL). В описание ошибки на ИТС сказано, что причина её - в ОТСУТСТВИИ таблиц изменений. Лечится она обновлением платформы до 8.3.13.1926 и тестированием и исправлением с реструктуризацией таблиц.
Ссылка на 1С-овское описание ошибки: https://bugboard.v8.1c.ru/error/000056151
Несмотря на найденное решение, обработку я дописал. Обнаружил, что у меня отсутствовали таблицы изменений только для констант. Вылечил их выключением-включением в планы обмена.
Обновление платформы решил пока не делать (чтобы лишний раз не напрягать сисадминов).
Выводы:
1) Причина описанных ошибок - в ОТСУТСТВИИ каких-либо из таблиц изменений.
2) Лечатся описанные ошибки обновлением платформы и реструктуризацией таблиц.
3) Обойтись без обновления можно через поиск проблемных таблиц изменений и их пересоздание.
Прилагаемая обработка - только для случая, когда нужно обойтись без обновления платформы. Алгоритм работы обработки:
- перебирает составы всех планов обмена и составляет список метаданных объектов конфигурации, по которым регистрируются изменения;
- сортирует полученный список примерно как в конфигураторе (константы, затем справочники, за ними документы, и т. д.);
- для каждого объекта метаданных из полученного списка формирует текст запроса к соответствующей таблице изменений (для разных типов объектов конфигурации они немного различаются) , запускает запрос на выполнение и сообщает об успешности/неуспешности его выполнения.
Чтобы не было аварийных завершений работы платформы в процессе работы обработки, запросы к таблицам изменений выполняются в фоновых заданиях. Для их запуска в конфигурацию нужно будет добавить общий модуль с именем ВременныйСерверный и флажками Серверный, ВызовСервера и Привилегированный, а в нём - создать процедуру:
Процедура ВыполнитьЗапрос(ТекстЗапроса) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
РезультатЗапроса = Запрос.Выполнить();
КонецПроцедуры
Обработка написана под толстый клиент.
Использовалась платформа 8.3.13.1513
P.S.
В процессе тестирования базы, с которой я работал, было обнаружено, что при попытке чтения таблиц изменений разных констант возникают ошибки типа "Ожидается имя таблицы" с разными числами в скобках после слова pos:
Ожидается имя таблицы (pos=125))
Ожидается имя таблицы (pos=275))
Ожидается имя таблицы (pos=281))
Ожидается имя таблицы (pos=365))
Ожидается имя таблицы (pos=371))
Ожидается имя таблицы (pos=545))
Ожидается имя таблицы (pos=635))
Ожидается имя таблицы (pos=731))
Ожидается имя таблицы (pos=821)