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

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

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

1. Программная реализация условных движений в процедуре ОбработкаПроведения

Если задача требует записывать данные в разные регистры накопления в зависимости от значения перечисления непосредственно в документе, логика прописывается в модуле объекта в процедуре ОбработкаПроведения.

Рассмотрим пример кода, когда в табличной части или реквизите шапки документа выбирается значение из перечисления (например, Перечисления.СтатусыРемонта.Выдан):


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

Важный технический момент: Обратите внимание на установку свойства Записывать = Истина для обоих регистров. Если документ ранее формировал движения по регистру, а затем пользователь сменил статус и перепровел документ, платформа при установленном флаге Записывать = Истина автоматически очистит старый набор записей в том регистре, где новые строки не добавлялись. Это предотвратит появление фантомных остатков и дублирования данных.

2. Архитектурные риски проведения одним документом

Попытка провести все этапы работы (от принятия оборудования в ремонт до его выдачи клиенту) одним документом с помощью смены статуса ведет к существенным проблемам в учете:

  1. Искажение хронологии и дат: При смене статуса на «Выдан» и повторном проведении документа его дата проведения остается прежней (датой приема). В результате дата поступления и дата выдачи совпадут, и получить реальный отчет о длительности ремонта за период будет невозможно.
  2. Потеря истории первичных документов: Документ в учетной системе фикcирует первичную операцию. Изменяя один и тот же документ, вы теряете возможность распечатать первоначальный акт приема-передачи в том виде, в каком он был подписан клиентом.
  3. Зависание остатков в регистрах накопления: Если использовать регистры накопления остатков и не списывать с них данные при выдаче, таблица остатков будет постоянно расти. Регистры накопления остатков обязательно должны «закрываться» в ноль по завершении цикла операции.

3. Оптимальные варианты проектирования структуры данных

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

Вариант А: Единый регистр накопления + Два документа (Рекомендуется)

Разберем наиболее правильный подход с точки зрения классического учета:

  1. Создается один регистр накопления остатков (например, ВРемонте).
  2. Создаются два отдельных документа:
    • ПриемВРемонт — при проведении создает движение Приход в регистре ВРемонте.
    • ВыдачаИзРемонта (вводится на основании приема) — при проведении создает движение Расход из регистра ВРемонте.

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

Вариант Б: Связка регистра остатков и регистра сведений

Если необходимо отслеживать промежуточные этапы («На согласовании», «В ремонте», «Готов к выдаче»), то логику разделяют следующим образом:

  1. Регистр накопления (Остатки): Фиксирует фактический приход товара на склад сервиса и его расход клиенту.
  2. Периодический регистр сведений (Подчинен регистратору или независимый): Хранит историю изменения статусов оборудования. При каждой смене статуса добавляется новая запись с текущей датой и временем. С помощью функции СрезПоследних можно легко получить актуальный статус любого изделия на любой момент времени.
← На главную