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

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

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

Причина возникновения ошибки «Поле объекта не обнаружено»

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


Если Не ЗначениеЗаполнено(Источник.Главная.Проживающий) Тогда
    Отказ = Истина;
КонецЕсли;

Платформа сформирует ошибку «Поле объекта не обнаружено (Проживающий)». Выясним причину такого поведения: объект Источник.Главная является коллекцией строк (табличной частью документа), а не отдельной строкой или реквизитом. У самой табличной части нет свойства Проживающий — оно есть только у конкретных элементов этой коллекции.

Способ 1. Проверка строки коллекции в ПКГС (Перед выгрузкой)

Если задача состоит в том, чтобы пропустить выгрузку только тех строк табличной части или регистра, где незаполнено поле Проживающий, разберем решение через Правило конвертации группы свойств (ПКГС).

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

Напишем следующий код в обработчике «Перед выгрузкой» ПКГС:


Если Не ЗначениеЗаполнено(ОбъектКоллекции.Проживающий) Тогда
    Отказ = Истина;
КонецЕсли;

При установке флага Отказ = Истина внутри этого обработчика платформа 1С пропустит только текущую выгружаемую строку, продолжить выгрузку остальных корректных строк документа или набора записей.

Способ 2. Заполнение выгружаемой коллекции через Запрос и ВходящиеДанные

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

  1. В настройках табличной части в ПКГС установим флаг «Получать из входящих данных».
  2. В ПКО документа в обработчике «Перед выгрузкой» напишем код формирования структурированных данных:

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ТабЧасть.Ссылка КАК Ссылка,
    |	ТабЧасть.Проживающий КАК Проживающий
    |ИЗ
    |	Документ.НазваниеДокумента.Главная КАК ТабЧасть
    |ГДЕ
    |	ТабЧасть.Ссылка = &Ссылка
    |	И ТабЧасть.Проживающий <> Значение(Справочник.Проживающие.ПустаяСсылка)";

Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);

РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
    ВходящиеДанные = Новый Структура;
    ВходящиеДанные.Вставить("Главная", РезультатЗапроса.Выгрузить());
КонецЕсли;

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

Способ 3. Очистка движения регистра на стороне приемника

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

В ПКО документа на стороне приемника в событии «Перед записью полученных данных» мы можем очистить строки табличной части или набора записей регистра перед их непосредственным сохранением в базу:


Индекс = Объект.Главная.Количество() - 1;
Пока Индекс >= 0 Цикл
    СтрокаТаблицы = Объект.Главная[Индекс];
    Если Не ЗначениеЗаполнено(СтрокаТаблицы.Проживающий) Тогда
        Объект.Главная.Удалить(СтрокаТаблицы);
    КонецЕсли;
    Индекс = Индекс - 1;
КонецЦикл;

Этот подход гарантирует, что в базу-приемник попадут только корректно заполненные объекты, даже если правила выгрузки базы-источника передали некорректные данные.

← На главную