Как настроить печать только основного варианта коммерческого предложения в заказе покупателя 1С?

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

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

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

Причина проблемы: структура хранения данных и ограничения конструктора

Выясним причину, по которой строки дублируются и не фильтруются автоматически:

  1. Единая табличная часть: В структуре метаданных документа ЗаказПокупателя все товарные строки по всем сформированным вариантам хранятся в одной физической табличной части (например, Запасы или Товары). В каждой строке присутствует служебный реквизит, указывающий номер или ссылку на вариант КП, а в шапке документа хранится ссылка на реквизит ОсновнойВариантКП.
  2. Ограничение встроенного редактора макетов: Пользовательский конструктор макетов, вызываемый через раздел Администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм (подсистема печати БСП), предназначен исключительно для визуального оформления вывода полей. Он не обладает аналитическим движком отборов и условий: конструктор просто считывает всю табличную часть документа целиком и последовательно выводит каждую строку в табличный документ, игнорируя контекстные связи между шапкой и строками.

Таким образом, стандартными галочками или условиями в самом пользовательском редакторе макета MXL отфильтровать строки невозможно. Для решения задачи рассмотрим два основных пути.

Решение 1. Штатный механизм шаблонов документов (Word / OpenOffice)

Если для работы подходит документ в формате Microsoft Word (.docx) или OpenOffice (.odt), в типовой конфигурации предусмотрен штатный механизм с поддержкой условий вывода строк. Разберем по шагам, как настроить такой шаблон:

  1. Перейдем в раздел CRM → Шаблоны КП и договоров (также данный справочник можно открыть непосредственно из формы заказа покупателя через меню Печать → Коммерческие предложения → Показать все шаблоны).
  2. Создадим новый элемент справочника с назначением Коммерческое предложение.
  3. В окне настройки макета перейдем к списку параметров табличной части (товары, работы, услуги).
  4. Найдем поле Условия вывода строки. Для фильтрации только активного варианта зададим условие сопоставления реквизита строки с реквизитом шапки:

    [Товары,работы,услуги.Номер варианта КП]=[Основной вариант КП]

  5. Сохраним настроенный шаблон и установим для него признак активности.

После сохранения при выборе настроенного шаблона из меню «Печать» программа автоматически сопоставит реквизит шапки со строками и сформирует файл, содержащий только позиции выбранного основного варианта.

Решение 2. Создание внешней печатной формы (ВПФ)

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

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


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

Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);

Разберем логику данного запроса подробнее: во втором пакете, где выбираются строки табличной части Запасы, добавлено жесткое условие соединения:

ЗаказТовары.НомерВариантаКП = ЗаказТовары.Ссылка.ОсновнойВариантКП

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

Решение 3. Использование расширения конфигурации

Если на предприятии запрещено использование внешних файлов обработок, аналогичный алгоритм реализуется с помощью расширения конфигурации:

  1. Создаем новое расширение с назначением Адаптация.
  2. Добавляем в расширение документ ЗаказПокупателя и его модуль менеджера.
  3. Перехватываем процедуру печати (например, с помощью аннотации &Вместо или &ИзменениеИКонтроль).
  4. Корректируем выборку строк табличной части, накладывая условие отбора по реквизиту ОсновнойВариантКП аналогично коду для внешней печатной формы.

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

← На главную