Как правильно реализовать движения по регистру накопления в зависимости от заполненных полей документа?

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

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

Этап 1: Подготовка к проведению

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

Для проверки того, выбрал ли пользователь значение в поле, используем универсальную функцию ЗначениеЗаполнено(). Она позволяет корректно определить, заполнено ли поле (будь то ссылка на справочник или другое значение), исключая пустые ссылки.

Этап 2: Реализация логики с помощью условий

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


Процедура ОбработкаПроведения(Отказ, Режим)
    // Очищаем движения перед записью
    Движения.ОстаткиКартриджей.Записывать = Истина;

    Если ЗначениеЗаполнено(Поле1) И ЗначениеЗаполнено(Поле2) Тогда
        // Выполняем движения прихода и расхода одновременно
    ИначеЕсли ЗначениеЗаполнено(Поле1) И Не ЗначениеЗаполнено(Поле2) Тогда
        // Выполняем только приход
    ИначеЕсли Не ЗначениеЗаполнено(Поле1) И ЗначениеЗаполнено(Поле2) Тогда
        // Выполняем только расход
    КонецЕсли;
КонецПроцедуры

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

Этап 3: Оптимизированный подход к проведению

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


Процедура ОбработкаПроведения(Отказ, Режим)
    Движения.ОстаткиКартриджей.Записывать = Истина;

    // Проверяем приход
    Если ЗначениеЗаполнено(НовыйКартридж) Тогда
        Движение = Движения.ОстаткиКартриджей.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        Движение.Картридж = НовыйКартридж;
        Движение.Количество = 1;
    КонецЕсли;

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

Важные рекомендации по проектированию движений

При реализации механизмов накопления данных всегда держите в уме следующие принципы:

  1. Атомарность операций: Помните, что проведение документа — это единая транзакция. Если в коде возникнет ошибка, изменения не сохранятся в базе данных.
  2. Разделение сущностей: Если вы замечаете, что документ выполняет слишком много разнородных функций, возможно, стоит разбить его на два разных документа. Это значительно упростит построение отчетов и отладку.
  3. Выбор регистра: Используйте РегистрНакопления для количественного учета (сколько штук осталось), и РегистрСведений для фиксации состояния (в каком кабинете сейчас находится картридж).
  4. Проверка остатков: Перед записью движений типа Расход обязательно проверяйте наличие картриджа в остатках. Для этого используйте виртуальную таблицу Остатки через объект Запрос. Если товара нет, вызывайте Отказ = Истина; и выводите пользователю сообщение об ошибке через Сообщить().
  5. Модульность: Выносите сложные расчеты в отдельные функции модуля объекта. Это позволит вам тестировать каждую часть логики отдельно от процедуры проведения.

Применяя эти простые, но эффективные приемы, вы сможете сделать код своей конфигурации чистым, поддерживаемым и устойчивым к ошибкам. Не бойтесь переписывать громоздкие блоки Если в более лаконичные конструкции — это признак профессионального роста разработчика.

← На главную