При активном использовании механизмов предварительных расчетов и вариантов коммерческих предложений (КП) в конфигурациях «1С:Управление нашей фирмой» или «1С:Розница» пользователи часто сталкиваются с непредвиденным поведением печатных форм. При попытке создать новый макет через пользовательский интерфейс в табличную часть документа попадают абсолютно все товарные позиции из каждого созданного варианта, даже если в документе один из них явно выбран в качестве основного.
Проанализируем архитектурную причину такого поведения платформы и подробно разберем все доступные способы решения: от штатной настройки шаблонов без написания программного кода до создания внешней печатной формы (ВПФ).
Выясним причину, по которой строки дублируются и не фильтруются автоматически:
ЗаказПокупателя все товарные строки по всем сформированным вариантам хранятся в одной физической табличной части (например, Запасы или Товары). В каждой строке присутствует служебный реквизит, указывающий номер или ссылку на вариант КП, а в шапке документа хранится ссылка на реквизит ОсновнойВариантКП.Таким образом, стандартными галочками или условиями в самом пользовательском редакторе макета MXL отфильтровать строки невозможно. Для решения задачи рассмотрим два основных пути.
Если для работы подходит документ в формате Microsoft Word (.docx) или OpenOffice (.odt), в типовой конфигурации предусмотрен штатный механизм с поддержкой условий вывода строк. Разберем по шагам, как настроить такой шаблон:
[Товары,работы,услуги.Номер варианта КП]=[Основной вариант КП]
После сохранения при выборе настроенного шаблона из меню «Печать» программа автоматически сопоставит реквизит шапки со строками и сформирует файл, содержащий только позиции выбранного основного варианта.
Если печатную форму необходимо получить строго в виде табличного документа 1С (MXL), лучшим решением является разработка внешней печатной формы. В этом случае мы управляем запросом, получающим данные документа.
Посмотрим на пример текста запроса, который должен использоваться в процедуре печати внешней обработки для получения данных только основного варианта:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказПокупателя.Ссылка КАК Ссылка,
| ЗаказПокупателя.Номер КАК Номер,
| ЗаказПокупателя.Дата КАК Дата,
| ЗаказПокупателя.Контрагент КАК Контрагент,
| ЗаказПокупателя.ОсновнойВариантКП КАК ОсновнойВариантКП
|ИЗ
| Документ.ЗаказПокупателя КАК ЗаказПокупателя
|ГДЕ
| ЗаказПокупателя.Ссылка В(&МассивОбъектов);
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗаказТовары.Ссылка КАК Ссылка,
| ЗаказТовары.НомерСтроки КАК НомерСтроки,
| ЗаказТовары.Номенклатура КАК Номенклатура,
| ЗаказТовары.Количество КАК Количество,
| ЗаказТовары.Цена КАК Цена,
| ЗаказТовары.Сумма КАК Сумма
|ИЗ
| Документ.ЗаказПокупателя.Запасы КАК ЗаказТовары
|ГДЕ
| ЗаказТовары.Ссылка В(&МассивОбъектов)
| И ЗаказТовары.НомерВариантаКП = ЗаказТовары.Ссылка.ОсновнойВариантКП
|УПОРЯДОЧИТЬ ПО
| НомерСтроки";
Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
Разберем логику данного запроса подробнее: во втором пакете, где выбираются строки табличной части Запасы, добавлено жесткое условие соединения:
ЗаказТовары.НомерВариантаКП = ЗаказТовары.Ссылка.ОсновнойВариантКП
Благодаря этому условию все строки, принадлежащие черновикам или альтернативным вариантам, отсекаются еще на этапе выборки данных СУБД, и табличный документ заполняется только корректными данными.
Если на предприятии запрещено использование внешних файлов обработок, аналогичный алгоритм реализуется с помощью расширения конфигурации:
ЗаказПокупателя и его модуль менеджера.&Вместо или &ИзменениеИКонтроль).ОсновнойВариантКП аналогично коду для внешней печатной формы.Этот способ позволяет сохранить конфигурацию на полной поддержке поставщика, обеспечивая корректное формирование стандартных бланков с учетом вариантов расчета.