При разработке или доработке документов в платформе 1С 7.7 разработчики часто сталкиваются с ситуацией, когда программно установленные в процедуре ВводНового флаги (например, УчитыватьНДС = 1 или СуммаВклНДС = 1) сбрасываются в 0, а функция глСтрокаОплаты(Контекст) выводит в шапке документа надпись < БЕЗ НДС >.
Рассмотрим подробно причины такого поведения типовой конфигурации и разберем по шагам, как правильно организовать порядок вызова процедур инициализации шапки документа.
Проанализируем исходный код процедуры ВводНового, с которого начинается создание документа:
Процедура ВводНового(Скопирован)
УчитыватьНДС = 1;
СуммаВклНДС = 1;
Сообщить("! - " + УчитыватьНДС + " - " + СуммаВклНДС);
глЗаполнитьШапку(Контекст, Скопирован, "Продажа");
Сообщить("1 - " + ТипЦен + " - " + ТипЦен.ЦенаВклНДС + " - " + глСтрокаОплаты(Контекст));
ПересчетСуммыВзаиморасчетов();
КонецПроцедуры // ВводНового()
До вызова типовой процедуры значение УчитыватьНДС равно 1. Однако сразу после вызова глЗаполнитьШапку этот реквизит принимает значение 0.
Выясним причину такого сброса. Внутри глобальной процедуры глЗаполнитьШапку выполняются стандартные действия по подстановке реквизитов по умолчанию (фирма, договор, тип цен, валюта и т.д.). В процессе выполнения глЗаполнитьШапку вызывает служебную процедуру глПриИзмененииФирмы (или аналогичные процедуры работы с договором и настройками налогообложения).
Эти типовые функции перезаписывают значение реквизита УчитыватьНДС в соответствии с установками выбранной фирмы или учетной политики (например, если фирма работает по спецрежимам или в настройках по умолчанию флаг учета НДС снят).
Строка состояния расчетов на форме документа обычно формируется функцией глСтрокаОплаты(Конт). Посмотрим, как именно она обрабатывает реквизиты документа:
Если ЕстьУчитыватьНДС = 1 Тогда
Если ПустоеЗначение(Конт.УчитыватьНДС) = 1 Тогда
Результат = Результат + ", < БЕЗ НДС >";
Иначе
Результат = Результат + ", НДС";
Если глЕстьРеквизитШапки("СуммаВклНДС", ВидДок) = 1 Тогда
Если Конт.СуммаВклНДС = 1 Тогда
Результат = Результат + " - в сумме";
Иначе
Результат = Результат + " - сверху";
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Так как процедура глЗаполнитьШапку сбрасывает УчитыватьНДС в ноль (или пустое значение), функция глСтрокаОплаты определяет, что документ создается без налога, и добавляет в результат текст < БЕЗ НДС >.
Чтобы индивидуальные настройки документа не перекрывались типовыми механизмами заполнения по умолчанию, изменим последовательность выполнения кода. Все явные присвоения значений реквизитам шапки необходимо выполнять **строго после** завершения работы процедуры глЗаполнитьШапку.
Разберем исправленный вариант процедуры ВводНового:
Процедура ВводНового(Скопирован)
// 1. Заполняем шапку документа типовыми значениями по умолчанию
глЗаполнитьШапку(Контекст, Скопирован, "Продажа");
// 2. Устанавливаем требуемые флаги НАЛОГООБЛОЖЕНИЯ ПОСЛЕ базового заполнения
УчитыватьНДС = 1;
СуммаВклНДС = 1;
// 3. Вызываем пересчет сумм и обновление связанных реквизитов
ПересчетСуммыВзаиморасчетов();
КонецПроцедуры // ВводНового()
глЗаполнитьШапку(Контекст, Скопирован, ...). Процедура заполнит организацию, подставит договор и связанные настройки.УчитыватьНДС и СуммаВклНДС нужными нам значениями.ПересчетСуммыВзаиморасчетов() или ПересчетТабличнойЧасти()), чтобы все табличные данные пересчитались с учетом новых флагов.После изменения порядка инициализации при вызове глСтрокаОплаты(Контекст) функция будет считывать значение УчитыватьНДС = 1 и формировать корректную строку оплаты (например, "Розничные, руб. курс: 1 руб., НДС - в сумме").