Как добавить новую колонку и итоговую строку в печатную форму счета на оплату?

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

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

Разберем по шагам весь процесс доработки встроенной печатной формы на примере вывода реквизита Вес и расчета общего веса в документе Счет на оплату покупателю.

Шаг 1. Проверка структуры метаданных

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

  1. В справочнике Номенклатура должен быть создан реквизит (например, Вес с типом Число).
  2. В табличной части Товары документа СчетНаОплатуПокупателю должен быть добавлен соответствующий реквизит Вес (Число). Если колонка добавлена только визуально на форму документа без добавления в метаданные табличной части, запрос к базе данных вернет ошибку отсутствия поля.

Шаг 2. Корректировка запроса выборки данных

В конфигурациях на обычных формах логика подготовки данных для печати счета часто сосредоточена в модуле объекта документа в функции ПолучитьПараметрыПечатиСчетаЗаказа (либо в модуле менеджера при использовании управляемых форм). Найдем эту функцию и проанализируем текст запроса.

Типовой запрос объединяет строки из двух табличных частей документа: Товары и Услуги с помощью конструкции ОБЪЕДИНИТЬ ВСЕ. Это накладывает жесткое требование: количество, порядок и типы полей в обоих объединяемых запросах должны строго совпадать. Поскольку у услуг веса быть не может, во второй части запроса необходимо передать пустое значение того же порядка.

Посмотрим на пример правильного формирования запроса:


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

Шаг 3. Передача значений в структуру параметров

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


// До начала цикла инициализируем переменную общего веса
ВсегоВес = 0;

Для каждого ВыборкаСтрокТовары Из ЗапросТовары Цикл
	ПараметрыПозиции = Новый Структура;
	ПараметрыПозиции.Вставить("Номенклатура", ВыборкаСтрокТовары.Номенклатура);
	ПараметрыПозиции.Вставить("НомерСтроки", ЗапросТовары.Индекс(ВыборкаСтрокТовары) + 1);
	ПараметрыПозиции.Вставить("Количество", ВыборкаСтрокТовары.Количество);
	ПараметрыПозиции.Вставить("ЕдиницаИзмерения", ВыборкаСтрокТовары.ЕдиницаИзмерения);
	ПараметрыПозиции.Вставить("Цена", ВыборкаСтрокТовары.Цена);
	
	// Передаем вес текущей строки
	ПараметрыПозиции.Вставить("Вес", ВыборкаСтрокТовары.Вес);
	
	// Накапливаем общий итог
	Если ВыборкаСтрокТовары.Вес <> NULL Тогда
		ВсегоВес = ВсегоВес + (ВыборкаСтрокТовары.Вес * ВыборкаСтрокТовары.Количество);
	КонецЕсли;

	// ... дальнейшее типовое заполнение параметров позиции ...
	
	Позиции.Добавить(ПараметрыПозиции);
КонецЦикла;

ПараметрыПечати.Вставить("Позиции", Позиции);
ПараметрыПечати.Вставить("ВсегоВес", ВсегоВес);

Шаг 4. Настройка макета печатной формы

Выясним причину, почему данные могут не отображаться после изменения кода:

  1. Свойство ячейки «Заполнение»: Откроем макет печатной формы (обычно это макет СчетЗаказ). Выделим добавленную ячейку в строке таблицы и откроем её свойства (F4). В свойстве Заполнение должно быть установлено значение Параметр, а в поле Параметр указано имя Вес (регистр должен совпадать с ключом структуры). Если там стоит Текст, данные выводиться не будут.
  2. Именованные области: В типовых механизмах печать строк формируется путем вывода горизонтальных и вертикальных областей. Убедимся, что новая колонка входит в вертикальную область колонок (например, Данные или Строка).
  3. Область подвала: Для вывода общего веса добавим параметр ВсегоВес в область итогов подвала или выведем отдельную строку макета, содержащую шаблон Общий вес: [ВсегоВес] кг (при типе заполнения Шаблон).

Альтернативное решение: создание внешней печатной формы

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

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