Как распечатать ТОРГ-12 из непроведенного документа реализации в 1С:Управление торговлей 11?

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

При работе в 1С:Управление торговлей 11 (УТ 11) часто возникает задача распечатать документ, например, товарную накладную ТОРГ-12, до того, как он будет проведен. По умолчанию типовая конфигурация 1С ограничивает печать непроведенных документов, поскольку многие печатные формы используют данные, формируемые при проведении документа, такие как движения по регистрам или расчет стоимости. Это сделано для обеспечения целостности данных и предотвращения печати документов с неактуальной информацией. Однако на практике часто требуется получить предварительную версию документа для согласования или внутренних нужд. Давайте рассмотрим различные подходы к решению этой задачи, от наименее инвазивных до требующих модификации конфигурации.

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

1. Использование внешних печатных форм (ВПФ)

Один из наиболее рекомендуемых и безопасных способов решения задачи – это создание и использование внешних печатных форм (ВПФ). Этот метод позволяет нам изменять логику печати без прямого изменения основной конфигурации, что значительно упрощает процесс обновления программы.

Разберем по шагам, как это работает:

  1. Создание ВПФ: Мы можем создать новую внешнюю печатную форму, используя "Конструктор внешних печатных форм" или разработать ее с нуля, взяв за основу типовую печатную форму ТОРГ-12. Важно, чтобы наша ВПФ была аналогична по структуре и логике сбору данных типовой форме, но при этом имела измененную логику вызова.

  2. Подключение ВПФ: Внешняя печатная форма подключается к системе через раздел "НСИ и Администрирование" -> "Печатные формы, отчеты и обработки". Здесь мы указываем файл ВПФ и привязываем ее к документу "Реализация товаров и услуг".

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

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

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

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

    Обратите внимание: Сообщение от пользователя naida.666 в форуме указывает, что создание ВПФ помогло решить проблему, но при этом "конфу с поддержки снять все же пришлось". Это может означать, что даже при использовании ВПФ, для полной отмены проверки на проведение потребовалось изменение какого-либо общего модуля конфигурации, который отвечает за вызов печати и содержит эту проверку. Такой сценарий хоть и решает проблему, но лишает конфигурацию возможности легкого обновления.

Риски использования ВПФ:

2. Модификация общих модулей конфигурации

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

Основной риск: Прямое изменение конфигурации приводит к тому, что она становится "снятой с поддержки". Это означает, что автоматическое обновление конфигурации становится невозможным, и каждое последующее обновление придется выполнять вручную, анализируя и объединяя изменения, что является трудоемким процессом и требует высокой квалификации.

Рассмотрим примеры модификаций общих модулей:

2.1. Изменение модуля "ДополнительныеОтчетыИОбработкиКлиентПереопределяемый"

В этом модуле можно добавить код, который перехватывает команду печати для определенных объектов и отключает стандартную обработку. Это позволяет вашей ВПФ или доработанной типовой печатной форме работать без проверки проведения.

  1. Откроем конфигурацию в режиме отладки (или режиме предприятия с правами администратора).

  2. Найдем общий модуль ДополнительныеОтчетыИОбработкиКлиентПереопределяемый.

  3. В процедуре ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы добавим следующий код:

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

    Установка СтандартнаяОбработка = Ложь; означает, что типовая логика проверки и вызова печати будет пропущена, и управление может быть передано вашей кастомной логике (например, в ВПФ).

2.2. Изменение модуля "УправлениеПечатьюКлиент"

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

  1. Откроем конфигурацию и найдем общий модуль УправлениеПечатьюКлиент.

  2. В процедуре ВыполнитьПодключаемуюКомандуПечати можно добавить код для отключения проверки проведения для конкретного документа или для всех:

    2.2.1. Отключение для конкретного документа (например, "Реализация товаров и услуг")

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

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

    В этом примере мы проверяем тип ссылки источника печати. Если это "Реализация товаров и услуг", мы устанавливаем параметр ПроверкаПроведенияПередПечатью в Ложь, тем самым отключая стандартную проверку.

    2.2.2. Отключение для всех печатных форм

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

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

    Эта модификация безусловно разрешает печать непроведенных документов. Мы проверяем свойство ПроверкаПроведенияПередПечатью в структуре ОписаниеКоманды и принудительно устанавливаем его в Ложь. Это базовое ограничение, и его снятие необходимо для печати непроведенных документов. Однако следует помнить, что могут существовать и другие проверки (например, на наличие движений по регистрам), которые этим кодом не будут затронуты.

3. Использование расширений конфигурации

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

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

Рассмотрим пример использования расширения для отключения проверки проведения для УТ 11.4.10 и выше:

  1. Создание расширения: Создадим новое расширение конфигурации.

  2. Переопределение функции: В расширении мы можем перехватить вызов функции ОписаниеКоманды в модуле ПодключаемыеКомандыКлиентПовтИсп. Для этого используется директива &Вместо.

  3. Изменение режима записи: Наша цель – изменить параметр РежимЗаписи для команд печати с "Проводить" на "Записывать". Это укажет системе, что документ не обязательно должен быть проведен перед печатью.

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

    Этот код перехватывает стандартную функцию ОписаниеКоманды, которая возвращает информацию о командах (включая команды печати). Если команда имеет Вид="Печать" и требует РежимЗаписи="Проводить", мы изменяем этот режим на "Записывать". Это позволяет печатать документ после его записи, но без обязательного проведения.

Особенности и ограничения расширений:

4. Временное проведение документа

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

  1. Пользователь временно проводит документ.
  2. Распечатывает его.
  3. Снова делает документ непроведенным (отменяет проведение).

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

Важные аспекты и рекомендации

При выборе способа печати непроведенных документов следует учитывать несколько важных факторов:

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

← На главную