При работе с типовой конфигурацией 1С:Бухгалтерия 7.7 часто возникают ситуации, когда доработанные механизмы расчета налогов ведут себя непредсказуемо при открытии уже сохраненных документов. Одной из частых проблем является отображение итоговой строки, где ставка НДС либо пропадает, либо принимает неверное значение (например, «0%» вместо реальной ставки). Давайте разберем, почему это происходит и как правильно реализовать обновление итогов.
Проблема кроется в том, как платформа 1С 7.7 работает с переменными модуля формы и формулами элементов диалога. Когда вы открываете существующий документ, происходит чтение данных из базы в табличную часть. Однако переменные, объявленные в модуле формы (в нашем случае — НДСпоДокументу), не сохраняются в базе данных вместе с документом. Они живут только во время работы формы в оперативной памяти.
Если в формуле текстового поля, выведенного на форму, используется такая переменная, она будет пустой до тех пор, пока не сработает код, который ее заполнит. В типовых механизмах инициализация часто происходит при изменении строк или записи документа, но при простом «открытии» этот код может не вызываться.
Рассмотрим структуру функции, которая формирует итоговую строку. В коде автора мы видим использование переменной НДСпоДокументу для определения того, какую ставку выводить:
Функция ИтоговаяСтрока()
перем стрСтавкаНДС;
Если НДСпоДокументу=-1 Тогда
стрСтавкаНДС="(по разным ставкам)";
ИначеЕсли НДСпоДокументу=0 Тогда
стрСтавкаНДС="";
Иначе
стрСтавкаНДС="(по ставке " + СокрЛ(формат(НДСпоДокументу,"Ч2")) + " %)";
КонецЕсли;
ИтСтр = "Всего: " + СокрЛ(Формат(Итог("Всего"),"Ч20.2-,")) + ", "+
"в т.ч. НДС " + стрСтавкаНДС +": " + СокрЛ(Формат(Итог("НДС"),"Ч20.2-,"));
Возврат ИтСтр;
КонецФункции
Когда документ открывается, переменная НДСпоДокументу инициализируется значением по умолчанию (пустая строка или 0), поэтому функция ИтоговаяСтрока() ошибочно считает, что налога нет, или выводит неверные данные.
Чтобы данные отображались корректно сразу после открытия документа, необходимо принудительно запустить пересчет всех налогов и итогов до того, как форма выведет текст на экран. Для этого нужно вмешаться в процедуру ПриОткрытии() модуля формы.
Разберем шаги решения:
ПриОткрытии(). Если её нет, создайте её.РассчитатьНалоги() или Пересчет()).Пример реализации:
Процедура ПриОткрытии()
// Принудительно вызываем расчет налогов, чтобы заполнить
// переменные модуля формы, используемые в формулах диалога
РассчитатьНалоги();
КонецПроцедуры
Когда вызывается процедура РассчитатьНалоги(), платформа проходит по всем строкам табличной части документа, вычисляет суммы НДС и корректно заполняет переменную НДСпоДокументу. Теперь, когда форма начнет отрисовывать текстовое поле, связанное с функцией ИтоговаяСтрока(), переменная уже будет содержать верное значение, и итоговый текст сформируется правильно.
Если после добавления вызова в ПриОткрытии() проблема сохраняется, выполните следующие действия:
РассчитатьНалоги() другими процедурами инициализации.РассчитатьНалоги() нет условий, которые завершают работу функции до того, как будет присвоено значение переменной НДСпоДокументу.ПриОткрытии() и пройдитесь по коду (клавиша F11), чтобы увидеть, как заполняются значения в модуле формы.Такой подход — явный вызов процедур пересчета при открытии — является стандартом для сложных доработок в 1С 7.7, где визуальные элементы зависят от вычисляемых (не хранимых в БД) значений.