Перегрузка данных через текстовые файлы — это классическая задача, которая часто встречается в тестовых заданиях и реальной практике при интеграции систем. Особую сложность здесь представляет работа с составными типами данных, такими как Субконто. В отличие от простых строк или чисел, субконто требует не только передачи значения, но и четкого определения его типа в контексте Плана видов характеристик.
Рассмотрим подробнее, как правильно организовать этот процесс, разберем типичные ошибки и проанализируем эффективные методы решения этой задачи.
Когда мы работаем с субконто (например, в табличной части документа «ОперацияБух» или в проводках), мы имеем дело с типом Характеристика.ВидыСубконтоХозрасчетные. Это означает, что в одном и том же поле может храниться ссылка на справочник «Номенклатура», «Контрагенты», «Статьи затрат» и многие другие.
Проанализируем ситуацию: если в текстовом файле у нас записано просто наименование «Основная номенклатурная группа», система 1С не знает автоматически, в каком именно справочнике искать это значение, пока мы не укажем ей на конкретный тип метаданных.
Если задача стоит именно в обмене между двумя базами 1С через текстовый файл (без использования XML), самым надежным способом будет использование функций ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). Выясним причину их эффективности: эти функции сохраняют не только текстовое представление, но и Уникальный Идентификатор (GUID) вместе с полной информацией о типе объекта.
Рассмотрим пример выгрузки ссылки в файл:
ЗначениеДляЗаписи = СтрокаТаблицы.Субконто1; // Это может быть СправочникСсылка.Номенклатура
СтрокаДляФайла = ЗначениеВСтрокуВнутр(ЗначениеДляЗаписи);
// Записываем СтрокаДляФайла в текст...
При загрузке мы восстанавливаем объект одной командой:
// Прочитали строку из файла в переменную СтрокаИзФайла
ЗначениеОбъекта = ЗначениеИзСтрокиВнутр(СтрокаИзФайла);
СтрокаТаблицыДокумента.Субконто1 = ЗначениеОбъекта;
Этот метод гарантирует, что тип данных будет восстановлен корректно, даже если это сложное субконто.
Если формат текстового файла жестко задан (например, «ТипОбъекта|Наименование») и мы не можем использовать внутренние строки 1С, нам придется задействовать объект ОписаниеТипов. Разберем по шагам, как это сделать правильно.
Частая ошибка начинающих разработчиков — попытка управления данными через интерфейсные объекты, используя ЭлементыФормы. Помните: всегда работайте с данными объекта, а не с его визуальным представлением.
Правильный алгоритм загрузки субконто из текстовых данных выглядит так:
ОписаниеТипов для этого имени.Посмотрим на пример кода:
// Допустим, из файла мы получили:
// ИмяТипа = "Справочник.НоменклатурныеГруппы"
// ЗначениеПоиска = "Основная группа"
// 1. Создаем описание типа
НужныйТип = Новый ОписаниеТипов(ИмяТипа);
// 2. Устанавливаем тип для поля субконто (важно для составных типов)
НоваяСтрока.Субконто1 = НужныйТип.ПривестиЗначение(Неопределено);
// 3. Динамически обращаемся к менеджеру справочника и ищем значение
ИмяСправочника = СокрЛП(Сред(ИмяТипа, Найти(ИмяТипа, ".") + 1));
СсылкаНаОбъект = Справочники[ИмяСправочника].НайтиПоНаименованию(ЗначениеПоиска);
// 4. Записываем результат, если нашли
Если Не СсылкаНаОбъект.Пустая() Тогда
НоваяСтрока.Субконто1 = СсылкаНаОбъект;
КонецЕсли;
Для субконто тип значения часто определяется автоматически исходя из настройки ВидСубконто. Рассмотрим ситуацию, когда мы заполняем бухгалтерскую операцию. Мы не можем записать в Субконто1 что попало — тип должен соответствовать тому, что указано в ВидСубконто1.
Проанализируем пример получения типа напрямую из метаданных плана видов характеристик:
ВидСубконтоСсылка = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НайтиПоНаименованию("Номенклатурные группы");
Если Не ВидСубконтоСсылка.Пустая() Тогда
// Получаем описание типов, которое разрешено для данного вида субконто
ДопустимыеТипы = ВидСубконтоСсылка.ТипЗначения;
// Теперь мы знаем, какие типы искать.
// Если мы точно знаем, что это справочник, можем использовать поиск:
НайденнаяСсылка = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию(ЗначениеИзФайла);
// Приводим значение к типу, разрешенному в ПВХ
НоваяСтрока.Субконто1 = ДопустимыеТипы.ПривестиЗначение(НайденнаяСсылка);
КонецЕсли;
Во-первых, избегайте поиска только по наименованию. Это «антипаттерн» в разработке 1С, так как наименования могут дублироваться или содержать невидимые символы (пробелы, переносы). Если вы проектируете обмен, всегда старайтесь передавать УникальныйИдентификатор (GUID). Получить его можно методом Ссылка.УникальныйИдентификатор(), а восстановить ссылку — Справочники.ИмяСправочника.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаИзФайла)).
Во-вторых, при массовой загрузке всегда используйте свойство ОбменДанными.Загрузка = Истина для загружаемого объекта. Это отключит лишние проверки в модулях объекта и значительно ускорит процесс загрузки документа.
В-третьих, если база-источник и база-приемник идентичны, не изобретайте велосипед с текстовыми файлами через НайтиПоНаименованию. Используйте ЗаписатьXML и ПрочитатьXML, даже если формат файла должен оставаться текстовым — вы можете упаковать XML-строку внутрь вашего текстового контейнера. Это самый надежный способ сохранить типизацию данных без потерь.