При работе с конфигурациями 1С, особенно если используются дописанные объекты и механизмы, часто возникает задача по корректировке печатных форм. Один из распространенных сценариев – необходимость удалить колонку из печатной формы документа. На первый взгляд, это кажется простой задачей, ведь достаточно открыть макет и скрыть или удалить ненужную колонку. Однако ситуация усложняется, когда данные для этой колонки формируются программно.
В этой статье мы подробно рассмотрим, как решить проблему удаления колонки из документа "Маршрутный лист" в 1С УТ 10.3, когда эта колонка формируется не только макетом, но и программным кодом. Мы пройдем по всем этапам: от диагностики до окончательного решения, включая модификацию макета и кода.
Прежде всего, нам необходимо убедиться, что мы редактируем именно тот макет, который используется для формирования печатной формы "Маршрутного листа". Это критически важный этап, поскольку в 1С часто могут существовать дубликаты макетов, внешние печатные формы или изменения, которые перекрывают стандартные механизмы.
Для стандартных документов макеты находятся непосредственно в объекте метаданных документа (например, в ветке "Макеты"). Однако для дописанных объектов или измененных форм макет может быть:
.epf), подключенной через раздел "Администрирование" -> "Печатные формы, отчеты и обработки".Если документ "Маршрутный лист" является дописанным, то, скорее всего, его макет будет либо непосредственно в объекте документа, либо в общем модуле, который вызывает функцию печати.
Чтобы окончательно убедиться, что вы редактируете нужный макет, предлагаем простой и эффективный способ:
Если в печатной форме мы увидим добавленные символы "ТЕСТ_УДАЛЕНИЕ", это однозначно подтверждает, что мы работаем с правильным макетом. Если символов нет, то нам следует продолжить поиск истинного источника печатной формы.
После того как мы подтвердили, что нашли верный макет, переходим к его модификации.
Теперь, когда мы уверены в правильности макета, мы можем приступить к изменению его структуры. Простое скрытие колонки не всегда дает желаемый эффект, особенно если колонка содержит программно заполняемые параметры.
Это самый прямой способ. Если колонка не является частью сложной группировки и ее удаление не приводит к нарушению общего дизайна, мы можем просто удалить ее.
В некоторых случаях, прямое удаление колонки с программно заполняемыми параметрами (например, [НаименованиеПараметра]) может привести к ошибкам выполнения, если программный код все еще пытается найти и заполнить эти параметры. Если физическое удаление вызывает проблемы, мы можем "скрыть" содержимое колонки.
Этот подход позволяет сохранить программный код без изменений, но делает колонку невидимой для пользователя. Однако, он менее "чистый", так как скрытые данные все равно обрабатываются.
Сообщение 6 и 8 из форума указывают на важность "перегруппировки". Если наша колонка входила в какую-либо группировку или формировалась как часть сложной области печати, простое удаление может "развалить" макет. В таких случаях нам потребуется:
Важный момент: если мы изменяем состав колонок в области, которая выводится циклом (например, Область.Вывести()), нам нужно быть предельно внимательными, чтобы не нарушить соответствие между данными, передаваемыми в область, и параметрами в макете.
Теперь, когда макет адаптирован, переходим к изменению программного кода, который отвечает за заполнение этой колонки.
Это самый важный шаг, так как причина, по которой скрытие колонки в макете не срабатывало, кроется именно в программном заполнении. Даже если мы удалили колонку из макета, код все равно может пытаться ее заполнить, что может приводить к ошибкам или неожиданному поведению.
Обычно код, который формирует печатную форму документа, находится:
Печать() или ВыполнитьКомандуПечать()).Мы будем искать строки кода, которые каким-либо образом упоминают данные, выводимые в удаляемой колонке. Это могут быть:
Область.Параметры.Вставить("МойПараметр", ЗначениеКолонки);ТаблицаДанных.Колонки.Добавить("МояКолонка"); ТаблицаДанных.Добавить().МояКолонка = Значение;ТабДокумент.Области.Получить("МояОбласть").Текст = Значение;Используем поиск по конфигурации (Ctrl+Shift+F в конфигураторе) по названию колонки или ее параметра (если он был в макете, например, МойПараметр), чтобы найти все вхождения.
После того как мы нашли соответствующие строки, у нас есть несколько вариантов:
// в начале каждой строки, которая заполняет или ссылается на удаляемую колонку. Это позволит нам легко откатить изменения, если возникнут непредвиденные проблемы.Рассмотрим пример. Допустим, у нас есть следующий код, который заполняет данные для печати:
// ...
ТаблицаВывода = Новый ТаблицаЗначений;
ТаблицаВывода.Колонки.Добавить("НомерСтроки");
ТаблицаВывода.Колонки.Добавить("НаименованиеТовара");
ТаблицаВывода.Колонки.Добавить("Количество");
ТаблицаВывода.Колонки.Добавить("Примечание"); // <-- Эта колонка подлежит удалению
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
НоваяСтрока = ТаблицаВывода.Добавить();
НоваяСтрока.НомерСтроки = НомерСтроки;
НоваяСтрока.НаименованиеТовара = СтрокаТЧ.Товар.Наименование;
НоваяСтрока.Количество = СтрокаТЧ.Количество;
НоваяСтрока.Примечание = СтрокаТЧ.Комментарий; // <-- Строка, которую нужно закомментировать/удалить
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
// ... далее код вывода в макет
// Например:
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаТВ Из ТаблицаВывода Цикл
ОбластьСтроки.Параметры.Заполнить(СтрокаТВ);
ТабДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
В этом примере нам необходимо будет:
// ТаблицаВывода.Колонки.Добавить("Примечание");// НоваяСтрока.Примечание = СтрокаТЧ.Комментарий;Если параметры заполняются напрямую в макет, например:
// ...
ОбластьШапки.Параметры.Заполнить(Объект); // Заполняет параметры из полей объекта
ОбластьШапки.Параметры.НазваниеДополнительнойКолонки = "ДополнительноеЗначение"; // <-- Эта строка
ТабДокумент.Вывести(ОбластьШапки);
// ...
Тогда нужно закомментировать строку, которая присваивает значение этому параметру: // ОбластьШапки.Параметры.НазваниеДополнительнойКолонки = "ДополнительноеЗначение";
Если данные для печати сначала собираются в какую-либо программно созданную таблицу (ТаблицаЗначений, ТаблицаОбъектов), мы можем удалить колонку непосредственно из этой таблицы перед тем, как она будет передана в макет для вывода.
// ...
ТаблицаДляПечати = ПолучитьДанныеДляПечатиМаршрутногоЛиста(ОбъектСсылка);
// Удаляем колонку "Примечание" из ТаблицыЗначений
Если ТаблицаДляПечати.Колонки.Найти("Примечание") <> Неопределено Тогда
ТаблицаДляПечати.Колонки.Удалить("Примечание");
КонецЕсли;
// ... далее код вывода этой таблицы в макет
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаТВ Из ТаблицаДляПечати Цикл
ОбластьСтроки.Параметры.Заполнить(СтрокаТВ);
ТабДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
// ...
Этот подход особенно полезен, если колонка генерируется в каком-то общем универсальном механизме, который сложно модифицировать напрямую, и мы хотим удалить ее на финальном этапе перед печатью.
Внесение изменений в конфигурацию, особенно в код, всегда сопряжено с определенными рисками. Поэтому мы настоятельно рекомендуем придерживаться следующих правил:
Сочетание правильной модификации макета и точечного изменения программного кода позволит нам успешно удалить ненужную колонку из печатной формы документа "Маршрутный лист" в 1С УТ 10.3, даже если она формируется программно.