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