Как удалить колонку из печатной формы документа "Маршрутный лист" в 1С УТ 10.3, если она формируется программно?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет
← На главную

При работе с конфигурациями 1С, особенно если используются дописанные объекты и механизмы, часто возникает задача по корректировке печатных форм. Один из распространенных сценариев – необходимость удалить колонку из печатной формы документа. На первый взгляд, это кажется простой задачей, ведь достаточно открыть макет и скрыть или удалить ненужную колонку. Однако ситуация усложняется, когда данные для этой колонки формируются программно.

В этой статье мы подробно рассмотрим, как решить проблему удаления колонки из документа "Маршрутный лист" в 1С УТ 10.3, когда эта колонка формируется не только макетом, но и программным кодом. Мы пройдем по всем этапам: от диагностики до окончательного решения, включая модификацию макета и кода.

Шаг 1: Идентификация и подтверждение используемого макета

Прежде всего, нам необходимо убедиться, что мы редактируем именно тот макет, который используется для формирования печатной формы "Маршрутного листа". Это критически важный этап, поскольку в 1С часто могут существовать дубликаты макетов, внешние печатные формы или изменения, которые перекрывают стандартные механизмы.

  1. Проверим путь к макету:

    Для стандартных документов макеты находятся непосредственно в объекте метаданных документа (например, в ветке "Макеты"). Однако для дописанных объектов или измененных форм макет может быть:

    • Встроенным макетом в другом объекте (например, в общем модуле, который отвечает за печать).
    • Внешней печатной формой (файлом .epf), подключенной через раздел "Администрирование" -> "Печатные формы, отчеты и обработки".
    • Измененным стандартным макетом, который активирован в "Администрирование" -> "Печатные формы, отчеты и обработки" -> "Макеты печатных форм", где указано "использовать измененный макет".

    Если документ "Маршрутный лист" является дописанным, то, скорее всего, его макет будет либо непосредственно в объекте документа, либо в общем модуле, который вызывает функцию печати.

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

    Чтобы окончательно убедиться, что вы редактируете нужный макет, предлагаем простой и эффективный способ:

    1. Откроем предполагаемый макет в режиме редактирования.
    2. Найдем ту колонку, которую планируем удалить.
    3. В одной из ячеек этой колонки (например, в ячейке заголовка или данных) добавим несколько уникальных символов, например, "ТЕСТ_УДАЛЕНИЕ".
    4. Сохраним изменения в конфигурации (или во внешнем макете/обработке).
    5. Повторно распечатаем "Маршрутный лист".

    Если в печатной форме мы увидим добавленные символы "ТЕСТ_УДАЛЕНИЕ", это однозначно подтверждает, что мы работаем с правильным макетом. Если символов нет, то нам следует продолжить поиск истинного источника печатной формы.

После того как мы подтвердили, что нашли верный макет, переходим к его модификации.

Шаг 2: Модификация макета печатной формы

Теперь, когда мы уверены в правильности макета, мы можем приступить к изменению его структуры. Простое скрытие колонки не всегда дает желаемый эффект, особенно если колонка содержит программно заполняемые параметры.

  1. Физическое удаление колонки из макета:

    Это самый прямой способ. Если колонка не является частью сложной группировки и ее удаление не приводит к нарушению общего дизайна, мы можем просто удалить ее.

    1. Откроем макет печатной формы в конфигураторе.
    2. Выделим всю колонку, которую мы хотим удалить. Это можно сделать, нажав на заголовок колонки (букву) в области заголовков колонок.
    3. Кликнем правой кнопкой мыши по выделенной колонке и выберем пункт меню "Удалить".
    4. При необходимости, если удаленная колонка была частью объединенных ячеек (например, для заголовков, растянутых на несколько колонок), нам может потребоваться скорректировать объединение ячеек в соседних колонках, чтобы избежать пустых пространств или некорректного вывода.
  2. "Скрытие" параметров вместо удаления (альтернативный подход):

    В некоторых случаях, прямое удаление колонки с программно заполняемыми параметрами (например, [НаименованиеПараметра]) может привести к ошибкам выполнения, если программный код все еще пытается найти и заполнить эти параметры. Если физическое удаление вызывает проблемы, мы можем "скрыть" содержимое колонки.

    1. Выделим все ячейки в удаляемой колонке, которые содержат параметры.
    2. Изменим цвет текста этих ячеек на цвет фона (обычно белый).
    3. Также можем уменьшить ширину колонки до минимума или сделать ее невидимой, если это позволяет редактор макета.

    Этот подход позволяет сохранить программный код без изменений, но делает колонку невидимой для пользователя. Однако, он менее "чистый", так как скрытые данные все равно обрабатываются.

  3. Корректировка группировок и областей:

    Сообщение 6 и 8 из форума указывают на важность "перегруппировки". Если наша колонка входила в какую-либо группировку или формировалась как часть сложной области печати, простое удаление может "развалить" макет. В таких случаях нам потребуется:

    1. Переопределить области: Если мы удалили колонку из табличной части макета, которая выводится определенными областями (например, "ЗаголовокТаблицы", "СтрокаДанных"), нам придется изменить определения этих областей. Возможно, потребуется уменьшить их ширину или скорректировать ячейки, чтобы они соответствовали новой структуре.
    2. Скорректировать объединения ячеек: Если колонка была частью объединенной ячейки (например, шапка таблицы), нам нужно будет выделить соседние ячейки и заново объединить их или изменить их границы, чтобы заполнить освободившееся пространство.

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

Теперь, когда макет адаптирован, переходим к изменению программного кода, который отвечает за заполнение этой колонки.

Шаг 3: Изменение программного кода

Это самый важный шаг, так как причина, по которой скрытие колонки в макете не срабатывало, кроется именно в программном заполнении. Даже если мы удалили колонку из макета, код все равно может пытаться ее заполнить, что может приводить к ошибкам или неожиданному поведению.

  1. Поиск кода, отвечающего за заполнение колонки:

    Обычно код, который формирует печатную форму документа, находится:

    • В модуле объекта документа (например, в процедуре Печать() или ВыполнитьКомандуПечать()).
    • В модуле менеджера документа.
    • В общем модуле, который специально предназначен для формирования печатных форм.

    Мы будем искать строки кода, которые каким-либо образом упоминают данные, выводимые в удаляемой колонке. Это могут быть:

    • Присвоение значений параметрам области: Область.Параметры.Вставить("МойПараметр", ЗначениеКолонки);
    • Заполнение колонок в промежуточной таблице значений: ТаблицаДанных.Колонки.Добавить("МояКолонка"); ТаблицаДанных.Добавить().МояКолонка = Значение;
    • Прямой вывод текста в ячейку: ТабДокумент.Области.Получить("МояОбласть").Текст = Значение;

    Используем поиск по конфигурации (Ctrl+Shift+F в конфигураторе) по названию колонки или ее параметра (если он был в макете, например, МойПараметр), чтобы найти все вхождения.

  2. Комментирование или удаление строк кода:

    После того как мы нашли соответствующие строки, у нас есть несколько вариантов:

    • Закомментировать: Это наиболее безопасный способ. Просто добавляем // в начале каждой строки, которая заполняет или ссылается на удаляемую колонку. Это позволит нам легко откатить изменения, если возникнут непредвиденные проблемы.
    • Удалить: Если мы абсолютно уверены, что колонка и связанные с ней данные больше не нужны, мы можем удалить эти строки. Однако, всегда лучше сначала закомментировать.

    Рассмотрим пример. Допустим, у нас есть следующий код, который заполняет данные для печати:

    
    // ...
    ТаблицаВывода = Новый ТаблицаЗначений;
    ТаблицаВывода.Колонки.Добавить("НомерСтроки");
    ТаблицаВывода.Колонки.Добавить("НаименованиеТовара");
    ТаблицаВывода.Колонки.Добавить("Количество");
    ТаблицаВывода.Колонки.Добавить("Примечание"); // <-- Эта колонка подлежит удалению
    
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        НоваяСтрока = ТаблицаВывода.Добавить();
        НоваяСтрока.НомерСтроки     = НомерСтроки;
        НоваяСтрока.НаименованиеТовара = СтрокаТЧ.Товар.Наименование;
        НоваяСтрока.Количество      = СтрокаТЧ.Количество;
        НоваяСтрока.Примечание      = СтрокаТЧ.Комментарий; // <-- Строка, которую нужно закомментировать/удалить
        НомерСтроки = НомерСтроки + 1;
    КонецЦикла;
    
    // ... далее код вывода в макет
    // Например:
    ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
    Для Каждого СтрокаТВ Из ТаблицаВывода Цикл
        ОбластьСтроки.Параметры.Заполнить(СтрокаТВ);
        ТабДокумент.Вывести(ОбластьСтроки);
    КонецЦикла;
    

    В этом примере нам необходимо будет:

    1. Закомментировать или удалить строку добавления колонки: // ТаблицаВывода.Колонки.Добавить("Примечание");
    2. Закомментировать или удалить строку заполнения колонки: // НоваяСтрока.Примечание = СтрокаТЧ.Комментарий;

    Если параметры заполняются напрямую в макет, например:

    
    // ...
    ОбластьШапки.Параметры.Заполнить(Объект); // Заполняет параметры из полей объекта
    ОбластьШапки.Параметры.НазваниеДополнительнойКолонки = "ДополнительноеЗначение"; // <-- Эта строка
    ТабДокумент.Вывести(ОбластьШапки);
    // ...
    

    Тогда нужно закомментировать строку, которая присваивает значение этому параметру: // ОбластьШапки.Параметры.НазваниеДополнительнойКолонки = "ДополнительноеЗначение";

  3. Особые случаи: Удаление колонки из ТаблицыЗначений/ТаблицыОбъектов:

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

    
    // ...
    ТаблицаДляПечати = ПолучитьДанныеДляПечатиМаршрутногоЛиста(ОбъектСсылка);
            
    // Удаляем колонку "Примечание" из ТаблицыЗначений
    Если ТаблицаДляПечати.Колонки.Найти("Примечание") <> Неопределено Тогда
        ТаблицаДляПечати.Колонки.Удалить("Примечание");
    КонецЕсли;
            
    // ... далее код вывода этой таблицы в макет
    ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
    Для Каждого СтрокаТВ Из ТаблицаДляПечати Цикл
        ОбластьСтроки.Параметры.Заполнить(СтрокаТВ);
        ТабДокумент.Вывести(ОбластьСтроки);
    КонецЦикла;
    // ...
    

    Этот подход особенно полезен, если колонка генерируется в каком-то общем универсальном механизме, который сложно модифицировать напрямую, и мы хотим удалить ее на финальном этапе перед печатью.

Важные рекомендации при работе с конфигурацией

Внесение изменений в конфигурацию, особенно в код, всегда сопряжено с определенными рисками. Поэтому мы настоятельно рекомендуем придерживаться следующих правил:

  1. Создавайте резервные копии: Перед внесением любых изменений в конфигурацию обязательно создайте полную резервную копию информационной базы. Это позволит нам восстановить систему в случае непредвиденных проблем.
  2. Работайте в тестовой базе: Всегда сначала тестируйте изменения в отдельной, тестовой базе, которая является точной копией рабочей. Это защитит рабочую среду от ошибок.
  3. Используйте систему контроля версий (при наличии): Если ваша команда использует систему контроля версий (например, Git), зафиксируйте текущее состояние конфигурации перед внесением изменений.
  4. Документируйте изменения: Оставляйте комментарии в коде, объясняющие, что и зачем было изменено. Это очень поможет вам или другим разработчикам в будущем.

Сочетание правильной модификации макета и точечного изменения программного кода позволит нам успешно удалить ненужную колонку из печатной формы документа "Маршрутный лист" в 1С УТ 10.3, даже если она формируется программно.

← На главную