Как в 1С увеличить длину строки реквизита до неограниченной через расширение?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При доработке типовых конфигураций 1С часто возникает задача увеличить длину строкового реквизита. Например, стандартной длины поля Содержание в табличной части "Услуги" документа "Реализация товаров и услуг" может не хватать. Разработчик добавляет объект в расширение, пытается установить у реквизита флаг "неограниченная длина", но после сохранения свойство сбрасывается, и длина остается прежней. Давайте разберемся, почему так происходит и как правильно решить эту задачу.

Проанализируем ситуацию: это не ошибка в ваших действиях или баг платформы, а сознательное архитектурное ограничение. Оно связано с тем, как платформа 1С хранит данные разного типа на уровне базы данных (например, MS SQL).

Почему возникает ограничение: разбираемся в архитектуре хранения данных

Чтобы понять причину, нужно знать о фундаментальных различиях в хранении строк ограниченной и неограниченной длины в СУБД, с которой работает 1С.

  1. Строки ограниченной длины. Когда вы в конфигураторе задаете для реквизита тип "Строка" с конкретной длиной (например, 100, 250 или 1000), 1С создает в таблице базы данных поле соответствующего типа, например NVARCHAR(1000). Данные для этого поля хранятся непосредственно в строке основной таблицы объекта. Это обеспечивает очень быстрый доступ к данным, их легко индексировать и использовать в запросах. Увеличение длины в рамках этого же типа хранения (например, с 1000 до 1024 символов) является допустимой операцией, так как лишь меняет параметр поля (NVARCHAR(1000) на NVARCHAR(1024)), не изменяя саму структуру хранения.
  2. Строки неограниченной длины. Когда вы устанавливаете флаг "неограниченная", механизм хранения кардинально меняется. Платформа 1С использует для таких данных специальные типы полей в СУБД (например, NVARCHAR(MAX)) или даже выносит их хранение в отдельную служебную таблицу. В основной таблице объекта остается лишь ссылка-идентификатор на запись в этой служебной таблице. Такой подход позволяет хранить огромные объемы текста, но имеет свои особенности: доступ к таким данным медленнее, их нельзя напрямую индексировать, группировать или упорядочивать стандартными средствами СУБД.

Изменение типа хранения с ограниченного на неограниченный — это не просто смена свойства, а глубокая реструктуризация таблицы базы данных. Механизм расширений предназначен для безопасной доработки функционала с сохранением совместимости с основной конфигурацией. Проведение таких кардинальных изменений структуры для заимствованных объектов запрещено, чтобы не нарушить целостность данных и не создать проблем при последующих обновлениях типового решения.

Практическое решение: создаем новый реквизит и дорабатываем форму

Поскольку напрямую изменить свойство заимствованного реквизита нельзя, мы применим стандартный и самый правильный обходной путь: добавим свой собственный реквизит с нужными свойствами и аккуратно "встроим" его в пользовательский интерфейс и логику документа. Рассмотрим по шагам.

Шаг 1: Добавление нового реквизита в расширении

  1. В дереве конфигурации вашего расширения найдите нужный объект. Например, Документ.РеализацияТоваровУслуг.
  2. Заимствуйте его в расширение.
  3. Разверните ветку документа и найдите табличную часть Услуги.
  4. Добавьте новый реквизит табличной части. Назовем его, например, СодержаниеПолное. В некоторых случаях для реализации подобной логики может быть полезен универсальный механизм добавления табличных частей с помощью расширения.
  5. В свойствах нового реквизита укажите тип Строка и установите флаг "неограниченная длина". Здесь это сработает, так как мы создаем новый объект, а не меняем заимствованный.

Шаг 2: Модификация формы документа

  1. Заимствуйте в расширение форму документа (например, ФормаДокумента). Чтобы выполнить добавление реквизитов и элементов формы на управляемые формы максимально быстро, можно использовать специализированные методики.
  2. В редакторе формы найдите таблицу, отображающую ТЧ "Услуги". В ее колонках будет стандартное поле Содержание. Если вам требуется программное изменение форм, можно реализовать добавление элементов кодом.
  3. Скройте стандартное поле. Для этого выделите колонку "Содержание" и в палитре свойств установите свойство Видимость в значение Ложь.
  4. Теперь добавьте на форму наш новый реквизит. Перетащите реквизит СодержаниеПолное из реквизитов табличной части в список колонок таблицы на форме. Расположите его на месте старого поля.
  5. Для удобства пользователя настройте свойства новой колонки: задайте понятный заголовок, установите свойство Многострочный режим в Да.

Шаг 3: Синхронизация данных для совместимости

Теперь пользователь будет работать с нашим новым полем. Однако стандартный реквизит Содержание остался в объекте, и многие типовые механизмы (печать, отчеты, выгрузки) могут по-прежнему обращаться именно к нему. Чтобы все работало корректно, нам нужно обеспечить синхронизацию данных.

Мы будем копировать текст из нашего поля СодержаниеПолное в стандартное поле Содержание, обрезая его до максимально допустимой длины (1000 символов). Это гарантирует, что типовой функционал получит ожидаемые данные.


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    // Обходим строки табличной части "Услуги"
    Для Каждого ТекСтрокаУслуги Из ТекущийОбъект.Услуги Цикл
        
        // Копируем значение из нашего нового реквизита в старый,
        // обрезая его до максимальной длины старого реквизита.
        ТекСтрокаУслуги.Содержание = Лев(ТекСтрокаУслуги.СодержаниеПолное, 1000);

    КонецЦикла;

КонецПроцедуры

Таким образом, мы решаем сразу две задачи: даем пользователю возможность вводить текст неограниченной длины и одновременно сохраняем полную совместимость с механизмами типовой конфигурации. Полный текст будет храниться в реквизите СодержаниеПолное, а его урезанная версия для совместимости — в стандартном Содержание.

Альтернативный подход: использование Дополнительных реквизитов

В большинстве современных конфигураций 1С есть подсистема "Дополнительные реквизиты и сведения". Она позволяет добавлять новые поля к объектам в режиме "1С:Предприятие", без необходимости вносить изменения в конфигурацию через конфигуратор или расширения.

Этот способ может подойти, если:

Вы можете создать дополнительный реквизит для табличной части "Услуги" с типом "Строка неограниченной длины". Однако этот подход менее гибок с точки зрения настройки интерфейса и программной логики по сравнению с доработкой через расширение.

В итоге, мы выяснили, что невозможность установить неограниченную длину для заимствованного реквизита — это не ошибка, а продуманное ограничение платформы. Наиболее правильным и надежным решением является создание нового реквизита в расширении и его грамотная интеграция в логику и интерфейс формы. Этот метод обеспечивает достижение цели, сохраняя при этом целостность и обновляемость основной конфигурации.

← На главную