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