Как правильно заполнить пустое значение в ПКС по умолчанию при выгрузке данных?

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

При работе с конфигурацией «Конвертация данных 2.0» (КД 2.0) разработчики часто сталкиваются с ситуацией, когда стандартное поле «Значение по умолчанию» в правилах конвертации свойств (ПКС) не срабатывает. Это происходит потому, что система различает техническое отсутствие значения (NULL) и «пустые» значения типов (пустая строка, пустая ссылка или ноль). Если из источника приходит пустая ссылка, механизм по умолчанию может считать её «заполненной» и не подставлять нужное нам значение.

В данной статье мы разберем, почему стандартные методы могут подводить, и рассмотрим по шагам, как программно гарантировать заполнение реквизитов, в том числе в табличных частях.

Разбор проблемы: почему не работает стандартное заполнение

Прежде всего, проанализируем ситуацию. Когда мы указываем в ПКС источник, система при выгрузке пытается получить данные. Если в базе-источнике реквизит не заполнен, он может передаваться как пустая ссылка. Для КД 2.0 это значение, которое нужно доставить в приемник. В итоге в базе-приемнике мы видим пустые строки, хотя ожидали дефолтное значение.

Важное правило: никогда не используйте обработчик После выгрузки в ПКС для изменения передаваемого значения. На этом этапе данные уже подготовлены для записи в XML, и изменение переменной Значение ни на что не повлияет.

Способ 1. Использование обработчика «При выгрузке» в ПКС

Это самый эффективный и рекомендуемый метод. Обработчик При выгрузке выполняется непосредственно перед тем, как данные попадут в файл обмена. Здесь мы можем проверить полученное из источника значение и, если оно нас не устраивает, подменить его.

Рассмотрим ситуацию на примере реквизита табличной части. Допустим, нам нужно заполнить категорию налогообложения, если она пуста:


Если НЕ ЗначениеЗаполнено(ОбъектКоллекции.КатегорияНалогообложения) Тогда
    // Прямое присвоение значения, которое будет выгружено
    Значение = Справочники.КатегорияНалогообложения.НаОбщихОснованиях;
КонецЕсли;

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

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

Способ 2. Обработка на стороне приемника в ПКО «После загрузки»

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

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


Для Каждого СтрокаТЧ Из Объект.Состав Цикл
    Если НЕ ЗначениеЗаполнено(СтрокаТЧ.КатегорияНалогообложения) Тогда
        СтрокаТЧ.КатегорияНалогообложения = Справочники.КатегорияНалогообложения.НаОбщихОснованиях;
    КонецЕсли;
КонецЦикла;

Здесь Объект — это загруженный объект (документ или справочник), а Состав — имя его табличной части в базе-приемнике. Этот метод гарантирует, что даже если из источника пришла «пустота», в приемнике объект будет записан с корректными данными.

Тонкости работы с пустыми ссылками

Проанализируем технический нюанс: передачу пустых ссылок. Иногда система пытается найти объект по пустой ссылке и создает в приемнике «битые» записи. Чтобы этого избежать и заставить систему использовать поиск по умолчанию или логику заполнения, в ПКС Перед выгрузкой можно использовать следующий прием:


Если НЕ ЗначениеЗаполнено(Значение) Тогда 
    Значение = Неопределено; 
КонецЕсли;

Установка значения в Неопределено заставляет КД 2.0 игнорировать выгрузку этого свойства, что может привести к срабатыванию стандартных механизмов заполнения или оставить поле доступным для обработки в событии После загрузки.

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

  1. Используйте ПКС «При выгрузке», если логика заполнения простая и зависит только от данных источника. Это снижает нагрузку на базу-приемник.
  2. Используйте ПКО «После загрузки», если вам нужно обращаться к метаданным или настройкам базы-приемника.
  3. При работе с табличными частями всегда проверяйте наличие данных через ОбъектКоллекции (в источнике) или обходите коллекцию Объект.ИмяТЧ (в приемнике).
  4. Не забывайте проверять типы данных. Если вы присваиваете значение программно, оно должно соответствовать типу реквизита в приемнике, иначе возникнет ошибка при записи объекта.

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

← На главную