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