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