В конфигурациях на базе современной платформы 1С (таких как Управление торговлей 11, ERP 2 или Комплексная автоматизация 2) печатные формы строятся с использованием механизмов БСП (Библиотеки стандартных подсистем). Задача добавления новой колонки, данные для которой отсутствуют в стандартной выборке, требует не просто визуального редактирования макета, но и программного вмешательства. Рассмотрим подробно, как реализовать вывод срока поставки (даты отгрузки) из Заказа клиента в печатную форму Счет на оплату.
Прежде чем приступать к написанию кода, выясним, откуда именно мы будем брать данные. В 1С:УТ 11 термин «Срок поставки» чаще всего соответствует реквизиту ДатаОтгрузки. Здесь есть важный нюанс: в зависимости от настроек системы, дата отгрузки может указываться как в шапке документа Заказ клиента, так и в каждой строке табличной части Товары.
Проанализируем, включена ли опция «Использовать даты отгрузки в строках». Если она включена, нам необходимо доставать дату для каждой конкретной позиции. Если выключена — берем единую дату из шапки заказа. В коде это проверяется через функциональную опцию или значение константы ИспользоватьДатыОтгрузкиВСтрокахЗаказовКлиентов.
Вся логика формирования печатных форм для счетов сосредоточена не в самом документе, а в специальной обработке. Разберем по шагам, где искать нужный код:
Обработка.ПечатьСчетовНаОплату.СформироватьДанныеДляПечатиСчетовНаОплату или ЗаполнитьТабличныйДокументСчетаНаОплату.Поскольку мы работаем в современной конфигурации, крайне рекомендуется использовать расширение конфигурации, чтобы сохранить возможность беспрепятственного обновления типового решения.
Сначала добавим макет в наше расширение. Найдем макет ПФ_MXL_СчетНаОплату (или аналогичный, используемый в вашей версии) в обработке ПечатьСчетовНаОплату и заимствуем его. Рассмотрим процесс изменения:
СрокПоставки.Теперь нам нужно наполнить этот параметр данными. Для этого в расширении создадим процедуру-перехватчик. Проанализируем ситуацию: нам нужно добавить поле в запрос, который собирает данные для печати. Наиболее правильным будет использование метода &После для процедуры, подготавливающей структуру данных.
Рассмотрим пример кода, который добавляет данные о дате отгрузки в выборку:
&После("СформироватьДанныеДляПечатиСчетовНаОплату")
Процедура Расш1_СформироватьДанныеДляПечатиСчетовНаОплату(ПараметрыПечати, СписокОбъектов, ДанныеДляПечати, ОбъектыПечати)
// Проанализируем структуру ДанныеДляПечати.ТабличныеЧасти
// Нам необходимо дополнить запрос, чтобы он вытянул ДатуОтгрузки из Заказа
Для Каждого СтрокаДокумента Из ДанныеДляПечати.ТабличныеЧасти Цикл
// Здесь мы можем программно дозаполнить колонку СрокПоставки
// Если данные уже есть в структуре заказа, просто переносим их
// Если нет — выполняем свой запрос к базе данных
КонецЦикла;
КонецПроцедуры
Выясним причину, по которой данные могут не попадать в печатную форму автоматически. В типовом запросе системы поля ДатаОтгрузки из табличной части заказа часто игнорируются при формировании счета. Нам нужно убедиться, что в результирующей таблице значений, которая передается в макет, колонка СрокПоставки заполнена.
Если счет печатается на основании Реализации товаров и услуг, связь становится сложнее. Проанализируем цепочку: Реализация -> Заказ -> Дата отгрузки. В этом случае в запросе нужно делать левое соединение с таблицей ЗаказКлиента.Товары по номеру строки и ссылке на документ-основание.
Пример запроса для получения даты отгрузки из строк заказа:
ВЫБРАТЬ
ЗаказКлиентаТовары.Ссылка КАК Ссылка,
ЗаказКлиентаТовары.НомерСтроки КАК НомерСтроки,
ЗаказКлиентаТовары.ДатаОтгрузки КАК СрокПоставки
ИЗ
Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
ГДЕ
ЗаказКлиентаТовары.Ссылка В (&МассивЗаказов)
После того как данные получены, их нужно передать в область макета. В процедуре ЗаполнитьТабличныйДокументСчетаНаОплату (или аналогичной в модуле менеджера) найдем цикл обхода строк товаров. Убедимся, что при заполнении параметров области ОбластьСтрока.Параметры.Заполнить(СтрокаДанных) наше поле СрокПоставки присутствует в структуре СтрокаДанных.
Важный момент: Если вы используете расширение макета, убедитесь, что система использует именно ваш макет из расширения, а не типовой из основной конфигурации. Иногда для этого требуется переопределить функцию ПолучитьМакет в модуле менеджера через &Вместо.
Проанализируем ситуацию, когда один счет выставляется по нескольким заказам. В этом случае типовая печатная форма может группировать одинаковые товары. Если у одинаковых товаров в разных заказах стоят разные сроки поставки, группировка может «схлопнуть» их, и вы получите неверные данные. В такой ситуации необходимо:
ДатаОтгрузки в поля группировки запроса, чтобы товары с разными датами выводились отдельными строками.Для реализации задачи мы выполнили следующие действия:
СрокПоставки.Обработка.ПечатьСчетовНаОплату.&После или &Вместо), который извлекает дату отгрузки из документа-основания и подставляет её в структуру данных для печати.