При разработке учетных механизмов в 1С часто возникает задача добавить подробное текстовое описание к каждой проводке (например, при оформлении ручных операций или бухгалтерских справок). На первый взгляд, создание реквизита с типом Строка (неограниченная длина) в регистре бухгалтерии кажется простым и универсальным решением. Однако на практике такой подход влечет за собой серьезные проблемы с производительностью СУБД и накладывает жесткие ограничения на язык запросов 1С. Разберем подробно внутреннее устройство хранения таких данных, возможные риски и оптимальные варианты архитектуры.
Проанализируем, как физически размещаются текстовые поля неограниченной длины на уровне СУБД и файловой базы данных:
NVARCHAR(MAX) или TEXT. Если строка не помещается в основной странице данных, СУБД выносит ее на отдельные страницы LOB-хранилища, оставляя в базовой строке таблицы лишь указатель (16 или 24 байта). Это приводит к дополнительным операциям ввода-вывода (I/O) при каждом чтении записей.Строки неограниченной длины накладывают существенные технические ограничения при написании запросов и разработке пользовательского интерфейса:
ГРУППИРОВАТЬ ПО, УПОРЯДОЧИТЬ ПО, а также в запросах с ключевым словом РАЗЛИЧНЫЕ (DISTINCT) и операцией ОБЪЕДИНИТЬ без модификатора ВСЕ. СУБД выдаст ошибку несовместимости типов.ПО) и в операциях точного сравнения на равенство в секции ГДЕ.ВЫРАЗИТЬ(), что создает дополнительную нагрузку на процессор при обработке больших массивов проводок:
ВЫБРАТЬ
ХозрасчетныйДвиженияССубконто.Период КАК Период,
ХозрасчетныйДвиженияССубконто.Регистратор КАК Регистратор,
ХозрасчетныйДвиженияССубконто.СчетДт КАК СчетДт,
ХозрасчетныйДвиженияССубконто.СчетКт КАК СчетКт,
ХозрасчетныйДвиженияССубконто.Сумма КАК Сумма,
ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.Содержание КАК Строка(250)) КАК СодержаниеСокращенное
ИЗ
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвиженияССубконто
ГДЕ
ХозрасчетныйДвиженияССубконто.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
УПОРЯДОЧИТЬ ПО
СодержаниеСокращенное
Рассмотрим самый простой и действенный способ. В большинстве практических сценариев бухгалтеру не требуется бесконечный текст в теле проводки. Достаточно установить фиксированную длину — например, Строка (250), Строка (500) или Строка (1000).
Преимущества такого подхода:
NVARCHAR(N) и хранится непосредственно в строке таблицы СУБД без создания LOB-указателей.ВЫРАЗИТЬ.Если специфика учета действительно требует хранить объемные тексты (пояснительные записки, расшифровки расчетов к проводкам), наилучшей практикой является вынос этих данных за пределы регистра бухгалтерии в отдельный Регистр сведений.
Разберем по шагам создание такой структуры:
Подчинение регистратору (или независимый регистр).Регистратор (тип: ДокументСсылка);НомерСтрокиПроводки (тип: Число(5, 0)) или КлючСвязи (тип: УникальныйИдентификатор / Число).ПодробноеОписание с типом Строка (неограниченная длина).Посмотрим на пример чтения таких данных в момент открытия формы конкретного документа или детального отчета:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КомментарииКПроводкам.НомерСтрокиПроводки КАК НомерСтроки,
| КомментарииКПроводкам.ПодробноеОписание КАК ПодробноеОписание
|ИЗ
| РегистрСведений.КомментарииКПроводкам КАК КомментарииКПроводкам
|ГДЕ
| КомментарииКПроводкам.Регистратор = &ТекущийДокумент";
Запрос.УстановитьПараметр("ТекущийДокумент", ДокументСсылка);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
При такой архитектуре основная таблица проводок остается максимально компактной и быстрой. Сервер СУБД не тратит ресурсы на считывание LOB-страниц при массовом расчете итогов или построении стандартных оборотно-сальдовых ведомостей, а детальные комментарии подгружаются только точечно по требованию пользователя.
Если подробные описания требуются только для ограниченного круга документов (например, исключительно для документа ОперацияБух / «Операция, введенная вручную»), анализировать их на уровне проводок не имеет смысла. Описание можно хранить непосредственно в табличной части или реквизитах самого документа, либо задействовать типовую подсистему БСП Свойства (Дополнительные реквизиты и сведения). В этом случае регистр бухгалтерии полностью освобождается от неструктурированных тяжелых текстовых данных.