Часто в процессе эксплуатации конфигураций 1С:Бухгалтерия 3.0 или специализированных решений на её базе (например, БСО) возникает ситуация, когда типовой план счетов оказывается «испорчен». Это происходит, если администраторы или программисты вместо корректного обновления через механизмы поддержки добавляют предопределенные счета вручную в конфигураторе. При попытке вернуть конфигурацию к типовому виду платформа выдает ошибку о неуникальности кода счета, так как в базе уже существует элемент с таким кодом, но с другим внутренним идентификатором.
В данной статье мы подробно разберем, почему так происходит, и проанализируем наиболее эффективные способы приведения плана счетов в типовое состояние без потери данных.
Для начала выясним причину конфликта. В системе 1С версии 8.3 работа с предопределенными данными устроена сложнее, чем кажется на первый взгляд. Каждый такой элемент имеет два ключевых признака:
ПланыСчетов.Хозрасчетный.Товары.Когда вы добавляете счет вручную в конфигуратор «на лету», платформа создает новый GUID. Если вы затем пытаетесь загрузить типовой CF-файл, система видит «правильный» предопределенный счет из типовой поставки и пытается создать его в базе. Но поскольку в базе уже живет «самописный» счет с тем же кодом (например, «41.01»), возникает конфликт уникальности. Платформа не может связать ваш ручной счет с типовым описанием автоматически, так как их внутренние идентификаторы (GUID) различаются.
Рассмотрим вариант, который часто оказывается самым чистым с точки зрения целостности метаданных. Этот способ особенно хорош, если база не слишком велика по объему.
Проанализируем шаги реализации этого метода:
Хозрасчетный необходимо отключить поиск по внутреннему идентификатору и установить поиск только по коду.Таким образом, все ваши движения «переедут» на правильные типовые счета, а мусорные записи останутся в старой базе.
Если перенос через КД кажется слишком трудоемким из-за большого объема данных (например, база весит более 10 Гб), разберем по шагам технологию «лечения» базы на месте. Этот метод требует аккуратности и последовательности.
Шаг 1. Переименование существующих счетов.
Нам необходимо сделать так, чтобы текущие коды счетов перестали мешать платформе. Напишем простую обработку или воспользуемся групповым изменением реквизитов. Ко всем кодам счетов в пользовательском режиме (1С:Предприятие) добавим префикс, например, нижнее подчеркивание. Код «10.01» должен стать «_10.01».
Выборка = ПланыСчетов.Хозрасчетный.Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.ПолучитьОбъект();
Объект.Код = "_" + Объект.Код;
Попытка
Объект.Записать();
Исключение
Сообщить("Ошибка при записи счета: " + Выборка.Код);
КонецПопытки;
КонецЦикла;
Шаг 2. Загрузка типовой конфигурации.
Заходим в Конфигуратор. Используем функцию «Конфигурация — Загрузить конфигурацию из файла» (выбираем чистый .cf типовой бухгалтерии). Поскольку коды в базе теперь начинаются с подчеркивания, конфликта уникальности не возникнет. Платформа создаст новые, пустые, но «правильные» предопределенные счета.
Шаг 3. Переброска ссылок.
Теперь у нас в базе «двойной» план счетов: счета с подчеркиванием (с данными) и новые типовые счета (пустые). Воспользуемся типовой обработкой «Поиск и замена значений» (её можно найти на ИТС или в составе некоторых инструментов разработчика). В качестве заменяемого значения выбираем «_10.01», а в качестве заменяющего — новый типовой «10.01». Программа найдет все ссылки в документах, проводках и регистрах и заменит старый «кривой» счет на новый «типовой».
Шаг 4. Удаление старых данных.
После успешной замены ссылок старые счета с префиксами можно пометить на удаление и окончательно удалить из системы.
Посмотрим на более «продвинутый» способ, доступный в платформе 8.3. В коде 1С у объектов есть свойство ИмяПредопределенныхДанных. Если мы программно установим это свойство для существующих счетов в базе так, чтобы оно совпадало с именами из типового конфигуратора, платформа при обновлении может «узнать» эти элементы.
Рассмотрим пример кода:
СчетОбъект = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01").ПолучитьОбъект();
СчетОбъект.ИмяПредопределенныхДанных = "Товары";
СчетОбъект.Записать();
После такой манипуляции (проделанной для всех счетов) при объединении конфигураций платформа увидит соответствие не по GUID, а по имени предопределенного элемента. Однако этот метод работает не всегда гладко, особенно если в метаданных структура плана счетов была сильно изменена.
Процесс восстановления плана счетов всегда связан с масштабной реструктуризацией таблиц (особенно Config и таблиц движений). Если ваша база тормозит даже при небольшом объеме (4–7 Гб), обратите внимание на дисковую подсистему.
Важные советы:
%TEMP%) и кэш 1С также находятся на быстром диске.Мы выяснили, что наиболее надежным способом возврата к типовому плану счетов является Метод префиксов с последующей заменой ссылок. Он позволяет избежать трудностей с переносом огромных объемов данных через КД и гарантирует, что все движения останутся в базе. Главное — всегда делать полную резервную копию перед началом любых манипуляций в конфигураторе, так как изменения в плане счетов затрагивают практически все учетные механизмы программы.