Как исправить ошибки при переносе внешних печатных форм из БП 8.2 в 8.3 и вывести полные реквизиты контрагента?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

Переход с конфигурации «Бухгалтерия предприятия 2.0» (на обычных формах) на версию 3.0 (на управляемых формах) часто сопровождается трудностями при адаптации внешних печатных форм (ВПФ). Одной из наиболее распространенных ошибок является отсутствие необходимых полей в структуре регистрации обработки, что приводит к системному сообщению «Поле объекта не обнаружено (Информация)». Кроме того, механизмы получения данных о контрагентах (адреса, телефоны, банковские счета) в новой версии существенно изменились. Рассмотрим подробно, как решить эти задачи.

Причина ошибки при регистрации внешней печатной формы

Разберем ситуацию, когда при попытке подключения обработки в справочнике «Дополнительные отчеты и обработки» возникает ошибка в общем модуле. Проблема кроется в функции СведенияОВнешнейОбработке. В версии 8.3 конфигурации используют Библиотеку стандартных подсистем (БСП). Для корректной регистрации система ожидает строго определенный набор полей в возвращаемой структуре.

Проанализируем ваш исходный код. Ошибка возникает из-за того, что в структуре РегистрационныеДанные отсутствует поле Информация. Даже если вы просто закомментировали эту строку, БСП не сможет прочитать описание обработки. Однако ручное заполнение структуры — это устаревший подход, который может привести к новым ошибкам при обновлении конфигурации.

Решение проблемы через стандартные методы БСП

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


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

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

Проблема вывода реквизитов контрагента в БП 3.0

Вторая сложность, с которой сталкиваются пользователи, — это получение реквизитов контрагента (ИНН, КПП, расчетный счет, адрес). В версии 8.2 данные часто извлекались напрямую через точку от ссылки, например: СсылкаНаОбъект.Контрагент.ИНН. В современной «1С:Бухгалтерии» контактная информация хранится в отдельном регистре сведений, а банковские счета могут меняться динамически. Простое обращение к реквизитам через точку часто возвращает пустые значения или только краткое наименование.

Выясним причину, почему код ?(СведенияОГрузополучателе, "ИНН, Адрес...", ) не работает. Это синтаксически неверная конструкция для получения данных. Для извлечения информации о контрагенте в 1С 8.3 следует использовать общие модули формирования печатных форм.

Как правильно получить данные для печати (ИНН, Банк, Адрес)

Рассмотрим пошагово, как правильно собрать сведения о контрагенте в функции СформироватьПечатнуюФорму. Мы воспользуемся функцией ФормированиеПечатныхФорм.СведенияОЮрФизЛице, которая возвращает структуру со всеми необходимыми данными.

  1. Получаем структуру данных: Вызываем функцию, передавая ссылку на контрагента и дату документа.
  2. Формируем строку представления: Используем модуль ОбщегоНазначенияБПВызовСервера для создания красивой строки с ИНН, КПП и адресом.
  3. Заполняем параметры макета: Передаем полученные строки в область макета.

Посмотрим на пример реализации кода:


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

Важные замечания по процедуре Печать

Проанализируем работу основной экспортной процедуры Печать. В управляемом приложении она должна принимать строго определенный набор параметров. Обязательно учитывайте, что в МассивОбъектов может быть передано несколько документов одновременно (групповая печать).


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Проверяем, наш ли макет затребован
    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЛицензионныйДоговор") Тогда
        
        // Формируем табличный документ для ПЕРВОГО объекта из массива (для простоты)
        // В идеале здесь должен быть цикл по МассивОбъектов
        ТабДок = СформироватьПечатнуюФорму(МассивОбъектов[0], ОбъектыПечати);
        
        // Выводим результат в коллекцию
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
            КоллекцияПечатныхФорм, 
            "ЛицензионныйДоговор", 
            "Лицензионный договор", 
            ТабДок);
            
    КонецЕсли;
    
КонецПроцедуры

Резюме: Чтобы внешняя печатная форма работала в 1С 8.3 без ошибок, необходимо использовать программный интерфейс БСП для регистрации и специализированные общие модули конфигурации для получения контактных данных. Попытки прямого обращения к реквизитам через точку в управляемых формах часто не дают результата из-за особенностей архитектуры хранения данных (контактная информация, банковские счета).

← На главную