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