Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с файлом обмена. Обрезает строку на 100 символах  (Прочитано 14239 раз)
0 Пользователей и 1 Гость смотрят эту тему.
fire_anngel
Интересующийся

ru
Offline Offline

« : 01-07-2013 09:21 » 

Доброго времени суток! В 1С я новичок. Сейчас дорабатываю загрузку Выписки из банка в 1С. Нужно считать строку Назначение платежа в соответствующее поле выписки и выбрать номер договора и сумму комиссия банка для дальнейшей работы. Для этого создаю объект выписка, а затем создаю новую выписку и заполняю строками.  При считывании значения поля НазначениеПлатежа - считываются первые 100 символов. Для считывания номера договора этого достаточно, а вот цифра комиссии может обрезаться или вообще не попадать в строку.  В конфигураторе в документе Выписка реквизиту Назначение платежа установила длину 250. Не помогло. Как я поняла по отладке - строка обрезается до 100 символов до присвоения ее значения реквизиту выписки. Скажите, можно ли вообще увеличить количество считываемых символов? Если да - то как?

Пример строки в txt-файле:
    НазначениеПлатежа=Перечисление по договору с ТСП 7921311108.Комиссия банка 20.47.|НДС не облагается.|Сумма операции MC 1364.61
    ......
    НазначениеПлатежа=зачисление средств торгового эквайринга. Мерчант № 710000200682. Дата реестра 28.06.2013. Комиссия 34.56. |НДС не облагается.|
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 01-07-2013 10:32 » 

В конфигураторе в документе Выписка реквизиту Назначение платежа установила длину 250. Не помогло. Как я поняла по отладке - строка обрезается до 100 символов до присвоения ее значения реквизиту выписки. Скажите, можно ли вообще увеличить количество считываемых символов? Если да - то как?
Длина строки при считывании органичена каким-то большим числом (возможно, 64 кБ), так что само чтение строку точно не обрезает.
Возможно, ты присваиваешь значение переменной какому-то реквизиту формы - объяви явно переменную, которую используешь:
Код: (1C v8)
Процедура ЧтениеИзФайла()
    Перем СтрокаФайла;
...
Если не поможет - давай полностью код, которым работаешь со строкой и реквизиты (скриншот из конфигуратора) выписки
Записан
fire_anngel
Интересующийся

ru
Offline Offline

« Ответ #2 : 02-07-2013 05:33 » 

Код: (1C v8)
//  Осуществляет поиск в информационной базе документа "ОперацияПоРасчСчету", если
// такой документ не существует добавляется новый. Затем вызывается процедура  
// ПровестиДокументПоСчету(), осуществляющая формирование движений в учете.
//Здесь явно устанавливается максимальная длина считываемого поля.

Функция ЗагрузитьОперациюПоРасчетномуСчету()
       
        Перем Синоним;
       
        // строка, идентифицирующая документ
        Идентификатор=СокрЛП(ТаблицаДокументов.СекцияДокумент)+
                      " с "+СокрЛП(ТаблицаДокументов.ПлательщикСчет)+
                      " на "+СокрЛП(ТаблицаДокументов.ПолучательСчет);
                                 
        // поиск ранее загруженного документа
        Объект=СоздатьОбъект("Документ.ОперацияПоРасчСчету");
        Объект.ВыбратьПоНомеру(ТаблицаДокументов.Номер, ТаблицаДокументов.Дата);
        Пока Объект.ПолучитьДокумент()=1 Цикл
                Если Объект.Идентификатор=Идентификатор Тогда
                        Прервать;
                КонецЕсли;
        КонецЦикла;
       
        // обработка найденного или создание нового документа
        Если Объект.Выбран()=1 Тогда
                СнятьПометкуУдаления(Объект);
        Иначе
                Объект.Новый();
                Объект.НомерДок=ТаблицаДокументов.Номер;
                Объект.ДатаДок=ТаблицаДокументов.Дата;
                Объект.Идентификатор=Идентификатор;
                Сообщить("Создан документ: "+Объект.Вид()+" "+Объект.НомерДок+" ("+Объект.ДатаДок+")", " ");
        КонецЕсли;

        Замены=0;
        // дата документа
        Замены=Замены+ИзменитьАтрибут(Объект, "ДатаДок", ТаблицаДокументов.Дата);
        // сумма документа
        Замены=Замены+ИзменитьАтрибут(Объект, "Сумма", ТаблицаДокументов.Сумма);
       
        // плательщик и его расчетный счет - элементы справочников
        Плательщик     = НайтиОрганизацию("Плательщик", "Фирмы");
        ПлательщикСчет = НайтиРасчетныйСчет("Плательщик", "БанковскиеСчета",Плательщик);
        Если ПлательщикСчет.Выбран()=0 Тогда
                Плательщик     = НайтиОрганизацию("Плательщик", "Контрагенты");
                ПлательщикСчет = НайтиРасчетныйСчет("Плательщик", "РасчетныеСчета", Плательщик);
               
        ИначеЕсли ТипЗначенияСтр(Плательщик) <> "Справочник" Тогда
                Плательщик = ПолучитьПустоеЗначение("Справочник.Контрагенты");
               
        КонецЕсли;

        // плательщик
        Замены=Замены+ИзменитьАтрибут(Объект, "Плательщик", Плательщик);
        // расчетный счет плательщика
        Замены=Замены+ИзменитьАтрибут(Объект, "ПлательщикСчет", ПлательщикСчет);
       
        // получатель и его расчетный счет - элементы справочников
        Получатель     = НайтиОрганизацию("Получатель", "Фирмы");
        ПолучательСчет = НайтиРасчетныйСчет("Получатель", "БанковскиеСчета",Получатель);
        Если ПолучательСчет.Выбран()=0 Тогда
                Получатель     = НайтиОрганизацию("Получатель", "Контрагенты");
                ПолучательСчет = НайтиРасчетныйСчет("Получатель", "РасчетныеСчета", Получатель);
               
        ИначеЕсли ТипЗначенияСтр(Получатель) <> "Справочник" Тогда
                Получатель = ПолучитьПустоеЗначение("Справочник.Контрагенты");
               
        КонецЕсли;

        // получатель
        Замены=Замены+ИзменитьАтрибут(Объект, "Получатель", Получатель);
        // расчетный счет получателя
        Замены=Замены+ИзменитьАтрибут(Объект, "ПолучательСчет", ПолучательСчет);
       
        // таблица всех реквизитов документа
        Реквизиты=СоздатьОбъект("ТаблицаЗначений");
        Реквизиты.НоваяКолонка("Имя", "Строка", 25);
        Реквизиты.НоваяКолонка("Синоним", "Строка", 50);
        Реквизиты.НоваяКолонка("Значение", "Строка", 150);    //Здесь явно устанавливается максимальная длина считываемого поля. Я увеличила длину строки со 100 до 150 символов
       
        // отбор всех непустых реквизитов
        Стр=ТаблицаДокументов.НомерСтроки;
        Для Кол=1 по ТаблицаДокументов.КоличествоКолонок() Цикл
                Значение=ТаблицаДокументов.ПолучитьЗначение(Стр, Кол);
        Если ПустоеЗначение(Значение)=1 Тогда Продолжить; КонецЕсли;
                Имя=ТаблицаДокументов.ПолучитьПараметрыКолонки(Кол, "", 0, 0, Синоним);
                Реквизиты.НоваяСтрока();
                Реквизиты.Имя=Имя; Реквизиты.Синоним=Синоним; Реквизиты.Значение=Строка(Значение);
        КонецЦикла;

        // установка значений ранее записанных реквизитов документа
        Объект.ВыбратьСтроки();
        Пока Объект.ПолучитьСтроку()=1 Цикл
                Стр=0;
                Если 1=Реквизиты.НайтиЗначение(Объект.Имя, Стр, "Имя") Тогда
                        Значение=Реквизиты.ПолучитьЗначение(Стр, "Значение");
                        Замены=Замены+ИзменитьАтрибут(Объект, "Значение", Значение);
                        Реквизиты.УдалитьСтроку(Стр);
                КонецЕсли;
        КонецЦикла;
       
        // запись новых реквизитов документа
        Реквизиты.ВыбратьСтроки();
        Пока Реквизиты.ПолучитьСтроку()=1 Цикл
                Объект.НоваяСтрока();
                Объект.Имя=Реквизиты.Имя; Объект.Синоним=Реквизиты.Синоним;
                Замены=Замены+ИзменитьАтрибут(Объект, "Значение", Реквизиты.Значение);
        КонецЦикла;
       
        // запись документа при необходимости
        Если 0<Замены Тогда
                ЗаписатьДокумент(Объект);
        Иначе     
                Сообщить("Обработан документ: "+Объект, " ");
        КонецЕсли;
       
        // включение документа в банковские выписки
        ПровестиДокументПоСчету(Объект.ТекущийДокумент(), ПлательщикСчет,
                                ТаблицаДокументов.ДатаСписано, 0, Объект.Сумма);
        ПровестиДокументПоСчету(Объект.ТекущийДокумент(), ПолучательСчет,
                                ТаблицаДокументов.ДатаПоступило, Объект.Сумма, 0);

        Возврат(Объект.ТекущийДокумент());
       
КонецФункции

//  В данной процедуре, на основании загруженного платежного документа или документа
// "ОперацияПоРасчСчету", формируется документ "Выписка".
//  
Процедура ПровестиДокументПоСчету(Документ, Счет, ДатаОперации='00.00.0000', Приход=0, Расход=0)
       
        Если ПустоеЗначение(Счет)=1 Тогда Возврат; КонецЕсли;
       
        Объект=СоздатьОбъект("Документ");

        Объект.ВыбратьПодчиненныеДокументы(, , Документ);
        Пока Объект.ПолучитьДокумент()=1 Цикл
                Если Объект.Вид()<>"Выписка" Тогда Продолжить;
                ИначеЕсли Объект.БанковскийСчет<>Счет Тогда Продолжить;
                КонецЕсли;

                Замены=0;
                Объект.ВыбратьСтроки();
                Пока Объект.ПолучитьСтроку()=1 Цикл
                        Если Объект.ПервичныйДокумент<>Документ Тогда
                               
                        ИначеЕсли Объект.ДатаДок<>ДатаОперации Тогда
                                Замены=Замены+ИзменитьАтрибут(Объект, "Приход", 0);
                                Замены=Замены+ИзменитьАтрибут(Объект, "Расход", 0);
                       
                        Иначе
                                Замены=Замены+ИзменитьАтрибут(Объект, "Приход", Мин(Объект.Приход, Приход));
                                Замены=Замены+ИзменитьАтрибут(Объект, "Расход", Мин(Объект.Расход, Расход));

                                Приход=Приход-Объект.Приход;
                                Расход=Расход-Объект.Расход;
                        КонецЕсли;
                КонецЦикла;

                Если 0<Замены Тогда
                        ЗаписатьДокумент(Объект);
                КонецЕсли;
        КонецЦикла;
               
        Если ПустоеЗначение(ДатаОперации)=1 Тогда Возврат; КонецЕсли;
        Если (Приход=0) и (Расход=0) Тогда Возврат; КонецЕсли;
       
        Объект=СоздатьОбъект("Документ.Выписка");

        Объект.ВыбратьДокументы(ДатаОперации, ДатаОперации);
        Пока Объект.ПолучитьДокумент()=1 Цикл
                Если Объект.БанковскийСчет=Счет Тогда
                        Прервать;
                КонецЕсли;
        КонецЦикла;
       
        Если Объект.Выбран()=0 Тогда
                Объект.Новый();
                Объект.ДатаДок=ДатаОперации;
                Объект.БанковскийСчет=Счет;
                Сообщить("Создан документ: "+Объект.Вид()+" "+Объект.НомерДок+" ("+Объект.ДатаДок+")", " ");
        КонецЕсли;
               
        Объект.НоваяСтрока();                                    
        Объект.ПервичныйДокумент = Документ;

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

        глЗаполнитьСтрокуВыпискиПоПлатежномуДокументу(Объект, Документ, Приход + Расход);
        ЗаписатьДокумент(Объект);
       
КонецПроцедуры

До этого момента на отладке все хорошо: реквизит НазначениеПлатежа считан полностью. А вот в процедуре глобального модуля на отладке при считывании назначения платежа вижу СтрДлина(ПлатДок.Значение) = 100.

Код: (1C v8)
Процедура глЗаполнитьСтрокуВыпискиПоПлатежномуДокументу(Конт, ПлатДок, Сумма=0) Экспорт
        Если ПлатДок.Выбран() = 1 Тогда
                Если ПлатДок.Вид() = "ОперацияПоРасчСчету" Тогда
                        Назначение = "";
                        ВидПлатДок = "";
                        Движение = "";
                        Если ПлатДок.ПлательщикСчет = Конт.БанковскийСчет Тогда
                                Движение = "Списание";
                        ИначеЕсли ПлатДок.ПолучательСчет = Конт.БанковскийСчет Тогда
                                Движение = "Поступление";
                        Иначе
                                Сообщить("В документе ""Операция по р/с"" №"+ПлатДок.НомерДок+" от "+ПлатДок.ДатаДок+" не указан банковский счет нашей организации.", "!!");
                                Сообщить("По данному документу строка выписки банка не сформирована.", "i");
                                Возврат;
                        КонецЕсли;                                  
                        ПлатДок.ВыбратьСтроки();
                        Пока ПлатДок.ПолучитьСтроку() =1 Цикл
                                Если Врег(СокрЛП(ПлатДок.Имя)) = "НАЗНАЧЕНИЕПЛАТЕЖА" Тогда  
                                        Назначение = Врег(СокрЛП(ПлатДок.Значение));
                                КонецЕсли;
                                Если Врег(СокрЛП(ПлатДок.Имя)) = "СЕКЦИЯДОКУМЕНТ" Тогда
                                        ВидПлатДок = Врег(СокрЛП(ПлатДок.Значение));
                                КонецЕсли;
                        КонецЦикла;
                       
                        Если      (ВидПлатДок = "ПЛАТЕЖНОЕ ПОРУЧЕНИЕ") Тогда
                                ВидПлатДок = "ПлатежноеПоручение";
                        ИначеЕсли (ВидПлатДок = "ЗАЯВЛЕНИЕ НА АККРЕДИТИВ") Тогда
                                ВидПлатДок = "ЗаявлениеНаАккредитив";
                        ИначеЕсли (ВидПлатДок = "ПЛАТЕЖНОЕ ТРЕБОВАНИЕ") Тогда
                                ВидПлатДок = "ПлатежноеТребование";
                        ИначеЕсли (ВидПлатДок ="ИНКАССОВОЕ ПОРУЧЕНИЕ") Тогда
                                ВидПлатДок = "ИнкассовоеПоручение";
                        ИначеЕсли (ВидПлатДок ="ПЛАТЕЖНОЕ ТРЕБОВАНИЕ-ПОРУЧЕНИЕ") Тогда
                                ВидПлатДок = "ПлатежноеТребованиеПоручение";
                        КонецЕсли;
                       
                Иначе
                        Назначение = ПлатДок.Содержание;
                        ВидПлатДок = ПлатДок.Вид();                                                          
                        Движение = "";
                КонецЕсли;
 .......................
КонецПроцедуры

* Безымянный.png (54.4 Кб - загружено 1005 раз.)
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 02-07-2013 07:40 » 

Какая длина реквизита (в конфигураторе) Документ.ОперацияПоРасчСчету.Значение ? В нем, похоже, и обрезает...

При создании таблицы можно размер колонок не указывать:
Код: (1C v8)
        // таблица всех реквизитов документа
        Реквизиты=СоздатьОбъект("ТаблицаЗначений");
        Реквизиты.НоваяКолонка("Имя", "Строка");
        Реквизиты.НоваяКолонка("Синоним", "Строка");
        Реквизиты.НоваяКолонка("Значение", "Строка");
Записан
fire_anngel
Интересующийся

ru
Offline Offline

« Ответ #4 : 05-07-2013 05:45 » new

Цитата
Какая длина реквизита (в конфигураторе) Документ.ОперацияПоРасчСчету.Значение ? В нем, похоже, и обрезает...

Спасибо! Помогло!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines