При обновлении нетиповых (измененных) конфигураций «1С:Бухгалтерия предприятия 3.0» (и других программ на базе Библиотеки стандартных подсистем — БСП) разработчики часто сталкиваются с критической ошибкой на этапе принятия изменений. В процессе обновления базы в режиме «1С:Предприятие» система аварийно завершает работу, выдавая длинное сообщение об ошибке, связанное с общим модулем РаботаВМоделиСервиса. Программа сообщает, что обнаружены несоответствия в структуре метаданных, так как определенные объекты конфигурации не входят в состав разделителей и одновременно не защищены специальными подписками на события.
В этой статье мы подробно разберем, почему возникает эта ошибка, как устроены механизмы защиты данных в модели сервиса (облачном режиме / 1C:Fresh) и какими способами можно успешно завершить обновление информационной базы. При регулярном обслуживании нескольких систем этот процесс можно автоматизировать, настроив архивирование, обновление и тестирование баз 1С по расписанию.
Для начала проанализируем архитектурную суть проверки, которую выполняет БСП. Современные типовые конфигурации 1С изначально проектируются с поддержкой работы в модели сервиса (SaaS). Это означает, что в одной базе данных могут одновременно работать сотни независимых организаций (абонентов). Для обеспечения изоляции данных используются механизмы разделения.
Все объекты метаданных в такой архитектуре жестко делятся на две категории:
ОбластьДанныхОсновныеДанные (и вспомогательный — ОбластьДанныхВспомогательныеДанные).Чтобы пользователи отдельных областей данных не могли случайно или умышленно перезаписать общую информацию (например, испортить единый справочник валют или забить мусором служебный регистр), БСП использует защитные подписки на события, такие как КонтрольНеразделенныхОбъектовПриЗаписи и КонтрольНеразделенныхНаборовЗаписейПриЗаписи. Эти подписки перехватывают попытку записи общего объекта в разделенном сеансе и вызывают исключение.
Во время обновления ИБ процедура РаботаВМоделиСервиса.КонтрольНеразделенныхДанныхПриОбновлении() выполняет тотальную проверку структуры метаданных конфигурации. Она требует, чтобы любой объект ИБ удовлетворял одному из условий:
Если в конфигурации обнаруживается объект (например, устаревший регистр сведений РегистрСведений.УдалитьОтправкиОтчетностиКОбработке), который не входит в разделители и при этом исключен из подписок контроля, БСП считает конфигурацию потенциально небезопасной и аварийно прерывает обновление.
При обновлении измененных конфигураций через окно «Сравнение и объединение» разработчики часто совершают типовые ошибки:
Удалить. При ручном сравнении и объединении конфигураций разработчик часто оставляет сам объект (чтобы не потерять данные или случайно пропустив его из-за фильтров), но при этом обновляет свойства общих реквизитов и подписок из новой конфигурации поставщика. В результате объект зависает «в воздухе»: он больше не разделен и больше не защищен подпиской.Рассмотрим подробнее по шагам все возможные варианты решения этой проблемы — от быстрых обходных путей до правильных архитектурных подходов.
Если ошибка указывает на объект, который содержит префикс Удалить (например, РегистрСведений.УдалитьОтправкиОтчетностиКОбработке), это означает, что фирма «1С» больше не использует данный объект. Самым правильным решением будет полностью удалить его из вашей конфигурации, если вы уверены, что в нем нет критически важных данных, которые вы планировали перенести.
Разберем процедуру удаления через сравнение и объединение:
ОбластьДанныхОсновныеДанные и установите для него флаг, чтобы взять свойства из новой конфигурации поставщика.РегистрСведений.УдалитьОтправкиОтчетностиКОбработке). Если в новой конфигурации поставщика этого регистра уже нет, система предложит его удалить. Установите флаг объединения для этого регистра.Если же кнопка установки флага для удаления неактивна или объект отсутствует в новой конфигурации поставщика, вы можете вручную удалить проблемный регистр из дерева метаданных конфигурации (предварительно сняв ее с поддержки или разрешив изменения для этого объекта), а также удалить связанные с ним подписки на события.
Если вы хотите сохранить проблемный объект в конфигурации, но вам нужно срочно обойти ошибку обновления, воспользуйтесь самым простым и популярным решением:
ОбластьДанныхОсновныеДанные и откройте его палитру свойств.Важное примечание: Этот способ отлично работает для быстрого обхода ошибки, однако с точки зрения архитектуры БСП он может быть не совсем корректным, если объект по своей логике должен быть неразделенным (общим для всей базы данных). Тем не менее, для успешного прохождения проверки обновления этот метод является самым быстрым.
Если ваш кастомный или устаревший объект должен оставаться строго неразделенным (общим для всей базы данных), его ни в коем случае нельзя включать в состав разделителя ОбластьДанныхОсновныеДанные. Правильный путь — привязать его к подпискам контроля БСП:
КонтрольНеразделенныхОбъектовПриЗаписи (если ошибка возникла на справочнике, документе или другом ссылочном типе) или КонтрольНеразделенныхНаборовЗаписейПриЗаписи (если ошибка указывает на регистр сведений, накопления или бухгалтерии).Теперь система контроля БСП увидит, что ваш объект защищен от несанкционированной записи в разделенных сеансах, и успешно пропустит этот шаг при обновлении.
Если вы не хотите вручную править свойства подписок или разделителей (чтобы облегчить последующие обновления конфигурации), в БСП предусмотрен штатный программный механизм добавления исключений.
В некоторых сообщениях на форумах предлагают напрямую редактировать процедуру КонтрольНеразделенныхДанныхПриОбновлении в общем модуле РаботаВМоделиСервиса, добавляя туда строки вида:
// Прямое добавление в исключения БСП (не рекомендуется править типовой код!)
Исключения.Добавить(Метаданные.РегистрыСведений.УдалитьОтправкиОтчетностиКОбработке);
Однако прямое редактирование общего модуля РаботаВМоделиСервиса усложнит поддержку конфигурации. Правильнее использовать официальную точку интеграции БСП:
ИнтеграцияПодсистемБТС (или аналогичный модуль вашей версии БСП, отвечающий за интеграцию технологии сервиса).ПриОпределенииИсключенийНеразделенныхДанных(Исключения).Исключения. Пример правильного кода:
Процедура ПриОпределенииИсключенийНеразделенныхДанных(Исключения) Экспорт
// Добавляем кастомные или устаревшие объекты в список исключений контроля БСП
Исключения.Добавить(Метаданные.РегистрыСведений.УдалитьОтправкиОтчетностиКОбработке);
КонецПроцедуры
Этот способ позволяет пройти проверку обновления без изменения критически важных типовых механизмов контроля БСП и сохраняет структуру конфигурации в чистоте. Чтобы убедиться в отсутствии ошибок в данных после завершения всех правок, можно запустить автоматическое сравнение бухгалтерских и налоговых проводок с базой до обновления.
Начиная с версии платформы «1С:Предприятие 8.3.11», разработчики начали массово использовать Расширения конфигурации для добавления новых объектов. Если вы добавили собственный справочник или регистр через Расширение, вы гарантированно столкнетесь с аналогичной ошибкой, так как:
Для решения этой проблемы в современных версиях БСП предусмотрена автоматическая обработка объектов расширений. Если же вы работаете на более старой версии БСП, вам необходимо программно добавить метаданные вашего расширения в список исключений через вышеописанную процедуру ПриОпределенииИсключенийНеразделенныхДанных общего модуля интеграции. Для комплексной проверки состава расширений и конфигурации на подобные ошибки можно использовать инструмент для анализа конфигураций и расширений.
Мы проанализировали причины возникновения ошибки контроля структуры неразделенных данных БСП при обновлении «1С:Бухгалтерия 3.0». Для исправления ситуации вы можете использовать любой из предложенных методов в зависимости от ваших задач:
ПриОпределенииИсключенийНеразделенныхДанных.