Зачем нужна двухфазная схема проведения документов в БСП и как с ней работать

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Особенности и архитектура проведения документов в БСП

Рассмотрим, почему в типовых конфигурациях 1С на базе Библиотеки Стандартных Подсистем (БСП) обработка проведения устроена сложнее, чем классический вызов прямого заполнения движений. При первом знакомстве с кодом может показаться, что пошаговая подготовка запросов, выгрузка результатов во временные таблицы и передача движений через ДополнительныеСвойства — это избыточная сложность. Однако данная архитектура решает ключевые системные задачи производительности и надежности.

Разберем основные этапы, из которых состоит проведение документа по стандарту БСП:

  1. Инициализация данных и сбор запросов: На первом этапе формируется пакет запросов для сбора всех необходимых данных из документа и базы данных. Все запросы выполняются пакетом, а полученные промежуточные результаты помещаются во временные таблицы СУБД.
  2. Подготовка таблиц движений: Данные из временных таблиц запрашиваются и выгружаются в структуру таблиц значений, которая сохраняется в контекстное свойство ДополнительныеСвойства.ТаблицыДляДвижений.
  3. Запись наборов записей в регистры: На завершающем этапе сформированные таблицы движений подставляются в наборы записей и записываются в соответствующие регистры накопления, сведений или бухгалтерии.

Технические преимущества паттерна БСП

Проанализируем технические и архитектурные причины, по которым разработчики фирмы «1С» применили именно эту схему:

Оптимизация транзакций и снижение времени блокировок: Разделение процесса на этап подготовки данных и этап записи движений сводит к минимуму время пребывания документа в транзакции. Блокировки на таблицы регистров накладываются непосредственно перед записью, а не удерживаются в течение всего времени проведения сложных расчетов.

Защита от взаимоблокировок (Deadlocks): Единая и строго унифицированная последовательность записи наборов записей по регистрам гарантирует одинаковый порядок захвата таблиц СУБД при параллельном проведении документов несколькими пользователями.

Повторное использование данных: Использование объекта МенеджерВременныхТаблиц позволяет однократно подготовить срез остатков или аналитику и задействовать эти таблицы сразу для нескольких регистров без повторных обращений к базе данных.

Двухфазный контроль остатков: При реализации новой методики проведения движения сначала записываются в регистры без предварительной блокировки остатков, после чего выполняется контроль превышения остатков единым запросом. В случае обнаружения ошибок транзакция отменяется.

Особенности доработки и отладки проведения

Выясним, как эффективно отлаживать и модифицировать документы, построенные по стандарту БСП.

При отладке алгоритмов проведения основная логика подготовки данных сосредоточена в специализированных функциях вида ТекстЗапроса%ИмяРегистра% или процедурах СформироватьТаблицу%ИмяРегистра%. Понимание структуры этих функций позволяет быстро найти источник формирования конкретных сумм или аналитических разрезов.

Рассмотрим основные правила разработки и расширения проведения для новых или существующих документов:

  1. Не пишите код проведения с нуля: При создании нового документа целесообразно скопировать структуру обработки проведения из близкого по смыслу типового документа и адаптировать запросы под свои реквизиты.
  2. Используйте расширения для перехвата таблиц: Чтобы добавить движения по новому регистру или изменить существующую логику, не требуется переписывать всю процедуру ОбработкаПроведения. Достаточно внести изменения в структуру ДополнительныеСвойства.ТаблицыДляДвижений перед вызовом процедуры записи движений.
  3. Учитывайте режим удаления движений: В метаданных документа свойство «Удаление движений» устанавливается в значение Не удалять автоматически, что предотвращает неявную очистку движений платформой и передает управление наборам записей разработчику.

Посмотрим на базовый пример вызова процедур проведения в модуле объекта документа:


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Инициализация параметров и структуры дополнительных свойств
    УчетМеханизмов.ИнициализироватьДокумент(Ссылка, ДополнительныеСвойства);
    
    // Подготовка таблиц движений запросами
    СформироватьТаблицыДвижений(ДополнительныеСвойства, Отказ);
    
    // Запись подготовленных таблиц в регистры
    ЗаписатьТаблицыДвижений(ЭтотОбъект, ДополнительныеСвойства);
    
КонецПроцедуры

Такой подход обеспечивает единую стандартную структуру кода во всей конфигурации, что облегчает сопровождение системы разными разработчиками и обеспечивает высокую скорость выполнения операционных транзакций.

← На главную