Как вывести информацию о складах из табличной части в печатную форму документа Реализация товаров и услуг в 1С 8.2?

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

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

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

Предварительная настройка системы

Прежде чем приступать к правке кода, нам необходимо убедиться, что сама конфигурация настроена на работу с несколькими складами в одном документе. Если это не сделано, поле Склад в табличной части будет отсутствовать или будет недоступно для заполнения.

Проанализируем настройки параметров учета:

  1. Перейдем в меню Сервис — Настройка учета — Настройка параметров учета.
  2. На вкладке «Общие» найдем и установим флаг «Использовать указание складов в табличной части документов».
  3. После включения этой опции в документе РеализацияТоваровУслуг на закладке «Товары» появится колонка «Склад».

Разбор проблемы: почему не работает Ссылка.Склад

Рассмотрим типичную ситуацию: разработчик добавляет в макет колонку «Склад» и пытается заполнить её кодом: ОбластьМакета.Параметры.Склад = Ссылка.Склад;. В этом случае система обращается к реквизиту шапки документа. Если в документе 10 строк и для каждой указан свой склад в таблице, данный код все равно выведет во всех строках печати один и тот же основной склад из заголовка. Это не решает нашу задачу.

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

Корректировка запроса для получения складов

Выясним причину ошибки «Поле не найдено», с которой часто сталкиваются программисты. Она возникает из-за того, что в сложных запросах с объединениями (ОБЪЕДИНИТЬ ВСЕ) и вложенными таблицами поле должно быть объявлено на всех уровнях и во всех частях объединения. Также, если используется СГРУППИРОВАТЬ ПО, новое поле обязательно должно быть включено в список группировки.

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


Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);
Запрос.Текст = "ВЫБРАТЬ
               | НомерТЧ,
               | НомерСтрокиТЧ,
               | Номенклатура,
               | ВЫРАЗИТЬ(Номенклатура.НаименованиеПолное КАК СТРОКА(1000)) КАК Товар,
               | Номенклатура.Код КАК Код,
               | Номенклатура."+ ТекстКодАртикул + " КАК КодАртикул,
               | Количество,
               | КоличествоМест,
               | ЕдиницаИзмерения.Представление КАК ЕдиницаЦены,
               | ЕдиницаИзмеренияМест.Представление КАК ЕдиницаМест,
               | Цена,
               | Сумма,
               | СуммаНДС,
               | ПроцентСкидкиНаценки КАК Скидка,
               | ПроцентАвтоматическихСкидок КАК АвтоматическаяСкидка,
               | ХарактеристикаНоменклатуры КАК Характеристика,
               | СерияНоменклатуры КАК Серия,
               | МестоХранения КАК Склад  // Выбираем склад из вложенного запроса
               |ИЗ
               | (ВЫБРАТЬ
               | 1 КАК НомерТЧ,
               | МИНИМУМ(НомерСтроки) КАК НомерСтрокиТЧ,
               | Номенклатура КАК Номенклатура,
               | ЕдиницаИзмерения КАК ЕдиницаИзмерения,
               | ЕдиницаИзмеренияМест КАК ЕдиницаИзмеренияМест,
               | Цена КАК Цена,
               | СтавкаНДС КАК СтавкаНДС,
               | ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки,
               | ПроцентАвтоматическихСкидок КАК ПроцентАвтоматическихСкидок,
               | СерияНоменклатуры КАК СерияНоменклатуры,
               | ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
               | СУММА(Количество) КАК Количество,
               | СУММА(КоличествоМест) КАК КоличествоМест,
               | СУММА(Сумма) КАК Сумма,
               | СУММА(СуммаНДС) КАК СуммаНДС,
               | Склад КАК МестоХранения // Добавляем поле Склад во внутренний запрос
               | ИЗ
               | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслуг
               | ГДЕ
               | РеализацияТоваровУслуг.Ссылка = &ТекущийДокумент
               | СГРУППИРОВАТЬ ПО
               | Номенклатура,
               | ЕдиницаИзмерения,
               | ЕдиницаИзмеренияМест,
               | Цена,
               | СтавкаНДС,
               | ПроцентСкидкиНаценки,
               | ПроцентАвтоматическихСкидок,
               | СерияНоменклатуры,
               | ХарактеристикаНоменклатуры,
               | Склад // Обязательно группируем по складу!
               | ) КАК ВложенныйЗапросПоТоварам
               |
               |ОБЪЕДИНИТЬ ВСЕ
               |
               |ВЫБРАТЬ
               | 2,
               | РеализацияТоваровУслуг.НомерСтроки,
               | Выразить(РеализацияТоваровУслуг.Содержание КАК Строка(100)),
               | Выразить(РеализацияТоваровУслуг.Содержание КАК Строка(100)),
               | Номенклатура.Код КАК Код,
               | Номенклатура."+ ТекстКодАртикул + " КАК КодАртикул,
               | Количество,
               | NULL,
               | Номенклатура.ЕдиницаХраненияОстатков.Представление КАК ЕдиницаЦены,
               | NULL,
               | Цена,
               | Сумма,
               | СуммаНДС,
               | ПроцентСкидкиНаценки,
               | NULL,
               | NULL,
               | NULL,
               | NULL // У услуг склада нет, проставляем пустое значение
               |ИЗ
               | Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслуг
               |ГДЕ
               | РеализацияТоваровУслуг.Ссылка = &ТекущийДокумент
               |УПОРЯДОЧИТЬ ПО
               | НомерТЧ, НомерСтрокиТЧ";

Почему важна группировка по складу?

Проанализируем ситуацию: если один и тот же товар (например, «Кабель силовой») указан в двух разных строках документа с разными складами, то при отсутствии группировки по полю Склад система могла бы попытаться просуммировать их количество. Добавление поля Склад в секцию СГРУППИРОВАТЬ ПО гарантирует, что в печатной форме эти позиции останутся разделенными, что критически важно для складской логистики.

Вывод данных в макет

После того как мы успешно изменили запрос и выгрузили его в таблицу значений или выборку (в нашем примере это ЗапросТовары), необходимо передать эти данные в параметры макета. Посмотрим на цикл обхода строк:


Для каждого ВыборкаСтрокТовары из ЗапросТовары Цикл
    // ... проверка заполнения номенклатуры ...
    
    ОбластьМакета.Параметры.Заполнить(ВыборкаСтрокТовары);
    
    // Формируем представление товара с сериями
    ОбластьМакета.Параметры.Товар = СокрЛП(ВыборкаСтрокТовары.Товар) + 
                                   ФормированиеПечатныхФорм.ПредставлениеСерий(ВыборкаСтрокТовары);
    
    // Прямое назначение параметра Склад из результата запроса
    ОбластьМакета.Параметры.Склад = ВыборкаСтрокТовары.Склад;
    
    // ... расчет скидок и сумм ...
    
    ТабДокумент.Вывести(ОбластьМакета);
КонецЦикла;

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

Рекомендации по улучшению печатной формы

Для повышения удобства работы со складской накладной, можно применить еще несколько приемов:

  1. Сортировка по складам: Если документ большой, кладовщику удобнее собирать товар, когда позиции сгруппированы по складам. Для этого в конец запроса добавьте условие: УПОРЯДОЧИТЬ ПО Склад, НомерСтрокиТЧ.
  2. Внешняя печатная форма: Вместо изменения модуля объекта документа (что затрудняет обновления), создайте внешнюю печатную форму (файл .epf). Это позволит сохранить типовую конфигурацию в чистоте.
  3. Обработка пустых значений: Если склад в строке не заполнен, можно выводить склад из шапки как значение по умолчанию. Для этого в коде можно использовать проверку: ОбластьМакета.Параметры.Склад = ?(ЗначениеЗаполнено(ВыборкаСтрокТовары.Склад), ВыборкаСтрокТовары.Склад, Ссылка.Склад);.

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

← На главную