При активном использовании механизма расширений в платформе 1С:Предприятие разработчики часто сталкиваются с необходимостью доработки существующих типовых реквизитов. Типичный сценарий: в типовой конфигурации длина строкового реквизита (например, НомерСчета в справочнике БанковскиеСчетаКонтрагентов) составляет 34 символа, а для бизнес-процессов организации требуется расширить его до 50 символов. Однако при попытке изменить длину заимствованного реквизита в расширении на старых версиях платформы (включая 8.3.11) система выдает ошибку о несовпадении контролируемых свойств с основной конфигурацией.
В этой статье мы подробно разберем, почему возникает эта проблема, как ее приходилось решать на платформе версии 8.3.11, и как этот вопрос элегантно решается в современных релизах 1С (начиная с 8.3.18 и выше).
Разберем причину такого поведения платформы на уровне СУБД. В версии 8.3.11 и близких к ней релизах расширения создавались как надстройки, которые не должны были монопольно изменять физическую структуру таблиц основной базы данных для заимствованных объектов. Когда мы заимствуем справочник в расширение, платформа строго контролирует соответствие метаданных. Если бы разработчику было позволено изменить длину строки с 34 до 50 символов на уровне расширения:
Именно поэтому при попытке запуска система проверяет контролируемые свойства и блокирует компиляцию, защищая целостность базы данных.
Если ваша база данных вынужденно работает на старой версии платформы (например, в силу требований совместимости или ограничений инфраструктуры), единственным надежным способом решения задачи является создание собственного реквизита в расширении и программная синхронизация его с основным реквизитом.
Проанализируем по шагам, как реализовать этот обходной путь:
БанковскиеСчетаКонтрагентов) в расширение.НомерСчета_Расширение, задаем ему нужный тип данных — Строка, длина 50 символов.НомерСчета.Рассмотрим пример кода синхронизации данных. В модуле формы элемента справочника в расширении переопределим обработчики событий чтения и записи:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Заполняем поле формы расширения сохраненным ранее длинным значением
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
// Читаем значение длинного номера счета из нашего реквизита расширения
ЭтаФорма.НомерСчета_Расширение = Объект.НомерСчета_Расширение;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура Расш1_ПередЗаписьюНаСервереПосле(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Перед записью синхронизируем данные.
// В стандартный реквизит пишем первые 34 символа (для совместимости)
ТекущийОбъект.НомерСчета = Лев(ЭтаФорма.НомерСчета_Расширение, 34);
// В реквизит расширения записываем полные 50 символов
ТекущийОбъект.НомерСчета_Расширение = ЭтаФорма.НомерСчета_Расширение;
КонецПроцедуры
Важное ограничение метода: При использовании такого обходного пути вам придется вручную дорабатывать или заменять логику во всех отчетах, запросах и печатных формах, где фигурирует стандартный реквизит НомерСчета, перенаправляя их на чтение поля НомерСчета_Расширение. Это трудоемкий процесс, требующий внимательности.
Фирма «1С» детально проработала этот сценарий и значительно расширила возможности механизма расширений в последующих релизах. Рассмотрим, как эта задача решается на современной платформе.
Начиная с версии платформы 8.3.18, разработчикам официально разрешено изменять длину существующих строковых и числовых реквизитов непосредственно в расширении. Теперь сценарий из темы форума реализуется без создания дублирующих реквизитов:
НомерСчета в свое расширение.Также появилась возможность расширять составные типы данных. Если стандартный реквизит имеет составной тип (например, СправочникСсылка.ФизическиеЛица, СправочникСсылка.Пользователи), вы можете добавить в состав этого типа новые объекты метаданных, созданные внутри вашего расширения.
В платформе 8.3.20 возможности работы со свойствами данных были существенно расширены:
Начиная с версии 8.3.22, разработчикам больше не нужно использовать сложные программные ухищрения для изменения длины кодов справочников или номеров документов. Если вашей организации не хватает стандартной длины номера счета-фактуры или кода номенклатуры, вы можете заимствовать объект в расширение и изменить свойство ДлинаКода или ДлинаНомера прямо в конфигураторе расширения.
Для того чтобы новые механизмы изменения типов данных в расширениях работали корректно, необходимо соблюдать три важнейших правила:
Выяснив все нюансы функционирования платформы, мы можем сделать вывод: если вы работаете на устаревших релизах типа 8.3.11, используйте обходной путь с созданием дополнительного реквизита и синхронизацией данных. Если же инфраструктура позволяет обновить платформу и режим совместимости до версии 8.3.18 и выше, настоятельно рекомендуем использовать штатный механизм заимствования и изменения длины свойств реквизитов — это сэкономит время разработки и избавит от необходимости переписывать десятки запросов.