При работе в распределенных информационных базах (РИБ) одной из самых трудноуловимых проблем является ошибка механизма разделения данных. Часто она проявляется в момент синхронизации, когда система отказывается записывать объект, ссылаясь на недопустимые значения разделителей. Типичный пример сообщения об ошибке: «объект: 'Справочник.ВетеринарноСопроводительныйДокументВЕТИС' = {"S","2000"}, в то время как допустимым значением является {"S","0"}». Разберемся по шагам, почему это происходит и как привести базы в соответствие.
Для начала проанализируем само содержание ошибки. Значения {"S","0"} и {"S","2000"} не являются случайными строками. В платформе 1С:Предприятие 8 число «2000» в контексте системных идентификаторов чаще всего указывает на смещение дат. При создании базы в консоли администрирования или при загрузке из файла можно выбрать параметр «Смещение дат», который может принимать значения 0 или 2000.
Если в центральной базе установлено смещение 0, а в периферийной — 2000, то при передаче данных через XML-пакеты РИБ происходит конфликт интерпретации внутренних идентификаторов. Платформа воспринимает данные из другой базы как принадлежащие иному «контенту» или области разделения, что и вызывает блокировку записи.
Выясним, совпадают ли настройки серверных баз. Для этого нам необходимо обратиться к консоли администрирования серверов 1С:Предприятие. Рассмотрим процедуру проверки:
Если значения различаются, это и есть корень проблемы. Важно помнить: изменить смещение дат в уже созданной и работающей базе штатными средствами консоли невозможно. Единственный корректный способ привести их к единому знаменателю — это выгрузка базы в файл .dt и загрузка в новую базу с правильно установленным параметром смещения.
Проанализируем ситуацию с версиями платформы. Разные версии могут по-разному обрабатывать механизмы сериализации объектов, особенно если речь идет о сложных справочниках с включенным разделением данных, таких как объекты ВЕТИС. Рассмотрим наши действия:
Хотя само по себе обновление платформы не всегда исправляет проблему разделителей, оно исключает вероятность возникновения ошибок из-за разного поведения механизмов Data Separation в разных релизах.
Если параметры баз совпадают, а ошибка сохраняется, нам следует заглянуть «под капот» конфигурации. Ошибка прямо указывает на справочник Справочник.ВетеринарноСопроводительныйДокументВЕТИС. Проанализируем, какие общие реквизиты-разделители влияют на этот объект.
В типовых решениях (Розница, УНФ) может использоваться механизм разделения данных по организациям или магазинам. Если объект помечен как разделяемый, то при попытке записи система проверяет, соответствуют ли разделители текущего сеанса тем, что указаны в объекте.
Посмотрим на пример кода в модуле сеанса, который может влиять на инициализацию разделителей:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
// Если сеанс вызван обменом данными, нужно проверить,
// не переопределяются ли значения разделителей некорректно
Если ОбменДаннымиСервер.ЭтоСеансОбмена() Тогда
// Установка специфических значений для области данных
// Например, принудительная установка области "0"
КонецЕсли;
КонецПроцедуры
Если в вашей базе используется механизм «Областей данных» (SaaS-модель), убедитесь, что периферийный узел РИБ не пытается записать данные в область, к которой у него нет доступа в текущем сеансе.
Рассмотрим метод более детального поиска ошибки с помощью отладчика. Нам нужно поймать момент, когда объект пытается записаться в базу-приемник. Для этого в периферийной базе установим точку останова в модуле справочника ВетеринарноСопроводительныйДокументВЕТИС в процедуре ПередЗаписью или в процедуре загрузки данных обмена.
При остановке в отладчике выполним следующие действия:
ЭтотОбъект.ОбменДанными.Загрузка. Обычно оно равно Истина.ПолучитьРазделителиСеанса() (если конфигурация позволяет) или проверим параметры сеанса, отвечающие за разделение.Часто выясняется, что в данных, пришедших из центра, заполнен реквизит, который в базе-приемнике считается системным разделителем и имеет другое значение.
Иногда платформа «запоминает» старые настройки разделителей в кэше метаданных. Проанализируем ситуацию: если вы обновляли конфигурацию или меняли настройки сервера, старый кэш может выдавать ошибку даже при верных данных. Выполним следующие действия:
snccntx и reg_1541 (за исключением файлов журналов и настроек).Справочник.ВетеринарноСопроводительныйДокументВЕТИС с включенными пунктами проверки логической и ссылочной целостности.Ошибка с разделителями {"S","2000"} и {"S","0"} — это явный признак рассинхронизации настроек СУБД или платформенных параметров «Смещение дат». Основное решение: убедиться, что обе базы (и центральная, и периферийная) созданы с одинаковым смещением даты. Если это не так, базу с некорректным смещением придется пересоздать через выгрузку/загрузку .dt. В дополнение к этому всегда следите за идентичностью версий платформы 1С на всех узлах РИБ.