Как найти и сопоставить строку документа в цепочке связанных документов в 1С?

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

При решении задач автоматизации в конфигурации «1С:Управление производственным предприятием» (УПП) и других прикладных решениях часто возникает необходимость проследить путь конкретной строки из документа-основания (например, ЗаказПоставщику) по всей цепочке связанных документов — таких как КорректировкаЗаказаПоставщику и ПоступлениеТоваровУслуг.

Рассмотрим, почему нельзя решить эту задачу простым единственным запросом, с какими ограничениями платформы «1С:Предприятие» приходится сталкиваться и какие проверенные механизмы существуют для точного сопоставления строк.

Ограничения платформы 1С при работе с цепочками и строками

Проанализируем базовые особенности архитектуры платформы, которые не позволяют выполнять прямой поиск строк одним запросом:

  1. Отсутствие прямых ссылок на строки табличных частей: В платформе «1С:Предприятие» строки табличных частей не являются самостоятельными ссылочными объектами базы данных. Мы можем сослаться на документ или справочник, но сослаться напрямую из одного документа на конкретную строку другого документа штатно невозможно.
  2. Ненадежность реквизита НомерСтроки: Порядковый номер строки динамически меняется при удалении, вставке или сортировке записей. Использовать НомерСтроки для связи табличных частей разных документов категорически не рекомендуется.
  3. Отсутствие рекурсивных запросов произвольной глубины: Язык запросов 1С не позволяет за один вызов обойти граф подчиненности связанных документов на неограниченную глубину. Стандартные процедуры (такие как ВывестиРодительскиеДокументы и ВывестиПодчиненныеДокументы) работают итеративно на уровне встроенного языка.
  4. Ограничения критериев отбора: Стандартный критерий отбора возвращает ссылки на связанные документы, но не связывает конкретные строки их табличных частей.

Способы решения задачи и сопоставления строк

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

1. Сопоставление по составному аналитическому ключу

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

Разберем набор полей, формирующих уникальный составной ключ строки:

  1. Номенклатура
  2. ХарактеристикаНоменклатуры
  3. СерияНоменклатуры
  4. ЕдиницаИзмерения
  5. Цена

Если в документе-основании нет дублирования одинаковой номенклатуры с одинаковыми характеристиками и ценой, такое соединение обеспечивает точный результат.

2. Использование уникального ключа строки (КлючСтроки)

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

Для достижения 100% точности сопоставления добавим в табличные части сопоставляемых документов служебный реквизит — например, КлючСтроки (тип Число или Строка). При вводе подчиненного документа на основании исходного переносим значение этого ключа из строки-источника в строку-приемник. В запросах связываем табличные части по равенству реквизита КлючСтроки.

3. Анализ через регистры накопления

В конфигурациях класса УПП движения и исполнение заказов фиксируются в специализированных регистрах накопления (например, ЗаказыПоставщикам). В них учет ведется в разрезе аналитики (заказ, номенклатура, характеристика).

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

Двухэтапный алгоритм реализации

Сформулируем оптимальную схему работы при необходимости построить отчет или обработку по цепочке документов:

  1. Этап 1. Сбор цепочки документов: В цикле или рекурсивно собираем массив ссылок на все связанные документы, используя реквизиты оснований или критерии отбора подчиненных документов.
  2. Этап 2. Выполнение единого запроса: Передаем собранный массив документов в параметр запроса с условием В (&МассивДокументов) и связываем табличные части по аналитическому ключу или реквизиту КлючСтроки.

Рассмотрим пример запроса для сопоставления строк заказа и подчиненных поступлений по аналитическому ключу:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЗаказТовары.Ссылка КАК Заказ,
    |	ЗаказТовары.Номенклатура КАК Номенклатура,
    |	ЗаказТовары.ХарактеристикаНоменклатуры КАК Характеристика,
    |	ЗаказТовары.Количество КАК КоличествоЗаказа,
    |	ПоступлениеТовары.Ссылка КАК ДокументПоступления,
    |	ЕСТЬНУЛЛ(ПоступлениеТовары.Количество, 0) КАК КоличествоПоступления
    |ИЗ
    |	Документ.ЗаказПоставщику.Товары КАК ЗаказТовары
    |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТовары
    |			ПО ЗаказТовары.Номенклатура = ПоступлениеТовары.Номенклатура
    |			И ЗаказТовары.ХарактеристикаНоменклатуры = ПоступлениеТовары.ХарактеристикаНоменклатуры
    |			И ПоступлениеТовары.Ссылка В(&МассивПоступлений)
    |ГДЕ
    |	ЗаказТовары.Ссылка = &ЗаказПоставщику";

Запрос.УстановитьПараметр("ЗаказПоставщику", ЗаказСсылка);
Запрос.УстановитьПараметр("МассивПоступлений", МассивСвязанныхПоступлений);

Результат = Запрос.Выполнить();

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

← На главную