Почему при выгрузке в DBF из 1С 7.7 реквизиты выгружаются числами и как получить строку

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При переносе данных из информационной базы «1С:Предприятие 7.7» в новые конфигурации на платформе «1С:Предприятие 8» часто используется промежуточный формат файлов DBF с помощью встроенного объекта XBase. Нередко разработчики сталкиваются с неожиданным поведением: текстовые по смыслу поля, такие как ВидНоменклатуры или СтавкаНДС, в результирующем файле DBF заполняются цифрами вместо понятных строковых значений, даже если колонка в DBF создана строкового типа.

Разберем причины такого поведения платформы 7.7 и рассмотрим способы корректной записи текстовых данных в файлы таблиц dBase.

Выясним причину появления цифр в файле DBF

Проанализируем структуру данных платформы «1С:Предприятие 7.7». В типовых конфигурациях реквизит СтавкаНДС (а в некоторых конфигурациях и ВидНоменклатуры) имеет тип Перечисление. Значения перечислений внутри базы данных хранятся как числовые порядковые номера (индексы элементов в структуре метаданных).

Когда мы выполняем прямое присвоение объекта сложного типа свойству объекта XBase:


ТЗ.VidNom = Материал.ВидНоменклатуры;
ТЗ.NDS = Материал.СтавкаНДС;

ДБФ.VidNom = ТЗ.VidNom;
ДБФ.NDS = ТЗ.NDS;

Платформа выполняет неявное приведение типов. В случае с перечислением при попытке записать его напрямую во внешнюю базу DBF платформа передает именно его внутренний числовой код, а не текстовое представление. Попытка же обратиться к свойству .Наименование, по аналогии со справочниками, приводит к ошибке: у объекта типа перечисление отсутствует атрибут Наименование.

Способ 1. Явное строковое приведение через СокрЛП или Строка

Самое быстрое и универсальное решение для получения текстового синонима значения — явное преобразование объекта в строку. В 1С 7.7 для этого применяются функции СокрЛП() или Строка().

Посмотрим на практический пример заполнения таблицы значений и записи в DBF:


// При явном преобразовании в строку перечисление возвратит свое синонимическое представление
ТЗ.VidNom = СокрЛП(Материал.ВидНоменклатуры);
ТЗ.NDS    = СокрЛП(Материал.СтавкаНДС);

// Либо с использованием базовой функции Строка()
ТЗ.VidNom = Строка(Материал.ВидНоменклатуры);
ТЗ.NDS    = Строка(Материал.СтавкаНДС);

ДБФ.VidNom = ТЗ.VidNom;
ДБФ.NDS    = ТЗ.NDS;

Функция СокрЛП() не только преобразует ссылочный тип или перечисление в строку с его представлением, но и убирает лишние ведущие и замыкающие пробелы, что особенно полезно при выгрузке в фиксированные по длине поля DBF.

Способ 2. Получение системного идентификатора перечисления

Если данные выгружаются для автоматической загрузки в «1С:Предприятие 8», строковое представление ставки (например, «18%» или «20%») может потребовать дополнительного парсинга символов процента на стороне приемника. В платформе 1С 7.7 для значений перечислений доступен метод Идентификатор(), возвращающий имя значения из дерева метаданных конфигуратора (например, НДС18, НДС20, БезНДС).

Рассмотрим, как выгрузить системное имя перечисления:


Если ПустоеЗначение(Материал.СтавкаНДС) = 0 Тогда
    ТЗ.NDS = Материал.СтавкаНДС.Идентификатор();
Иначе
    ТЗ.NDS = "";
КонецЕсли;

ДБФ.NDS = ТЗ.NDS;

Использование метода Идентификатор() позволяет в коде загрузки 1С 8 сразу обращаться к аналогичному перечислению через Перечисления.СтавкиНДС[ИмяИдентификатора] без использования громоздких условий сопоставления.

Важные нюансы работы с объектом XBase в 1С 7.7

При организации обмена через DBF обратим внимание на обязательные технические ограничения:

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

Таким образом, явное приведение сложных типов к строке через СокрЛП() или чтение свойства Идентификатор() полностью устраняет проблему передачи числовых индексов в DBF-файлы.

← На главную