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