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