Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
15 дек 2024, 12:43

Заполнение документа результатом из запроса.

Автор asdfr1, 20 янв 2014, 15:34

0 Пользователей и 1 гость просматривают эту тему.

asdfr1

ПолучитьПодключениеКФайловойБД(СBase);
Соединение=ПолучитьПодключениеКФайловойБД(СBase);

Запрос=СBase.NewObject("Запрос");     //+ Выбираем ТОВАРЫ и ДОКУМЕНТЫ за период
Запрос.Текст=
///////////////////////////
ТЗ = Запрос.Выполнить().Выбрать();

               
Пока ТЗ.Следующий() Цикл     // получаем значения ТОВАРЫ
                           
НоменклатураСсылка        =Соединение.String(ТЗ.НоменклатураСсылка);

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

//Сообщить("Нашли Деталь  "+НайденнаяДеталь);

СтрокаДокумента = НовыйЭлемент.Детали.Добавить();
СтрокаДокумента.Деталь= НоваяДеталь.Ссылка;

КонецЦикла; // ТЗ


   НовыйЭлемент.Номер=      "К"+Прав(НомерДок, 10);
Попытка
   НовыйЭлемент.Записать(); //.Записать();
Исключение
   Предупреждение("Не удалось записать объект """ + НовыйЭлемент + """!
               |" + ОписаниеОшибки(), 60);
КонецПопытки;


   НовыйЭлемент.ПолучитьФорму("ФормаДокумента").Открыть();
   НоваяДеталь.Записать();

asdfr1

Цитата: asdfr1 от 20 янв 2014, 15:34
ПолучитьПодключениеКФайловойБД(СBase);
Соединение=ПолучитьПодключениеКФайловойБД(СBase);

Запрос=СBase.NewObject("Запрос");     //+ Выбираем ТОВАРЫ и ДОКУМЕНТЫ за период
Запрос.Текст=
///////////////////////////
ТЗ = Запрос.Выполнить().Выбрать();

               
Пока ТЗ.Следующий() Цикл     // получаем значения ТОВАРЫ
                           
НоменклатураСсылка        =Соединение.String(ТЗ.НоменклатураСсылка);

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

//Сообщить("Нашли Деталь  "+НайденнаяДеталь);

СтрокаДокумента = НовыйЭлемент.Детали.Добавить();
СтрокаДокумента.Деталь= НоваяДеталь.Ссылка;

КонецЦикла; // ТЗ


   НовыйЭлемент.Номер=      "К"+Прав(НомерДок, 10);
Попытка
   НовыйЭлемент.Записать(); //.Записать();
Исключение
   Предупреждение("Не удалось записать объект """ + НовыйЭлемент + """!
               |" + ОписаниеОшибки(), 60);
КонецПопытки;


   НовыйЭлемент.ПолучитьФорму("ФормаДокумента").Открыть();
   НоваяДеталь.Записать();

и добавляет одну позицию в табличную часть документа "Детали" и ошибкой номер документа не уникальный.

Vit1501

таких наворотов в коде я давно уже не видел:) Можете объяснить почему документ и справочник создаются в цикле а записываются после цикла? Получается что запишется только последний документ. Ну и не понимаю зачем получать объект элемента справочника и записывать его если мы его не меняем ( когда просто нашли его)?
Добавлено: 20 янв 2014, 16:18


Я бы переделал структуру кода так:
1 Получаем список номенклатуры для списания ( это ваш запрос который вы выгружаете в ТЗ)
2 создаем документ списания
3 начинаем цикл обхода ТЗ
    3.1 ищем номенклатуру в справочнике
    3.2 Если не нашли, то создаем новую номенклатуру, заполняем ее, записываем и переменной НайденнаяДеталь присваиваем ссылку на этот элемент справочника, если         нашли    то просто НайденнаяДеталь присваиваем ссылку на найденный элемент справочника
    3.3 Добавляем строку в табличную часть созданного документа
4 заканчиваем цикл
5 записываем документ

asdfr1

Цитата: Vit1501 от 20 янв 2014, 16:09
таких наворотов в коде я давно уже не видел:) Можете объяснить почему документ и справочник создаются в цикле а записываются после цикла? Получается что запишется только последний документ. Ну и не понимаю зачем получать объект элемента справочника и записывать его если мы его не меняем ( когда просто нашли его)?
Добавлено: 20 янв 2014, 16:18


... документ и справочник создаются в цикле...  не досмотрел, сделал заполнение ТабЧасти отдельно в цикле и всё заработало как надо :)! СПАСИБО!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск