Как вывести строку «Итог — ВСЕГО» в печатной форме документа «Оказание услуг»

Программист 1С v8.3 (Управляемые формы) Сфера услуг, туризм и социальный сектор
← На главную

При изучении основ разработки в системе 1С (особенно по популярным учебным пособиям, таким как книга М.Г. Радченко) начинающие программисты часто сталкиваются с ситуацией, когда в печатной форме документа выводятся заголовок и табличная часть, но итоговая строка «Всего» упорно не появляется на экране. Давайте подробно разберем, почему это происходит, как правильно диагностировать проблему и какие методы решения существуют.

Анализируем структуру макета и именование областей

Первым делом нам необходимо убедиться, что область, которую мы пытаемся вывести, физически существует в макете и правильно названа. В 1С область макета — это именованная группа строк или ячеек. Рассмотрим типичную ситуацию: в коде мы пишем ОбластьИтог = Макет.ПолучитьОбласть("Всего"). Это означает, что в макете печатной формы обязательно должна быть строка (или набор строк), выделенная и названная именно как Всего.

Важный нюанс: часто путают Имя области и Имя параметра. Имя области задается в меню «Таблица — Имена — Назначить имя» (или через левую панель строк). Параметр же — это то, что пишется внутри ячейки (например, ВсегоПоДокументу). Если вы ошиблись в имени области, метод ПолучитьОбласть() может выдать ошибку или пустую область.

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


Макет = Документы.ОказаниеУслуги.ПолучитьМакет("Печать");
ОбластьИтог = Макет.ПолучитьОбласть("Всего");
ТабДок.Очистить();
// Выводим только область итога для теста
ТабДок.Вывести(ОбластьИтог);

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

Работа с запросом и вложенными таблицами

Одной из наиболее частых причин отсутствия итогов является некорректная структура запроса. В документе «Оказание услуг» данные обычно выбираются вместе с табличной частью. Посмотрим на правильную структуру запроса в модуле менеджера:


Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    ОказаниеУслуги.Дата,
|    ОказаниеУслуги.Клиент,
|    ОказаниеУслуги.Номер,
|    ОказаниеУслуги.ПереченьНоменклатуры.(
|        Номенклатура,
|        Количество,
|        Цена,
|        Сумма
|    )
|ИЗ
|    Документ.ОказаниеУслуги КАК ОказаниеУслуги
|ГДЕ
|    ОказаниеУслуги.Ссылка В (&Ссылка)";

Выясним причину, по которой итог может не считаться: если в запросе поле Сумма не выбрано или названо иначе, то при обходе выборки значение ВыборкаПереченьНоменклатуры.Сумма будет равно нулю или вызовет ошибку. Также обратите внимание на ключевое слово ВСЕГО в запросе — если вы используете Конструктор печати, он может добавить его автоматически, но при ручном написании кода лучше использовать явное накопление суммы или итоги в запросе.

Алгоритм расчета суммы и вывод области в цикле

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

Рассмотрим пример кода в процедуре Печать:


// ... код получения областей Заголовок, Шапка, Строка ...
ОбластьИтог = Макет.ПолучитьОбласть("Всего");

Пока Выборка.Следующий() Цикл
    // Выводим шапку документа
    ТабДок.Вывести(ОбластьЗаголовок);
    Шапка.Параметры.Заполнить(Выборка);
    ТабДок.Вывести(Шапка);
    
    // Инициализируем переменную для расчета суммы по текущему документу
    СуммаИтог = 0;
    
    // Получаем выборку по табличной части
    ВыборкаТЧ = Выборка.ПереченьНоменклатуры.Выбрать();
    
    Пока ВыборкаТЧ.Следующий() Цикл
        // Заполняем строку данными
        ОбластьСтрока.Параметры.Заполнить(ВыборкаТЧ);
        ТабДок.Вывести(ОбластьСтрока);
        
        // Накапливаем сумму
        СуммаИтог = СуммаИтог + ВыборкаТЧ.Сумма;
    КонецЦикла;
    
    // КРИТИЧЕСКИЙ МОМЕНТ: Заполняем параметр итога и ВЫВОДИМ область
    ОбластьИтог.Параметры.ВсегоПоДокументу = СуммаИтог;
    ТабДок.Вывести(ОбластьИтог);
КонецЦикла;

Важно: убедитесь, что в макете у ячейки, где должен быть итог, в свойстве «Заполнение» выбрано значение Параметр, а не «Текст». В противном случае программа просто не поймет, куда записывать рассчитанное значение СуммаИтог.

Типичные ошибки «новичка» и способы их исправления

  1. Переменная не определена: Если вы получаете ошибку «Переменная не определена (ОбластьИтог)», значит, вы пытаетесь присвоить значение параметрам области до того, как вызвали метод Макет.ПолучитьОбласть(). Всегда объявляйте переменные областей в начале процедуры.
  2. Пустая сумма: Если строка «Всего» выводится, но сумма равна 0, проверьте, заполнено ли поле «Сумма» в самом документе в режиме «Предприятие». Также проверьте точность имен: если в запросе поле называется Сумма, а в коде вы пишете Выборка.Итого, расчет не сработает.
  3. Область выводится вверху страницы: Это происходит, если метод ТабДок.Вывести(ОбластьИтог) вызван до начала цикла обхода строк или вне основного алгоритма формирования документа.
  4. Конфигурация не обновлена: Часто после внесения изменений в модуль менеджера или макет разработчик забывает нажать F7 (Обновить конфигурацию базы данных). В этом случае в режиме пользователя вы будете видеть старую версию печатной формы.

Альтернативный (профессиональный) способ расчета итога

Проанализируем ситуацию: если нам нужно просто получить сумму по табличной части документа, не обязательно обходить её в цикле вручную. Если у вас есть ссылка на документ, можно воспользоваться методом Итог() самой табличной части. Это делает код чище и быстрее:


// Вместо цикла накопления суммы можно использовать:
СуммаИтог = Ссылка.ПереченьНоменклатуры.Итог("Сумма");
ОбластьИтог.Параметры.ВсегоПоДокументу = СуммаИтог;
ТабДок.Вывести(ОбластьИтог);

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

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

← На главную