Как удалить пустые табличные строки при заполнении шаблона документов в Word?
Документооборот 8, КОРП 2.1. В конфигурации допилила к внутренним документам еще одну табличную часть. (Так там есть возможность иметь дело только с ТЧ "Товары и услуги"). В итоге столкнулась с проблемой, что все стандартные обработки модулей АвтозаполнениеШаблонов железно заточены под вывод в файл только одной полноценной таблицы. Потому получается, что если в ТЧ товары и услуги, допустим 4 позиции, а во второй моей таблице 2 заполненных строки, то при создании файла вторая таблица выводится с 2 лишними пустыми строками (ну то есть 1С при заполнении считает, что все мои столбцы - это часть одной таблицы, хотя при верстке шаблона я их разношу вообще по разным страницам). Я не хочу менять стандартные процедуры автозаполнения шаблонов, хочу, чтобы просто перед окончанием процедуры заполнения, 1С выполнила поиск пустых строк таблицы и их удалила. Я очень мало смыслю в xml-структурах, а вопрос очень срочный. Потому очень прошу мне помочь. Хотя бы подсказкой, в каком направлении вообще искать решение.
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
ну это вам к программисту надо. судя по описанным симптомам у вас в макете две области Таблица с одинаковым именем (удивительно что вообще еще разными строчками заполняется), задайте второй таблице новое имя, настройте заполнение новой таблицы. больше со слов посоветовать нечего.
для более детального ответа нужны:
1.ваш вордовский шаблон
2.код которым он заполняется
для более детального ответа нужны:
1.ваш вордовский шаблон
2.код которым он заполняется
(2) насколько я смогла понять, имена областей таблиц он вообще не проверяет. МассивДанныхДляАвтоЗамен берется в итоге из вот этой структуры.
Как видите, там не отлеживается принадлежность колонок какой-то из ТЧ. Поля у меня в таблицах повторяющихся имен не имеют, потому на выходе получается, что-то типа
Реквизит1ТЧ1 - Номер колонки = 1, ...
Реквизит5ТЧ1 - Номер колонки = 5,
Реквизит1ТЧ2 - Номер колонки = 6, ...
Реквизит1ТЧ2 - Номер колонки = 10
Количество строк, которые надо в файл вписать он берет по количеству строк в таблице Товары, но мне это не мешает - там строк всегда будет больше.
ДанныеВладельцаФайлаДляАвтозаполнения = Новый Структура(
"ТермДляЗамены, ЗаменяемаяСтрока, ЗначениеЗамены, НомерКолонкиТабличнойЧасти");
ДанныеВладельцаФайлаДляАвтозаполнения.ТермДляЗамены = ДанныеДляЗамены.ТермДляЗамены;
ДанныеВладельцаФайлаДляАвтозаполнения.ЗаменяемаяСтрока = ДанныеДляЗамены.ЗаменяемаяСтрока;
ДанныеВладельцаФайлаДляАвтозаполнения.НомерКолонкиТабличнойЧасти = 0
Как видите, там не отлеживается принадлежность колонок какой-то из ТЧ. Поля у меня в таблицах повторяющихся имен не имеют, потому на выходе получается, что-то типа
Реквизит1ТЧ1 - Номер колонки = 1, ...
Реквизит5ТЧ1 - Номер колонки = 5,
Реквизит1ТЧ2 - Номер колонки = 6, ...
Реквизит1ТЧ2 - Номер колонки = 10
Количество строк, которые надо в файл вписать он берет по количеству строк в таблице Товары, но мне это не мешает - там строк всегда будет больше.
//Осуществляет выборку всех полей в файле MSWord
//Параметры:Расширение - расширение файла ("doc" и т.п.)
// ДвоичныеДанныеФайла - двоичные данные файла
//Возвращает:Массив наименований полей. Массив пустой, если в файле нет полей.
//Выполняет замену полей и строк в документе MSOffice 2007+ (OpenXML)
//Параметры:ЧтениеXML - объект ЧтениеXML, содержащий в себе файл, составляющий OpenOffice документ
// ЗаписьXML - объект ЧтениеXML, содержащий в себе файл с измененными данными, составляющий OpenOffice документ
// МассивДанныхДляАвтоЗамен - массив настроек для заполнения файла данными
Процедура ВыполнитьЗаменуПолейИСтрокВДокументеMSOfficeOpenXML(ЧтениеXML, ЗаписьXML, АдресXML, МассивДанныхДляАвтоЗамен) Экспорт
// Получаем количество строк в таблице товары, если она заполнена.
КоличествоСтрок = 0;
Для Каждого Настройка Из МассивДанныхДляАвтоЗамен Цикл
Если Настройка.НомерКолонкиТабличнойЧасти = 1 Тогда
КоличествоСтрок = Настройка.ЗначениеЗамены.Количество();
Прервать;
КонецЕсли;
КонецЦикла;
ЧтениеXML.ИгнорироватьПробелы = Ложь;
ФлагНайденоПоле = Ложь;
ФлагНайденаСтрока = Ложь;
ПереводСтроки = Ложь; ВозможенПереводСтроки = Ложь;
СтрЗамены = "";
СтрПоиска = "";
ТекстБылЗаписан = Ложь;
СтрокаТаблицы = 0; НомерКолонки = 0;
ФлагНайденаТаблица = Ложь; ФлагНайденаНашаТаблица = Ложь;
ФлагНайденаСтрокаТаблицы = Ложь;
ПервыйТег = КоличествоСтрок > 1; ПропуститьСтроку = Ложь;
СтрокаXMLОткрыт = Ложь;
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
// Найдено предполагаемое поле для замены
Если ЧтениеXML.Имя = "w:bookmarkStart" Тогда
ФлагНайденоПоле = Истина;
СкрытаяЗакладка = Ложь;
КонецЕсли;
Если ЧтениеXML.Имя = "w:t" Тогда
ФлагНайденаСтрока = Истина;
КонецЕсли;
// Предполагаем, что найдена наша таблица для замены
Если ЧтениеXML.Имя = "w:tbl" И КоличествоСтрок > 0 Тогда
ФлагНайденаТаблица = Истина;
СтрокаТаблицы = 0;
КонецЕсли;
// Предполагаем, что найдена строка нашей таблица для замены
Если ЧтениеXML.Имя = "w:tr" И ФлагНайденаТаблица Тогда
Если СтрокаТаблицы > КоличествоСтрок И ФлагНайденаНашаТаблица Тогда
ПропуститьСтроку = Истина;
Продолжить;
КонецЕсли;
СтрокаТаблицы = СтрокаТаблицы + 1;
Если СтрокаТаблицы = 2 И КоличествоСтрок > 1 Тогда
ФлагНайденаСтрокаТаблицы = Истина;
КонецЕсли;
КонецЕсли;
Если ЧтениеXML.Имя = "w:tc" Тогда
НомерКолонки = НомерКолонки + 1;
КонецЕсли;
// В случае перезаполнения файла, этот тег пропускаем, чтобы не создавались лишние переводы строки.
Если ЧтениеXML.Имя = "w:cr" И ВозможенПереводСтроки Тогда
ПереводСтроки = Истина;
Продолжить;
КонецЕсли;
Если ПропуститьСтроку Тогда
Продолжить;
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента(ЧтениеXML.Имя);
Если ПервыйТег Или ФлагНайденаСтрокаТаблицы Тогда
Если Не СтрокаXMLОткрыт Тогда
КопияСтрокиXML = СоздатьНовуюЗапись(АдресXML);
СтрокаXMLОткрыт = Истина;
КонецЕсли;
КопияСтрокиXML.ЗаписатьНачалоЭлемента(ЧтениеXML.Имя);
КонецЕсли;
// Читаем и записываем атрибуты тега
Если ЧтениеXML.КоличествоАтрибутов() > 0 Тогда
Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
Если ФлагНайденоПоле И ЧтениеXML.Имя = "w:name"
И Найти(ЧтениеXML.Значение, "_GoBack") = 0 Тогда
СтрПоиска = ЧтениеXML.Значение;
// Скрытые закладки начинаются с символа "_"
Если Лев(ЧтениеXML.Значение, 1) = "_" Тогда
СкрытаяЗакладка = Истина;
КонецЕсли;
Если ФлагНайденаТаблица И Не ФлагНайденаНашаТаблица Тогда
Для Каждого НастройкаЗамены Из МассивДанныхДляАвтоЗамен Цикл
Если НастройкаЗамены.ТермДляЗамены = СтрПоиска
И НастройкаЗамены.НомерКолонкиТабличнойЧасти > 0 Тогда
ФлагНайденаНашаТаблица = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ПервыйТег Или ФлагНайденаСтрокаТаблицы Тогда
КопияСтрокиXML.ЗаписатьАтрибут(ЧтениеXML.Имя, Лев(СтрПоиска, 19) + "1");
КонецЕсли;
ИначеЕсли ПервыйТег Или ФлагНайденаСтрокаТаблицы Тогда
КопияСтрокиXML.ЗаписатьАтрибут(ЧтениеXML.Имя, ЧтениеXML.Значение);
КонецЕсли;
ЗаписьXML.ЗаписатьАтрибут(ЧтениеXML.Имя, ЧтениеXML.Значение);
КонецЦикла
КонецЕсли;
ПервыйТег = Ложь;
// Текст тега
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
Если ПереводСтроки И ВозможенПереводСтроки Тогда
ЗаписьXML.ЗаписатьБезОбработки("");
// Перезаполняем поля таблицы
ИначеЕсли ФлагНайденаНашаТаблица И ФлагНайденоПоле И ФлагНайденаСтрока Тогда
Если ПропуститьСтроку Тогда
Продолжить;
КонецЕсли;
СтрЗамены = ЧтениеXML.Значение;
БылаВыполненаЗамена = Ложь;
Если ЗначениеЗаполнено(СтрЗамены) Тогда
Для Каждого НастройкаЗамены Из МассивДанныхДляАвтоЗамен Цикл
ИмяРеквизита = СтрЗаменить(Лев(НастройкаЗамены.ТермДляЗамены, 20), " ", "_");
Если ИмяРеквизита <> СтрПоиска Тогда
Продолжить;
КонецЕсли;
СтрЗамены = НастройкаЗамены.ЗначениеЗамены[СтрокаТаблицы - 2].Значение;
БылаВыполненаЗамена = Истина;
Прервать;
КонецЦикла;
КонецЕсли;
Если БылаВыполненаЗамена И Найти(СтрЗамены, Символы.ПС) > 0 Тогда
СтрЗамены = СтрЗаменить(СтрЗамены, Символы.ПС, "<w:cr/>");
Если СтрЗамены <> ЧтениеXML.Значение Тогда
ЗаписьXML.ЗаписатьБезОбработки(СтрЗамены);
Если ФлагНайденаСтрокаТаблицы Тогда
КопияСтрокиXML.ЗаписатьБезОбработки(СтрЗамены);
КонецЕсли;
Иначе
ЗаписьXML.ЗаписатьТекст(СтрЗамены);
Если ФлагНайденаСтрокаТаблицы Тогда
КопияСтрокиXML.ЗаписатьТекст(СтрЗамены);
КонецЕсли;
КонецЕсли;
Иначе
ЗаписьXML.ЗаписатьТекст(СтрЗамены);
Если ФлагНайденаСтрокаТаблицы Тогда
КопияСтрокиXML.ЗаписатьТекст(СтрЗамены);
КонецЕсли;
КонецЕсли;
СтрЗамены = "";
ФлагНайденоПоле = Ложь;
// Перезаполняем поля документа
ИначеЕсли ФлагНайденоПоле И ФлагНайденаСтрока Тогда
Для Каждого НастройкаЗамены Из МассивДанныхДляАвтоЗамен Цикл
ИмяРеквизита = СтрЗаменить(Лев(НастройкаЗамены.ТермДляЗамены, 20), " ", "_");
Если ИмяРеквизита = СтрПоиска Тогда
СтрЗамены = НастройкаЗамены.ЗначениеЗамены;
Прервать;
КонецЕсли;
КонецЦикла;
СтрЗаменыССимволамиПС = СтрЗамены;
СтрЗамены = СтрЗаменить(СтрЗамены, Символы.ПС, "<w:cr/>");
Если ЗначениеЗаполнено(СтрЗамены) Тогда
Если СтрЗамены <> СтрЗаменыССимволамиПС Тогда
ЗаписьXML.ЗаписатьБезОбработки(СтрЗамены);
Иначе
ЗаписьXML.ЗаписатьТекст(СтрЗамены);
КонецЕсли;
ИначеЕсли Не СкрытаяЗакладка И СтрЗамены <> ЧтениеXML.Значение Тогда
ЗаписьXML.ЗаписатьТекст(" ");
Иначе
ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение);
КонецЕсли;
ФлагНайденоПоле = Ложь;
СтрЗамены = "";
ВозможенПереводСтроки = Истина;
// Перезаполняем строки документа
ИначеЕсли ФлагНайденаСтрока Тогда
СтрЗамены = ЧтениеXML.Значение;
БылаВыполненаЗамена = Ложь;
Для Каждого НастройкаЗамены Из МассивДанныхДляАвтоЗамен Цикл
Если Не ЗначениеЗаполнено(НастройкаЗамены.ЗаменяемаяСтрока) Тогда
Продолжить;
КонецЕсли;
Если Найти(СтрЗамены, НастройкаЗамены.ЗаменяемаяСтрока) > 0 Тогда
СтрЗамены = СтрЗаменить(СтрЗамены, НастройкаЗамены.ЗаменяемаяСтрока, НастройкаЗамены.ЗначениеЗамены);
БылаВыполненаЗамена = Истина;
КонецЕсли;
КонецЦикла;
Если БылаВыполненаЗамена И Найти(СтрЗамены, Символы.ПС) > 0 Тогда
СтрЗамены = СтрЗаменить(СтрЗамены, Символы.ПС, "<w:cr/>");
Если СтрЗамены <> ЧтениеXML.Значение Тогда
ЗаписьXML.ЗаписатьБезОбработки(СтрЗамены);
Иначе
ЗаписьXML.ЗаписатьТекст(СтрЗамены);
КонецЕсли;
Иначе
ЗаписьXML.ЗаписатьТекст(СтрЗамены);
КонецЕсли;
Иначе
ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение);
Если ФлагНайденаСтрокаТаблицы Тогда
КопияСтрокиXML.ЗаписатьТекст(ЧтениеXML.Значение);
КонецЕсли;
КонецЕсли;
// Читаем и записываем конец тега
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
// В случае перезаполнения файла, этот тег пропускаем, чтобы не создавались лишние переводы строки.
Если ЧтениеXML.Имя = "w:cr" И ВозможенПереводСтроки Тогда
Продолжить;
КонецЕсли;
Если ФлагНайденаТаблица И ЧтениеXML.Имя = "w:tbl" Тогда
ФлагНайденаТаблица = Ложь;
ФлагНайденаНашаТаблица = Ложь;
ПропуститьСтроку = Ложь;
СтрЗамены = "";
КонецЕсли;
Если ПропуститьСтроку Тогда
Продолжить;
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
Если ФлагНайденаСтрокаТаблицы Тогда
КопияСтрокиXML.ЗаписатьКонецЭлемента();
КонецЕсли;
Если ФлагНайденоПоле И ЧтениеXML.Имя = "w:bookmarkEnd" Тогда
ФлагНайденоПоле = Ложь; СкрытаяЗакладка = Ложь;
СтрЗамены = "";
КонецЕсли;
Если ФлагНайденаСтрока Тогда
ФлагНайденаСтрока = Ложь;
СтрЗамены = "";
КонецЕсли;
Если ЧтениеXML.Имя = "w:tr" И ФлагНайденаТаблица Тогда
НомерКолонки = 0;
ФлагНайденаСтрокаТаблицы = Ложь;
Если СтрокаТаблицы = 2 И КоличествоСтрок > 1 Тогда
КопияСтрокиXML.ЗаписатьКонецЭлемента();
КопияСтрокиXML.Закрыть();
СтрокаXMLОткрыт = Ложь;
ЗаменитьПространствоИменR(АдресXML);
// Добавление в документ копии первой строки таблицы, с последующим заполнением данными документа
Если ФлагНайденаНашаТаблица Тогда
Пока СтрокаТаблицы - 1 < КоличествоСтрок Цикл
ЧтениеСтрокиXML = Новый ЧтениеXML();
ЧтениеСтрокиXML.ОткрытьФайл(АдресXML);
ЧтениеСтрокиXML.ИгнорироватьПробелы = Ложь;
ФлагНайденоПоле = Ложь; ФлагНайденаСтрока = Ложь;
Пока ЧтениеСтрокиXML.Прочитать() Цикл
Если ЧтениеСтрокиXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
// Первый тег пропускаем
Если ЧтениеСтрокиXML.Имя = "w:document" Тогда
Продолжить;
КонецЕсли;
Если ЧтениеСтрокиXML.Имя = "w:bookmarkStart" Тогда
ФлагНайденоПоле = Истина;
КонецЕсли;
Если ЧтениеСтрокиXML.Имя = "w:t" Тогда
ФлагНайденаСтрока = Истина;
КонецЕсли;
Если ЧтениеСтрокиXML.Имя = "w:tr" Тогда
СтрокаТаблицы = СтрокаТаблицы + 1;
КонецЕсли;
Если ЧтениеСтрокиXML.Имя = "w:tc" Тогда
НомерКолонки = НомерКолонки + 1;
КонецЕсли;
// В случае перезаполнения файла, этот тег пропускаем, чтобы не создавались лишние переводы строки.
Если ЧтениеСтрокиXML.Имя = "w:cr" И ВозможенПереводСтроки Тогда
ПереводСтроки = Истина;
Продолжить;
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента(ЧтениеСтрокиXML.Имя);
Если ЧтениеСтрокиXML.КоличествоАтрибутов() > 0 Тогда
Пока ЧтениеСтрокиXML.ПрочитатьАтрибут() Цикл
Если ФлагНайденоПоле И ЧтениеСтрокиXML.Имя = "w:name"
И Найти(ЧтениеXML.Значение, "_GoBack") = 0 Тогда
СтрПоиска = ЧтениеСтрокиXML.Значение;
КонецЕсли;
ЗаписьXML.ЗаписатьАтрибут(ЧтениеСтрокиXML.Имя, ЧтениеСтрокиXML.Значение);
КонецЦикла
КонецЕсли;
ИначеЕсли ЧтениеСтрокиXML.ТипУзла = ТипУзлаXML.Текст Тогда
Если ПереводСтроки И ВозможенПереводСтроки Тогда
ЗаписьXML.ЗаписатьБезОбработки("");
ИначеЕсли ФлагНайденоПоле И ФлагНайденаСтрока Тогда
СтрЗамены = ЧтениеСтрокиXML.Значение;
БылаВыполненаЗамена = Ложь;
Для Каждого НастройкаЗамены Из МассивДанныхДляАвтоЗамен Цикл
ИмяРеквизита = Лев(НастройкаЗамены.ТермДляЗамены, 19) + "1";
Если ИмяРеквизита <> СтрПоиска Тогда
Продолжить;
КонецЕсли;
СтрЗамены = НастройкаЗамены.ЗначениеЗамены[СтрокаТаблицы - 2].Значение;
БылаВыполненаЗамена = Истина;
Прервать;
КонецЦикла;
Если БылаВыполненаЗамена И Найти(СтрЗамены, Символы.ПС) > 0 Тогда
СтрЗамены = СтрЗаменить(СтрЗамены, Символы.ПС, "<w:cr/>");
Если СтрЗамены <> ЧтениеСтрокиXML.Значение Тогда
ЗаписьXML.ЗаписатьБезОбработки(СтрЗамены);
Иначе
ЗаписьXML.ЗаписатьТекст(СтрЗамены);
КонецЕсли;
Иначе
ЗаписьXML.ЗаписатьТекст(СтрЗамены);
КонецЕсли;
СтрЗамены = "";
ФлагНайденоПоле = Ложь;
Иначе
ЗаписьXML.ЗаписатьТекст(ЧтениеСтрокиXML.Значение);
КонецЕсли;
ИначеЕсли ЧтениеСтрокиXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
// В случае перезаполнения файла, этот тег пропускаем, чтобы не создавались лишние переводы строки.
Если ЧтениеСтрокиXML.Имя = "w:cr" И ВозможенПереводСтроки Тогда
Продолжить;
КонецЕсли;
Если ЧтениеСтрокиXML.Имя = "w:document" Тогда
Продолжить;
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
Если ФлагНайденоПоле И ЧтениеСтрокиXML.Имя = "w:bookmarkEnd" Тогда
ФлагНайденоПоле = Ложь;
СтрЗамены = "";
КонецЕсли;
Если ФлагНайденаСтрока Тогда
ФлагНайденаСтрока = Ложь;
СтрЗамены = "";
КонецЕсли;
Если ЧтениеСтрокиXML.Имя = "w:tr" Тогда
НомерКолонки = 0;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ЧтениеСтрокиXML.Закрыть();
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ВозможенПереводСтроки И ЧтениеXML.Имя = "w:bookmarkEnd" Тогда
ПереводСтроки = Ложь;
ВозможенПереводСтроки = Ложь;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьПрикрепленные файлы:
Шаблон.docx
упс, вот это код у вас, у меня код по заполнению документа в ворде примерно строк 20 (без учета запроса собирающего данные для вывода)
вот где-то здесь, точнее (без отладчика) сказать трудно.
Если БылаВыполненаЗамена И Найти(СтрЗамены, Символы.ПС) > 0 Тогда
СтрЗамены = СтрЗаменить(СтрЗамены, Символы.ПС, "<w:cr/>");
Если СтрЗамены <> ЧтениеXML.Значение Тогда
ЗаписьXML.ЗаписатьБезОбработки(СтрЗамены);
Если ФлагНайденаСтрокаТаблицы Тогда
КопияСтрокиXML.ЗаписатьБезОбработки(СтрЗамены);
КонецЕсли;
Иначе
ЗаписьXML.ЗаписатьТекст(СтрЗамены);
Если ФлагНайденаСтрокаТаблицы Тогда
КопияСтрокиXML.ЗаписатьТекст(СтрЗамены);
КонецЕсли;
КонецЕсли;
Иначе
ЗаписьXML.ЗаписатьТекст(СтрЗамены);
Если ФлагНайденаСтрокаТаблицы Тогда
КопияСтрокиXML.ЗаписатьТекст(СтрЗамены);
КонецЕсли;
КонецЕсли;
а еще есть подозрение на данные, проверьте данные таблицу для замены с данными из вашей ТЧ, возможно в ней есть пустые строчки
вот где-то здесь, точнее (без отладчика) сказать трудно.
Если БылаВыполненаЗамена И Найти(СтрЗамены, Символы.ПС) > 0 Тогда
СтрЗамены = СтрЗаменить(СтрЗамены, Символы.ПС, "<w:cr/>");
Если СтрЗамены <> ЧтениеXML.Значение Тогда
ЗаписьXML.ЗаписатьБезОбработки(СтрЗамены);
Если ФлагНайденаСтрокаТаблицы Тогда
КопияСтрокиXML.ЗаписатьБезОбработки(СтрЗамены);
КонецЕсли;
Иначе
ЗаписьXML.ЗаписатьТекст(СтрЗамены);
Если ФлагНайденаСтрокаТаблицы Тогда
КопияСтрокиXML.ЗаписатьТекст(СтрЗамены);
КонецЕсли;
КонецЕсли;
Иначе
ЗаписьXML.ЗаписатьТекст(СтрЗамены);
Если ФлагНайденаСтрокаТаблицы Тогда
КопияСтрокиXML.ЗаписатьТекст(СтрЗамены);
КонецЕсли;
КонецЕсли;
а еще есть подозрение на данные, проверьте данные таблицу для замены с данными из вашей ТЧ, возможно в ней есть пустые строчки
(4) Насчет пустых строк вы оказались правы, но теперь всплыла другая проблема: когда строк во второй таблице меньше, чем в первой на вот этой строке вылетает ошибка:
Что в принципе логично, ведь, допустим, значений замены для 3 строки нет, когда в таблице их всего 2)
Я решила это просто через исключения обойти. Типа если столкнулись с такой ошибкой, значит, мы дошли до конца более короткой таблицы.
Но, короче, в итоге работает точно так же как изначально - пустые строки в файл для более короткой таблицы все равно записываются.
СтрЗамены = НастройкаЗамены.ЗначениеЗамены[СтрокаТаблицы - 2].Значение;
Что в принципе логично, ведь, допустим, значений замены для 3 строки нет, когда в таблице их всего 2)
Я решила это просто через исключения обойти. Типа если столкнулись с такой ошибкой, значит, мы дошли до конца более короткой таблицы.
СтрЗамены = ЧтениеСтрокиXML.Значение;
БылаВыполненаЗамена = Ложь;
КонецКороткойТаблицы = Ложь;
Для Каждого НастройкаЗамены Из МассивДанныхДляАвтоЗамен Цикл
ИмяРеквизита = Лев(НастройкаЗамены.ТермДляЗамены, 19) + "1";
Если ИмяРеквизита <> СтрПоиска Тогда
Продолжить;
КонецЕсли;
Попытка
СтрЗамены = НастройкаЗамены.ЗначениеЗамены[СтрокаТаблицы - 2].Значение;
БылаВыполненаЗамена = Истина;
Исключение
СтрЗамены = "";
БылаВыполненаЗамена = Ложь;
КонецКороткойТаблицы = Истина; //если не получилось получить значение из таблицы, значит, в ней было меньше строк, чем в Товарах
КонецПопытки;
Прервать;
КонецЦикла;
Если БылаВыполненаЗамена И Найти(СтрЗамены, Символы.ПС) > 0 Тогда
СтрЗамены = СтрЗаменить(СтрЗамены, Символы.ПС, "<w:cr/>");
Если СтрЗамены <> ЧтениеСтрокиXML.Значение Тогда
ЗаписьXML.ЗаписатьБезОбработки(СтрЗамены);
Иначе
ЗаписьXML.ЗаписатьТекст(СтрЗамены);
КонецЕсли;
Иначе
Если Не КонецКороткойТаблицы Тогда //если для короткой таблицы ничего больше не записывать, то пустая строка в файл не попадет, думала я...
ЗаписьXML.ЗаписатьТекст(СтрЗамены);
КонецЕсли;
КонецЕсли;
ПоказатьНо, короче, в итоге работает точно так же как изначально - пустые строки в файл для более короткой таблицы все равно записываются.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот