Почему регистр сведений не отображается в движениях документа и как правильно записывать движения?

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

При разработке конфигураций на платформе 1С:Предприятие часто возникают вопросы при связке документов с регистрами сведений. Рассмотрим основные этапы настройки и разберем распространенные ошибки, из-за которых регистр не «видит» документ или возникают ошибки записи.

Настройка подчинения регистратора

Если вы хотите, чтобы документ делал движения по регистру сведений, первое, что необходимо проверить — свойство Режим записи самого регистра. В конфигураторе перейдите в свойства регистра МаршрутныеЛисты. Найдите свойство РежимЗаписи и установите значение Подчинение регистратору. Без этой настройки платформа не будет считать регистр зависимым от документа, и он не появится на вкладке «Движения».

После установки этого свойства в регистре автоматически появятся два системных реквизита: Регистратор и НомерСтроки. Они служат фундаментом для связи данных.

Понимание работы с набором записей

Многие разработчики совершают ошибку, пытаясь вручную управлять полем НомерСтроки или не понимая, как работает НаборЗаписей. Давайте проанализируем правильный алгоритм формирования движений в процедуре ОбработкаПроведения.

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

Разберем пример корректной процедуры проведения:


Процедура ОбработкаПроведения(Отказ, Режим)
    // 1. Создаем набор записей
    НаборЗаписей = РегистрыСведений.МаршрутныеЛисты.СоздатьНаборЗаписей();
    
    // 2. Устанавливаем отбор по конкретному документу (регистратору)
    НаборЗаписей.Отбор.Регистратор.Установить(Ссылка);
    
    // 3. Добавляем новые записи в цикле
    Для Каждого Стр Из СписокСкладов Цикл
        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.Регистратор = Ссылка;
        НоваяЗапись.Период = Ссылка.Дата;
        НоваяЗапись.Маршрут = Ссылка.Маршрут;
        НоваяЗапись.КодСетки = Стр.КодСклада;
        НоваяЗапись.Магазин = Стр.Склад;
    КонецЦикла;
    
    // 4. Записываем набор
    НаборЗаписей.Записать();
КонецПроцедуры

Почему возникает ошибка «Запись с такими ключевыми полями уже существует»?

Эта ошибка — классическая проблема при работе с подчиненными регистрами. Платформа 1С формирует уникальный ключ записи на основе измерений регистра, периода и регистратора. Если вы пытаетесь добавить несколько строк, которые по составу измерений (например, Маршрут + КодСетки) идентичны, система блокирует запись.

Важные выводы:

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

Советы по отладке

Если вы не видите поля НомерСтроки в списке движений при просмотре документа, помните, что стандартная форма списка не всегда отображает все служебные поля. Вы можете открыть конфигуратор, найти форму списка набора записей и вывести этот реквизит на форму, чтобы убедиться, что он заполняется платформой корректно при выполнении метода НаборЗаписей.Записать().

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

← На главную