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

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

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

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

Проблема прямой связи документов в УТ 11

Прежде чем приступать к кодингу, проанализируем структуру данных. В УТ 11 «Реализация товаров и услуг» крайне редко имеет прямую ссылку на «Счет на оплату». Обычно связь строится через посредника — документ Заказ клиента. Возможны следующие цепочки:

  1. Заказ клиента -> Реализация (Счет в этом случае является подчиненным Заказу или просто печатной формой Заказа).
  2. Счет на оплату -> Реализация (Если счет используется как самостоятельный документ-основание).
  3. Заказ клиента -> Счет на оплату и Реализация (Оба документа созданы на основании одного заказа).

Следовательно, чтобы «достать» номер счета, нам придется написать алгоритм поиска связанных документов. Рассмотрим способы реализации этой задачи.

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

Этот метод считается классическим для 1С. Мы не меняем конфигурацию, а подключаем обработку через справочник «Дополнительные отчеты и обработки».

Рассмотрим подробнее шаги реализации:

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

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

Способ 2. Реализация через Расширение конфигурации

Для современных версий 1С (начиная с 8.3.6) использование расширений является более гибким и предпочтительным вариантом. Разберем по шагам, как это работает.

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

Проанализируем пример использования аннотации &После для модификации данных:


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

КонецПроцедуры

При таком подходе нам даже не нужно менять макет, если мы просто дописываем информацию в стандартное поле «Основание». Это максимально безопасно при обновлениях.

Алгоритм поиска номера счета

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


Функция ПолучитьНомерСчетаПоРеализации(СсылкаНаРеализацию)
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |   СвязанныеДокументы.Ссылка КАК Счет
        |ИЗ
        |   КритерийОтбора.СвязанныеДокументы(&Ссылка) КАК СвязанныеДокументы
        |ГДЕ
        |   СвязанныеДокументы.Ссылка ССЫЛКА Документ.СчетНаОплатуКлиенту";
    
    Запрос.УстановитьПараметр("Ссылка", СсылкаНаРеализацию);
    Результат = Запрос.Выполнить();
    
    Если Не Результат.Пустой() Тогда
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        Возврат СокрЛП(Выборка.Счет.Номер) + " от " + Формат(Выборка.Счет.Дата, "ДЛФ=D");
    КонецЕсли;
    
    // Если напрямую не нашли, пробуем поискать через Заказ
    Если ЗначениеЗаполнено(СсылкаНаРеализацию.ЗаказКлиента) Тогда
        // Рекурсивно или отдельным запросом ищем счета, связанные с заказом
    КонецЕсли;
    
    Возврат "";
КонецФункции

Почему нельзя просто изменить макет в пользовательском режиме?

Многие пользователи пробуют зайти в меню «Администрирование — Печатные формы, отчеты и обработки — Макеты печатных форм» и отредактировать ТОРГ-12 там. Выясним причину, по которой это не сработает для данной задачи:

Поэтому без программирования (через ВПФ или Расширение) реализовать вывод номера счета невозможно.

Подводим итоги: что выбрать?

Выбор метода зависит от ваших приоритетов:

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

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

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

← На главную