Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
15 Дек 2017, 05:52
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Поиск соотношения цен из выборки  (Прочитано 708 раз)

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

Оффлайн Golickoff

  • ****
  • Сообщений: 359
  • РЕПУТАЦИЯ: 35
  • КПД: 10%
  • Регистрация: 2015-02-05
  • Сайт: 
  • Профессия: Ученик 1С
Всем привет.
Есть такой отчёт кассовой смены (для наглядности)
Его движения по регистру списанных товаров выглядят следующим образом
где красным выделены движения по собственному товару, которые мне и нужны. На основании этих данных создаётся приходный кассовый ордер по наличным, полученным за собственный товар (эти данные видно в левом нижнем углу формы ОКС). Выглядит этот ПКО следующим образом
Как видите, данные по оплате не заполнены. Так произошло по той причине, что их просто нет. Нигде. Совсем.
Но заполнить их нужно. Чтобы они были похожи на действительность, я думаю сделать это так: для каждой единицы номенклатуры найти соотношение учётной суммы из регистра на второй картинке к другим единицам номенклатуры и основываясь на этих соотношениях выставить в табличной части ПКО сумму платежей, полученную делением суммы наличных за собственный товар на это соотношение.
Как это можно реализовать?

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

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

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

Возврат;

КонецЕсли;

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

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

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

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


Оффлайн vitasw

  • *****
  • Сообщений: 2575
  • РЕПУТАЦИЯ: 311
  • КПД: 12%
  • Регистрация: 2015-02-10
  • Сайт: 
  • Профессия: Программист 1С
Тут же возникает вопрос, а какое вообще имеет отношение себестоимость товаре к оплате от клиентов?

Оффлайн Golickoff

  • ****
  • Сообщений: 359
  • РЕПУТАЦИЯ: 35
  • КПД: 10%
  • Регистрация: 2015-02-05
  • Сайт: 
  • Профессия: Ученик 1С
Тут же возникает вопрос, а какое вообще имеет отношение себестоимость товаре к оплате от клиентов?
Тут речь идёт вообще не о себестоимости. При формировании ПКО на основании ОКС пользователь выбирает вид формирования между собственным и комиссионным товаром. После этого в таблицу ПКО заносятся товары в зависимости от выбора пользователя. Т.к. это ПКО, там должна храниться информация только о наличных. Т.е. в каждой строке должна быть информация о сумме наличных, полученных за товар в этой строке. И чтобы получить хотя бы приблизительное количество денег, мне нужно поделить сумму наличных за собственный/комиссионный товар, которая есть в ОКС, на соотношение, о котором я писал ранее. Тут себестоимость вообще никак не затрагивается.

Я могу дописать текст запроса, получающего данные для ПКО и взять информацию о деньгах за каждую единицу номенклатуры. Но как мне потом найти соотношение между этими строками данных из запроса, я не могу разобраться.
Добавлено: 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: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

Последний раз редактировалось: Golickoff; 04 Май 2015, 13:11. Причина: Объединение сообщений

Оффлайн vitasw

  • *****
  • Сообщений: 2575
  • РЕПУТАЦИЯ: 311
  • КПД: 12%
  • Регистрация: 2015-02-10
  • Сайт: 
  • Профессия: Программист 1С
ЭЭэээээээээээ, месье знает толк в извращениях. Но раз вы удовлетворены результатом - это уже хорошо.


Теги:
 

Поиск в справочнике "Номенклатура" в УТ 11

Автор HolicРаздел Пользователям "1С - Предприятие 8"

Ответов: 0
Просмотров: 1389
Последний ответ 08 Фев 2016, 20:53
от Holic
Поиск стандартных процедур модуля формы из другой формы.

Автор Дамир ТлеухановРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 3
Просмотров: 744
Последний ответ 18 Авг 2016, 11:50
от MuI_I_Ika
Как установить "Поиск по точному совпадению" по умолчанию?

Автор BulatsergРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 6
Просмотров: 1673
Последний ответ 16 Сен 2016, 14:58
от Bulatserg
Поиск и замена способа отражения расходов в документе Передача материалов в эксплуатацию

Автор Елена ПлаксинаРаздел Пользователям "1С - Предприятие 8"

Ответов: 5
Просмотров: 2559
Последний ответ 08 Авг 2015, 00:37
от Дмитрий@
Поиск в основной форме обработки ссылок на формирование табличной части

Автор Nail2010Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 5
Просмотров: 3530
Последний ответ 21 Дек 2010, 10:02
от Nail2010

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
175 Сообщений
ilyay ilyay
69 Сообщений
oleg-x
48 Сообщений
alex0402
44 Сообщений
AIFrame
39 Сообщений
andron81_81
38 Сообщений
MuI_I_Ika MuI_I_Ika
33 Сообщений
Golickoff Golickoff
31 Сообщений
BuhRust
30 Сообщений
Dima Dddd Dima Dddd
26 Сообщений

* Кто онлайн

  • Точка Гостей: 289
  • Точка Скрытых: 0
  • Точка Пользователей: 4
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal