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