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

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

Автор miraclless, 18 фев 2025, 17:27

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

miraclless

&НаКлиенте
Процедура НоменклатураРеализацииПриИзменении(Элемент)
   Элементы.ФормированиеСчетаАктаКлиенту.Доступность = Истина;
КонецПроцедуры


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

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

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

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

Шпаргалка для себя, вопросов не имею, но если у вас есть варианты как улучшить, то оч поможете

antoneus

Вот эти все Справочник.НайтиПоНаименованию надо выносить за цикл.
Совсем некуда шпаргалки складывать?)

miraclless

antoneus, Здравствуйте. Понял, вы правы, что надо вынести.  :ooifh:  :ooifh:  :ooifh:  :ooifh: . Да, извините, если это вам мешает. Просто очень долго над этим сидел :fdbsdfbsd:

miraclless

Не понимаю, как удалить или изменить вопрос или тему

Теги:

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

Рейтинг@Mail.ru

Поиск