Как отследить предыдущее значение организации при ее смене в документе для пересчета НДС?

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

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

Почему обращение через ссылку дает сбой

Первое решение, которое часто приходит на ум разработчику — обратиться к свойству Ссылка.Организация для получения старого значения, а в текущем реквизите Организация или свойстве Элемент.Значение прочитать новое. Проанализируем, почему такой подход ненадежен:

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

Решение с использованием переменной уровня модуля формы

Наиболее надежный и классический способ для обычных форм — использование переменной уровня модуля формы. Локальные переменные внутри процедур уничтожаются после завершения работы процедуры, однако переменная модуля формы существует всё время, пока открыта форма документа.

Разберем по шагам реализацию этого механизма:

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

Альтернативный вариант: фиксация в событии НачалоВыбора

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


Процедура ОрганизацияНачалоВыбора(Элемент, СтандартнаяОбработка)
    мПредыдущаяОрганизация = Элемент.Значение;
КонецПроцедуры

Важное ограничение: этот подход сработает только в том случае, если пользователь нажимает кнопку выбора из списка. Если значение изменяется быстрым вводом по строке или очищается клавишей Delete / Backspace, событие НачалоВыбора не сработает, поэтому первый вариант с инициализацией при открытии остается предпочтительным.

Архитектурный подход типовых конфигураций к пересчету НДС

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

  1. При смене организации считываются параметры учетной политики новой организации (является ли она плательщиком НДС по ОСНО или применяет специальный режим — УСН).
  2. Устанавливаются реквизиты документа (например, флаги УчитыватьНДС, НДСВключенВСтоимость).
  3. Выполняется циклический обход строк табличной части: для каждой строки подставляется ставка НДС по умолчанию (из карточки номенклатуры при ОСНО либо значение «Без НДС» при спецрежимах) и пересчитываются суммы НДС.
  4. Поскольку договоры контрагентов и расчетные счета жестко привязаны к конкретной организации, при смене организации также выполняется их очистка или автоподбор.
← На главную