При настройке обмена данными через конфигурацию Конвертация данных 2.1 разработчики часто сталкиваются с ситуацией, когда в базе-источнике есть документы или регистры сведений, содержащие строки с незаполненными аналитическими реквизитами (например, не указан жилец или проживающий). Перенос таких пустых значений в базу-приемник может вызывать ошибки записи или нарушать целостность учета. Рассмотрим, почему возникают ошибки при попытке проверить заполненность реквизитов и как правильно отфильтровать ненужные строки.
Проанализируем типичную ошибку, с которой сталкиваются начинающие специалисты при попытке написать проверку в обработчике правил выгрузки. Если попытаться обратиться к полю табличной части напрямую через источник:
Если Не ЗначениеЗаполнено(Источник.Главная.Проживающий) Тогда
Отказ = Истина;
КонецЕсли;
Платформа сформирует ошибку «Поле объекта не обнаружено (Проживающий)». Выясним причину такого поведения: объект Источник.Главная является коллекцией строк (табличной частью документа), а не отдельной строкой или реквизитом. У самой табличной части нет свойства Проживающий — оно есть только у конкретных элементов этой коллекции.
Если задача состоит в том, чтобы пропустить выгрузку только тех строк табличной части или регистра, где незаполнено поле Проживающий, разберем решение через Правило конвертации группы свойств (ПКГС).
В обработчике «Перед выгрузкой» для группы свойств (которая отвечает за выгрузку табличной части или набора движений) доступна локальная переменная ОбъектКоллекции. Она содержит ссылку на текущую обрабатываемую строку.
Напишем следующий код в обработчике «Перед выгрузкой» ПКГС:
Если Не ЗначениеЗаполнено(ОбъектКоллекции.Проживающий) Тогда
Отказ = Истина;
КонецЕсли;
При установке флага Отказ = Истина внутри этого обработчика платформа 1С пропустит только текущую выгружаемую строку, продолжить выгрузку остальных корректных строк документа или набора записей.
Рассмотрим альтернативный вариант, когда фильтрацию необходимо выполнить до начала итерации по строкам. В этом случае в Правиле конвертации объектов (ПКО) документа в обработчике «Перед выгрузкой» мы можем сформировать выборку заполненных строк с помощью запроса и передать их в коллекцию выгрузки.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТабЧасть.Ссылка КАК Ссылка,
| ТабЧасть.Проживающий КАК Проживающий
|ИЗ
| Документ.НазваниеДокумента.Главная КАК ТабЧасть
|ГДЕ
| ТабЧасть.Ссылка = &Ссылка
| И ТабЧасть.Проживающий <> Значение(Справочник.Проживающие.ПустаяСсылка)";
Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("Главная", РезультатЗапроса.Выгрузить());
КонецЕсли;
Важное примечание: данный способ с использованием запроса работает только для документов, уже записанных в базу данных. Если выгрузка происходит из оперативной памяти, следует использовать обход коллекции или переопределение параметра КоллекцияОбъектов.
Посмотрим на ситуацию со стороны базы-приемника. Если движения регистра сведений передаются вместе с документом, важно следить за тем, чтобы неперенесенные строки табличной части не привели к расхождению с движениями регистра.
В ПКО документа на стороне приемника в событии «Перед записью полученных данных» мы можем очистить строки табличной части или набора записей регистра перед их непосредственным сохранением в базу:
Индекс = Объект.Главная.Количество() - 1;
Пока Индекс >= 0 Цикл
СтрокаТаблицы = Объект.Главная[Индекс];
Если Не ЗначениеЗаполнено(СтрокаТаблицы.Проживающий) Тогда
Объект.Главная.Удалить(СтрокаТаблицы);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикл;
Этот подход гарантирует, что в базу-приемник попадут только корректно заполненные объекты, даже если правила выгрузки базы-источника передали некорректные данные.