При переносе данных из информационной базы «1С:Предприятие 7.7» в новые конфигурации на платформе «1С:Предприятие 8» часто используется промежуточный формат файлов DBF с помощью встроенного объекта XBase. Нередко разработчики сталкиваются с неожиданным поведением: текстовые по смыслу поля, такие как ВидНоменклатуры или СтавкаНДС, в результирующем файле DBF заполняются цифрами вместо понятных строковых значений, даже если колонка в DBF создана строкового типа.
Разберем причины такого поведения платформы 7.7 и рассмотрим способы корректной записи текстовых данных в файлы таблиц dBase.
Проанализируем структуру данных платформы «1С:Предприятие 7.7». В типовых конфигурациях реквизит СтавкаНДС (а в некоторых конфигурациях и ВидНоменклатуры) имеет тип Перечисление. Значения перечислений внутри базы данных хранятся как числовые порядковые номера (индексы элементов в структуре метаданных).
Когда мы выполняем прямое присвоение объекта сложного типа свойству объекта XBase:
ТЗ.VidNom = Материал.ВидНоменклатуры;
ТЗ.NDS = Материал.СтавкаНДС;
ДБФ.VidNom = ТЗ.VidNom;
ДБФ.NDS = ТЗ.NDS;
Платформа выполняет неявное приведение типов. В случае с перечислением при попытке записать его напрямую во внешнюю базу DBF платформа передает именно его внутренний числовой код, а не текстовое представление. Попытка же обратиться к свойству .Наименование, по аналогии со справочниками, приводит к ошибке: у объекта типа перечисление отсутствует атрибут Наименование.
Самое быстрое и универсальное решение для получения текстового синонима значения — явное преобразование объекта в строку. В 1С 7.7 для этого применяются функции СокрЛП() или Строка().
Посмотрим на практический пример заполнения таблицы значений и записи в DBF:
// При явном преобразовании в строку перечисление возвратит свое синонимическое представление
ТЗ.VidNom = СокрЛП(Материал.ВидНоменклатуры);
ТЗ.NDS = СокрЛП(Материал.СтавкаНДС);
// Либо с использованием базовой функции Строка()
ТЗ.VidNom = Строка(Материал.ВидНоменклатуры);
ТЗ.NDS = Строка(Материал.СтавкаНДС);
ДБФ.VidNom = ТЗ.VidNom;
ДБФ.NDS = ТЗ.NDS;
Функция СокрЛП() не только преобразует ссылочный тип или перечисление в строку с его представлением, но и убирает лишние ведущие и замыкающие пробелы, что особенно полезно при выгрузке в фиксированные по длине поля DBF.
Если данные выгружаются для автоматической загрузки в «1С:Предприятие 8», строковое представление ставки (например, «18%» или «20%») может потребовать дополнительного парсинга символов процента на стороне приемника. В платформе 1С 7.7 для значений перечислений доступен метод Идентификатор(), возвращающий имя значения из дерева метаданных конфигуратора (например, НДС18, НДС20, БезНДС).
Рассмотрим, как выгрузить системное имя перечисления:
Если ПустоеЗначение(Материал.СтавкаНДС) = 0 Тогда
ТЗ.NDS = Материал.СтавкаНДС.Идентификатор();
Иначе
ТЗ.NDS = "";
КонецЕсли;
ДБФ.NDS = ТЗ.NDS;
Использование метода Идентификатор() позволяет в коде загрузки 1С 8 сразу обращаться к аналогичному перечислению через Перечисления.СтавкиНДС[ИмяИдентификатора] без использования громоздких условий сопоставления.
При организации обмена через DBF обратим внимание на обязательные технические ограничения:
XBase может создать файл в кодировке DOS (OEM / CP866). Чтобы в 1С 8 кириллические строки не превратились в нечитаемые символы, перед созданием или открытием файла таблицы обязательно зададим кодовую страницу Windows (ANSI / CP1251):
ДБФ = СоздатьОбъект("XBase");
ДБФ.КодоваяСтраница(0); // 0 — кодировка Windows (ANSI), 1 — DOS (OEM)
ВидНоменклатуры содержит 15 символов), платформа автоматически обрежет его, что нарушит последующее автоматическое чтение. Используем лаконичные имена колонок: VidNom, NDS, Artikul."S" или "C" (Character), так и цифровой код типа 2. Для длинных строковых полей всегда указываем точную предельную длину:
ДБФ.ДобавитьПоле("VidNom", "S", 50, 0);
ДБФ.ДобавитьПоле("NDS", "S", 15, 0);
Таким образом, явное приведение сложных типов к строке через СокрЛП() или чтение свойства Идентификатор() полностью устраняет проблему передачи числовых индексов в DBF-файлы.