Как правильно перенести булево свойство в числовой реквизит при конвертации данных из УПП в БП 3.0?

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

При переносе данных из устаревших конфигураций (например, «Управление производственным предприятием», редакция 1.2 / 1.3) в современные решения на управляемых формах (такие как «Бухгалтерия предприятия», редакция 3.0) разработчики часто сталкиваются с нестыковкой типов данных. Один из типичных примеров — реквизит ДляСписанияНДСиспользоватьСчетИАналитикуУчетаЗатрат в документе ТребованиеНакладная (в БП 3.0 данный документ может называться РасходМатериалов).

В этой статье мы подробно разберем, почему разработчики фирмы «1С» изменили тип реквизита с удобного Булево на Число, в чем заключается глубокий архитектурный смысл этого решения, а также рассмотрим практические способы настройки правил конвертации свойств (ПКС) в КД 2.1 для корректного переноса данных без ошибок преобразования типов.

В чем логика разработчиков: почему «Булево» заменили на «Число»?

На первый взгляд, замена логического типа на числовой кажется избыточной и нелогичной. В модуле объекта БП 3.0 можно встретить присвоение вида ДляСписанияНДСИспользоватьСчетИАналитикуУчетаЗатрат = Ложь;, в то время как в модуле формы того же документа используется числовое выражение: Объект.ДляСписанияНДСиспользоватьСчетИАналитикуУчетаЗатрат = 1;. Давайте разберемся, зачем это было сделано.

Дело в особенностях работы платформы «1С:Предприятие 8» с элементами интерфейса, а именно с флажками (чекбоксами). Элемент управления «Флажок» на форме может функционировать в двух режимах:

  1. Два состояния — флажок либо установлен (Истина), либо снят (Ложь). Этот режим жестко привязан к типу данных Булево.
  2. Три состояния — флажок может быть установлен, снят или находиться в так называемом третьем (неопределенном или смешанном) состоянии. На форме такое состояние визуализируется как затененный («серый») флажок с галочкой. Этот режим работы элемента управления платформы поддерживается только для числового типа данных. При этом задействуются три фиксированных значения:
    • 0 — флажок полностью снят;
    • 1 — флажок установлен;
    • 2 — флажок находится в третьем (смешанном) состоянии.

В «1С:Бухгалтерии предприятия 3.0» реализована сложная бизнес-логика распределения расходов. Счета учета затрат и параметры списания НДС могут указываться как в шапке документа (для всех строк сразу), так и детально в табличной части (индивидуально для каждой номенклатурной позиции).

Когда пользователь открывает форму документа, система анализирует строки табличной части:

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

Решение проблемы при конвертации данных (КД 2.1)

При переносе данных из УПП, где данный реквизит является строго булевым, нам нужно гарантировать, что в базу-приемник БП 3.0 запишется корректное числовое значение. Если передавать строковые литералы вроде "1" или "0", это может привести к неявным ошибкам приведения типов на стороне базы данных или при проведении документа программными механизмами.

Ниже мы рассмотрим три способа реализации этой конвертации в правилах выгрузки свойств (ПКС).

Вариант 1. Использование встроенной функции приведения типов (Рекомендуемый)

Платформа «1С:Предприятие» имеет встроенный механизм явного приведения типов. Функция Число() при передаче в нее булевого значения Истина всегда возвращает 1, а при передаче Ложь возвращает 0. Это самый быстродействующий и лаконичный вариант.

В правиле конвертации свойства (ПКС) для реквизита ДляСписанияНДСиспользоватьСчетИАналитикуУчетаЗатрат в обработчике «Перед выгрузкой» пропишем следующий код:


// Приводим булево значение источника к числу для приемника
Значение = Число(Источник.ДляСписанияНДСиспользоватьСчетИАналитикуУчетаЗатрат);

Вариант 2. Использование тернарного оператора

Если вы хотите сделать код максимально наглядным и задокументировать логику преобразования непосредственно в тексте обработчика, можно применить сокращенную форму условного оператора (тернарный оператор):


// Явное определение числового значения в зависимости от булева источника
Значение = ?(Источник.ДляСписанияНДСиспользоватьСчетИАналитикуУчетаЗатрат = Истина, 1, 0);

Этот вариант работает аналогично первому, однако он более понятен для тех, кто только начинает изучать программирование в среде «1С» и правила конвертации данных.

Вариант 3. Полная условная конструкция «Если ... Тогда»

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


Если Источник.ДляСписанияНДСиспользоватьСчетИАналитикуУчетаЗатрат = Истина Тогда 
    Значение = 1;
Иначе
    Значение = 0;
КонецЕсли;

Важное примечание: Обратите внимание, что числовые значения 1 и 0 присваиваются переменной Значение без кавычек. Если вы укажете Значение = "1";, XML-выгрузка запишет тип свойства как строку, что заставит конфигурацию-приемник тратить дополнительные ресурсы на преобразование типов при загрузке или приведет к ошибкам в строгих транзакционных механизмах БП 3.0.

Резюме

Мы проанализировали неочевидное поведение платформы «1С» и выяснили технические причины использования числового типа для хранения логических флагов в конфигурации «Бухгалтерия предприятия 3.0». Применяя любой из предложенных вариантов преобразования типов в правилах конвертации данных, вы обеспечите стабильный и безошибочный перенос документов из УПП в БП 3.0.

← На главную