Как добавить колонку «Срок поставки» из Заказа клиента в печатную форму Счета на оплату в 1С:УТ 11?

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

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

Анализируем источник данных и структуру системы

Прежде чем приступать к написанию кода, выясним, откуда именно мы будем брать данные. В 1С:УТ 11 термин «Срок поставки» чаще всего соответствует реквизиту ДатаОтгрузки. Здесь есть важный нюанс: в зависимости от настроек системы, дата отгрузки может указываться как в шапке документа Заказ клиента, так и в каждой строке табличной части Товары.

Проанализируем, включена ли опция «Использовать даты отгрузки в строках». Если она включена, нам необходимо доставать дату для каждой конкретной позиции. Если выключена — берем единую дату из шапки заказа. В коде это проверяется через функциональную опцию или значение константы ИспользоватьДатыОтгрузкиВСтрокахЗаказовКлиентов.

Определяем место внесения изменений

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

  1. Откроем конфигуратор и найдем объект Обработка.ПечатьСчетовНаОплату.
  2. Перейдем в Модуль менеджера этой обработки.
  3. Найдем процедуру, отвечающую за подготовку данных. Обычно это СформироватьДанныеДляПечатиСчетовНаОплату или ЗаполнитьТабличныйДокументСчетаНаОплату.

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

Шаг 1. Подготовка макета в расширении

Сначала добавим макет в наше расширение. Найдем макет ПФ_MXL_СчетНаОплату (или аналогичный, используемый в вашей версии) в обработке ПечатьСчетовНаОплату и заимствуем его. Рассмотрим процесс изменения:

  1. В области «Строка» добавим новую колонку.
  2. Назовем ячейку (параметр), например, СрокПоставки.
  3. Убедимся, что границы области макета включают новую колонку, иначе она не будет выведена на печать.

Шаг 2. Модификация программного кода через расширение

Теперь нам нужно наполнить этот параметр данными. Для этого в расширении создадим процедуру-перехватчик. Проанализируем ситуацию: нам нужно добавить поле в запрос, который собирает данные для печати. Наиболее правильным будет использование метода &После для процедуры, подготавливающей структуру данных.

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


&После("СформироватьДанныеДляПечатиСчетовНаОплату")
Процедура Расш1_СформироватьДанныеДляПечатиСчетовНаОплату(ПараметрыПечати, СписокОбъектов, ДанныеДляПечати, ОбъектыПечати)
    
    // Проанализируем структуру ДанныеДляПечати.ТабличныеЧасти
    // Нам необходимо дополнить запрос, чтобы он вытянул ДатуОтгрузки из Заказа
    
    Для Каждого СтрокаДокумента Из ДанныеДляПечати.ТабличныеЧасти Цикл
        // Здесь мы можем программно дозаполнить колонку СрокПоставки
        // Если данные уже есть в структуре заказа, просто переносим их
        // Если нет — выполняем свой запрос к базе данных
    КонецЦикла;
    
КонецПроцедуры

Шаг 3. Реализация запроса к данным Заказа

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

Если счет печатается на основании Реализации товаров и услуг, связь становится сложнее. Проанализируем цепочку: Реализация -> Заказ -> Дата отгрузки. В этом случае в запросе нужно делать левое соединение с таблицей ЗаказКлиента.Товары по номеру строки и ссылке на документ-основание.

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


ВЫБРАТЬ
    ЗаказКлиентаТовары.Ссылка КАК Ссылка,
    ЗаказКлиентаТовары.НомерСтроки КАК НомерСтроки,
    ЗаказКлиентаТовары.ДатаОтгрузки КАК СрокПоставки
ИЗ
    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
ГДЕ
    ЗаказКлиентаТовары.Ссылка В (&МассивЗаказов)

Шаг 4. Вывод данных в макет

После того как данные получены, их нужно передать в область макета. В процедуре ЗаполнитьТабличныйДокументСчетаНаОплату (или аналогичной в модуле менеджера) найдем цикл обхода строк товаров. Убедимся, что при заполнении параметров области ОбластьСтрока.Параметры.Заполнить(СтрокаДанных) наше поле СрокПоставки присутствует в структуре СтрокаДанных.

Важный момент: Если вы используете расширение макета, убедитесь, что система использует именно ваш макет из расширения, а не типовой из основной конфигурации. Иногда для этого требуется переопределить функцию ПолучитьМакет в модуле менеджера через &Вместо.

Особенности группировки

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

Подведем итоги

Для реализации задачи мы выполнили следующие действия:

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

← На главную