При доработке типовых конфигураций 1С часто возникает задача увеличить длину строкового реквизита. Например, стандартной длины поля Содержание в табличной части "Услуги" документа "Реализация товаров и услуг" может не хватать. Разработчик добавляет объект в расширение, пытается установить у реквизита флаг "неограниченная длина", но после сохранения свойство сбрасывается, и длина остается прежней. Давайте разберемся, почему так происходит и как правильно решить эту задачу.
Проанализируем ситуацию: это не ошибка в ваших действиях или баг платформы, а сознательное архитектурное ограничение. Оно связано с тем, как платформа 1С хранит данные разного типа на уровне базы данных (например, MS SQL).
Чтобы понять причину, нужно знать о фундаментальных различиях в хранении строк ограниченной и неограниченной длины в СУБД, с которой работает 1С.
NVARCHAR(1000). Данные для этого поля хранятся непосредственно в строке основной таблицы объекта. Это обеспечивает очень быстрый доступ к данным, их легко индексировать и использовать в запросах. Увеличение длины в рамках этого же типа хранения (например, с 1000 до 1024 символов) является допустимой операцией, так как лишь меняет параметр поля (NVARCHAR(1000) на NVARCHAR(1024)), не изменяя саму структуру хранения.NVARCHAR(MAX)) или даже выносит их хранение в отдельную служебную таблицу. В основной таблице объекта остается лишь ссылка-идентификатор на запись в этой служебной таблице. Такой подход позволяет хранить огромные объемы текста, но имеет свои особенности: доступ к таким данным медленнее, их нельзя напрямую индексировать, группировать или упорядочивать стандартными средствами СУБД.Изменение типа хранения с ограниченного на неограниченный — это не просто смена свойства, а глубокая реструктуризация таблицы базы данных. Механизм расширений предназначен для безопасной доработки функционала с сохранением совместимости с основной конфигурацией. Проведение таких кардинальных изменений структуры для заимствованных объектов запрещено, чтобы не нарушить целостность данных и не создать проблем при последующих обновлениях типового решения.
Поскольку напрямую изменить свойство заимствованного реквизита нельзя, мы применим стандартный и самый правильный обходной путь: добавим свой собственный реквизит с нужными свойствами и аккуратно "встроим" его в пользовательский интерфейс и логику документа. Рассмотрим по шагам.
Шаг 1: Добавление нового реквизита в расширении
Документ.РеализацияТоваровУслуг.Услуги.СодержаниеПолное. В некоторых случаях для реализации подобной логики может быть полезен универсальный механизм добавления табличных частей с помощью расширения.Строка и установите флаг "неограниченная длина". Здесь это сработает, так как мы создаем новый объект, а не меняем заимствованный.Шаг 2: Модификация формы документа
ФормаДокумента). Чтобы выполнить добавление реквизитов и элементов формы на управляемые формы максимально быстро, можно использовать специализированные методики.Содержание. Если вам требуется программное изменение форм, можно реализовать добавление элементов кодом.Видимость в значение Ложь.СодержаниеПолное из реквизитов табличной части в список колонок таблицы на форме. Расположите его на месте старого поля.Многострочный режим в Да.Шаг 3: Синхронизация данных для совместимости
Теперь пользователь будет работать с нашим новым полем. Однако стандартный реквизит Содержание остался в объекте, и многие типовые механизмы (печать, отчеты, выгрузки) могут по-прежнему обращаться именно к нему. Чтобы все работало корректно, нам нужно обеспечить синхронизацию данных.
Мы будем копировать текст из нашего поля СодержаниеПолное в стандартное поле Содержание, обрезая его до максимально допустимой длины (1000 символов). Это гарантирует, что типовой функционал получит ожидаемые данные.
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Обходим строки табличной части "Услуги"
Для Каждого ТекСтрокаУслуги Из ТекущийОбъект.Услуги Цикл
// Копируем значение из нашего нового реквизита в старый,
// обрезая его до максимальной длины старого реквизита.
ТекСтрокаУслуги.Содержание = Лев(ТекСтрокаУслуги.СодержаниеПолное, 1000);
КонецЦикла;
КонецПроцедуры
Таким образом, мы решаем сразу две задачи: даем пользователю возможность вводить текст неограниченной длины и одновременно сохраняем полную совместимость с механизмами типовой конфигурации. Полный текст будет храниться в реквизите СодержаниеПолное, а его урезанная версия для совместимости — в стандартном Содержание.
В большинстве современных конфигураций 1С есть подсистема "Дополнительные реквизиты и сведения". Она позволяет добавлять новые поля к объектам в режиме "1С:Предприятие", без необходимости вносить изменения в конфигурацию через конфигуратор или расширения.
Этот способ может подойти, если:
Вы можете создать дополнительный реквизит для табличной части "Услуги" с типом "Строка неограниченной длины". Однако этот подход менее гибок с точки зрения настройки интерфейса и программной логики по сравнению с доработкой через расширение.
В итоге, мы выяснили, что невозможность установить неограниченную длину для заимствованного реквизита — это не ошибка, а продуманное ограничение платформы. Наиболее правильным и надежным решением является создание нового реквизита в расширении и его грамотная интеграция в логику и интерфейс формы. Этот метод обеспечивает достижение цели, сохраняя при этом целостность и обновляемость основной конфигурации.