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

Создание документов через регистр сведений

Автор miraclless, 16 фев 2025, 13:08

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

miraclless

Шпаргалка. :P

&НаКлиенте
Процедура ФормированиеСчетаАктаКлиенту(Команда)
   //ТекДанные = Элементы.Список.ТекущиеДанные;
   
   МассивОдинаковыхКонтрагентов = Новый Массив();
   СтруктураПроектов = Новый Структура();
   Номер = 0;
   
   Для каждого Задание Из Элементы.Список.ВыделенныеСтроки Цикл
      Ключ = "Строка" + Строка(Номер);
      Строка = Элементы.Список.ДанныеСтроки(Задание);
      
      Если МассивОдинаковыхКонтрагентов.Количество() <> 0 Тогда
         Если МассивОдинаковыхКонтрагентов[Номер].Контрагент = Строка.Контрагент Тогда
            МассивОдинаковыхКонтрагентов[Номер].Факт = МассивОдинаковыхКонтрагентов[Номер].Факт + Строка.Факт
         Иначе   
            МассивОдинаковыхКонтрагентов.Добавить(Строка);
            Номер = Номер + 1;
         КонецЕсли;
      
      Иначе МассивОдинаковыхКонтрагентов.Добавить(Строка);   
      КонецЕсли;
      СтруктураПроектов.Вставить(Ключ,Элементы.Список.ДанныеСтроки(Задание).Проект)
   КонецЦикла;
   
   ДокСчет = ФормированиеСчета(МассивОдинаковыхКонтрагентов);
   Для каждого _Ссылка Из ДокСчет Цикл
      ПоказатьЗначение(,_Ссылка.Значение);   
   КонецЦикла;
   
   ДокАкт = ФормированиеАкта(ДокСчет, СтруктураПроектов);
   Для каждого _Ссылка Из ДокАкт Цикл
      ПоказатьЗначение(,_Ссылка.Значение);   
   КонецЦикла;
КонецПроцедуры

Функция ФормированиеСчета(СтруктураДанных)
   
   СсылкиСтруктура = Новый Структура();
   Номер = 0;
   
   Для каждого ТекДанные Из СтруктураДанных Цикл
      Счет = Документы.СчетНаОплату.СоздатьДокумент();
   
      Счет.Контрагент = ТекДанные.Контрагент;
      Счет.Договор = ТекДанные.Проект.Договор;
      Счет.Организация = Справочники.Организации.НайтиПоНаименованию("Ассоль");
      Счет.Дата = ТекущаяДата();
      Счет.ВидЦен = ТекДанные.Проект.Договор.ВидЦен;
      Счет.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ОблагаетсяНДС;
      
      Запасы = Счет.Запасы.Добавить();
      Запасы.Номенклатура = НоменклатураРеализации;
      Запасы.Количество = ТекДанные.Факт;
      Запасы.ЕдиницаИзмерения = НоменклатураРеализации.ЕдиницаИзмерения;
      Запасы.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("20%");

      Запрос = Новый Запрос;
      Запрос.Текст =
         "ВЫБРАТЬ
         |   ЦеныНоменклатурыКонтрагентовСрезПоследних.ВидЦенКонтрагента КАК ВидЦенКонтрагента,
         |   ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура,
         |   ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена КАК Цена
         |ИЗ
         |   РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних КАК ЦеныНоменклатурыКонтрагентовСрезПоследних
         |ГДЕ
         |   ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура = &Номенклатура
         |   И ЦеныНоменклатурыКонтрагентовСрезПоследних.ВидЦенКонтрагента = &ВидЦенКонтрагента";
      
      Запрос.УстановитьПараметр("Номенклатура", НоменклатураРеализации);
      Запрос.УстановитьПараметр("ВидЦенКонтрагента", ТекДанные.Проект.Договор.ВидЦенКонтрагента);
      
      РезультатЗапроса = Запрос.Выполнить();
      Выборка = РезультатЗапроса.Выбрать();
      Выборка.Следующий();
      
      Запасы.Цена = Выборка.Цена;
      Запасы.Сумма = Выборка.Цена * ТекДанные.Факт;
      Счет.Записать();
      
      Ключ = "Строка" + Строка(Номер);
      
      СсылкиСтруктура.Вставить(Ключ, Счет.Ссылка);
      
      Номер = Номер + 1;
      
   КонецЦикла;
   
   
   Возврат СсылкиСтруктура;
   
КонецФункции // ()

Функция ФормированиеАкта(ТекДанные, СтруктураПроектов)
   
   СсылкиСтруктура = Новый Структура();
   Номер = 0;
   
   Для каждого Данные Из ТекДанные Цикл
      Акт = Документы.АктВыполненныхРабот.СоздатьДокумент();
      Акт.Заполнить(Данные.Значение);
      Акт.Дата = ТекущаяДата();
      
      Для каждого Проект Из СтруктураПроектов Цикл
         Акт.РаботыИУслуги[0].Проект = Проект.Значение;
      КонецЦикла;
      
      Акт.Записать();
      
      Ключ = "Строка" + Строка(Номер);
      СсылкиСтруктура.Вставить(Ключ, Акт.Ссылка);
      Номер = Номер + 1;
   КонецЦикла;
   
   Возврат СсылкиСтруктура;
КонецФункции // ()

LexaK

miraclless,
ЦитироватьШпаргалка. :P
Хм, пример, как НЕ НАДО писать код?
(а вы его вообще запускали, очень похоже что он не рабочий...)
если помогло нажмите: Спасибо!

miraclless

LexaK, не подскажите, как можно улучшить? Да, вроде работает.

LexaK

например, проверка повторения
      Если МассивОдинаковыхКонтрагентов.Количество() <> 0 Тогда
         Если МассивОдинаковыхКонтрагентов[Номер].Контрагент = Строка.Контрагент Тогда
            МассивОдинаковыхКонтрагентов[Номер].Факт = МассивОдинаковыхКонтрагентов[Номер].Факт + Строка.Факт
         Иначе   
            МассивОдинаковыхКонтрагентов.Добавить(Строка);
            Номер = Номер + 1;
         КонецЕсли;
     
      Иначе МассивОдинаковыхКонтрагентов.Добавить(Строка);   
      КонецЕсли;


можно заменить так

Если МассивОдинаковыхКонтрагентов.Найти(Строка.Контрагент) <> Неопределено Тогда
//уже был такой контрагент, пропускаем
Продолжить;
КонецЕсли;                       

МассивОдинаковыхКонтрагентов.Добавить(Строка.Контрагент);
//и дальше код обработки  
 
 
если помогло нажмите: Спасибо!

Afinogen

У вас в источнике данных списка лежит произвольный запрос?

Строка.Факт - это не реквизит контрагента а тянется откуда то?

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

можно запихнуть в запрос например


Теги:

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

Рейтинг@Mail.ru

Поиск