Имя: Пароль:
1C
1С v8
Вопрос по обработке на создание документа
, ,
0 example
 
20.11.12
12:09
Здравствуйте! Имеется внешняя обработка на создание документа и заполнения его таб части из dbf таблицы (перед этим все данные из dbf я гружу в табличную часть обработки из нее же и заполняю таб часть док-та)

Сейчас все данные грузятся в один документ, а нужно чтобы для каждого значение определенного поля создавался отдельный док

Как правильно написать цикл?
1 Рэйв
 
20.11.12
12:11
ОТсортируй таблицу по этим значением и отслеживай его смену при переборе. Как изменилось -  создавай новый док.
2 shuhard
 
20.11.12
12:11
(20) загрузить всё херню в ТЗ, отсортировать ТС по определенному знанию поля, выполнить по нему цикл
3 mikecool
 
20.11.12
12:14
(2) твой пост похож на перевод с китайского ))
зы: сорри за офф
4 example
 
20.11.12
12:16
Допустим таблица отсортирована, как отследить смену значения?
Если можно кодом, а то я на словах плохо пойму)))


Я понимаю, что пост глупый) Но я только учусь и поэтому грамотно формулировать вопросы касаемо 1с не умею))
5 Птица
 
20.11.12
12:18
(4) запоминать текущее в переменную, сравнивать с очередным из базы, при смене значения обновлять переменную и начинать новый документ
6 zladenuw
 
20.11.12
12:18
с общей ТЗ. копируешь поля которые будут в шапке документа. сворачиваешь тз шапка. делаешь цикл по нему. создаешь и заполняешь шапку документа, внутри делаешь отбор к общей тз и заполняешь тч документа. методом ЗаполнитьЗначенияСвойств. как то так.
7 example
 
20.11.12
12:57
извините за излишнюю тупость, но нагляднее мне будет понятнее, как сюда скопировать код ?)
8 Рэйв
 
20.11.12
13:03
(7)
//---------------
Перем Док;
ТЗ.Сортировать("Чтото");
чтотоДО="Здесь пока ничего";

Для Каждого Стр Из ТЗ Цикл
   Если Стр.Чтото<>ЧтотоДо Тогда
       Если чтотоДО<>"Здесь пока ничего" Тогда  
             Док.Записать();
       КонецЕсли;
       Док=Документы.Имя.СоздатьДокумент();
      //....Заполняешь шапку
   КонецЕсли;
   Нов=Док.ТабЧасть.Добавить();
   //   заполняешь новыю строку документа
   //-------
   ЧтотоДО=Стр.Чтото;
КонецЦикла;

Док. Записать();
//---------

Как то так
9 example
 
20.11.12
13:13
у меня все немножко иначе изначально

вот на эту кнопку я гружу данные из dbf в табличную часть обработки
[code]Процедура ЗагрузитьФайл(Элемент)
   
   Материалы.Очистить();
   хВ = Новый XBase;
   хВ.ОткрытьФайл(Путь);
   хВ.Первая();
   к=1;
   
   Пока Не хВ.ВКонце() Цикл
       
       ГН=СтрЗаменить(хВ.INV," ","");
       НУ=СтрЗаменить(хВ.N_U," ","");
       ВТ=СтрЗаменить(хВ.KOD," ","");
       КО=СтрЗаменить(хВ.KOB," ","");
       Рд=СтрЗаменить(хВ.RASHOD," ","");
       НоваяСтрока=Материалы.Добавить();
       НоваяСтрока.ГаражныйНомер=Справочники.рар_ГаражныеНомера.НайтиПоНаименованию(ГН);
       НоваяСтрока.НомерУчастка="Участок № "+НУ;
       Если НоваяСтрока.НомерУчастка="Участок № 4" Тогда
           НоваяСтрока.НомерУчастка=Справочники.Подразделения.НайтиПоНаименованию("Производственный");
       КонецЕсли;
       
       Если ВТ="4" Тогда
           НоваяСтрока.ВидТоплива=Справочники.Номенклатура.НайтиПоНаименованию("Дизельное топливо");
       ИначеЕсли ВТ="3" Тогда              
           НоваяСтрока.ВидТоплива=Справочники.Номенклатура.НайтиПоНаименованию("Бензин   АИ-92");
       ИначеЕсли ВТ="2" Тогда
           НоваяСтрока.ВидТоплива=Справочники.Номенклатура.НайтиПоНаименованию("Бензин АИ-80");
       ИначеЕсли ВТ="1" Тогда
           НоваяСтрока.ВидТоплива=Справочники.Номенклатура.НайтиПоНаименованию("Бензин АИ-95");
       КонецЕсли;
       
       Если КО="990" или КО="992" Тогда
           НоваяСтрока.КодОбъекта=Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Услуги авто");
       Иначе
           НоваяСтрока.КодОбъекта=Справочники.НоменклатурныеГруппы.НайтиПоНаименованию(КО);
       КонецЕсли;
       
       НоваяСтрока.Расход=Рд;
       хВ.Следующая();
       
   КонецЦикла;
   
   
КонецПроцедуры[/code]

А вот на эту кнопку уже формирую док
[code]Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   
     ТребованиеНакладная=Документы.ТребованиеНакладная.СоздатьДокумент();
   ТребованиеНакладная.Организация=Организация;
   ТребованиеНакладная.Подразделение=Участок;
   ТребованиеНакладная.Склад=Склад;
   ТребованиеНакладная.Ответственный=ПараметрыСеанса.ТекущийПользователь;
   ТребованиеНакладная.Дата=КонецМесяца(МесяцЗагрузки);
   ТребованиеНакладная.ОтражатьВУправленческомУчете = Истина;
   ТребованиеНакладная.ОтражатьВБухгалтерскомУчете = Истина;
   ТребованиеНакладная.ОтражатьВНалоговомУчете = Истина;
   ТребованиеНакладная.Ответственный=Справочники.Пользователи.НайтиПоНаименованию("Хромова");
   ТребованиеНакладная.НДСвСтоимостиТоваров=Перечисления.ДействиеНДСВСтоимостиТоваров.НеИзменять;    
   
   Для каждого стр из Материалы Цикл
               
   СтрокаТН=ТребованиеНакладная.Материалы.Добавить();    
   СтрокаТН.Номенклатура=стр.ВидТоплива;
   ЭтаФорма.Обновить();
   СтрокаТН.Количество=стр.Расход;
   СтрокаТН.ЕдиницаИзмерения=Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("л");
   СтрокаТН.Коэффициент=Число(1.000);
   СтрокаТН.СтатьяЗатрат=Справочники.СтатьиЗатрат.НайтиПоНаименованию("20 Стоимость гсм");
   СтрокаТН.НоменклатурнаяГруппа=стр.КодОбъекта;
   СтрокаТн.ГаражныйНомер=стр.ГаражныйНомер;
   СтрокаТн.Качество=Справочники.Качество.Новый;
   СтрокаТн.Склад=Склад;
   ТребованиеНакладная.Записать();
   
       
   КонецЦикла;    
   
   ТребованиеНакладная.Записать();
   
       
КонецПроцедуры[/code]

Создавать новый док нужно для каждого "КодОбъекта" а их множество
10 example
 
20.11.12
15:14
up, help!)
11 Aprobator
 
20.11.12
15:30

ОбработанныеКоды = Новый Соответствие;
стркОтбора = Новый Структура;
Для каждого стр Из Материалы Цикл
   Если ОбработанныеКоды[стр.КодОбъекта] = Неопределено Тогда
        стркОтбора.Вставить("КодОбъекта", стр.КодОбъекта);
        мсвСтрокПоКодуОбъекта  = Материалы.НайтиСтроки(стркОтбора);
         // создаем документ и заполняем его обходя элементы полученного массива, значения которого строки
.......
        ОбработаныеКоды[стр.КодОбъекта] = 1;
   КонецЕсли;
КонецЦикла;
12 example
 
20.11.12
16:02
Получилось, но теперь почему-то в каждом доке по одной записи (

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


Что не так теперь?)
13 hhhh
 
20.11.12
17:05
(12) а где у вас здесь "обходя элементы полученного массива"??
14 Aprobator
 
20.11.12
17:21
кирдык мамай, что еще сказать.
15 Aprobator
 
20.11.12
17:25
особенно нравится

...
ЭтаФорма.Обновить();
...
16 example
 
21.11.12
09:10
Спасибо короче всем, залошить залошили, а помочь толком никто и не помог)
17 Homer
 
21.11.12
09:14
в (8) все показано как делать.
18 Aprobator
 
21.11.12
09:44
если читать не умеешь, кто ж тебе поможет то?
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший