При разработке расширений или модификации типовых конфигураций (например, ЗаказКлиента) часто возникает вопрос: где именно хранить дополнительные структурированные данные? На первый взгляд, создание табличной части в самом документе кажется самым логичным и простым решением. Однако опытные архитекторы 1С часто смотрят в сторону справочников или регистров сведений. Давайте вместе разберем эту ситуацию, проанализируем плюсы и минусы каждого подхода и выясним, в каких случаях стоит отказаться от привычной табличной части.
Рассмотрим ситуацию, когда мы создаем табличную часть (ТЧ) непосредственно в документе через расширение. Это стандартный путь, который выбирает большинство разработчиков для хранения данных, жестко связанных с конкретным экземпляром документа.
Преимущества этого подхода:
Однако, проанализируем и недостатки. Главный из них — неразрывная связь. Если нам нужно изменить одну строку в таблице, нам придется заблокировать и перезаписать весь документ целиком. В высоконагруженных системах это может стать критической точкой, мешающей совместной работе пользователей.
Иногда предлагается схема, при которой в документе есть только ссылка на элемент справочника, а в этом справочнике уже хранится вся необходимая табличная информация (или сам справочник выступает как набор данных).
Когда это действительно оправдано?
Выясним причину, по которой это может быть полезно. Основной аргумент — повторное использование. Если наборы дополнительных данных в разных заказах начинают совпадать на 100%, использование справочника позволяет избежать дублирования информации. Вместо того чтобы хранить 10 строк в каждом из 1000 документов, мы храним их один раз в элементе справочника, а в документах просто указываем ссылку.
Технические нюансы:
Проанализируем ситуацию, когда данные лучше хранить в регистре сведений. Этот вариант часто оказывается самым сбалансированным для сложных систем.
Основные плюсы работы с регистром:
Рассмотрим подробнее, как платформа 1С работает с памятью. Когда мы вызываем ЭтотОбъект = СсылкаНаДокумент.ПолучитьОбъект();, в оперативную память сервера (а затем и клиента) передаются абсолютно все данные всех табличных частей.
Если ваша таблица содержит сотни строк с тяжелыми реквизитами, это существенно нагружает сеть и память. В случае со справочником или регистром мы можем использовать динамический список для отображения данных на форме. Разберем по шагам, как это работает: динамический список запрашивает из базы только те строки, которые видны пользователю в данный момент («порционность»), что делает интерфейс отзывчивым даже при огромных объемах информации.
Если вы выбрали вариант со сторонним объектом (справочником или регистром), важно правильно организовать запись данных. Посмотрим на пример логики в модуле формы документа:
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Пример записи связанных данных в регистр сведений
НаборЗаписей = РегистрыСведений.ДополнительныеДанныеЗаказов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Заказ.Установить(ТекущийОбъект.Ссылка);
// Заполняем набор из временной таблицы формы или коллекции
Для Каждого СтрокаДанных Из Объект.ДополнительнаяТаблица Цикл
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Заказ = ТекущийОбъект.Ссылка;
ЗаполнитьЗначенияСвойств(НоваяЗапись, СтрокаДанных);
КонецЦикла;
НаборЗаписей.Записать();
КонецПроцедуры
Важный момент: при таком подходе нужно обязательно следить за тем, чтобы данные записывались именно в момент сохранения документа, чтобы обеспечить логическую целостность.
Прежде чем создавать новые объекты, давайте выясним, нельзя ли обойтись штатным механизмом БСП (Библиотеки Стандартных Подсистем). В современных конфигурациях (ERP, УТ 11, КА) реализован механизм Дополнительных сведений.
Они хранятся в общем регистре ДополнительныеСведения. Это идеальный вариант, если вам нужно добавить несколько простых реквизитов, не меняя структуру метаданных. Однако для полноценных таблиц этот механизм не подходит — он предназначен для «плоских» данных (одно свойство — одно значение).
Подведем итог нашему анализу и выделим критерии выбора:
Проанализировав все варианты, мы видим, что решение "в лоб" через табличную часть не всегда является оптимальным. Для профессиональной разработки в системе 1С важно учитывать не только текущее удобство написания кода, но и будущую производительность, удобство поддержки и объемы базы данных.