При работе с базами данных на платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с крайне неприятной проблемой. При попытке добавить новый реквизит в крупный справочник (например, «Необоротные активы», «Номенклатура» или «Контрагенты»), в котором содержится более 20 000 записей, процесс сохранения конфигурации «зависает». В некоторых случаях это «зависание» может длиться часами, вынуждая администраторов аварийно завершать работу конфигуратора, что чревато повреждением всей базы данных.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы 1С 7.7 и рассмотрим три эффективных практических метода решения этой задачи — от безопасного штатного до продвинутых способов прямой модификации таблиц базы данных.
Для того чтобы понять суть проблемы, нам необходимо заглянуть под капот платформы 1С 7.7. Когда мы добавляем любой новый реквизит в справочник, система инициирует процедуру реструктуризации базы данных. Алгоритм, заложенный разработчиками платформы более двадцати лет назад, работает крайне неоптимально:
.cdx в файловом режиме) или индексы таблиц в MS SQL Server. Если записей много, а индексированных реквизитов несколько, время выполнения операции возрастает в геометрической прогрессии. Именно поэтому скромная база на 22 000 записей может обновляться по 5–10 часов.Рассмотрим по шагам три основных метода, которые позволят нам обойти это ограничение и добавить реквизит за считанные минуты или даже секунды.
Если мы хотим решить проблему исключительно встроенными средствами конфигуратора 1С 7.7, не прибегая к сторонним утилитам и прямому вмешательству в базу данных, этот метод подойдет идеально. Его суть заключается в том, чтобы избавить платформу от тяжелой работы по постоянному обновлению индексов во время переноса записей.
Разберем этот процесс по шагам:
НеоборотныеАктивы).Этот метод ориентирован на системных администраторов и программистов, чья база данных работает под управлением MS SQL Server. Он позволяет полностью исключить долгий процесс копирования таблиц силами 1С и выполнить задачу за одну секунду.
Внимание: Перед проведением любых манипуляций с SQL-таблицами обязательно сделайте резервную копию базы данных!
Рассмотрим алгоритм действий:
1cv7.dd (или 1cv7.dds) с помощью любого текстового редактора.SP12345), и физическое имя самой таблицы справочника (например, SC123). Заодно зафиксируем точный тип данных в SQL (например, NUMERIC(15,2)).
ALTER TABLE SC123 ADD SP12345 NUMERIC(15,2) NOT NULL DEFAULT 0;
Этот запрос выполнится на сервере мгновенно, так как SQL Server просто добавит описание колонки со значением по умолчанию без полной перезаписи таблицы.
1cv7.md и словаря 1cv7.dd (или 1cv7.dds) и заменим ими аналогичные файлы в рабочем каталоге базы данных.Если ваша база данных является файловой (работает на DBF-таблицах), мы можем применить аналогичную «хитрость», используя специализированные DBF-редакторы (например, DBF Commander или аналогичные инструменты).
Разберем схему действий по шагам:
1cv7.dd.1cv7.dd в текстовом редакторе и найдем физическое имя DBF-файла нашего справочника (например, SC123.dbf) и параметры нового поля (например, имя SP12345, тип N, длина 15, точность 2)..cdx. Не переживайте, при первом монопольном запуске платформа автоматически перестроит их заново.SC123.dbf нашей рабочей базы в DBF-редакторе.SP12345, указав соответствующий числовой тип данных, длину и точность. Сохраним изменения в DBF-файле.1cv7.md и 1cv7.dd в рабочей базе на новые файлы из тестовой базы..cdx и запустит процедуру автоматической переиндексации. Этот процесс пройдет очень быстро, и база будет полностью готова к работе с новым реквизитом.В крупных проектах на базе 1С 7.7, работающих на SQL, разработчики часто вообще отказываются от изменения стандартной структуры метаданных для хранения новых аналитических разрезов. Вместо внесения изменений в конфигурацию применяется технология хранения данных во внешних таблицах СУБД.
С помощью внешней компоненты 1С++ разработчик создает произвольную SQL-таблицу непосредственно на сервере базы данных. Связь между элементами справочника 1С и записями в этой таблице осуществляется по уникальному идентификатору ID элемента (который в 1С представляет собой 9-символьную строку). Чтение и запись данных производятся с помощью прямых SQL-запросов через объект ODBCRecordset. Этот подход гарантирует, что структура метаданных 1С остается неизменной, а пользователи могут продолжать бесперебойную работу в системе даже в момент добавления новых колонок на уровне СУБД.