К статье
Практический материал

Разработка и Конфигурация · 11 мин

Ключ связи в 1С: назначение, принцип работы и практическое применение

Что такое ключ связи в 1С, зачем он нужен в табличных частях и формах, как заполнять ключ связи программно и избегать типичных ошибок при разработке.

Ключ связи в 1С — это служебное числовое значение, которое связывает между собой строки двух табличных частей одного документа или строки табличной части с другими данными формы. Без такого ключа платформа не смогла бы понять, какой строке товаров соответствует конкретная строка серий, скидок или налоговой информации. Механизм встроен в типовые конфигурации и активно используется в управляемых формах.

Чаще всего разработчик сталкивается с ключом связи при программном заполнении табличных частей, например когда нужно добавить товар и одновременно указать его серию, характеристику упаковки или данные по НДС. Если ключ не заполнен или заполнен неправильно, связанные данные «отрываются» от основной строки: серии перестают отображаться, суммы не считаются, документ ведёт себя непредсказуемо.

Механизм одинаков по сути во всех конфигурациях на управляемых формах — «Управление торговлей», «ERP», «Комплексная автоматизация», «Бухгалтерия». Отличаются только составы связанных табличных частей и имена реквизитов. Поняв принцип один раз, вы сможете применять его в любой типовой или самописной конфигурации.

Что такое ключ связи простыми словами

Представьте документ «Реализация товаров и услуг». В нём есть табличная часть «Товары» и табличная часть «Серии». Одна строка товара может иметь несколько серийных номеров, и платформе нужно как-то понять, какие серии к какому товару относятся. Для этого у обеих табличных частей есть реквизит «КлючСвязи»: у строки товара и у всех её серий значение этого реквизита одинаковое.

Ключ связи — это обычное целое число, не ключ базы данных и не уникальный идентификатор объекта. Он живёт только внутри документа и имеет смысл лишь как «ярлык» для сопоставления строк. В одном документе ключ 3 может означать связь товара с сериями, в другом документе то же число 3 будет связывать совершенно другие строки — конфликтов не возникает.

Важно не путать ключ связи с уникальным идентификатором ссылки, номером строки табличной части и ключом строки динамического списка. Это разные механизмы: номер строки виден пользователю и меняется при сортировке, уникальный идентификатор относится ко всему объекту, а ключ связи — невидимая служебная метка внутри одного объекта.

Где применяется ключ связи в типовых конфигурациях

Механизм встречается везде, где одна «мастер-строка» должна иметь набор подчинённых данных, которые неудобно хранить в той же табличной части. Типовые примеры:

  • товары и серии номенклатуры в документах продажи, закупки и перемещения;
  • товары и данные по автоматическим скидкам в чеках и заказах;
  • товары и сведения о прослеживаемости (РНПТ) в поступлениях и реализациях;
  • этапы производства и обеспечение материалами в ERP;
  • строки заказа и данные по вариантам обеспечения потребностей.

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

Реквизит в табличной частиЧисловое поле «КлючСвязи»

Откройте состав табличной части в конфигураторе или через «Ещё — Изменить форму»

Повторение в двух таблицахОдинаковое имя реквизита в двух ТЧ

Сравните реквизиты табличных частей «Товары» и «Серии»

Поведение в формеОтбор связанных строк при активации

Выделите товар — в связанной таблице останутся только его строки

Как работает механизм связи строк

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

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

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

Как программно заполнить ключ связи

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

Стандартный приём — вычислить максимальное значение ключа в табличной части и увеличить его на единицу для каждой новой связки строк. Начинать нумерацию можно с единицы. Главное — не допустить повторов и не оставить нулевые значения там, где типовой код ожидает заполненный ключ.

Порядок программного заполнения
  1. 1
    Найдите максимальное значение КлючСвязи в табличной части товаров (перебором строк)
  2. 2
    Добавьте строку товара и присвойте ей КлючСвязи = Максимум + 1
  3. 3
    Добавьте связанные строки (серии, скидки) с тем же значением КлючСвязи
  4. 4
    Для следующей строки товара увеличьте ключ ещё на единицу
  5. 5
    Запишите документ и откройте его форму — проверьте, что связанные строки отображаются у нужного товара

Пример фрагмента кода на встроенном языке:

МаксКлюч = 0;

Для Каждого СтрокаТовара Из Объект.Товары Цикл

Если СтрокаТовара.КлючСвязи > МаксКлюч Тогда

МаксКлюч = СтрокаТовара.КлючСвязи;

КонецЕсли;

КонецЦикла;

НоваяСтрока = Объект.Товары.Добавить();

НоваяСтрока.Номенклатура = НоменклатураСсылка;

НоваяСтрока.Количество = 2;

НоваяСтрока.КлючСвязи = МаксКлюч + 1;

СтрокаСерии = Объект.Серии.Добавить();

СтрокаСерии.Серия = СерияСсылка;

СтрокаСерии.Количество = 2;

СтрокаСерии.КлючСвязи = НоваяСтрока.КлючСвязи;

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

Типичные ошибки и их последствия

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

Вторая ошибка — присвоить одинаковый ключ разным строкам товаров. В этом случае серии обоих товаров «смешиваются»: при активации любой из строк пользователь видит объединённый список, а списание при проведении идёт некорректно. Исправление требует перебора документа и переназначения ключей вручную или обработкой.

Типичные ошибки
01
Оставить КлючСвязи = 0 — связанные строки теряются или отображаются у чужого товара
02
Присвоить одинаковый ключ разным товарам — серии и скидки смешиваются между строками
03
Заполнить ключ только в товарах, но не в связанных строках — связь не работает
04
Копировать строки копированием без смены ключа — дублируются связи после вставки
05
Удалить строку товара и оставить «осиротевшие» связанные строки с тем же ключом

Отдельная ситуация — копирование документа целиком. Здесь ключи обычно копируются корректно вместе со строками, и проблем не возникает. А вот при копировании отдельных строк внутри формы типовой код переназначает ключ сам; если вы делаете это программно в обход формы, переназначение — ваша задача.

Как проверить корректность связей в документе

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

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

Контрольные точки

Как проверить результат

Отбор связанных строк в форме
Норма

У каждого товара отображаются только его серии/скидки

Тревожный признак

Одинаковый список у разных строк или пустой список при наличии данных

Значения ключа в табличной части
Норма

Все ключи больше нуля и не повторяются в пределах документа

Тревожный признак

Нулевые значения или дубли

Проведение документа
Норма

Документ проводится без ошибок по сериям и скидкам

Тревожный признак

Ошибки нехватки серий при физически заполненных данных

При загрузке документов из внешних систем удобно генерировать ключ связи как порядковый номер строки товара (1, 2, 3...). Это гарантирует уникальность и упрощает отладку: по номеру ключа сразу видно, к какой строке относятся связанные данные.
ПЗ
Практическое замечание

Частые вопросы о ключе связи в 1С

Ключ связи — это то же самое, что уникальный идентификатор?

Нет. Уникальный идентификатор (GUID) однозначно определяет объект во всей информационной базе и не меняется. Ключ связи — обычное целое число, имеющее смысл только внутри одного документа для сопоставления строк его табличных частей.

Можно ли менять ключ связи в уже проведённом документе?

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

Почему после программной загрузки серии не видны в форме документа?

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

Обязательно ли нумеровать ключи с единицы и по порядку?

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

Что делать с «осиротевшими» строками серий после удаления товара?

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

Используется ли ключ связи в самописных конфигурациях?

Механизм не является встроенной функцией платформы — это соглашение, реализованное прикладным кодом. В собственной конфигурации вы можете добавить реквизит «КлючСвязи» в табличные части и написать обработчики отбора и удаления по аналогии с типовыми решениями.

Итог

Что важно запомнить

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