При работе с конфигурациями 1С:Комплексная автоматизация 2.5 и 1С:ERP 2.5 многие разработчики и аналитики сталкиваются с особенностью: в документе Заказ клиента поле НоменклатураПартнера заполнено и доступно, а в созданном на его основе документе Реализация товаров и услуг (РТУ) это же поле в консоли запросов или в табличной части оказывается пустым. Рассмотрим подробно, почему так происходит и как правильно получить эти данные для печатных форм или отчетов.
Проанализируем архитектурную логику систем 1С. Документ Заказ клиента является «коммерческим» соглашением. На этапе заказа важно зафиксировать, как именно товар называется у покупателя, чтобы избежать ошибок при согласовании позиций. Поэтому поле НоменклатураПартнера в табличной части Товары заказа заполняется активно.
Однако документ Реализация товаров и услуг предназначен в первую очередь для складского и финансового учета. С точки зрения системы, для списания остатков и формирования выручки критически важна ваша внутренняя Номенклатура. Поле НоменклатураПартнера в РТУ считается опциональным. В типовой логике перенос этого реквизита из заказа в реализацию может не происходить «в лоб», так как для проведения документа он не требуется. Это часто вызывает удивление, но такая логика заложена разработчиками: если данные нужны для печати, система должна уметь доставать их по связям.
Самый надежный способ вывести номенклатуру партнера в реализации — это обратиться к Заказу клиента, который указан в качестве основания для каждой строки реализации. Разберем по шагам, как составить правильный запрос.
Важным нюансом является связь по полю КодСтроки. В современных конфигурациях ERP/КА связь только по ссылке на документ и ссылке на номенклатуру может быть недостаточной (например, если в одном заказе одна и та же номенклатура идет разными строками с разными характеристиками или ценами). Использование КодСтроки гарантирует точность сопоставления.
Посмотрим на пример запроса:
ВЫБРАТЬ
РеализацияТовары.Ссылка КАК Ссылка,
РеализацияТовары.Номенклатура КАК Номенклатура,
РеализацияТовары.НоменклатураПартнера КАК НоменклатураВДокументе,
// Используем ЕСТЬNULL, чтобы приоритетно взять значение из Заказа, если в РТУ пусто
ЕСТЬNULL(ЗаказТовары.НоменклатураПартнера, РеализацияТовары.НоменклатураПартнера) КАК ИтоговаяНоменклатураПартнера
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.Товары КАК ЗаказТовары
ПО РеализацияТовары.ЗаказКлиента = ЗаказТовары.Ссылка
И РеализацияТовары.Номенклатура = ЗаказТовары.Номенклатура
И РеализацияТовары.КодСтроки = ЗаказТовары.КодСтроки
ГДЕ
РеализацияТовары.Ссылка = &Ссылка
В этом запросе мы выполняем ЛЕВОЕ СОЕДИНЕНИЕ табличной части товаров реализации с аналогичной таблицей заказа. Это позволяет «подтянуть» заполненное поле НоменклатураПартнера из первоисточника.
Если реализация создается без заказа-основания или поле в заказе также не было заполнено, мы можем обратиться напрямую к справочнику НоменклатураКонтрагентов. Однако здесь нужно быть осторожными. Рассмотрим ситуацию: у одного и того же партнера (контрагента) для вашей одной позиции номенклатуры может быть создано несколько записей в справочнике номенклатуры партнера (например, разные артикулы для разных подразделений).
Проанализируем структуру запроса к справочнику:
ВЫБРАТЬ
РеализацияТовары.Номенклатура,
НоменклатураПартнеров.Наименование,
НоменклатураПартнеров.Артикул
ИЗ
Документ.RealizatsiyaTovarovUslug.Товары КАК РеализацияТовары
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатураКонтрагентов КАК НоменклатураПартнеров
ПО РеализацияТовары.Номенклатура = НоменклатураПартнеров.Номенклатура
И РеализацияТовары.Ссылка.Партнер = НоменклатураПартнеров.Владелец
ГДЕ
РеализацияТовары.Ссылка = &Ссылка
И НЕ НоменклатураПартнеров.ПометкаУдаления
Важный момент: Чтобы избежать «размножения» строк в результате запроса (если в справочнике нашлось два соответствия), рекомендуется использовать дополнительные фильтры или выбирать только одну запись (например, через МАКСИМУМ или выбирая ту, которая указана в Соглашении с клиентом).
Если ваша цель — вывести данные в ТОРГ-12, УПД или Счет-фактуру, полезно знать, как это делает сама система 1С. В типовом коде печатных форм реализован каскадный поиск:
НоменклатураПартнера самой реализации.НоменклатураКонтрагентов по связке «Партнер + Номенклатура».Поэтому, если вы разрабатываете Внешнюю печатную форму (ВПФ), лучшей практикой будет повторить этот каскад в своем запросе, используя функцию ЕСТЬNULL.
Прежде чем приступать к написанию кода, обязательно проверьте, включена ли соответствующая возможность в настройках системы. Если опция выключена, поля могут быть скрыты или недоступны для программного обращения.
Перейдите в раздел: НСИ и администрирование — Настройка НСИ и разделов — Номенклатура — Дополнительно — Номенклатура партнеров. Убедитесь, что флаг установлен. Это активирует использование справочника и соответствующих реквизитов в документах продажи.
Стоит отметить, что для компаний, использующих Электронный документооборот (ЭДО), заполнение поля НоменклатураПартнера непосредственно в Реализации товаров и услуг становится критичным. При формировании электронного XML-файла УПД система берет данные именно из табличной части документа. Если в РТУ это поле пустое (даже если оно есть в Заказе), покупатель получит в ЭДО ваше наименование, что может вызвать проблемы с автоматическим сопоставлением на его стороне.
В таких случаях мы рекомендуем использовать небольшое расширение, которое при заполнении Реализации на основании Заказа будет принудительно копировать значение НоменклатураПартнера в табличную часть РТУ. Это снимет все вопросы как при выгрузке в ЭДО, так и при формировании простых печатных форм через консоль запросов.
Мы выяснили, что отсутствие номенклатуры партнера в реализации — это не ошибка, а особенность типовой логики 1С. Чтобы решить задачу вывода данных, следует:
ЗаказКлиента.Товары по полям Ссылка, Номенклатура и КодСтроки.НоменклатураКонтрагентов, фильтруя по Владельцу (Партнеру) и исключая помеченные на удаление записи.ЕСТЬNULL(ЗаказТовары.НоменклатураПартнера, СправочникНоменклатураПартнера.Наименование).