Как в 1С выбрать номенклатуру по цеху, отсортировать по алфавиту и вывести на печать

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

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

Постановка задачи и проектирование связи данных

Прежде чем приступать к написанию кода, проанализируем структуру данных. В типовых конфигурациях 1С (таких как ERP, Комплексная автоматизация или Управление нашей фирмой) напрямую в карточке номенклатуры поля «Цех» нет. Связь между номенклатурой и цехом (подразделением) обычно регистрируется в документах выпуска продукции (например, ОтчетПроизводстваЗаСмену или ПроизводствоБезЗаказа) либо хранится в регистрах накопления учетных систем.

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

  1. Исключить документы, помеченные на удаление.
  2. Исключить саму номенклатуру, если она помечена на удаление.
  3. Убрать дубликаты позиций (получить уникальный список).
  4. Отсортировать результат по алфавиту.
  5. Вывести результат в печатную форму (табличный документ).

---

Способ 1. Программный метод (Внешняя обработка с формой)

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

Шаг 1. Создание реквизитов и проектирование формы

Создадим новую внешнюю обработку в конфигураторе. Добавим на форму реквизит ВыбранныйЦех. В качестве типа данных выберем ссылку на справочник подразделений (например, СправочникСсылка.СтруктураПредприятия или СправочникСсылка.Склады, в зависимости от вашей конфигурации).

Перенесем созданный реквизит на форму. Платформа 1С автоматически сгенерирует поле ввода. Нам не нужно писать код для открытия списка выбора — благодаря типизации реквизита, кнопка выбора с тремя точками появится в поле ввода автоматически и предоставит пользователю стандартное диалоговое окно выбора из справочника.

Добавим на форму кнопку «Сформировать» и свяжем ее с клиентской процедурой КнопкаВыполнитьНажатие.

Шаг 2. Написание поискового запроса

Чтобы получить список номенклатуры и отсечь все лишние данные, напишем оптимальный запрос. Мы будем использовать ключевое слово РАЗЛИЧНЫЕ, чтобы исключить дублирование строк, а также наложим условия проверки на пометку удаления.

Проанализируем текст запроса:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ДокТаблица.Номенклатура КАК Номенклатура,
    ДокТаблица.Номенклатура.Код КАК Код
ИЗ
    Документ.ОтчетПроизводстваЗаСмену.Продукция КАК ДокТаблица
ГДЕ
    ДокТаблица.Ссылка.Подразделение = &ВыбранныйЦех
    И НЕ ДокТаблица.Ссылка.ПометкаУдаления
    И НЕ ДокТаблица.Номенклатура.ПометкаУдаления
УПОРЯДОЧИТЬ ПО
    Номенклатура.Наименование ВОЗР

Разберем важные конструкции этого запроса:

Шаг 3. Разметка макета печатной формы

В нашей внешней обработке создадим новый макет с типом «Табличный документ» и назовем его Макет. Нам нужно разметить три области по горизонтали:

  1. Шапка: здесь мы напишем заголовок таблицы, например, "Список номенклатуры по цеху [ИмяЦеха]".
  2. Строка: область, которая будет выводиться в цикле. В ней создадим одну ячейку и определим ее тип как "Параметр", назвав ее Номенклатура.
  3. Подвал: область завершения таблицы (например, с указанием ответственного или общего количества позиций).

Шаг 4. Программный вывод макета на печать

Теперь свяжем форму, запрос и макет воедино. В модуле формы обработки пропишем следующий код:


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

&НаКлиенте
Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Попытка
        ТабДок = СформироватьПечатнуюФормуНаСервере();
        // Открываем документ на экране для просмотра и последующей печати
        ТабДок.Показать("Список номенклатуры по цеху " + Объект.ВыбранныйЦех);
    Исключение
        ПоказатьПредупреждение(, ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Метод ТабДок.Показать() откроет стандартное окно просмотра 1С, из которого пользователь сможет распечатать сформированный список на принтере стандартным сочетанием клавиш Ctrl+P.

---

Способ 2. Использование Системы компоновки данных (СКД) без программирования

Как совершенно справедливо заметили опытные разработчики на форуме, для решения подобных задач программировать в 1С часто вовсе не обязательно. Платформа предоставляет мощнейший инструмент автоматической генерации отчетов — СКД. Использование СКД позволяет решить задачу быстрее, надежнее и гибче.

Рассмотрим по шагам, как настроить такое решение:

  1. Создание внешнего отчета: В конфигураторе создадим новый Внешний отчет вместо обработки. Нажмем кнопку «Открыть схему компоновки данных».
  2. Добавление набора данных: Добавим новый Набор данных - запрос. Вставим в поле запроса наш SQL-подобный текст, который мы разработали в первом способе.
  3. Настройка параметров: Перейдем на вкладку «Параметры». Платформа автоматически создаст параметр &ВыбранныйЦех. В колонке «Доступные значения» или «Ограничение доступности» мы можем настроить его свойства. Обязательно снимем флаг «Ограничение доступности», чтобы пользователь мог выбирать значение на форме отчета.
  4. Настройки структуры отчета: Перейдем на вкладку «Настройки». Добавим новую группировку «Детальные записи». В окне «Выбранные поля» выберем поле Номенклатура.
  5. Настройка сортировки: На вкладке «Сортировка» в настройках СКД перетащим поле Номенклатура в список сортировки и укажем направление «По возрастанию». Это обеспечит сортировку по алфавиту без написания кода.
  6. Включение параметра в пользовательские настройки: Выделим наш параметр ВыбранныйЦех на вкладке параметров внизу экрана настроек, нажмем кнопку со свойствами элемента пользовательских настроек (иконка с шестеренкой) и установим флаг «Включать в пользовательские настройки». Режим отображения выберем «Быстрый доступ».

После запуска такого отчета в режиме «1С:Предприятие» платформа самостоятельно:

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

← На главную