Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
20 мая 2024, 15:10

Загрузка и выгрузка из текстового документа. Выгрузка дополнительных реквизитов (Субконто)

Автор Никита Курилов, 10 окт 2023, 23:36

0 Пользователей и 1 гость просматривают эту тему.

Никита Курилов

Здравствуйте! Дали тестовое задание на создание внешней обработки на выгрузку и загрузку любого документа в конфигурации в текстовый файл. Формат выгрузки нужно реализовать самому, пользоваться функциями "ЗначениеВСтрокуВнутр()" и "УникальныйИдентификатор" нельзя. Нельзя делать выгрузку в форматах XML и JSON. Обработка должна быть выполнена в бухгалтерии.
Необходимо выгружать всю необходимую информацию, чтобы при загрузке создавалась копия исходного документа. У меня получилось выгрузить все реквизиты документа и все реквизиты табличных частей, за исключением одного, "Субконто". Насколько я понял, это дополнительный реквизит. На форме указано, что его тип - "Характеристика.ВидыСубконтаХозрасчетные", но при проведении обработки он возвращает тип "Перечисление.ЭлементыЗатрат", а значение "Основная Номенклатурная Группа". Подскажите, как такой реквизит надо загружать и как его заполнить в последствии?

Код для выгрузки реквизитов в файл:

&НаСервере
Процедура ВыгрузитьОбъектНаСервере()     
    Если Не ЗначениеЗаполнено(ВыбФайл) Тогда
        СообщениеТест = Новый СообщениеПользователю;
        СообщениеТест.Текст = "Поле ""Файл"" не заполнено";
        СообщениеТест.Поле = "Файл";
        СообщениеТест.Сообщить();
        Возврат;
    КонецЕсли;
    Если Не ЗначениеЗаполнено(Документ) Тогда
        СообщениеТест = Новый СообщениеПользователю;
        СообщениеТест.Текст = "Поле ""Документ"" не заполнено";
        СообщениеТест.Поле = "Документ";
        СообщениеТест.Сообщить();
        Возврат;
    КонецЕсли;
    Текст = Новый ТекстовыйДокумент;   
    СтрокаИмяИДата = Документ.Метаданные().Имя + ";" + Документ.Дата;
    Текст.ДобавитьСтроку(СтрокаИмяИДата);   
    Для каждого Реквизит Из Документ.Метаданные().Реквизиты Цикл
        Если Не Реквизит.Имя = "Номер" Тогда
            ТипРеквизита = ОпределениеТипаРеквизита(Реквизит);
            СтрокаТекст = "" + ТипРеквизита + ";" + Реквизит.Имя + ";" + Документ[Реквизит.Имя];
            Текст.ДобавитьСтроку(СтрокаТекст);
        КонецЕсли;
    КонецЦикла;
    Текст.ДобавитьСтроку("ТабличныеЧастиДокумента");
    Для каждого ТабличнаяЧасть Из Документ.Метаданные().ТабличныеЧасти Цикл
        ИмяТабЧасти = Документ[ТабличнаяЧасть.Имя];
        Текст.ДобавитьСтроку("ТабличнаяЧасть;" + ИмяТабЧасти);
        Таблица = ИмяТабЧасти.Выгрузить();
        СтрокаНомер = 0;
        Для каждого Строка из Таблица Цикл
            Для каждого Реквизит из ТабличнаяЧасть.Реквизиты Цикл
                ТипРеквизита = ОпределениеТипаРеквизита(Реквизит);
                СтрокаТекст = "" + ТипРеквизита + ";" + Реквизит.Имя + ";" + ИмяТабЧасти[СтрокаНомер][Реквизит.Имя] + ";" + СтрокаНомер;
                Текст.ДобавитьСтроку(СтрокаТекст);
            КонецЦикла;
            СтрокаНомер = СтрокаНомер + 1;
        КонецЦикла;
    КонецЦикла;
    Текст.Записать(ВыбФайл);
    Сообщить("Реквизиты документа сохранены");
КонецПроцедуры

&НаСервере
Функция ОпределениеТипаРеквизита(Реквизит)
    ТипыРеквизита = Реквизит.Тип.Типы();
    Для каждого ТипР из ТипыРеквизита Цикл
        Если Метаданные.НайтиПоТипу(ТипР) <> Неопределено Тогда
            ТипРеквизита = Метаданные.НайтиПоТипу(ТипР).ПолноеИмя();
        Иначе
            ТипРеквизита = Реквизит.Тип;
        КонецЕсли;
    КонецЦикла;
    Возврат(ТипРеквизита);
КонецФункции

Код для загрузки документа:

&НаСервере
Процедура ЗагрузитьОбъектНаСервере()
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать(ВыбФайл);
   
    МассивИМениИДаты = СтрРазделить(Текст.ПолучитьСтроку(1), ";");
    ИмяДокумента = МассивИмениИДаты[0];
    ДатаДокумента = Дата(МассивИмениИДаты[1]);
    НовыйДокумент = Документы[ИмяДокумента].СоздатьДокумент();
    НовыйДокумент.Дата = ДатаДокумента;
    Для НомерСтроки = 2 По Текст.КоличествоСтрок() Цикл
        ТекСтрока = Текст.ПолучитьСтроку(НомерСтроки);
        Если ТекСтрока = "ТабличныеЧастиДокумента" Тогда
            НомерТабличныхЧастей = НомерСтроки;
            Прервать;
        КонецЕсли;
        МассивСлов = СтрРазделить(ТекСтрока, ";");
        Если МассивСлов.Количество() < 3 Тогда
            Продолжить;
        КонецЕсли;
        МассивПараметрыРеквизита = ПоискРеквизита(МассивСлов);
        СтрукутураПараметрыРеквизита = МассивПараметрыРеквизита[0];
        РеквизитНазвание = СтрукутураПараметрыРеквизита.РеквизитНазвание;
        РеквизитЗначение = СтрукутураПараметрыРеквизита.РеквизитЗначение;
        НовыйДокумент[РеквизитНазвание] = РеквизитЗначение;
    КонецЦикла;
   
    СтрокаНомерТот = -1;
    Для НомерСтроки = НомерТабличныхЧастей По Текст.КоличествоСтрок() Цикл
        ТекСтрока = Текст.ПолучитьСтроку(НомерСтроки);
        МассивСлов = СтрРазделить(ТекСтрока, ";");
        Если МассивСлов[0] = "ТабличнаяЧасть" Тогда
            МассивИмени = СтрРазделить(МассивСлов[1], ".");
            ИмяТаблицы = МассивИмени[МассивИмени.Количество() - 1];
            //ИскомаяТаблица = НовыйДокумент.Метаданные().ТабличныеЧасти[ИмяТаблицы];
            ИскомаяТаблица = НовыйДокумент[ИмяТаблицы];
            Продолжить;
        КонецЕсли;
        МассивСловПроверка = СтрРазделить(ТекСтрока, ";", Ложь);
        Если МассивСловПроверка.Количество() < 4 Тогда
            Продолжить;
        КонецЕсли;
        МассивПараметрыРеквизита = ПоискРеквизита(МассивСлов);
        СтрукутураПараметрыРеквизита = МассивПараметрыРеквизита[0];
        РеквизитНазвание = СтрукутураПараметрыРеквизита.РеквизитНазвание;
        РеквизитЗначение = СтрукутураПараметрыРеквизита.РеквизитЗначение;
        СтрокаНомерЭтот = Число(МассивСлов[3]);
        Если СтрокаНомерЭтот <> СтрокаНомерТот Тогда
            НоваяСтрока = ИскомаяТаблица.Добавить();       
        КонецЕсли;
        СтрокаНомерТот = СтрокаНомерЭтот;
        НоваяСтрока[РеквизитНазвание] = РеквизитЗначение;
        //ИскомаяТаблица[СтрокаНомер][РеквизитНазвание] = РеквизитЗначение;   
    КонецЦикла;
    НовыйДокумент.Записать();
КонецПроцедуры

&НаСервере
Функция ПоискРеквизита(МассивСлов)   
    РеквизитНазвание = МассивСлов[1];
    Если       МассивСлов[0] = "Число" Тогда
        РеквизитЗначение = Число(СтрЗаменить(МассивСлов[2]," ",""));
    ИначеЕсли МассивСлов[0] = "Строка" Тогда
        РеквизитЗначение = Строка(МассивСлов[2]);
    ИначеЕсли МассивСлов[0] = "Дата" Тогда
        РеквизитЗначение = Дата(МассивСлов[2]);
    ИначеЕсли МассивСлов[0] = "Булево" Тогда
        Если МассивСлов[2] = "Да" Тогда
            РеквизитЗначение = Истина;
        Иначе
            РеквизитЗначение = Ложь;
        КонецЕсли;
    ИначеЕсли МассивСлов[1] = "Субконто" Тогда
        //ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ЭлементыЗатрат
        МассивСубконто = СтрРазделить(МассивСлов[0],".");
        РеквизитЗначение = ПредопределенноеЗначение(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные[МассивСубконто[1]]);
    Иначе
        ИскомыйОбъект = Метаданные.НайтиПоПолномуИмени(МассивСлов[0]);
        Если Метаданные.Справочники.Содержит(ИскомыйОбъект) Тогда
            РеквизитЗначение = Справочники[ИскомыйОбъект.Имя].НайтиПоНаименованию(МассивСлов[2]);
        ИначеЕсли Метаданные.Документы.Содержит(ИскомыйОбъект) Тогда
            ИскомыйДокумент = Документы[ИскомыйОбъект.Имя];
            МассивПервый = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(МассивСлов[2], " от "); //отрезаю дату
            МассивВторой = СтрРазделить(МассивПервый[0], " "); //отрезаю все остальное
            ИскомыйНомер = МассивВторой[МассивВторой.Количество() - 1]; //это и есть номер(по идее)
            ИскомаяДата = Дата(МассивПервый[1]);
            РеквизитЗначение = ИскомыйДокумент.НайтиПоНомеру(ИскомыйНомер, ИскомаяДата);
        ИначеЕсли Метаданные.Перечисления.Содержит(ИскомыйОбъект) Тогда
            РеквизитЗначение = Перечисления[ИскомыйОбъект.Имя][СтрЗаменить(МассивСлов[2]," ","")];
        ИначеЕсли Метаданные.ПланыСчетов.Содержит(ИскомыйОбъект) Тогда
            РеквизитЗначение = ПланыСчетов[ИскомыйОбъект.Имя].НайтиПоНаименованию(МассивСлов[2]);
        КонецЕсли;
    КонецЕсли;
    МассивПараметрыРеквизита = Новый Массив;
    СтруктураПараметрыРеквизита = Новый Структура;
    СтруктураПараметрыРеквизита.Вставить("РеквизитНазвание", РеквизитНазвание);
    СтруктураПараметрыРеквизита.Вставить("РеквизитЗначение", РеквизитЗначение);
    МассивПараметрыРеквизита.Добавить(СтруктураПараметрыРеквизита);
    Возврат(МассивПараметрыРеквизита);
КонецФункции

Похожие темы (5)

Рейтинг@Mail.ru

Поиск