Имя: Пароль:
1C
1С v8
Загрузка данных из табличного документа
0 Dark_Warrior
 
18.03.13
08:30
Всем доброго времени суток. Подскажите, пожалуйста, с обработкой "Загрузка данных из табличного документа" - я не пойму как заполнить в готовом документе пару колонок, не трогая остальные.
1 Dark_Warrior
 
18.03.13
09:15
товарищи знатоки, откликнитесь! очень нужна ваша помощь
2 cw014
 
18.03.13
09:17
Никак, перед заполнением он очищает таблицу
3 Dark_Warrior
 
18.03.13
10:10
(2) пытаюсь сделать так, чтобы ТЧ документа не очищалась, и новые значения заменяли текущие. С языком знаком очень слабо, пока смог только убрать очищение ТЧ документа (теперь добавляются новые строки в конец ТЧ). Подскажите пожалуйста, какой участок кода подкорректировать чтобы не добавлялись новые строки, а менялось значение ячейки в текущей?
РежимЗагрузки - 2

ОчиститьСообщения();
       Сообщить("Выполняется загрузка"+ ТекстВопросаИсточника, СтатусСообщения.Информация);
       Сообщить("Всего: " + КоличествоЭлементов, СтатусСообщения.Информация);
       Сообщить("---------------------------------------------", СтатусСообщения.БезСтатуса);
       Индикатор.Значение = 0;
       Индикатор.МаксимальноеЗначение = КоличествоЭлементов;
       Загружено = 0;
       Для К = ПерваяСтрокаДанныхТабличногоДокумента По ТабличныйДокумент.ВысотаТаблицы Цикл
           НомерТекущейСтроки = Индикатор.Значение + 1;
           ТекстыЯчеек = Неопределено;
           Отказ = Ложь;
           ТекущаяСтрока = КонтрольЗаполненияСтроки(ТабличныйДокумент, К, ТекстыЯчеек);
           Если РежимЗагрузки =0 Тогда
               
               Объект = Неопределено;
               Если Не Запрос = Неопределено Тогда
                   СтрокаОшибок = "";
                   Для каждого СтрокаПоиска Из СтрокиПоиска Цикл
                       
                       ЗначениеРеквизита = Неопределено;
                       
                       ТекущаяСтрока.Свойство(СтрокаПоиска.ИмяРеквизита,ЗначениеРеквизита);
                       Если ПустаяСтрока(ЗначениеРеквизита) Тогда
                           СтрокаОшибок = ?(ПустаяСтрока(СтрокаОшибок),"",СтрокаОшибок + ", ") + СтрокаПоиска.ПредставлениеРеквизита;
                       Иначе
                           Запрос.УстановитьПараметр(СтрокаПоиска.ИмяРеквизита,ТекущаяСтрока[СтрокаПоиска.ИмяРеквизита]);
                       КонецЕсли;
                       
                   КонецЦикла;
                   
                   Если Не ПустаяСтрока(СтрокаОшибок) Тогда
                       Сообщить("Строка " + НомерТекущейСтроки + " не может быть записана.Не указано значение ключевых реквизитов: " + СтрокаОшибок,СтатусСообщения.Важное);
                       Индикатор.Значение = Индикатор.Значение + 1;
                       Продолжить;
                   КонецЕсли;
                   
                   Выборка = Запрос.Выполнить().Выбрать();
                   Если Выборка.Следующий() Тогда
                       Объект = Выборка.Ссылка.ПолучитьОбъект();
                   КонецЕсли;
                   
               КонецЕсли;
               
               ОбъектНайден = Не Объект = Неопределено;
               Если Не ОбъектНайден Тогда
                   Если НеСоздаватьНовыхЭлементов Тогда
                       Индикатор.Значение = Индикатор.Значение + 1;
                       Продолжить;
                   Иначе
                       Объект = Справочники[МетаданныеИсточника.Имя].СоздатьЭлемент();
                   КонецЕсли;
                   
               КонецЕсли;
           ИначеЕсли РежимЗагрузки = 1 Тогда
               //Объект = Источник.Добавить();
               ОбъектНайден = Ложь;
           ИначеЕсли РежимЗагрузки = 2 Тогда
               Объект = РегистрыСведений[МетаданныеИсточника.Имя].СоздатьМенеджерЗаписи();
               Для каждого КлючИЗначение Из ТекущаяСтрока Цикл
                   
                   Если ИзмеренияРегистра.Свойство(КлючИЗначение.Ключ) Тогда
                       Объект[КлючИЗначение.Ключ] = КлючИЗначение.Значение;
                   КонецЕсли;
                   
               КонецЦикла;
               
               Если Не ЗамещатьСуществующиеЗаписи Тогда
                   Объект.Прочитать();
                   ОбъектНайден = Объект.Выбран();
               Иначе
                   ОбъектНайден = Ложь;
               КонецЕсли;
               
           КонецЕсли;
           
           Для каждого КлючИЗначение Из ТекущаяСтрока Цикл
                   
               Если Не ОбъектНайден или Колонки[КлючИЗначение.Ключ].Пометка  Тогда
                   Попытка
                       Объект[КлючИЗначение.Ключ] = КлючИЗначение.Значение;
                   Исключение
                       мСообщитьОбОшибке("Ошибка при установки значения реквизита """ + КлючИЗначение.Ключ + "" + ОписаниеОшибки());
                       Отказ = Истина;
                       Прервать;
                   КонецПопытки;
               КонецЕсли;
                   
           КонецЦикла;
           
           Если РежимЗагрузки = 0 Тогда
               Если Не Отказ и ЗаписатьОбъект(Объект, ТекстыЯчеек) Тогда
                   Сообщить(?(ОбъектНайден,"Изменен","Загружен") + " элемент справочника: " + Объект.ссылка, СтатусСообщения.Информация);
                   Загружено = Загружено + 1;
               Иначе
                   Сообщить("Объект не " + ?(ОбъектНайден,"изменен","загружен") + ". Элемент справочника: " + Объект + ".", СтатусСообщения.Важное);
               КонецЕсли;
           ИначеЕсли РежимЗагрузки = 1 Тогда
               
               Если Не ОбработатьСобытиеПослеДобавленияСтроки(ОбъектИсточника, Объект, ТекстыЯчеек) Тогда
                   Отказ = Истина;
               КонецЕсли;
               
               Если Не Отказ Тогда
                   Сообщить("Добавлена строка: " + (Загружено + 1));
               Иначе
                   Сообщить("При добавлении строки " + (Загружено + 1) + " возникли ошибки. ");
                   ЗаписыватьОбъект = Ложь;
               КонецЕсли;
               
               Загружено = Загружено + 1;
               
           ИначеЕсли РежимЗагрузки = 2 Тогда
               Если Не Отказ и ЗаписатьОбъект(Объект, ТекстыЯчеек) Тогда
                   Сообщить(?(ОбъектНайден,"Изменена","Добавлена") + " запись № " + НомерТекущейСтроки + ".");
                   Загружено = Загружено + 1;
               Иначе
                   Сообщить("Запись не " + ?(ОбъектНайден,"изменена","загружена") + ". № записи: " + НомерТекущейСтроки + ".", СтатусСообщения.Важное);
               КонецЕсли;
           КонецЕсли;
           
           Индикатор.Значение = Индикатор.Значение + 1;
           ОбработкаПрерыванияПользователя();
           
       КонецЦикла;
       Сообщить("---------------------------------------------", СтатусСообщения.БезСтатуса);
       
       Если РежимЗагрузки = 1  Тогда
           Если ЗаписыватьОбъект и ЗаписатьОбъект(ОбъектИсточника) Тогда
               
               Сообщить("Выполнена загрузка"+    ТекстВопросаИсточника, СтатусСообщения.Информация);
               Сообщить("" +Загружено +" из "+ КоличествоЭлементов + " элементов.", СтатусСообщения.Информация);
               Возврат Истина;
           Иначе
               Сообщить("Объект не записан: " + Объект + ".", СтатусСообщения.Важное);
               Возврат Ложь;
           КонецЕсли;
       ИначеЕсли РежимЗагрузки = 0 Тогда
           Сообщить("Выполнена загрузка"+    ТекстВопросаИсточника, СтатусСообщения.Информация);
           Сообщить("" +Загружено +" из "+ КоличествоЭлементов + " элементов.", СтатусСообщения.Информация);
           Возврат Истина;
       ИначеЕсли РежимЗагрузки = 2 Тогда
           Сообщить("Выполнена загрузка"+    ТекстВопросаИсточника, СтатусСообщения.Информация);
           Сообщить("" +Загружено +" из "+ КоличествоЭлементов + " записей.", СтатусСообщения.Информация);
           Возврат Истина;
       КонецЕсли;
       
   Иначе
       Возврат Ложь;
   КонецЕсли;
4 cw014
 
18.03.13
10:13
(3) Подсказываю: править весь участок кода.

А именно, определять, больше или меньше у тебя позиций, чем в документе. После этого вместо добавления получаешь строку ТЧ по индексу и ее меняешь. Если в твоей таблице строк больше - начинаешь после окончания ТЧ добавлять новые строки...

В общем будь программистом
5 Dark_Warrior
 
18.03.13
10:16
(4) количество строк одинаково
6 Dark_Warrior
 
18.03.13
10:17
После этого вместо добавления получаешь строку ТЧ по индексу и ее меняешь.
Можно немного поподробнее?
7 cw014
 
18.03.13
10:18
(6) Нет, ибо в твоем коде (который ты запостил) этого куска нет.
(5) Это сейчас одинаково, а наступит день - и случайно оно окажется разным (этот день обязательно наступит, будешь ли ты на том рабочем месте или нет)
8 cw014
 
18.03.13
10:18
(6) +(7) И никто переписывать за тебя обработку за бесплатно не будет
9 Dark_Warrior
 
18.03.13
10:22
(8) мне это нужно для одной конкретной задачи, и желательно побыстрее, поэтому я так суечусь.
я подозреваю что дело в

ТекущаяСтрока = КонтрольЗаполненияСтроки(ТабличныйДокумент, К, ТекстыЯчеек);
10 cw014
 
18.03.13
10:28
(9) Очень наврят ли
11 cw014
 
18.03.13
10:29
(9) Смотри в коде, пробегись отладчиком, совет тебе дали, причем практически досконально
12 Dark_Warrior
 
18.03.13
10:32
(11) а можно ли просто в цикле

Для К = ПерваяСтрокаДанныхТабличногоДокумента По ТабличныйДокумент.ВысотаТаблицы Цикл

заменить эту кучу условий на кусочек кода, который просто построчно будет менять значение одной ячейки в строке?
13 cw014
 
18.03.13
10:38
(12) Не знаю, можно или нет
14 cw014
 
18.03.13
10:38
(12) Пробуй
15 Dark_Warrior
 
18.03.13
10:42
(14) пытаюсь отладчиком найти момент когда добавляется новая строка. спасибо большое за помощь!
16 Dark_Warrior
 
18.03.13
11:08
(14) мб есть более простой способ? вообще, изначально задача стоит такая - в документе ввода нач. остатков заполнить поле "Сумма" в соответствии с числами из табличного документа.
17 cw014
 
18.03.13
11:10
(16) Напиши сам обработку
18 Dark_Warrior
 
18.03.13
11:12
(17) Правильные суммы показываются в отчете "Остатки ТМЦ" в 1с7. Может быть проще цеплять данные с семерки?
19 cw014
 
18.03.13
11:12
(18) Напишешь - будет проще
20 Dark_Warrior
 
18.03.13
11:13
(17) создать, к примеру, документ инвентаризации по складу и из него цеплять значения реквизитов
21 Dark_Warrior
 
18.03.13
11:14
(19) я не совсем представляю себе алгоритм ,по которому должна действовать эта обработка
22 cw014
 
18.03.13
11:15
(21) Посиди, подумай, представь... Все у тебя получится
23 Dark_Warrior
 
18.03.13
11:18
(22) Получиться должно, другого выхода нет - задание нужно сделать.
24 cw014
 
18.03.13
11:22
(23) Ну вот и хорошо