В процессе сопровождения типовых конфигураций 1С часто возникает ситуация, когда стандартной длины кода справочника (например, 9 символов) становится недостаточно. Это может быть связано с загрузкой данных из внешних систем или специфическими требованиями бизнеса к нумерации. Начиная с определенных версий платформы 1С:Предприятие 8.3, разработчики получили возможность изменять структуру данных через расширения, не снимая основную конфигурацию с поддержки. Однако эта процедура имеет свои нюансы и "подводные камни", которые мы подробно разберем в данной статье.
Прежде чем приступать к изменениям, нам необходимо убедиться, что используемая платформа и настройки конфигурации поддерживают модификацию структуры таблиц базы данных через механизм расширений. Рассмотрим основные условия:
Код и Наименование) появилась в платформе начиная с версии 8.3.12.РежимСовместимости ниже 8.3.12 (например, 8.3.10), платформа заблокирует попытку изменить физическую структуру таблиц.ИспользуетсяТолькоДляИсправления. Если этот флаг установлен, расширение будет считаться "патчем", который не может вносить изменения в структуру данных (создавать таблицы, менять длину полей и т.д.).Разберем последовательность действий, которую необходимо выполнить программисту для успешного решения задачи. Представим, что нам нужно увеличить длину кода справочника СтраныМира.
Шаг 1. Добавление объекта в расширение. В дереве объектов основной конфигурации найдем нужный справочник, нажмем на него правой кнопкой мыши и выберем пункт "Добавить в расширение". Убедитесь, что справочник перенесся со всеми необходимыми свойствами.
Шаг 2. Изменение свойства. Откроем палитру свойств справочника уже внутри расширения. Найдем поле ДлинаКода и установим требуемое значение (например, увеличим с 3 до 10 символов). На этом этапе многие сталкиваются с проблемой: при попытке обновить конфигурацию базы данных (F7) система выдает ошибку: "Значение контролируемого свойства ДлинаКода у объекта не совпадает со значением в расширяемой конфигурации".
Шаг 3. Настройка контроля свойства. Рассмотрим подробнее механизм, который вызывает эту ошибку. Платформа по умолчанию строго следит за тем, чтобы метаданные расширения соответствовали метаданным основной конфигурации. Чтобы обойти это ограничение, нам нужно изменить режим проверки:
ДлинаКода найдите маленькую иконку (она может выглядеть как две кавычки или лупа). Это значок настройки контроля свойства.Важно понимать, что изменение длины кода — это не просто изменение экранной формы, а реальное изменение физической структуры таблицы в базе данных (SQL или файловой). Проанализируем последствия этого процесса:
При нажатии клавиши F7 (Обновить конфигурацию базы данных) платформа запустит процесс реструктуризации. Для этого ей потребуется монопольный доступ к базе данных. Если в системе в данный момент работают пользователи, обновление завершится ошибкой. Процесс реструктуризации может занять значительное время, если справочник содержит сотни тысяч или миллионы записей, так как платформе необходимо перестроить индексы и физически расширить поля в таблице.
Обратите внимание: Увеличить длину кода можно, но уменьшить её относительно значения в основной конфигурации платформа не позволит. Это логично, так как уменьшение длины может привести к потере данных (обрезанию значащих символов кода), что недопустимо для целостности системы.
Выясним причину, по которой простого увеличения длины поля иногда бывает недостаточно для корректной работы. В 1С используется механизм автоматической генерации кодов. Рассмотрим ситуацию на примере:
Если старая длина кода была 3 символа и последний номер был "999", то после увеличения длины до 5 символов следующий код может автоматически сформироваться как "1000". Однако, если в кодах используются префиксы (например, "УТ-001"), изменение длины может потребовать пересмотра логики префиксации. В некоторых случаях после изменения длины в расширении требуется программно вызвать процедуру ОбновитьПовторноИспользуемыеЗначения() или вручную перенумеровать существующие записи, чтобы автонумерация подхватила новый диапазон.
Для программной проверки текущей длины кода в контексте расширения мы можем использовать следующий код:
// Пример получения длины кода программно
МетаданныеСправочника = Справочники.СтраныМира.Метаданные();
ДлинаКодаОбъекта = МетаданныеСправочника.ДлинаКода;
Сообщить("Текущая длина кода справочника: " + ДлинаКодаОбъекта);
Проанализируем возможные риски, которые следует учитывать руководителю проекта и ведущему программисту:
Подводя итог, можно сказать, что механизм расширений предоставляет мощный инструмент для кастомизации системы без снятия с поддержки. Главное — помнить про настройку режима контроля свойств ("две кавычки") и учитывать необходимость монопольного доступа при обновлении базы данных.