Как реализовать загрузку данных из текстового файла с обработкой субконто в 1С

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

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

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

Проблема составных типов и специфика субконто

Когда мы работаем с субконто (например, в табличной части документа «ОперацияБух» или в проводках), мы имеем дело с типом Характеристика.ВидыСубконтоХозрасчетные. Это означает, что в одном и том же поле может храниться ссылка на справочник «Номенклатура», «Контрагенты», «Статьи затрат» и многие другие.

Проанализируем ситуацию: если в текстовом файле у нас записано просто наименование «Основная номенклатурная группа», система 1С не знает автоматически, в каком именно справочнике искать это значение, пока мы не укажем ей на конкретный тип метаданных.

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

Если задача стоит именно в обмене между двумя базами 1С через текстовый файл (без использования XML), самым надежным способом будет использование функций ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). Выясним причину их эффективности: эти функции сохраняют не только текстовое представление, но и Уникальный Идентификатор (GUID) вместе с полной информацией о типе объекта.

Рассмотрим пример выгрузки ссылки в файл:


ЗначениеДляЗаписи = СтрокаТаблицы.Субконто1; // Это может быть СправочникСсылка.Номенклатура
СтрокаДляФайла = ЗначениеВСтрокуВнутр(ЗначениеДляЗаписи);
// Записываем СтрокаДляФайла в текст...

При загрузке мы восстанавливаем объект одной командой:


// Прочитали строку из файла в переменную СтрокаИзФайла
ЗначениеОбъекта = ЗначениеИзСтрокиВнутр(СтрокаИзФайла);
СтрокаТаблицыДокумента.Субконто1 = ЗначениеОбъекта;

Этот метод гарантирует, что тип данных будет восстановлен корректно, даже если это сложное субконто.

Метод 2. Ручное определение типа через ОписаниеТипов

Если формат текстового файла жестко задан (например, «ТипОбъекта|Наименование») и мы не можем использовать внутренние строки 1С, нам придется задействовать объект ОписаниеТипов. Разберем по шагам, как это сделать правильно.

Частая ошибка начинающих разработчиков — попытка управления данными через интерфейсные объекты, используя ЭлементыФормы. Помните: всегда работайте с данными объекта, а не с его визуальным представлением.

Правильный алгоритм загрузки субконто из текстовых данных выглядит так:

  1. Определяем имя метаданных (например, "Справочник.НоменклатурныеГруппы").
  2. Создаем объект ОписаниеТипов для этого имени.
  3. Приводим пустое значение к нужному типу, чтобы "подготовить" поле.
  4. Ищем объект в базе (лучше по GUID, но если его нет — по наименованию).

Посмотрим на пример кода:


// Допустим, из файла мы получили: 
// ИмяТипа = "Справочник.НоменклатурныеГруппы"
// ЗначениеПоиска = "Основная группа"

// 1. Создаем описание типа
НужныйТип = Новый ОписаниеТипов(ИмяТипа);

// 2. Устанавливаем тип для поля субконто (важно для составных типов)
НоваяСтрока.Субконто1 = НужныйТип.ПривестиЗначение(Неопределено);

// 3. Динамически обращаемся к менеджеру справочника и ищем значение
ИмяСправочника = СокрЛП(Сред(ИмяТипа, Найти(ИмяТипа, ".") + 1));
СсылкаНаОбъект = Справочники[ИмяСправочника].НайтиПоНаименованию(ЗначениеПоиска);

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

Метод 3. Работа через План Видов Характеристик (ПВХ)

Для субконто тип значения часто определяется автоматически исходя из настройки ВидСубконто. Рассмотрим ситуацию, когда мы заполняем бухгалтерскую операцию. Мы не можем записать в Субконто1 что попало — тип должен соответствовать тому, что указано в ВидСубконто1.

Проанализируем пример получения типа напрямую из метаданных плана видов характеристик:


ВидСубконтоСсылка = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НайтиПоНаименованию("Номенклатурные группы");
Если Не ВидСубконтоСсылка.Пустая() Тогда
    // Получаем описание типов, которое разрешено для данного вида субконто
    ДопустимыеТипы = ВидСубконтоСсылка.ТипЗначения;
    
    // Теперь мы знаем, какие типы искать. 
    // Если мы точно знаем, что это справочник, можем использовать поиск:
    НайденнаяСсылка = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию(ЗначениеИзФайла);
    
    // Приводим значение к типу, разрешенному в ПВХ
    НоваяСтрока.Субконто1 = ДопустимыеТипы.ПривестиЗначение(НайденнаяСсылка);
КонецЕсли;

Важные рекомендации при работе с текстовым обменом

Во-первых, избегайте поиска только по наименованию. Это «антипаттерн» в разработке 1С, так как наименования могут дублироваться или содержать невидимые символы (пробелы, переносы). Если вы проектируете обмен, всегда старайтесь передавать УникальныйИдентификатор (GUID). Получить его можно методом Ссылка.УникальныйИдентификатор(), а восстановить ссылку — Справочники.ИмяСправочника.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаИзФайла)).

Во-вторых, при массовой загрузке всегда используйте свойство ОбменДанными.Загрузка = Истина для загружаемого объекта. Это отключит лишние проверки в модулях объекта и значительно ускорит процесс загрузки документа.

В-третьих, если база-источник и база-приемник идентичны, не изобретайте велосипед с текстовыми файлами через НайтиПоНаименованию. Используйте ЗаписатьXML и ПрочитатьXML, даже если формат файла должен оставаться текстовым — вы можете упаковать XML-строку внутрь вашего текстового контейнера. Это самый надежный способ сохранить типизацию данных без потерь.

← На главную