При доработке типовых конфигураций (1С:Управление торговлей 11, 1С:Комплексная автоматизация 2, 1С:ERP) часто возникает необходимость сопоставить конкретную строку документа РеализацияТоваровУслуг со строкой исходного документа ЗаказКлиента. Например, это требуется при выводе дополнительных реквизитов строк заказа в печатную форму УПД, контроле цен или расчете специфических скидок. Разберем подробно, какие реквизиты отвечают за эту связь и как правильно организовать выборку данных в запросах.
В табличных частях документов товародвижения присутствуют два похожих по назначению реквизита, которые выполняют принципиально разные задачи:
КодСтроки (сквозная связь между документами) — это числовой идентификатор строки распоряжения (заказа). При оформлении реализации на основании заказа клиента (или через рабочее место оформления накладных) значение поля КодСтроки из табличной части заказа переносится в соответствующую строку реализации. Именно связка документа ЗаказКлиента и поля КодСтроки используется системой для закрытия остатков по регистрам накопления (например, в регистре ЗаказыКлиентов).КлючСвязи (внутренняя связь внутри одного документа) — числовой идентификатор, предназначенный исключительно для связывания строк подчиненных табличных частей с основной табличной частью внутри одного объекта. Например, он соединяет строку табличной части Товары со строками табличных частей Серии, ВидыЗапасов или СкидкиНаценки того же самого документа. Для связи разных документов между собой КлючСвязи не применяется.Проанализируем ключевые нюансы, которые необходимо учитывать при построении логики на основе КодСтроки:
РеализацияТоваровУслуг будут содержать один и тот же КодСтроки, указывающий на исходную строку заказа.РТиУ.ЗаказКлиента либо в реквизите табличной части РТиУ.Товары.ЗаказКлиента (если одна реализация оформлена по нескольким заказам сразу).КодСтроки может остаться равным 0 или получить новое значение, не сопоставленное заказу. Также сброс связей часто происходит при некорректном программном заполнении документов во внешних обработках.Рассмотрим, как правильно составить запрос к базе данных, если нам требуется получить значение доработанного реквизита из табличной части заказа клиента для вывода в печатную форму УПД из документа реализации. В примере учтем вариант, когда заказ может быть указан как в шапке накладной, так и в строках табличной части, а также предусмотрим резервное сопоставление на случай незаполненного кода строки:
ВЫБРАТЬ
РеализацияТовары.НомерСтроки КАК НомерСтрокиРТУ,
РеализацияТовары.Номенклатура КАК Номенклатура,
РеализацияТовары.Характеристика КАК Характеристика,
РеализацияТовары.Количество КАК Количество,
ВЫБОР
КОГДА РеализацияТовары.ЗаказКлиента <> ЗНАЧЕНИЕ(Документ.ЗаказКлиента.ПустаяСсылка)
ТОГДА РеализацияТовары.ЗаказКлиента
ИНАЧЕ РеализацияШапка.ЗаказКлиента
КОНЕЦ КАК ДокументЗаказ,
РеализацияТовары.КодСтроки КАК КодСтрокиРТУ
ПОМЕСТИТЬ ВТ_ТоварыРеализации
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияШапка
ПО РеализацияТовары.Ссылка = РеализацияШапка.Ссылка
ГДЕ
РеализацияТовары.Ссылка = &СсылкаНаРеализацию
;
ВЫБРАТЬ
ВТ.НомерСтрокиРТУ КАК НомерСтрокиРТУ,
ВТ.Номенклатура КАК Номенклатура,
ВТ.Характеристика КАК Характеристика,
ВТ.Количество КАК Количество,
ЕСТЬNULL(ЗаказТоварыПоКоду.ДополнительныйРеквизит, ЗаказТоварыПоПолям.ДополнительныйРеквизит) КАК ДополнительныйРеквизитИзЗаказа
ИЗ
ВТ_ТоварыРеализации КАК ВТ
// Основное соединение по точному коду строки заказа
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.Товары КАК ЗаказТоварыПоКоду
ПО ВТ.ДокументЗаказ = ЗаказТоварыПоКоду.Ссылка
И ВТ.КодСтрокиРТУ = ЗаказТоварыПоКоду.КодСтроки
И ВТ.КодСтрокиРТУ > 0
// Резервное соединение по номенклатуре и характеристике на случай ручного ввода строк
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.Товары КАК ЗаказТоварыПоПолям
ПО ВТ.ДокументЗаказ = ЗаказТоварыПоПолям.Ссылка
И ВТ.Номенклатура = ЗаказТоварыПоПолям.Номенклатура
И ВТ.Характеристика = ЗаказТоварыПоПолям.Характеристика
И (ВТ.КодСтрокиРТУ = 0 ИЛИ ЗаказТоварыПоКоду.Ссылка ЕСТЬ NULL)
В зависимости от требований к учету и производительности системы можно применить альтернативные варианты передачи данных:
Товары документа реализации и заполнять его в обработчике ОбработкаЗаполнения или через подписку на событие при вводе на основании. Это повышает скорость формирования печатных форм и фиксирует состояние данных на момент отгрузки, защищая печатную форму от последующих правок в исходном заказе.ДополнительныеРеквизитыИСведения для справочника Номенклатура или ХарактеристикиНоменклатуры, избегая изменения структуры табличных частей документов.