В процессе сопровождения типовых конфигураций (например, 1С:Бухгалтерия 3.0) специалисты иногда сталкиваются с парадоксальной ситуацией: при попытке обновить информационную базу система выдает ошибки "код счета не уникальный" или "количество субконто превышает допустимое". При этом в конфигураторе проблемный счет отсутствует, а в режиме «Предприятие» он отображается как предопределенный. Эту ситуацию часто называют возникновением «счета-фантома» или «счета Шредингера».
В этой статье мы подробно проанализируем причины этой технической коллизии и разберем пошаговые методы ее устранения.
Для начала проанализируем, почему платформа 1С:Предприятие 8.3 ведет себя подобным образом. Связь между объектом в конфигураторе и записью в таблице базы данных осуществляется через внутренний идентификатор (GUID) и специальное поле ИмяПредопределенныхДанных.
Проблема возникает из-за сбоя механизма синхронизации. В норме при удалении объекта из метаданных (конфигурации) платформа должна либо удалить соответствующую запись в БД, либо снять с нее признак предопределенности, превратив в обычный элемент. Если этот процесс прерывается или происходит программный сбой, в базе остается запись, которая «считает себя» предопределенной, но для которой нет соответствующего описания в текущей конфигурации. При попытке обновления на новый релиз, где этот код счета используется снова, возникает конфликт уникальности.
Ошибка "количество субконто превышает допустимое" обычно является следствием того, что система пытается объединить настройки субконто из обновления с уже существующими настройками «фантомного» счета, в результате чего их количество превышает лимит (обычно 3 для хозрасчетного плана счетов).
Прежде чем приступать к программным методам, попробуем подготовить базу стандартными средствами. Если обновление конфигурации БД не проходит, но в режиме «Предприятие» вы можете зайти в план счетов, выполним следующие действия:
Рассмотрим ситуацию, когда права доступа не позволяют редактировать такие счета. В этом случае нам потребуется зайти в систему под пользователем с полными правами и использовать специализированные обработки.
Проанализируем ситуацию глубже. Часто визуальное совпадение кодов обманчиво. Нам нужно выяснить реальное имя предопределенного элемента, которое хранится в базе. Для этого в списке плана счетов через "Изменить форму" можно вывести поле Имя предопределенных данных.
Если это поле заполнено значением, которого нет в конфигураторе (в ветке предопределенных данных плана счетов Хозрасчетный), значит, мы имеем дело с «осиротевшей» записью. Система видит связь с метаданными, которых больше не существует.
Самый эффективный способ лечения — принудительно превратить «фантомный» предопределенный счет в обычный элемент. Для этого напишем небольшую обработку или воспользуемся консолью кода. Нам нужно очистить свойство ИмяПредопределенныхДанных для конкретной ссылки.
Разберем пример кода для выполнения этой операции:
// Найдем проблемный счет по коду или ссылке
СчетОбъект = ПланыСчетов.Хозрасчетный.НайтиПоКоду("ВАШ_КОД").ПолучитьОбъект();
Если СчетОбъект <> Неопределено Тогда
// Очищаем признак связи с метаданными
СчетОбъект.ИмяПредопределенныхДанных = "";
// Отключаем проверку уникальности и заполнения, если необходимо
СчетОбъект.ОбменДанными.Загрузка = Истина;
Попытка
СчетОбъект.Записать();
Сообщить("Счет успешно преобразован в обычный элемент.");
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
После выполнения этого кода счет перестанет подсвечиваться «желтым шариком» в интерфейсе и станет обычным элементом плана счетов. Теперь он не будет конфликтовать с новыми предопределенными данными из файла обновления конфигурации.
Проанализируем настройки конфигурации. В свойствах плана счетов есть параметр "Обновление предопределенных данных". По умолчанию он стоит в значении Автоматически.
В некоторых случаях, чтобы «протолкнуть» проблемное обновление, помогает временная установка этого свойства в значение Не обновлять автоматически. Это позволяет применить изменения метаданных без немедленной синхронизации записей в БД. Однако помните, что после успешного обновления и устранения дублей, этот режим лучше вернуть в исходное состояние для корректной работы типовых механизмов 1С.
Иногда «фантом» существует только в оперативной памяти сервера или локальном кэше из-за рассинхронизации Config и dbConfig. Выясним, помогает ли очистка кэша:
srvinfo/reg_1541/snccntx... (серверный кэш).Важный момент: если вы уже успели обновить основную конфигурацию, но обновление конфигурации БД (нажатие синей бочки) не проходит, убедитесь, что вы сравниваете текущее состояние БД именно с конфигурацией базы данных, а не с новым релизом.
Подведем итог. Чтобы вылечить «счет Шредингера», мы должны выполнить следующие действия:
ИмяПредопределенныхДанных, превратив счет в обычный.После успешного обновления вы сможете либо перенести данные со старого (теперь обычного) счета на новый (предопределенный) с помощью обработки "Поиск и замена значений", либо просто удалить старый счет, если по нему нет движений.