Разработка внешних печатных форм (ВПФ) на базе Библиотеки Стандартных Подсистем (БСП) — одна из наиболее частых задач для начинающих разработчиков в системе 1С:Предприятие 8.3. Однако на этапе вывода табличного документа, заполнения параметров макета и регистрации обработки часто возникают неприятные синтаксические и логические ошибки. Рассмотрим типичные проблемы, с которыми сталкиваются программисты при выгрузке данных документа РеализацияТоваровУслуг в печатную форму «Заявка на склад», и разберем способы их решения по шагам.
Проанализируем наиболее распространенные неточности, возникающие в модуле объекта внешней печатной формы:
Одной из главных причин, почему печатная форма не формируется или выдает ошибку, является передача строки в метод вывода. Метод ТабличныйДокумент.Вывести() принимает в качестве параметра переменную, содержащую объект области макета (тип ОбластьТабличногоДокумента), а не её имя в кавычках.
Сравним ошибочный и исправленный вариант кода:
// Неправильно: передача имени области строкой
ТабличныйДокумент.Вывести("ОбластьШапки");
// Правильно: передача полученной ранее области
ОбластьШапки = МакетОбработки.ПолучитьОбласть("Шапка");
// ... заполнение параметров области ...
ТабличныйДокумент.Вывести(ОбластьШапки);
Чтобы добавить артикул номенклатуры в печатную форму, необходимо предварительно завести параметр в ячейке макета (например, назовем его Артикул и установим свойство ячейки «Заполнение» в значение «Параметр»). После этого в цикле обхода строк документа пропишем получение данного значения из справочника Номенклатура:
ОбластьСтроки.Параметры.Артикул = ТекущаяСтрока.Номенклатура.Артикул;
При оформлении складских заявок часто требуется выводить не массово-габаритный объем или чистый вес товара из реквизита Количество, а число упаковок или мест. В зависимости от конфигурации и настроек учета логистика может опираться на реквизит КоличествоМест или КоличествоУпаковок. При заполнении параметров следует указывать именно тот реквизит табличной части, который содержит данные о транспортных местах:
ОбластьСтроки.Параметры.Мест = ТекущаяСтрока.КоличествоМест;
При объявлении обязательной функции регистрации БСП СведенияОВнешнейОбработке() слово Экспорт обязательно отделяется скобками и пробелом: Функция СведенияОВнешнейОбработке() Экспорт. Если написать слитно, платформа выдаст ошибку компиляции.
Также обратим внимание на написание стандартных реквизитов. Например, реквизит «Комментарий» в типовых конфигурациях 1С пишется с удвоенной буквой «м». Ошибка в написании СсылкаНаОбъект.Коментарий приведет к ошибке «Реквизит объекта не найден». Правильный вариант:
ОбластьШапки.Параметры.Комментарий = СсылкаНаОбъект.Комментарий;
Рассмотрим важные аспекты, о которых стоит помнить для обеспечения высокой скорости работы и соответствия стандартам 1С:
Обращение к реквизитам через точку в цикле (например, ТекущаяСтрока.Номенклатура.Артикул) провоцирует отдельные неявные запросы к базе данных на каждую строчку документа. Для небольших накладных это незаметно, но на документах с сотнями строк вызовет задержки. В профессиональной разработке рекомендуется получать все необходимые данные (включая артикулы и наименования) единым запросом Запрос.
В стандартном процедурном вызове БСП в процедуру Печать передается массив МассивОбъектов. Если обращаться только к первому элементу МассивОбъектов[0], то при выделении пользователем нескольких документов в списке на печать выведется только один. Для корректной групповой печати необходимо организовать цикл по всем элементам массива и разделять документы методом ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц().
Для удобства пользователей рекомендуется задавать свойства автомасштабирования и параметров печати перед возвратом табличного документа:
ТабличныйДокумент.АвтоМасштаб = Истина;
ТабличныйДокумент.ОтображатьСетку = Ложь;
ТабличныйДокумент.ОтображатьЗаголовки = Ложь;
Сведем все исправления воедино и посмотрим на корректную реализацию модуля внешней печатной формы:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Заявка на склад");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("Информация", "Внешняя печатная форма заявки на склад");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, "Заявка на склад", "ЗаявкаНаСклад", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ЗаявкаНаСклад",
"Заявка на склад",
СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
);
КонецПроцедуры
Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.АвтоМасштаб = Истина;
ТабличныйДокумент.ОтображатьСетку = Ложь;
МакетОбработки = ПолучитьМакет("МакетЗаказа");
ОбластьШапки = МакетОбработки.ПолучитьОбласть("Шапка");
ОбластьСтроки = МакетОбработки.ПолучитьОбласть("СтрокаСТ");
ПервыйДокумент = Истина;
Для Каждого СсылкаНаОбъект Из МассивОбъектов Цикл
Если НЕ ПервыйДокумент Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ПервыйДокумент = Ложь;
// Заполнение шапки
ОбластьШапки.Параметры.НомерРеализации = СсылкаНаОбъект.Номер;
ОбластьШапки.Параметры.ДатаРеализации = Формат(СсылкаНаОбъект.Дата, "ДЛФ=DD");
ОбластьШапки.Параметры.Комментарий = СсылкаНаОбъект.Комментарий;
ТабличныйДокумент.Вывести(ОбластьШапки);
// Заполнение строк
Для Каждого ТекущаяСтрока Из СсылкаНаОбъект.Товары Цикл
ОбластьСтроки.Параметры.Товар = ТекущаяСтрока.Номенклатура;
ОбластьСтроки.Параметры.Артикул = ТекущаяСтрока.Номенклатура.Артикул;
ОбластьСтроки.Параметры.Мест = ТекущаяСтрока.КоличествоМест;
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции
Таким образом, мы исправили синтаксические ошибки вывода областей, настроили передачу артикула и количества мест, добавили вывод комментария и обеспечили корректную работу печатной формы при выделении нескольких документов.