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