Как добавить склад, общее количество позиций и общий вес в печатную форму расходной накладной в 1С:Управление торговлей 3.1?

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

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

Для выполнения этой задачи мы будем работать с конфигурацией «Управление торговлей для Украины, редакция 3.1» (аналог УТ11), а изменения будем вносить в модуль менеджера обработки печати.

Подготовка: выбор макета и общая структура функции печати

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

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


Функция ЗаполнитьТабличныйДокументРасходнаяНакладная(ТабличныйДокумент, ДанныеДляПечати, ОбъектыПечати, КомплектыПечати, ПараметрыПечати, ПараметрыВывода)
    Перем КомплектПечатиПоСсылке;

    КодЯзыкаПечать = ПараметрыВывода.КодЯзыкаДляМногоязычныхПечатныхФорм;    

    ДанныеПечати        = ДанныеДляПечати.РезультатПоШапке.Выбрать();
    ВыборкаПоДокументам = ДанныеДляПечати.РезультатПоТабличнойЧасти.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    // ... остальной код функции ...
КонецФункции

Основной объект, содержащий данные документа, – это ДанныеПечати. Табличная часть документа обрабатывается с помощью выборки ВыборкаПоДокументам, из которой затем получается ВыборкаПоТоварам для текущего документа.

Шаг 1: Добавление склада в печатную форму

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

  1. Редактирование макета. Сначала откроем макет печатной формы «ПФ_MXL_РасходнаяНакладная» в режиме конфигуратора (или через механизм пользовательских макетов печати в режиме 1С:Предприятие). Найдем подходящую область для вывода информации о складе, например, область «Покупатель» или «Поставщик» (в зависимости от того, где логичнее расположить информацию). Создадим новую ячейку или выделим существующую, и в ее свойствах (или через контекстное меню) зададим ей параметр, например, [Склад].

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

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

    Здесь мы создали структуру СтруктураДанныхПоставщик, добавили в нее элемент с именем "Склад" и передали ему значение ДанныеПечати.Ссылка.Склад. Затем эта структура используется для заполнения параметров области макета.

Шаг 2: Добавление общего количества позиций в печатную форму

Для того чтобы вывести общее количество товаров в накладной (сумму по колонке «Количество»), нам потребуется пройти по всем строкам табличной части документа и просуммировать значения.

  1. Инициализация переменной. В начале цикла обхода документов, но перед циклом обхода товаров, инициализируем переменную ИтогКоличество.

    
    // ...
    НомерСтроки = 0;
    ВсегоБезСкидок = 0;
    ИтогКоличество = 0; // Наша новая переменная
    ИтогВес = 0;        // Переменная для общего веса, которую добавим позже
    // ...
    
  2. Накопление суммы. Нам нужно найти место, где происходит обход строк табличной части документа. В данной конфигурации это цикл Пока ВыборкаПоТоварам.Следующий() Цикл. Внутри этого цикла мы будем добавлять значение количества текущей строки к нашей переменной.

    Важно: В исходной теме была обнаружена распространенная ошибка – двойной вызов Пока ВыборкаПоТоварам.Следующий() Цикл. Если мы проитерируем выборку для подсчета итогов, а затем попытаемся итерировать ее еще раз для вывода строк в табличный документ, вторая итерация не даст результата, так как выборка уже будет исчерпана. Чтобы избежать этого, сначала мы итерируем выборку для подсчета итогов, а затем сбрасываем ее и итерируем повторно для вывода строк.

    
    // ... код перед выводом строк таблицы Товары ...
    
    // Сбросим выборку, чтобы пройти по ней для подсчета итогов
    ВыборкаПоТоварам.Сбросить(); 
    
    // Цикл для подсчета итогов
    Пока ВыборкаПоТоварам.Следующий() Цикл
        // Здесь мы исключаем комплектующие из подсчета общих итогов, если это необходимо
        Если Не НаборыСервер.ИспользоватьОбластьКомплектующие(ВыборкаПоТоварам, ИспользоватьНаборы) Тогда
            ИтогКоличество = ИтогКоличество + ВыборкаПоТоварам.Количество;
            // Для веса учтем количество в строке
            ИтогВес = ИтогВес + ВыборкаПоТоварам.Количество * ВыборкаПоТоварам.Номенклатура.Вес;
        КонецЕсли;
    КонецЦикла;
    
    // После подсчета итогов, сбросим выборку снова, чтобы затем она могла быть использована для вывода строк
    ВыборкаПоТоварам.Сбросить();
    
    // ... далее идет основной цикл для вывода строк таблицы Товары ...
    Пока ВыборкаПоТоварам.Следующий() Цикл
        // ... тело цикла, выводящее строки в табличный документ ...
    КонецЦикла;
    
  3. Вывод в подвал. После завершения цикла подсчета, когда ИтогКоличество содержит общую сумму, нам нужно передать это значение в соответствующую область подвала макета.

    Мы найдем блок кода, который отвечает за вывод подвала печатной формы, например, область ПодвалНДС. В типовых конфигурациях часто используется структура для заполнения параметров этой области. Мы добавим туда наш параметр.

    
    // ... код перед выводом подвала ...
    Область = Макет.ПолучитьОбласть("ПодвалНДС");
    СтруктураДанныхПодвалНДС = Новый Структура;
    СтруктураДанныхПодвалНДС.Вставить("ВсегоНДС", СуммаНДС);
    // ... другие параметры ...
    
    // Добавляем наши итоги в структуру
    СтруктураДанныхПодвалНДС.Вставить("ИтогКоличество", ИтогКоличество);
    СтруктураДанныхПодвалНДС.Вставить("ИтогВес", ИтогВес);
    
    // ... остальные параметры ...
    Область.Параметры.Заполнить(СтруктураДанныхПодвалНДС);
    ТабличныйДокумент.Присоединить(Область);
    // ...
    

    Также не забудьте добавить соответствующую ячейку с параметром [ИтогКоличество] (и [ИтогВес]) в макет в области "ПодвалНДС" (или в другую подходящую область, если вы выбрали другое место для вывода итогов). Важно, чтобы имя параметра в коде и в макете совпадало!

Шаг 3: Добавление общего веса позиций в печатную форму

Расчет общего веса аналогичен расчету общего количества, но с учетом веса каждой единицы номенклатуры и ее количества в строке.

  1. Инициализация переменной. Мы уже добавили переменную ИтогВес = 0; на предыдущем шаге.

  2. Накопление веса. В том же цикле, где мы считаем ИтогКоличество, мы будем считать и ИтогВес. Критически важно умножать вес единицы номенклатуры на количество в текущей строке!

    
    // ... внутри цикла подсчета итогов ...
    // Цикл для подсчета итогов
    Пока ВыборкаПоТоварам.Следующий() Цикл
        Если Не НаборыСервер.ИспользоватьОбластьКомплектующие(ВыборкаПоТоварам, ИспользоватьНаборы) Тогда
            ИтогКоличество = ИтогКоличество + ВыборкаПоТоварам.Количество;
            // Для веса учтем количество в строке
            ИтогВес = ИтогВес + ВыборкаПоТоварам.Количество * ВыборкаПоТоварам.Номенклатура.Вес; // Умножаем на количество
        КонецЕсли;
    КонецЦикла;
    // ...
    

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

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

    
    // ...
    СтруктураДанныхПодвалНДС.Вставить("ИтогКоличество", ИтогКоличество);
    СтруктураДанныхПодвалНДС.Вставить("ИтогВес", ИтогВес);
    // ...
    

    И, конечно, не забудьте добавить параметр [ИтогВес] в соответствующую ячейку макета.

Типичные ошибки и их исправление

В процессе реализации этой задачи могут возникнуть несколько распространенных ошибок:

  1. «Переменная не определена (ОбластьПодвалТаблицы)»: Эта ошибка означает, что вы пытаетесь использовать переменную, которая не была объявлена или не получила значения. Например, если вы написали ОбластьПодвалТаблицы.Параметры..., но забыли получить эту область из макета.

    Решение: Убедитесь, что перед использованием переменной области вы получили ее из макета, например: ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ИмяОбласти");.

  2. «Поле объекта не обнаружено (ИтогКоличество)»: Эта ошибка указывает, что в области макета, которую вы пытаетесь заполнить, нет параметра с таким именем, или вы пытаетесь добавить параметр в структуру, которая не содержит такой ключ.

    Решение: Тщательно проверьте имя параметра в макете (например, [ИтогКоличество]) и имя, которое вы используете в коде для вставки значения (например, СтруктураДанныхПодвалНДС.Вставить("ИтогКоличество", ИтогКоличество);). Они должны совпадать. Если вы используете ОбластьМакета.Параметры.Заполнить(СтруктураДанных), убедитесь, что в макете есть ячейка с параметром, чье имя совпадает с ключом структуры.

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

    Решение: Используйте метод ВыборкаПоТоварам.Сбросить(); перед каждой новой итерацией по выборке, как показано в примере выше.

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

    Решение: Обязательно умножайте вес единицы номенклатуры (ВыборкаПоТоварам.Номенклатура.Вес) на количество в строке (ВыборкаПоТоварам.Количество) при накоплении общего веса: ИтогВес = ИтогВес + ВыборкаПоТоварам.Количество * ВыборкаПоТоварам.Номенклатура.Вес;.

Общие рекомендации и лучшие практики при модификации печатных форм

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

  1. Используйте механизм пользовательских макетов печати. Вместо прямого изменения кода типовой конфигурации, что приведет к снятию с поддержки, рассмотрите возможность использования механизма пользовательских макетов печати. Этот механизм позволяет создавать и подключать свои макеты без изменения конфигурации, что упрощает обновления. Доступ к нему можно получить в режиме 1С:Предприятие через раздел НСИ и администрирование -> Печатные формы, отчеты и обработки -> Макеты печатных форм.

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

  3. Активно используйте отладчик. При возникновении ошибок или для понимания потока выполнения кода, отладчик является незаменимым инструментом. Он позволяет пошагово проследить выполнение кода, проверять значения переменных и убеждаться в корректности данных, передаваемых в макеты.

  4. Проверяйте доступность реквизитов в запросе. Если вам нужны данные, которые не передаются в выборку по умолчанию (например, вес номенклатуры), вам, возможно, потребуется модифицировать запрос, который формирует ДанныеДляПечати. Это можно сделать либо в модуле менеджера, либо в обработке, если вы используете ВПФ.

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

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

Надеемся, что это подробное руководство поможет вам успешно адаптировать печатные формы в вашей конфигурации 1С:Управление торговлей!

← На главную