Как организовать проведение документа 1С в зависимости от активной закладки?

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

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

Способ 1. Использование реквизита для фиксации состояния формы

Напрямую обратиться к элементам формы или узнать активную страницу панели из серверного модуля документа невозможно, так как процедура ОбработкаПроведения выполняется в контексте объекта на сервере и не имеет доступа к интерфейсным элементам клиентской формы. Чтобы передать состояние формы в логику проведения, разберем пошаговый алгоритм:

  1. Добавим в метаданные документа реквизит АктивнаяЗакладка (тип Строка или Число).
  2. В модуле формы документа при переключении страниц настроим сохранение имени или индекса текущей закладки в этот реквизит.
  3. При открытии формы настроим автоматический переход на сохраненную ранее закладку, чтобы пользователь продолжал работу в актуальном контексте.
  4. В процедуре ОбработкаПроведения модуля документа обратимся к значению реквизита АктивнаяЗакладка и построим алгоритм условий для формирования движений.

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


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

КонецПроцедуры

Архитектурные ограничения и риски привязки к интерфейсу

Проанализируем технические подводные камни, которые возникают при использовании закладок формы для управления движениями:

  1. Фоновое и групповое перепроведение: При вызове проведения из групповых обработок, регламентных заданий или при обмене данными через веб-сервисы форма не создается. Если реквизит активной закладки не был заполнен или содержит неактуальное значение, документ сформирует неполные или ошибочные движения.
  2. Автоматическая очистка движений платформой: По умолчанию в 1С свойство документа Удаление движений установлено в режим автоматической очистки. Это означает, что при повторном проведении документа все старые движения по всем регистрам будут удалены. Если логика формирует проводки только для одной закладки, данные предыдущих закладок будут безвозвратно затерты.
  3. Блокировки при многопользовательской работе: Если с разными закладками должны работать разные пользователи (например, кладовщик и бухгалтер), они не смогут одновременно редактировать или проводить один и тот же объект базы данных из-за объектных и транзакционных блокировок платформы.

Управление записью наборов движений без затирания

Если бизнес-логика требует поэтапного формирования проводок без потери ранее созданных записей, разберем порядок настройки коллекций движений:

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

Рекомендуемые типовые альтернативы

Для создания надежной архитектуры учета рекомендуется отказаться от прямой привязки к визуальным закладкам и использовать один из стандартных паттернов платформы 1С:

  1. Реквизит статуса или этапа: Вместо имени вкладки создадим реквизит документа со ссылкой на перечисление (например, СтатусДокумента со значениями: Черновик, ОформленСкладом, УтвержденБухгалтерией, Закрыт). Проведение по регистрам связывается со значением статуса, а форма документа лишь визуально подстраивает доступность полей и страниц под текущий этап.
  2. Цепочка связанных документов: Разделим бизнес-процесс на отдельные специализированные документы, вводимые на основании (например: ЗаказПокупателя $\rightarrow$ РасходныйОрдерНаТовары $\rightarrow$ РеализацияТоваровУслуг). Это исключит конфликты блокировок между сотрудниками разных отделов и позволит разграничить права доступа через роли.
  3. Бизнес-процессы и задачи: При сложной маршрутизации согласующих действий используем подсистему бизнес-процессов. Переход задачи на следующий шаг маршрута программно инициирует фиксацию нужного статуса и выполнение регламентных серверных действий.
← На главную