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

Поиск соотношения цен из выборки

Автор Golickoff, 03 мая 2015, 14:23

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

Golickoff

Всем привет.
Есть такой отчёт кассовой смены (для наглядности)
Его движения по регистру списанных товаров выглядят следующим образом
где красным выделены движения по собственному товару, которые мне и нужны. На основании этих данных создаётся приходный кассовый ордер по наличным, полученным за собственный товар (эти данные видно в левом нижнем углу формы ОКС). Выглядит этот ПКО следующим образом
Как видите, данные по оплате не заполнены. Так произошло по той причине, что их просто нет. Нигде. Совсем.
Но заполнить их нужно. Чтобы они были похожи на действительность, я думаю сделать это так: для каждой единицы номенклатуры найти соотношение учётной суммы из регистра на второй картинке к другим единицам номенклатуры и основываясь на этих соотношениях выставить в табличной части ПКО сумму платежей, полученную делением суммы наличных за собственный товар на это соотношение.
Как это можно реализовать?

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

Запрос.УстановитьПараметр("Ссылка",Основание);
Запрос.УстановитьПараметр("Поставка", Перечисления.СтатусыПартий.Купленный);
Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Количество() = 0 Тогда

Возврат;

КонецЕсли;

ПровСумДокумент = 0;
ПровСумДоговор = 0;
ПровСумНДС = 0;
СуммаНДСДок = ПолучитьНДСДокумента(Основание);

Пока Выборка.Следующий() Цикл

СтрокаТЧ = ДокументОбъект.ВзаиморасчетыПодробно.Добавить();
СтрокаТЧ.ДоговорКонтрагента      = Основание.ДоговорКонтрагента;
СтрокаТЧ.КратностьВзаиморасчетов = ВзаиморасчетыОстаток.Кратность;
СтрокаТЧ.КурсВзаиморасчетов      = ВзаиморасчетыОстаток.Курс ;
СтрокаТЧ.ОснованиеВзаиморасчетов = ?(УчетВзаиморасчетовПоДокументам, Основание, Неопределено);
СтрокаТЧ.СтавкаНДС = Выборка.СтавкаНДС;
СтрокаТЧ.Сумма                   = "";//////Вот     две        надо          делением    соотношение
СтрокаТЧ.СуммаВзаиморасчетов     = "";//////    эти     строки     заполнить          на
СтрокаТЧ.СуммаНДС          =  РассчитатьСуммуНДС(СтрокаТЧ.Сумма,
                                                   Истина, Истина,
                                                   ПолучитьСтавкуНДС(Выборка.СтавкаНДС));
ПровСумДокумент = ПровСумДокумент+СтрокаТЧ.Сумма;
ПровСумДоговор = ПровСумДоговор+СтрокаТЧ.СуммаВзаиморасчетов;
ПровСумНДС                       = ПровСумНДС+СтрокаТЧ.СуммаНДС;

КонецЦикла;

Данные из регистра можно легко вытащить вот этим запросом:
"ВЫБРАТЬ
                           |   СписанныеТовары.Номенклатура КАК Номенклатура,
                           |   СУММА(СписанныеТовары.СуммаУчетная) КАК Сумма
                           |ИЗ
                           |   РегистрНакопления.СписанныеТовары КАК СписанныеТовары
                           |ГДЕ
                           |   СписанныеТовары.Регистратор = &Ссылка
                           |   И СписанныеТовары.ДоговорПоставщика = &Поставка
                           |СГРУППИРОВАТЬ ПО
                           |   Номенклатура"
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

vitasw

Тут же возникает вопрос, а какое вообще имеет отношение себестоимость товаре к оплате от клиентов?

Golickoff

Цитата: vitasw от 03 мая 2015, 22:40
Тут же возникает вопрос, а какое вообще имеет отношение себестоимость товаре к оплате от клиентов?
Тут речь идёт вообще не о себестоимости. При формировании ПКО на основании ОКС пользователь выбирает вид формирования между собственным и комиссионным товаром. После этого в таблицу ПКО заносятся товары в зависимости от выбора пользователя. Т.к. это ПКО, там должна храниться информация только о наличных. Т.е. в каждой строке должна быть информация о сумме наличных, полученных за товар в этой строке. И чтобы получить хотя бы приблизительное количество денег, мне нужно поделить сумму наличных за собственный/комиссионный товар, которая есть в ОКС, на соотношение, о котором я писал ранее. Тут себестоимость вообще никак не затрагивается.

Я могу дописать текст запроса, получающего данные для ПКО и взять информацию о деньгах за каждую единицу номенклатуры. Но как мне потом найти соотношение между этими строками данных из запроса, я не могу разобраться.
Добавлено: 04 мая 2015, 06:15


В общем, я разобрался сам. Сейчас допишу код и выложу, чтобы прояснить что я хотел.
Добавлено: 04 мая 2015, 13:11


В общем, задача была такой:
Дано:

МассивА = {1,2,3,4,5}
МассивБ = {a,b,c,d,e}
МассивБ[0]+МассивБ[1]+МассивБ[2]+МассивБ[3]+МассивБ[4] = 100
МассивА[4]/МассивА[0] = МассивБ[4]/МассивБ[0]
МассивА[4]/МассивА[1] = МассивБ[4]/МассивБ[1]
МассивА[4]/МассивА[2] = МассивБ[4]/МассивБ[2]
МассивА[4]/МассивА[3] = МассивБ[4]/МассивБ[3]

Найти:
МассивБ

Решил её так:

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

Запрос.УстановитьПараметр("Ссылка",Основание);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Количество() = 0 Тогда

Возврат;

КонецЕсли;
/////Сформирован МассивБ (С точки зрения 1С это не массив)
ПровСумДокумент = 0;
ПровСумДоговор = 0;
ПровСумНДС = 0;
СуммаНДСДок = ПолучитьНДСДокумента(Основание);
Круг = 0;
Остаток = Основание.НалСоб;
Сумма = 0;
Пока Выборка.Следующий() Цикл

СтрокаТЧ = ДокументОбъект.ВзаиморасчетыПодробно.Добавить();
СтрокаТЧ.ДоговорКонтрагента      = Основание.ДоговорКонтрагента;
СтрокаТЧ.КратностьВзаиморасчетов = ВзаиморасчетыОстаток.Кратность;
СтрокаТЧ.КурсВзаиморасчетов      = ВзаиморасчетыОстаток.Курс ;
СтрокаТЧ.ОснованиеВзаиморасчетов = ?(УчетВзаиморасчетовПоДокументам, Основание, Неопределено);
СтрокаТЧ.СтавкаНДС = Выборка.СтавкаНДС;
Если (Массив.Количество()-1) > Круг Тогда
СтрокаТЧ.Сумма                   = (КрайнееЗначение*Массив[Круг])/Массив[Массив.Количество()-1]; И вот, собственно, идёт вычисление значения МассивБ[i]
СтрокаТЧ.СуммаВзаиморасчетов     = (КрайнееЗначение*Массив[Круг])/Массив[Массив.Количество()-1];
Иначе
СтрокаТЧ.Сумма                   = Остаток-Сумма;
СтрокаТЧ.СуммаВзаиморасчетов     = Остаток-Сумма;
КонецЕсли;
СтрокаТЧ.СуммаНДС          =  РассчитатьСуммуНДС(СтрокаТЧ.Сумма,
                                                   Истина, Истина,
                                                   ПолучитьСтавкуНДС(Выборка.СтавкаНДС));
ПровСумДокумент = ПровСумДокумент+СтрокаТЧ.Сумма;
ПровСумДоговор = ПровСумДоговор+СтрокаТЧ.СуммаВзаиморасчетов;
ПровСумНДС                       = ПровСумНДС+СтрокаТЧ.СуммаНДС;
Сумма = Сумма + (КрайнееЗначение*Массив[Круг])/Массив[Массив.Количество()-1];

Круг = Круг+1;
КонецЦикла;
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

vitasw

ЭЭэээээээээээ, месье знает толк в извращениях. Но раз вы удовлетворены результатом - это уже хорошо.

Теги:

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

Рейтинг@Mail.ru

Поиск