При разработке сложных учетных механизмов нередко возникает задача, когда один и тот же документ содержит несколько закладок с данными (например, по видам операций, подразделениям или этапам согласования), и требуется сформировать движения только по тем данным, которые относятся к текущему контексту. Разберем, как технически реализовать такой механизм, с какими архитектурными ограничениями платформы 1С можно столкнуться и какие альтернативные решения считаются стандартными в среде 1С.
Напрямую обратиться к элементам формы или узнать активную страницу панели из серверного модуля документа невозможно, так как процедура ОбработкаПроведения выполняется в контексте объекта на сервере и не имеет доступа к интерфейсным элементам клиентской формы. Чтобы передать состояние формы в логику проведения, разберем пошаговый алгоритм:
АктивнаяЗакладка (тип Строка или Число).ОбработкаПроведения модуля документа обратимся к значению реквизита АктивнаяЗакладка и построим алгоритм условий для формирования движений.Посмотрим на пример реализации логики проведения в модуле объекта:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если ЭтотОбъект.АктивнаяЗакладка = "Товары" Тогда
// Формируем движения только по складскому учету
Движения.ОстаткиТоваров.Записывать = Истина;
Для Каждого Стр Из ЭтотОбъект.Товары Цикл
Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
Движение.Период = ЭтотОбъект.Дата;
Движение.Номенклатура = Стр.Номенклатура;
Движение.Количество = Стр.Количество;
КонецЦикла;
ИначеЕсли ЭтотОбъект.АктивнаяЗакладка = "Взаиморасчеты" Тогда
// Формируем движения по финансовому контуру
Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина;
// Заполнение движений по расчетам...
КонецЕсли;
КонецПроцедуры
Проанализируем технические подводные камни, которые возникают при использовании закладок формы для управления движениями:
Удаление движений установлено в режим автоматической очистки. Это означает, что при повторном проведении документа все старые движения по всем регистрам будут удалены. Если логика формирует проводки только для одной закладки, данные предыдущих закладок будут безвозвратно затерты.Если бизнес-логика требует поэтапного формирования проводок без потери ранее созданных записей, разберем порядок настройки коллекций движений:
ОбработкаПроведения явно включаем флаг записи Движения.ИмяРегистра.Записывать = Истина только для тех регистров, которые изменяются на текущем этапе.Записывать оставляем равным Ложь. Это предотвратит перезапись существующих данных пустым набором.Для создания надежной архитектуры учета рекомендуется отказаться от прямой привязки к визуальным закладкам и использовать один из стандартных паттернов платформы 1С:
СтатусДокумента со значениями: Черновик, ОформленСкладом, УтвержденБухгалтерией, Закрыт). Проведение по регистрам связывается со значением статуса, а форма документа лишь визуально подстраивает доступность полей и страниц под текущий этап.ЗаказПокупателя $\rightarrow$ РасходныйОрдерНаТовары $\rightarrow$ РеализацияТоваровУслуг). Это исключит конфликты блокировок между сотрудниками разных отделов и позволит разграничить права доступа через роли.