Как исправить ошибку вывода количества и серий в печатной форме Накладная на перемещение в 1С:ERP

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

В процессе работы с конфигурацией 1С:ERP Управление предприятием 2 (особенно в актуальных релизах ветки 2.5) программисты часто сталкиваются с проблемой некорректного отображения данных в печатных формах документов перемещения. Суть проблемы обычно заключается в том, что при печати «Накладной на перемещение» количество товара отображается неверно или отдельные строки вовсе пропадают, если в документе используется учет по сериям. Рассмотрим подробно, почему это происходит и как правильно составить запрос для формирования печатной формы.

Анализ проблемы: почему «плывет» количество

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

Основная ошибка кроется в логике соединения таблиц в запросе. Если мы попытаемся соединить Документ.ПеремещениеТоваров.Товары и Документ.ПеремещениеТоваров.Серии по полям Номенклатура и Характеристика, мы неизбежно получим «декартово произведение» (умножение строк). Проанализируем пример: если в товарах 2 строки по 5 штук одного товара, а в сериях 1 строка на 10 штук, то при обычном внутреннем соединении система может выдать неожиданный результат, либо потерять данные, если условия группировки или статусы указания серий не совпадают.

Шаг 1. Исправление логики соединения таблиц

В современных конфигурациях 1С (ERP 2.5, КА 2.5, УТ 11.5) для связи строк табличных частей используется техническое поле КлючСвязи. Это уникальный числовой идентификатор строки в рамках одного документа. Использование Номенклатуры для связи является устаревшим и ненадежным методом.

Проанализируем фрагмент кода, который вызывает ошибку, и посмотрим, как его оптимизировать. В исходном запросе используется ВНУТРЕННЕЕ СОЕДИНЕНИЕ, которое отсекает товары, если по ним не найдены серии, или если статус указания серий не соответствует фильтру. Для корректной работы печатной формы рекомендуется использовать ЛЕВОЕ СОЕДИНЕНИЕ, чтобы товары не пропадали из списка, даже если серии по какой-то причине не заполнены.

Рассмотрим правильную структуру первого этапа запроса (помещение данных во временную таблицу):


ВЫБРАТЬ
    ТаблицаТовары.Ссылка КАК Ссылка,
    ТаблицаТовары.НомерСтроки КАК НомерСтроки,
    ТаблицаТовары.Номенклатура КАК Номенклатура,
    ТаблицаТовары.Характеристика КАК Характеристика,
    ТаблицаТовары.КлючСвязи КАК КлючСвязи,
    ВЫБОР
        КОГДА ТаблицаТовары.СтатусУказанияСерий В (10, 14)
            ТОГДА ТаблицаТовары.Серия
        ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
    КОНЕЦ КАК Серия,
    ТаблицаТовары.Упаковка КАК Упаковка,
    ТаблицаТовары.КоличествоУпаковок КАК КоличествоУпаковок,
    ТаблицаТовары.Количество КАК Количество
ПОМЕСТИТЬ ТаблицаТоваров
ИЗ
    Документ.ПеремещениеТоваров.Товары КАК ТаблицаТовары
ГДЕ
    ТаблицаТовары.Ссылка В(&МассивОбъектов)
    И НЕ ТаблицаТовары.СтатусУказанияСерий В (2, 4, 6, 8)
;

Шаг 2. Работа с табличной частью Серии

Теперь выясним причину потери строк при объединении с сериями. Когда серии указаны в отдельной табличной части (статусы 2, 4, 6, 8), нам нужно корректно сопоставить их с товарами. Важно понимать, что в ТЧ Серии также присутствует поле КлючСвязи, которое должно совпадать с аналогичным полем в ТЧ Товары.

Посмотрим, как изменить объединение таблиц, чтобы количество не «размножалось»:


ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ТаблицаСерии.Ссылка,
    ТаблицаТовары.НомерСтроки,
    ТаблицаСерии.Номенклатура,
    ТаблицаСерии.Характеристика,
    ТаблицаТовары.КлючСвязи,
    ТаблицаСерии.Серия,
    ТаблицаТовары.Упаковка,
    ТаблицаСерии.Количество / ЕСТЬNULL(ТаблицаТовары.Коэффициент, 1), // Пересчет в упаковки
    ТаблицаСерии.Количество
ИЗ
    Документ.ПеремещениеТоваров.Серии КАК ТаблицаСерии
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров.Товары КАК ТаблицаТовары
        ПО ТаблицаСерии.Ссылка = ТаблицаТовары.Ссылка
        И ТаблицаСерии.КлючСвязи = ТаблицаТовары.КлючСвязи
ГДЕ
    ТаблицаСерии.Ссылка В(&МассивОбъектов)

Важный момент: использование ТаблицаСерии.КлючСвязи = ТаблицаТовары.КлючСвязи гарантирует, что серия привяжется именно к той строке товара, к которой она относится в интерфейсе документа. Это решает проблему, когда товар разбит на несколько строк (например, по 1 шт.), а серии указаны общим списком.

Шаг 3. Группировка и суммирование результатов

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

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


ВЫБРАТЬ
    ТаблицаТоваров.Ссылка КАК Ссылка,
    МИНИМУМ(ТаблицаТоваров.НомерСтроки) КАК НомерСтроки,
    ТаблицаТоваров.Номенклатура КАК Номенклатура,
    ТаблицаТоваров.Характеристика КАК Характеристика,
    ТаблицаТоваров.Упаковка КАК Упаковка,
    СУММА(ТаблицаТоваров.КоличествоУпаковок) КАК КоличествоУпаковок,
    СУММА(ТаблицаТоваров.Количество) КАК Количество,
    ТаблицаТоваров.Серия КАК Серия
ПОМЕСТИТЬ СуммированнаяТаблицаТоваров
ИЗ
    ТаблицаТоваров КАК ТаблицаТоваров
СГРУППИРОВАТЬ ПО
    ТаблицаТоваров.Ссылка,
    ТаблицаТоваров.Номенклатура,
    ТаблицаТоваров.Характеристика,
    ТаблицаТоваров.Упаковка,
    ТаблицаТоваров.Серия
;

Обратите внимание на СУММА(ТаблицаТоваров.Количество). Мы используем агрегатную функцию только для числовых показателей. Поле НомерСтроки мы берем через МИНИМУМ, чтобы сохранить порядок вывода товаров, максимально близкий к документу.

Рекомендации по отладке и проверке

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

  1. Статус документа: В ERP серии могут физически записываться в таблицы только после проведения документа или при смене статуса (например, на «К отгрузке» или «Принято»). Если документ в черновике, таблица серий может быть пуста.
  2. Ордерная схема: Если склад-отправитель является ордерным, проверьте настройки политики учета серий. Иногда серии фиксируются не в «Перемещении», а в «Расходном ордере на товары». В этом случае запрос к самому перемещению не вернет серийные номера.
  3. Вид номенклатуры: Убедитесь, что для номенклатуры включен учет серий. Проверьте поле СтатусУказанияСерий в ТЧ Товары. Если оно равно 0, значит, для этой строки серии не предусмотрены.

Подводя итог, можно сказать, что главная причина ошибок в печатных формах ERP — это игнорирование поля КлючСвязи и использование ВНУТРЕННЕГО СОЕДИНЕНИЯ там, где логически требуется объединение или левое соединение. Исправив эти моменты в запросе, вы добьетесь точного соответствия печатной формы данным в экранной форме документа.

← На главную