При работе с типовыми конфигурациями 1С, построенными на базе Библиотеки стандартных подсистем (БСП), разработчики часто сталкиваются с неприятным ограничением: при попытке записать длинный текст в дополнительные сведения или определенные ресурсы регистров, строка обрезается на 1024 символах. В этой статье мы подробно разберем причины этого ограничения и изучим проверенные способы его обхода.
Прежде всего, проанализируем ситуацию с точки зрения архитектуры платформы и метаданных. Ограничение в 1024 символа в типовых решениях (таких как ERP, Комплексная автоматизация или Бухгалтерия предприятия) чаще всего связано с объектом ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения. Для строкового типа данных здесь жестко задана квалификация длины. Почему это сделано?
nvarchar(max) в SQL) не могут быть полноценно индексированы, что привело бы к значительным задержкам при поиске информации в базе данных.Рассмотрим наиболее правильный способ с точки зрения методологии типовых конфигураций. Если вам необходимо хранить объемные текстовые данные (например, логи, подробные описания или инструкции), которые не помещаются в стандартное поле, следует использовать механизм присоединенных файлов.
Вместо того чтобы пытаться «впихнуть» текст в строку регистра, мы сохраняем его как текстовый файл (.txt), который привязывается к объекту. В типовых конфигурациях для этого уже созданы все необходимые справочники (например, Справочник.НоменклатураПрисоединенныеФайлы). Этот метод позволяет хранить данные любого объема, не нагружая основную таблицу регистра сведений.
Разберем вариант для тех случаев, когда вы создаете собственный (нетиповой) регистр сведений. Если поле не планируется использовать для поиска или отбора, самым эффективным способом будет использование типа ХранилищеЗначения.
Алгоритм работы в этом случае будет следующим:
ХранилищеЗначения.Посмотрим на пример кода для записи данных:
// Подготовка данных для записи
НоваяЗапись = РегистрыСведений.МойРегистрТекстов.СоздатьМенеджерЗаписи();
НоваяЗапись.Объект = СсылкаНаОбъект;
// Помещаем длинную строку в ХранилищеЗначения
НоваяЗапись.ДлинныйТекст = Новый ХранилищеЗначения(ДлиннаяСтрокаПеременная, Новый СжатиеДанных(9));
НоваяЗапись.Записать();
Преимущество этого метода в том, что ХранилищеЗначения автоматически поддерживает сжатие данных, что экономит место в базе.
Проанализируем ситуацию, когда необходимо расширить лимит именно в типовом механизме «Дополнительные сведения», не снимая конфигурацию с поддержки. В этом случае на помощь приходят расширения конфигурации.
Вы можете добавить в расширение ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения и изменить длину типа Строка. Однако будьте осторожны: если вы увеличите длину до очень больших значений или попытаетесь сделать её неограниченной, это может привести к конфликту с составным типом данных и ошибкам при реструктуризации базы данных.
Рассмотрим более сложный, но гибкий программный метод — разбиение одной длинной строки на несколько частей (чанки). Это позволяет обойти лимит в 1024 символа, используя стандартные ресурсы регистра.
Для реализации этого метода в регистр сведений необходимо добавить измерение НомерСтроки (тип Число). При записи текста мы делим его на фрагменты по 1024 символа и записываем каждый фрагмент отдельной строкой в регистр. При чтении выполняем обратную операцию — соединяем фрагменты в одну переменную.
Пример логики разбиения:
РазмерЧасти = 1024;
Позиция = 1;
НомерЧасти = 1;
Пока Позиция <= СтрДлина(ИсходныйТекст) Цикл
Фрагмент = Сред(ИсходныйТекст, Позиция, РазмерЧасти);
// Запись фрагмента в регистр с указанием НомерЧасти
ЗаписатьЧастьВРегистр(Ссылка, НомерЧасти, Фрагмент);
Позиция = Позиция + РазмерЧасти;
НомерЧасти = НомерЧасти + 1;
КонецЦикла;
Выбор метода зависит от ваших конкретных задач:
ХранилищеЗначения для экономии места или Строка (неограниченная длина), если поле находится в ресурсе (а не в измерении) и тип не является составным.Помните, что хранение избыточно длинных строк в индексируемых полях всегда ведет к снижению производительности базы данных, поэтому старайтесь выносить такие данные в отдельные хранилища или файлы.