Почему в 1С 7.7 при открытии счета некорректно отображается итоговая строка с НДС?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При работе с типовой конфигурацией 1С:Бухгалтерия 7.7 часто возникают ситуации, когда доработанные механизмы расчета налогов ведут себя непредсказуемо при открытии уже сохраненных документов. Одной из частых проблем является отображение итоговой строки, где ставка НДС либо пропадает, либо принимает неверное значение (например, «0%» вместо реальной ставки). Давайте разберем, почему это происходит и как правильно реализовать обновление итогов.

Выясняем причину: жизненный цикл формы в 1С 7.7

Проблема кроется в том, как платформа 1С 7.7 работает с переменными модуля формы и формулами элементов диалога. Когда вы открываете существующий документ, происходит чтение данных из базы в табличную часть. Однако переменные, объявленные в модуле формы (в нашем случае — НДСпоДокументу), не сохраняются в базе данных вместе с документом. Они живут только во время работы формы в оперативной памяти.

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

Анализируем текущую логику расчета

Рассмотрим структуру функции, которая формирует итоговую строку. В коде автора мы видим использование переменной НДСпоДокументу для определения того, какую ставку выводить:


Функция ИтоговаяСтрока()
    перем стрСтавкаНДС;
    Если НДСпоДокументу=-1 Тогда
        стрСтавкаНДС="(по разным ставкам)";
    ИначеЕсли НДСпоДокументу=0 Тогда
        стрСтавкаНДС="";
    Иначе
        стрСтавкаНДС="(по ставке " + СокрЛ(формат(НДСпоДокументу,"Ч2")) + " %)";
    КонецЕсли;
    ИтСтр = "Всего: " + СокрЛ(Формат(Итог("Всего"),"Ч20.2-,")) + ", "+
            "в т.ч. НДС " + стрСтавкаНДС +": " + СокрЛ(Формат(Итог("НДС"),"Ч20.2-,"));
    Возврат ИтСтр;
КонецФункции

Когда документ открывается, переменная НДСпоДокументу инициализируется значением по умолчанию (пустая строка или 0), поэтому функция ИтоговаяСтрока() ошибочно считает, что налога нет, или выводит неверные данные.

Решаем проблему: принудительный пересчет при открытии

Чтобы данные отображались корректно сразу после открытия документа, необходимо принудительно запустить пересчет всех налогов и итогов до того, как форма выведет текст на экран. Для этого нужно вмешаться в процедуру ПриОткрытии() модуля формы.

Разберем шаги решения:

  1. Откройте модуль формы документа «Счет на оплату».
  2. Найдите процедуру ПриОткрытии(). Если её нет, создайте её.
  3. Внутри процедуры вызовите процедуру пересчета налогов (в вашей конфигурации она может называться РассчитатьНалоги() или Пересчет()).

Пример реализации:


Процедура ПриОткрытии()
    // Принудительно вызываем расчет налогов, чтобы заполнить 
    // переменные модуля формы, используемые в формулах диалога
    РассчитатьНалоги();
КонецПроцедуры

Почему это работает?

Когда вызывается процедура РассчитатьНалоги(), платформа проходит по всем строкам табличной части документа, вычисляет суммы НДС и корректно заполняет переменную НДСпоДокументу. Теперь, когда форма начнет отрисовывать текстовое поле, связанное с функцией ИтоговаяСтрока(), переменная уже будет содержать верное значение, и итоговый текст сформируется правильно.

Рекомендации по отладке

Если после добавления вызова в ПриОткрытии() проблема сохраняется, выполните следующие действия:

Такой подход — явный вызов процедур пересчета при открытии — является стандартом для сложных доработок в 1С 7.7, где визуальные элементы зависят от вычисляемых (не хранимых в БД) значений.

← На главную