Как получить реквизит из документа-основания через один уровень в 1С 7.7

Программист 1С v7.7
← На главную

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

Принцип обращения через цепочку подчиненности

Структура подчиненности документов выглядит следующим образом:

  1. Документ верхнего уровня (содержит верный реквизит Склад)
  2. Промежуточный документ (ссылается на документ верхнего уровня через реквизит ДокОснование)
  3. Текущий документ (ссылается на промежуточный документ через реквизит ДокОснование)

Для обращения к реквизиту исходного документа в 1С 7.7 используется последовательный переход по реквизитам основания: ДокОснование.ДокОснование.Склад.

Безопасное получение реквизита с проверками

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

Разберем безопасный алгоритм получения реквизита:


Перем НужныйСклад;

НужныйСклад = ПолучитьПустоеЗначение("Справочник.Склады");

Если ДокОснование.Выбран() = 1 Тогда
    ПромежДок = ДокОснование;
    Если ПромежДок.ДокОснование.Выбран() = 1 Тогда
        НужныйСклад = ПромежДок.ДокОснование.Склад;
    КонецЕсли;
КонецЕсли;

Если НужныйСклад.Выбран() = 0 Тогда
    Сообщить("Не удалось определить склад из документа-основания!");
    Возврат;
КонецЕсли;

Корректировка процедуры обновления справочника

Рассмотрим итоговый вариант процедуры УбратьИзМинОст(). Помимо безопасного обращения к складу, учтем следующие важные технические нюансы:

  1. Проверка заполнения номенклатуры: при обходе строк табличной части необходимо проверять, выбрана ли Номенклатура, чтобы не передавать пустое значение в метод ИспользоватьВладельца().
  2. Лишние вызовы Записать(): при создании нового элемента справочника метод Записать() достаточно вызвать один раз — после установки всех реквизитов (включая изменение реквизита Набор2).
  3. Установка владельца: при вызове метода Спр.ИспользоватьВладельца(Номенклатура) перед созданием нового элемента методом Спр.Новый() владелец подставляется автоматически, поэтому явное присвоение Спр.Владелец = Номенклатура не требуется.

С учетом всех улучшений и проверок код процедуры принимает следующий вид:


Процедура УбратьИзМинОст()
    Перем НужныйСклад;
    
    // Получаем склад из документа-основания через один уровень
    Если ДокОснование.Выбран() = 1 Тогда
        Если ДокОснование.ДокОснование.Выбран() = 1 Тогда
            НужныйСклад = ДокОснование.ДокОснование.Склад;
        КонецЕсли;
    КонецЕсли;
    
    Если ПустоеЗначение(НужныйСклад) = 1 Тогда
        Сообщить("Сначала надо выбрать документ-основание с указанным складом!");
        Возврат;
    ИлиЕсли НужныйСклад.Выбран() = 0 Тогда
        Сообщить("Склад в документе-основании не выбран!");
        Возврат;
    КонецЕсли;

    Спр = СоздатьОбъект("Справочник.СписокМинимальныхОстатков");
    
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
        Если Номенклатура.Выбран() = 0 Тогда
            Продолжить;
        КонецЕсли;
        
        Спр.ИспользоватьВладельца(Номенклатура);
        
        Если Спр.НайтиПоРеквизиту("Склад", НужныйСклад, 0) = 0 Тогда
            Спр.Новый();
            Спр.Склад = НужныйСклад;
        КонецЕсли;
        
        Спр.Набор2 = Спр.Набор2 - Количество;
        Спр.Записать();
    КонецЦикла;
КонецПроцедуры

Обратите внимание: для корректной работы метода НайтиПоРеквизиту() у реквизита Склад в справочнике СписокМинимальныхОстатков в Конфигураторе должен быть установлен признак «Сортировка» или «Отбор по реквизиту».

← На главную