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