Как исправить ошибки при создании внешней печатной формы заявки на склад в 1С 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка внешних печатных форм (ВПФ) на базе Библиотеки Стандартных Подсистем (БСП) — одна из наиболее частых задач для начинающих разработчиков в системе 1С:Предприятие 8.3. Однако на этапе вывода табличного документа, заполнения параметров макета и регистрации обработки часто возникают неприятные синтаксические и логические ошибки. Рассмотрим типичные проблемы, с которыми сталкиваются программисты при выгрузке данных документа РеализацияТоваровУслуг в печатную форму «Заявка на склад», и разберем способы их решения по шагам.

Основные ошибки при выводе табличного документа и заполнении параметров

Проанализируем наиболее распространенные неточности, возникающие в модуле объекта внешней печатной формы:

  1. Передача строкового названия области вместо объекта области:

    Одной из главных причин, почему печатная форма не формируется или выдает ошибку, является передача строки в метод вывода. Метод ТабличныйДокумент.Вывести() принимает в качестве параметра переменную, содержащую объект области макета (тип ОбластьТабличногоДокумента), а не её имя в кавычках.

    Сравним ошибочный и исправленный вариант кода:

    
    // Неправильно: передача имени области строкой
    ТабличныйДокумент.Вывести("ОбластьШапки");
    
    // Правильно: передача полученной ранее области
    ОбластьШапки = МакетОбработки.ПолучитьОбласть("Шапка");
    // ... заполнение параметров области ...
    ТабличныйДокумент.Вывести(ОбластьШапки);
    
  2. Вывод дополнительных реквизитов номенклатуры (Артикул):

    Чтобы добавить артикул номенклатуры в печатную форму, необходимо предварительно завести параметр в ячейке макета (например, назовем его Артикул и установим свойство ячейки «Заполнение» в значение «Параметр»). После этого в цикле обхода строк документа пропишем получение данного значения из справочника Номенклатура:

    ОбластьСтроки.Параметры.Артикул = ТекущаяСтрока.Номенклатура.Артикул;
  3. Различие между количеством товара и количеством мест/коробок:

    При оформлении складских заявок часто требуется выводить не массово-габаритный объем или чистый вес товара из реквизита Количество, а число упаковок или мест. В зависимости от конфигурации и настроек учета логистика может опираться на реквизит КоличествоМест или КоличествоУпаковок. При заполнении параметров следует указывать именно тот реквизит табличной части, который содержит данные о транспортных местах:

    ОбластьСтроки.Параметры.Мест = ТекущаяСтрока.КоличествоМест;
  4. Синтаксис объявления экспортных функций и правильность наименования реквизитов:

    При объявлении обязательной функции регистрации БСП СведенияОВнешнейОбработке() слово Экспорт обязательно отделяется скобками и пробелом: Функция СведенияОВнешнейОбработке() Экспорт. Если написать слитно, платформа выдаст ошибку компиляции.

    Также обратим внимание на написание стандартных реквизитов. Например, реквизит «Комментарий» в типовых конфигурациях 1С пишется с удвоенной буквой «м». Ошибка в написании СсылкаНаОбъект.Коментарий приведет к ошибке «Реквизит объекта не найден». Правильный вариант:

    ОбластьШапки.Параметры.Комментарий = СсылкаНаОбъект.Комментарий;

Оптимизация кода печатной формы и стандарты разработки 1С

Рассмотрим важные аспекты, о которых стоит помнить для обеспечения высокой скорости работы и соответствия стандартам 1С:

  1. Избавление от неявных запросов в цикле:

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

  2. Печать нескольких выделенных документов:

    В стандартном процедурном вызове БСП в процедуру Печать передается массив МассивОбъектов. Если обращаться только к первому элементу МассивОбъектов[0], то при выделении пользователем нескольких документов в списке на печать выведется только один. Для корректной групповой печати необходимо организовать цикл по всем элементам массива и разделять документы методом ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц().

  3. Настройки отображения печатного документа:

    Для удобства пользователей рекомендуется задавать свойства автомасштабирования и параметров печати перед возвратом табличного документа:

    
    ТабличныйДокумент.АвтоМасштаб = Истина;
    ТабличныйДокумент.ОтображатьСетку = Ложь;
    ТабличныйДокумент.ОтображатьЗаголовки = Ложь;
    

Готовый пример кода внешней печатной формы

Сведем все исправления воедино и посмотрим на корректную реализацию модуля внешней печатной формы:


Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");
    
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Заявка на склад");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("Информация", "Внешняя печатная форма заявки на склад");
    
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(ТаблицаКоманд, "Заявка на склад", "ЗаявкаНаСклад", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
    
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

Функция ПолучитьТаблицуКоманд()
    
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    
    Возврат Команды;
    
КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
    
КонецПроцедуры

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
        КоллекцияПечатныхФорм, 
        "ЗаявкаНаСклад", 
        "Заявка на склад", 
        СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
    );
    
КонецПроцедуры

Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
    
    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.АвтоМасштаб = Истина;
    ТабличныйДокумент.ОтображатьСетку = Ложь;
    
    МакетОбработки = ПолучитьМакет("МакетЗаказа");
    ОбластьШапки = МакетОбработки.ПолучитьОбласть("Шапка");
    ОбластьСтроки = МакетОбработки.ПолучитьОбласть("СтрокаСТ");
    
    ПервыйДокумент = Истина;
    
    Для Каждого СсылкаНаОбъект Из МассивОбъектов Цикл
        
        Если НЕ ПервыйДокумент Тогда
            ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
        ПервыйДокумент = Ложь;
        
        // Заполнение шапки
        ОбластьШапки.Параметры.НомерРеализации = СсылкаНаОбъект.Номер;
        ОбластьШапки.Параметры.ДатаРеализации = Формат(СсылкаНаОбъект.Дата, "ДЛФ=DD");
        ОбластьШапки.Параметры.Комментарий = СсылкаНаОбъект.Комментарий;
        
        ТабличныйДокумент.Вывести(ОбластьШапки);
        
        // Заполнение строк
        Для Каждого ТекущаяСтрока Из СсылкаНаОбъект.Товары Цикл
            
            ОбластьСтроки.Параметры.Товар = ТекущаяСтрока.Номенклатура;
            ОбластьСтроки.Параметры.Артикул = ТекущаяСтрока.Номенклатура.Артикул;
            ОбластьСтроки.Параметры.Мест = ТекущаяСтрока.КоличествоМест;
            
            ТабличныйДокумент.Вывести(ОбластьСтроки);
            
        КонецЦикла;
        
    КонецЦикла;
    
    Возврат ТабличныйДокумент;
    
КонецФункции

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

← На главную