Как связать две табличные части одного документа по номеру строки в 1С?

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

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

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

Самый очевидный способ, который первым приходит в голову — это использование предопределенного поля НомерСтроки. На первый взгляд, если в обеих табличных частях (ТЧ) данные вводятся синхронно, их номера строк будут совпадать. Однако здесь кроется серьезная методическая ловушка. Давайте разберем, почему полагаться исключительно на НомерСтроки в типовых конфигурациях 1С (таких как Бухгалтерия предприятия или Управление торговлей) опасно:

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

Тем не менее, если вы уверены, что структура документа жестко детерминирована, рассмотрим, как выполнить такое соединение в запросе.

Решение через запрос: работа с физическими таблицами

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

Проанализируем пример запроса, который объединяет две табличные части по номеру строки и ссылке на документ:


ВЫБРАТЬ
    ТЧ_Товары.Ссылка КАК ДокументСсылка,
    ТЧ_Товары.НомерСтроки КАК НомерСтроки,
    ТЧ_Товары.Номенклатура КАК Продукция,
    ТЧ_Материалы.Номенклатура КАК Материал,
    ТЧ_Товары.Количество КАК КоличествоПродукции,
    ТЧ_Материалы.Количество КАК КоличествоМатериала
ИЗ
    Документ.НазваниеВашегоДокумента.Товары КАК ТЧ_Товары
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.НазваниеВашегоДокумента.Материалы КАК ТЧ_Материалы
        ПО ТЧ_Товары.Ссылка = ТЧ_Материалы.Ссылка
            И ТЧ_Товары.НомерСтроки = ТЧ_Материалы.НомерСтроки
ГДЕ
    ТЧ_Товары.Ссылка = &СсылкаНаДокумент

Важный момент: Мы используем ЛЕВОЕ СОЕДИНЕНИЕ. Это гарантирует, что если во второй таблице по какой-то причине отсутствует строка с соответствующим номером, данные из основной таблицы (продукция) все равно попадут в отчет, а поле материала останется пустым. Если использовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ, потеря данных в одной из таблиц приведет к полному исчезновению всей строки из результата.

Профессиональный подход: использование «Ключа связи»

Если вы проектируете документ самостоятельно или дорабатываете типовой, лучшим решением будет отказ от привязки к номеру строки в пользу специального реквизита. В типовых решениях (ERP, УТ 11, КА) для этих целей используется реквизит КлючСвязи (тип Число).

Разберем алгоритм реализации этого механизма:

  1. Добавьте в обе табличные части реквизит КлючСвязи (Тип: Число, длина 10, точность 0).
  2. При добавлении строки в основную ТЧ генерируйте уникальное число в пределах документа.
  3. Записывайте это же число в соответствующую строку подчиненной ТЧ.

Для автоматизации заполнения ключа в модуле формы документа можно использовать следующий код:


&НаСервере
Процедура ПриДобавленииСтрокиВТЧ(НоваяСтрока)
    // Находим максимальный текущий ключ
    МаксКлюч = 0;
    Для Каждого Стр Из Объект.Товары Цикл
        МаксКлюч = Макс(МаксКлюч, Стр.КлючСвязи);
    КонецЦикла;
    
    НоваяСтрока.КлючСвязи = МаксКлюч + 1;
КонецПроцедуры

Теперь в запросе вместо НомерСтроки мы будем использовать КлючСвязи. Это сделает связь «неубиваемой»: даже если строки будут перемешаны, удалены или отсортированы, программный ключ сохранит логическое единство данных.

Особенности настройки в Системе компоновки данных (СКД)

Если вы строите отчет в СКД, у вас есть два пути. Первый — описать соединение в тексте запроса (как показано выше). Это наиболее производительный метод. Второй — создать два разных набора данных (запроса) и связать их на вкладке «Связи наборов данных».

Рассмотрим второй вариант подробнее:

Выясним причину, почему разработчики часто выбирают связь через вкладку в СКД: это позволяет легче оперировать ресурсами и итогами, если в одной ТЧ строк больше, чем в другой (связь «один ко многим»). Однако для простой связи строк «один к одному» лучше использовать один плоский запрос с левым соединением — это работает быстрее и прозрачнее.

Резюме

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

← На главную