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

Как найти соответствия между двумя документами

Автор strelok240378, 30 янв 2012, 23:12

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

strelok240378

Помогите пожалуйста. Есть два типа документов. По одним отпускается товар (расходная накладная) по другим оплачивается (приходно кассовый ордер). Одним ПКО может закрываться несколько РН. И наоборот, одна РН может закрываться несколькими ПКО. Закрытие РН происходит в конце отчетного периода. Как написать процедуру которая будет в соответствии с FIFO или LIFO находить соответствие для каждой РН - ПКО и для каждого ПКО -  РН? 

cska-fanat-kz

Как? Руками.

Для начала неплохо было бы свой вариант (пусть и неправильный) привести...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

strelok240378

 
  &НаСервере
Процедура ПолучитьРаспределение(Контрагент)
   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   ПродажаТовара.Ссылка,
      |   ПродажаТовара.СуммаДокумента
      |ИЗ
      |   Документ.ПродажаТовара КАК ПродажаТовара
      |ГДЕ
      |   ПродажаТовара.Контрагент = &Контрагент";

   Запрос.УстановитьПараметр("Контрагент", Контрагент);

   Результат = Запрос.Выполнить();

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

   Запрос.УстановитьПараметр("Контрагент", Контрагент);

   Результат = Запрос.Выполнить();

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

strelok240378

Процедура в модуле формы документа. Пока только выбирает документы ПКО и РН и помещает их в одну табличную часть.
Сам механизм поиска соответствий только начал делать, но он основан на полученых таблицах значений.
Перебирая их планирую находить  соответствия. Подскажите так можно?

cska-fanat-kz

Надо завести регистр накопления:
измерения - номенклатура, РН
ресурсы - количество, сумма

Документ РН делает приходные движения в него и соответственно прописывается в измерение РН.
А ПКО делает расходные движения перебирая "партии" соответственно методу списания...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Теги:

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

Рейтинг@Mail.ru

Поиск