При переносе данных из устаревших конфигураций (например, «Управление производственным предприятием», редакция 1.2 / 1.3) в современные решения на управляемых формах (такие как «Бухгалтерия предприятия», редакция 3.0) разработчики часто сталкиваются с нестыковкой типов данных. Один из типичных примеров — реквизит ДляСписанияНДСиспользоватьСчетИАналитикуУчетаЗатрат в документе ТребованиеНакладная (в БП 3.0 данный документ может называться РасходМатериалов).
В этой статье мы подробно разберем, почему разработчики фирмы «1С» изменили тип реквизита с удобного Булево на Число, в чем заключается глубокий архитектурный смысл этого решения, а также рассмотрим практические способы настройки правил конвертации свойств (ПКС) в КД 2.1 для корректного переноса данных без ошибок преобразования типов.
На первый взгляд, замена логического типа на числовой кажется избыточной и нелогичной. В модуле объекта БП 3.0 можно встретить присвоение вида ДляСписанияНДСИспользоватьСчетИАналитикуУчетаЗатрат = Ложь;, в то время как в модуле формы того же документа используется числовое выражение: Объект.ДляСписанияНДСиспользоватьСчетИАналитикуУчетаЗатрат = 1;. Давайте разберемся, зачем это было сделано.
Дело в особенностях работы платформы «1С:Предприятие 8» с элементами интерфейса, а именно с флажками (чекбоксами). Элемент управления «Флажок» на форме может функционировать в двух режимах:
Истина), либо снят (Ложь). Этот режим жестко привязан к типу данных Булево.0 — флажок полностью снят;1 — флажок установлен;2 — флажок находится в третьем (смешанном) состоянии.В «1С:Бухгалтерии предприятия 3.0» реализована сложная бизнес-логика распределения расходов. Счета учета затрат и параметры списания НДС могут указываться как в шапке документа (для всех строк сразу), так и детально в табличной части (индивидуально для каждой номенклатурной позиции).
Когда пользователь открывает форму документа, система анализирует строки табличной части:
1 (установлен).0 (снят).2. Пользователь видит серый флажок и сразу понимает, что в документе используется смешанная аналитика списания НДС.Если бы разработчики оставили тип реквизита логическим (Булево), база данных физически не смогла бы сохранить это третье состояние, что привело бы к невозможности корректного отображения сводной информации в интерфейсе управляемой формы.
При переносе данных из УПП, где данный реквизит является строго булевым, нам нужно гарантировать, что в базу-приемник БП 3.0 запишется корректное числовое значение. Если передавать строковые литералы вроде "1" или "0", это может привести к неявным ошибкам приведения типов на стороне базы данных или при проведении документа программными механизмами.
Ниже мы рассмотрим три способа реализации этой конвертации в правилах выгрузки свойств (ПКС).
Платформа «1С:Предприятие» имеет встроенный механизм явного приведения типов. Функция Число() при передаче в нее булевого значения Истина всегда возвращает 1, а при передаче Ложь возвращает 0. Это самый быстродействующий и лаконичный вариант.
В правиле конвертации свойства (ПКС) для реквизита ДляСписанияНДСиспользоватьСчетИАналитикуУчетаЗатрат в обработчике «Перед выгрузкой» пропишем следующий код:
// Приводим булево значение источника к числу для приемника
Значение = Число(Источник.ДляСписанияНДСиспользоватьСчетИАналитикуУчетаЗатрат);
Если вы хотите сделать код максимально наглядным и задокументировать логику преобразования непосредственно в тексте обработчика, можно применить сокращенную форму условного оператора (тернарный оператор):
// Явное определение числового значения в зависимости от булева источника
Значение = ?(Источник.ДляСписанияНДСиспользоватьСчетИАналитикуУчетаЗатрат = Истина, 1, 0);
Этот вариант работает аналогично первому, однако он более понятен для тех, кто только начинает изучать программирование в среде «1С» и правила конвертации данных.
Для любителей классического структурированного кода можно использовать полное ветвление. Этот способ исключает любые неоднозначности при выгрузке пустых или неопределенных значений источника:
Если Источник.ДляСписанияНДСиспользоватьСчетИАналитикуУчетаЗатрат = Истина Тогда
Значение = 1;
Иначе
Значение = 0;
КонецЕсли;
Важное примечание: Обратите внимание, что числовые значения 1 и 0 присваиваются переменной Значение без кавычек. Если вы укажете Значение = "1";, XML-выгрузка запишет тип свойства как строку, что заставит конфигурацию-приемник тратить дополнительные ресурсы на преобразование типов при загрузке или приведет к ошибкам в строгих транзакционных механизмах БП 3.0.
Мы проанализировали неочевидное поведение платформы «1С» и выяснили технические причины использования числового типа для хранения логических флагов в конфигурации «Бухгалтерия предприятия 3.0». Применяя любой из предложенных вариантов преобразования типов в правилах конвертации данных, вы обеспечите стабильный и безошибочный перенос документов из УПП в БП 3.0.