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