При работе с информационной базой 1С:Управление торговлей 11.5, как и в других конфигурациях на платформе 1С:Предприятие 8.3, часто возникает необходимость распечатать или выгрузить полный список документов, отобранных по определенным критериям. Стандартный функционал "Печать" - "Список", доступный в формах списков, часто отображает только видимую часть данных на экране, что не всегда достаточно для полноценного анализа или формирования отчетов. В этой статье мы подробно разберем, как можно получить полный список документов, включая все необходимые поля, используя как типовые средства программы, так и возможности программной разработки.
Мы рассмотрим две основные стратегии решения данной задачи. Первая — это использование встроенного функционала "Вывести список", который позволяет пользователю без специальных навыков получить данные в удобном для печати или экспорта формате. Вторая — программный подход, который дает разработчикам полную гибкость в формировании и выводе данных, что особенно полезно для сложных отчетов или специфических требований к выборке.
Это наиболее простой и доступный способ для большинства пользователей, не требующий специальных знаний в программировании. Функционал "Вывести список" позволяет выгрузить данные из любой табличной части или списка документов в табличный документ, который затем можно распечатать или сохранить в различных форматах (Excel, PDF и т.д.).
Рассмотрим пошаговую инструкцию по использованию этой функции:
Номер, Дата, Контрагент, СуммаДокумента, Статус, Договор, Организация и другие. Важно отметить, что этот механизм позволяет выбрать гораздо больше полей, чем отображается в текущей форме списка.
Преимущества этого метода очевидны: он прост в использовании, не требует доработок конфигурации и доступен рядовым пользователям. Ограничения могут быть связаны с тем, что для очень сложных запросов с несколькими уровнями вложенности или специфической логикой расчета этот инструмент может быть недостаточен. Однако для большинства стандартных задач вывода списков документов он является оптимальным решением.
Для более сложных задач, когда требуется особая логика отбора, вывода специфических данных, которых нет в стандартных полях, или когда необходимо автоматизировать процесс формирования и печати, мы можем использовать программный подход. Этот метод требует навыков программирования на встроенном языке 1С и позволяет создать внешний отчет или обработку, которая будет выполнять все необходимые действия.
Основой для программного решения является использование объектов Запрос для выборки данных и ТабличныйДокумент для их представления и вывода. Мы рассмотрим шаги по созданию такого решения.
Запрос. Этот объект позволяет нам формулировать запросы к данным информационной базы на языке запросов 1С, который очень похож на SQL. Мы определяем, какие таблицы или регистры нам нужны, какие поля из них выбрать, как связать эти таблицы и какие условия отбора применить.
ВЫБРАТЬ для определения полей, которые хотим получить, оператор ИЗ для указания источника данных (например, Документ.РеализацияТоваровУслуг) и оператор ГДЕ для установки условий отбора.
УстановитьПараметр() объекта Запрос. Это позволяет сделать запрос гибким и повторно используемым.
Выполнить(). Результатом выполнения запроса является объект РезультатЗапроса, который содержит выбранные данные.
ТаблицаЗначений с помощью метода Выгрузить(). Это удобно для дальнейшей итерации и обработки. Альтернативно, мы можем использовать обход результата запроса через метод Выбрать().
ТабличныйДокумент. Этот объект является универсальным средством для формирования печатных форм, отчетов и вывода табличных данных в 1С.
ТабличногоДокумента данными из результата запроса. Мы можем задавать заголовки колонок, форматировать текст (шрифт, размер, цвет), устанавливать границы ячеек, объединять ячейки, вставлять рисунки и выполнять другие операции для создания профессионального вида отчета. Мы будем итерировать по строкам полученной ТаблицаЗначений или ВыборкеИзРезультатаЗапроса и для каждой строки добавлять новую строку в ТабличныйДокумент, заполняя ее ячейки соответствующими значениями.
ТабличногоДокумента мы можем вызвать его метод Показать() для отображения на экране, метод Напечатать() для прямой печати или метод Записать() для сохранения в файл (например, Excel или PDF).
Представим, что нам нужно получить номер, дату, контрагента, сумму и статус документов "Реализация товаров и услуг" за определенный период. Вот как будет выглядеть текст запроса:
// Создаем новый объект запроса
Запрос = Новый Запрос;
// Определяем текст запроса
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка,
| РеализацияТоваровУслуг.Номер,
| РеализацияТоваровУслуг.Дата,
| РеализацияТоваровУслуг.Контрагент,
| РеализацияТоваровУслуг.СуммаДокумента,
| РеализацияТоваровУслуг.Статус
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода
|УПОРЯДОЧИТЬ ПО
| РеализацияТоваровУслуг.Дата ВОЗР, РеализацияТоваровУслуг.Номер ВОЗР";
// Устанавливаем параметры запроса (примерные значения для демонстрации)
// В реальной обработке эти значения будут браться из полей формы
МояДатаНачала = НачалоДня(ТекущаяДата() - 30 * 24 * 3600); // 30 дней назад
МояДатаКонца = КонецДня(ТекущаяДата()); // Сегодня
Запрос.УстановитьПараметр("НачалоПериода", МояДатаНачала);
Запрос.УстановитьПараметр("КонецПериода", МояДатаКонца);
// Выполняем запрос
РезультатЗапроса = Запрос.Выполнить();
// Выгружаем результат в таблицу значений для удобства дальнейшей обработки
ТаблицаРезультат = РезультатЗапроса.Выгрузить();
// Теперь ТаблицаРезультат содержит данные, которые мы можем использовать
// для формирования ТабличногоДокумента
В этом примере мы выбираем основные реквизиты документа РеализацияТоваровУслуг: Ссылка (уникальный идентификатор), Номер, Дата, ссылку на Контрагента, СуммуДокумента и Статус. Условие ГДЕ РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода позволяет нам гибко устанавливать временной интервал для отбора. Параметры &НачалоПериода и &КонецПериода должны быть установлены перед выполнением запроса.
После того как мы получили данные в ТаблицаРезультат, следующим шагом будет создание и заполнение ТабличногоДокумента. Мы подробно рассмотрим, как это сделать, чтобы отчет выглядел аккуратно и содержал всю необходимую информацию.
// Создаем новый ТабличныйДокумент
ТабДок = Новый ТабличныйДокумент;
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СПИСКА_РЕАЛИЗАЦИЙ"; // Можно задать имя для сохранения настроек печати
// Задаем основные параметры страницы
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет; // Или Альбом
// Определяем начальную строку для заголовков
ТекущаяСтрокаДокумента = 1;
// Формируем заголовки колонок
НомерКолонки = 1;
Для Каждого Колонка Из ТаблицаРезультат.Колонки Цикл
// Вставляем текст заголовка в ячейку
ТабДок.Области.ПолучитьОбласть(ТекущаяСтрокаДокумента, НомерКолонки).Текст = Колонка.Заголовок;
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
// Форматируем область заголовков
ОбластьЗаголовков = ТабДок.Области.ПолучитьОбласть(ТекущаяСтрокаДокумента, 1, ТекущаяСтрокаДокумента, ТаблицаРезультат.Колонки.Количество());
ОбластьЗаголовков.Шрифт.Жирный = Истина;
ОбластьЗаголовков.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
ОбластьЗаголовков.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
ОбластьЗаголовков.Обвести(ЛинияСтиль.Тонкая); // Добавляем границы к заголовкам
// Увеличиваем текущую строку для данных
ТекущаяСтрокаДокумента = ТекущаяСтрокаДокумента + 1;
// Обходим каждую строку полученной ТаблицыЗначений и выводим в ТабличныйДокумент
Для Каждого СтрокаТЗ Из ТаблицаРезультат Цикл
НомерКолонки = 1;
Для Каждого Колонка Из ТаблицаРезультат.Колонки Цикл
ЗначениеПоля = СтрокаТЗ[Колонка.Имя];
// Обработка особых типов данных для вывода
Если ТипЗнч(ЗначениеПоля) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
ТабДок.Области.ПолучитьОбласть(ТекущаяСтрокаДокумента, НомерКолонки).Текст = Строка(ЗначениеПоля.Номер);
ИначеЕсли ТипЗнч(ЗначениеПоля) = Тип("СправочникСсылка.Контрагенты") Тогда
ТабДок.Области.ПолучитьОбласть(ТекущаяСтрокаДокумента, НомерКолонки).Текст = Строка(ЗначениеПоля.Наименование);
ИначеЕсли ТипЗнч(ЗначениеПоля) = Тип("ПеречислениеСсылка.СтатусыРеализацииТоваровУслуг") Тогда
ТабДок.Области.ПолучитьОбласть(ТекущаяСтрокаДокумента, НомерКолонки).Текст = Строка(ЗначениеПоля.Представление());
ИначеЕсли ТипЗнч(ЗначениеПоля) = Тип("Дата") Тогда
ТабДок.Области.ПолучитьОбласть(ТекущаяСтрокаДокумента, НомерКолонки).Текст = Формат(ЗначениеПоля, "ДФ=dd.MM.yyyy");
ИначеЕсли ТипЗнч(ЗначениеПоля) = Тип("Число") Тогда
ТабДок.Области.ПолучитьОбласть(ТекущаяСтрокаДокумента, НомерКолонки).Текст = Формат(ЗначениеПоля, "ЧЦ=15; ЧДЦ=2");
ТабДок.Области.ПолучитьОбласть(ТекущаяСтрокаДокумента, НомерКолонки).ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право; // Выравнивание чисел
Иначе
ТабДок.Области.ПолучитьОбласть(ТекущаяСтрокаДокумента, НомерКолонки).Текст = Строка(ЗначениеПоля);
КонецЕсли;
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
// Добавляем границы для текущей строки данных
ТабДок.Области.ПолучитьОбласть(ТекущаяСтрокаДокумента, 1, ТекущаяСтрокаДокумента, ТаблицаРезультат.Колонки.Количество()).Обвести(ЛинияСтиль.Тонкая);
ТекущаяСтрокаДокумента = ТекущаяСтрокаДокумента + 1;
КонецЦикла;
// Регулируем автоматическую ширину колонок для лучшей читаемости
ТабДок.АвтоМасштаб = Истина;
ТабДок.ПараметрыСтраницы.Масштаб = 100; // Сброс масштаба, если был изменен
// Устанавливаем ширину колонок (примерно, можно доработать)
Для ИндКолонки = 1 По ТаблицаРезультат.Колонки.Количество() Цикл
Если ТаблицаРезультат.Колонки[ИндКолонки-1].Имя = "Дата" Тогда
ТабДок.УстановитьШиринуКолонки(ИндКолонки, 12);
ИначеЕсли ТаблицаРезультат.Колонки[ИндКолонки-1].Имя = "Номер" Тогда
ТабДок.УстановитьШиринуКолонки(ИндКолонки, 10);
ИначеЕсли ТаблицаРезультат.Колонки[ИндКолонки-1].Имя = "Контрагент" Тогда
ТабДок.УстановитьШиринуКолонки(ИндКолонки, 30);
ИначеЕсли ТаблицаРезультат.Колонки[ИндКолонки-1].Имя = "СуммаДокумента" Тогда
ТабДок.УстановитьШиринуКолонки(ИндКолонки, 15);
Иначе
ТабДок.УстановитьШиринуКолонки(ИндКолонки, 20); // Ширина по умолчанию
КонецЕсли;
КонецЦикла;
// Показываем сформированный табличный документ
ТабДок.Показать();
// Можно также сразу напечатать:
// ТабДок.Напечатать();
// Или сохранить в файл:
// ТабДок.Записать("C:\Temp\СписокРеализаций.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Мы создаем объект ТабличныйДокумент и последовательно заполняем его. Сначала мы выводим заголовки колонок, используя информацию из метаданных ТаблицаРезультат. Мы можем применять к областям ТабличногоДокумента различные свойства, такие как Шрифт.Жирный, ГоризонтальноеПоложение, ВертикальноеПоложение для форматирования. Затем мы итерируем по каждой строке нашей ТаблицаРезультат. Для каждого поля в строке мы определяем его тип и выводим соответствующим образом. Например, для ссылочных типов (СправочникСсылка.Контрагенты) мы выводим Наименование, а для ДокументСсылка — Номер. Числовые и датовые значения форматируем для лучшего вида. В конце мы вызываем метод Показать(), чтобы отобразить сформированный отчет на экране.
Важно: При работе с ТабличнымДокументом мы должны тщательно управлять координатами ячеек (строка, колонка) и размерами областей, чтобы получить желаемый макет. Можно использовать также шаблоны (макеты), созданные в конфигураторе, для более сложного и стандартизированного оформления. Этот подход значительно упрощает процесс заполнения табличного документа, так как мы работаем не напрямую с координатами, а с именованными областями макета.
Помимо прямого вывода данных, в программном решении мы имеем возможность выполнять дополнительные вычисления, агрегации, применять условное форматирование к ячейкам (например, выделять просроченные документы красным цветом) и интегрировать данные из нескольких источников в один отчет. Это делает программный подход чрезвычайно мощным инструментом для решения нестандартных задач.
Выбор между типовым функционалом "Вывести список" и программным формированием ТабличногоДокумента зависит от конкретных требований:
Мы рассмотрели оба подхода, каждый из которых имеет свои преимущества. Теперь, вооруженные этими знаниями, вы сможете эффективно работать со списками документов в 1С:Управление торговлей 11.5 и получать необходимую информацию в удобном для вас формате.