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