При изучении основ разработки в системе 1С (особенно по популярным учебным пособиям, таким как книга М.Г. Радченко) начинающие программисты часто сталкиваются с ситуацией, когда в печатной форме документа выводятся заголовок и табличная часть, но итоговая строка «Всего» упорно не появляется на экране. Давайте подробно разберем, почему это происходит, как правильно диагностировать проблему и какие методы решения существуют.
Первым делом нам необходимо убедиться, что область, которую мы пытаемся вывести, физически существует в макете и правильно названа. В 1С область макета — это именованная группа строк или ячеек. Рассмотрим типичную ситуацию: в коде мы пишем ОбластьИтог = Макет.ПолучитьОбласть("Всего"). Это означает, что в макете печатной формы обязательно должна быть строка (или набор строк), выделенная и названная именно как Всего.
Важный нюанс: часто путают Имя области и Имя параметра. Имя области задается в меню «Таблица — Имена — Назначить имя» (или через левую панель строк). Параметр же — это то, что пишется внутри ячейки (например, ВсегоПоДокументу). Если вы ошиблись в имени области, метод ПолучитьОбласть() может выдать ошибку или пустую область.
Для диагностики попробуем упростить код вывода и проверить, выводится ли область без данных. Проанализируем следующий проверочный фрагмент кода:
Макет = Документы.ОказаниеУслуги.ПолучитьМакет("Печать");
ОбластьИтог = Макет.ПолучитьОбласть("Всего");
ТабДок.Очистить();
// Выводим только область итога для теста
ТабДок.Вывести(ОбластьИтог);
Если после выполнения этого кода на экране появляется пустая страница или ошибка «Область не найдена», значит, проблема в самом макете — нужно зайти в него и перепроверить имена назначенных областей.
Одной из наиболее частых причин отсутствия итогов является некорректная структура запроса. В документе «Оказание услуг» данные обычно выбираются вместе с табличной частью. Посмотрим на правильную структуру запроса в модуле менеджера:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслуги.Дата,
| ОказаниеУслуги.Клиент,
| ОказаниеУслуги.Номер,
| ОказаниеУслуги.ПереченьНоменклатуры.(
| Номенклатура,
| Количество,
| Цена,
| Сумма
| )
|ИЗ
| Документ.ОказаниеУслуги КАК ОказаниеУслуги
|ГДЕ
| ОказаниеУслуги.Ссылка В (&Ссылка)";
Выясним причину, по которой итог может не считаться: если в запросе поле Сумма не выбрано или названо иначе, то при обходе выборки значение ВыборкаПереченьНоменклатуры.Сумма будет равно нулю или вызовет ошибку. Также обратите внимание на ключевое слово ВСЕГО в запросе — если вы используете Конструктор печати, он может добавить его автоматически, но при ручном написании кода лучше использовать явное накопление суммы или итоги в запросе.
Разберем по шагам правильный алгоритм вывода печатной формы с расчетом итога вручную. Нам необходимо инициализировать переменную суммы перед началом обхода табличной части и вывести область итога строго после завершения вложенного цикла.
Рассмотрим пример кода в процедуре Печать:
// ... код получения областей Заголовок, Шапка, Строка ...
ОбластьИтог = Макет.ПолучитьОбласть("Всего");
Пока Выборка.Следующий() Цикл
// Выводим шапку документа
ТабДок.Вывести(ОбластьЗаголовок);
Шапка.Параметры.Заполнить(Выборка);
ТабДок.Вывести(Шапка);
// Инициализируем переменную для расчета суммы по текущему документу
СуммаИтог = 0;
// Получаем выборку по табличной части
ВыборкаТЧ = Выборка.ПереченьНоменклатуры.Выбрать();
Пока ВыборкаТЧ.Следующий() Цикл
// Заполняем строку данными
ОбластьСтрока.Параметры.Заполнить(ВыборкаТЧ);
ТабДок.Вывести(ОбластьСтрока);
// Накапливаем сумму
СуммаИтог = СуммаИтог + ВыборкаТЧ.Сумма;
КонецЦикла;
// КРИТИЧЕСКИЙ МОМЕНТ: Заполняем параметр итога и ВЫВОДИМ область
ОбластьИтог.Параметры.ВсегоПоДокументу = СуммаИтог;
ТабДок.Вывести(ОбластьИтог);
КонецЦикла;
Важно: убедитесь, что в макете у ячейки, где должен быть итог, в свойстве «Заполнение» выбрано значение Параметр, а не «Текст». В противном случае программа просто не поймет, куда записывать рассчитанное значение СуммаИтог.
Макет.ПолучитьОбласть(). Всегда объявляйте переменные областей в начале процедуры.Сумма, а в коде вы пишете Выборка.Итого, расчет не сработает.ТабДок.Вывести(ОбластьИтог) вызван до начала цикла обхода строк или вне основного алгоритма формирования документа.Проанализируем ситуацию: если нам нужно просто получить сумму по табличной части документа, не обязательно обходить её в цикле вручную. Если у вас есть ссылка на документ, можно воспользоваться методом Итог() самой табличной части. Это делает код чище и быстрее:
// Вместо цикла накопления суммы можно использовать:
СуммаИтог = Ссылка.ПереченьНоменклатуры.Итог("Сумма");
ОбластьИтог.Параметры.ВсегоПоДокументу = СуммаИтог;
ТабДок.Вывести(ОбластьИтог);
Этот метод предпочтительнее, если в печатной форме не требуется сложная логика фильтрации строк. Мы рекомендуем использовать его для упрощения кода и минимизации ошибок «человеческого фактора» при расчетах.
Подводя итог, отметим, что решение проблемы с выводом строки «Всего» всегда кроется в трех плоскостях: правильное именование области в макете, корректный запрос к данным и соблюдение порядка вывода областей в табличный документ. Внимательно следите за тем, чтобы имена параметров в коде 1С в точности совпадали с именами, указанными в свойствах ячеек макета.