Данная функция является типовой.
Конфигурация - ЕРП 2.4.
Возвращает неправильную цену.
Функция ЗаполнитьЦены(ТабличнаяЧасть, ВыделенныеСтроки = Неопределено, ПараметрыЗаполнения = Неопределено, СтруктураДействий = Неопределено) Экспорт
ЦеныЗаполнены = Ложь;
Если ПараметрыЗаполнения = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Параметры заполнения не указаны';
|en = 'Population parameters are not specified'");
Возврат ЦеныЗаполнены;
КонецЕсли;
КэшированныеЗначения = Неопределено;
// Получение структуры параметров по умолчанию
Параметры = Новый Структура(
"ПоляЗаполнения, КолонкиПоЗначению, ДругиеИменаКолонок",
"Цена", Новый Структура, Новый Структура);
ОбщегоНазначенияУТКлиентСервер.ДополнитьСтруктуру(Параметры, ПараметрыЗаполнения, Истина);
// Проверки входящих данных
Если Не Параметры.Свойство("Соглашение") И Не Параметры.Свойство("ВидЦены") Тогда
ВызватьИсключение НСтр("ru = 'В параметрах заполнения должны быть указаны ""Соглашение"" или ""ВидЦены""';
|en = '""Agreement"" or ""ВидЦены"" should be specified in population parameters'");
Возврат ЦеныЗаполнены;
ИначеЕсли Не Параметры.Свойство("Дата") Или Не Параметры.Свойство("Валюта") Тогда
ВызватьИсключение НСтр("ru = 'В параметрах заполнения должны быть указаны ""Валюта"" и ""Дата""';
|en = 'Specify ""Currency"" and ""Date"" in the population parameters'");
Возврат ЦеныЗаполнены;
КонецЕсли;
ДополнительныеКолонки = "";
ЕстьКоличествоУпаковок = Ложь;
ЕстьКодСтроки = Ложь;
Если ТипЗнч(ТабличнаяЧасть) = Тип("ТаблицаЗначений") Тогда
ЕстьКоличествоУпаковок = ТабличнаяЧасть.Колонки.Найти("КоличествоУпаковок") <> Неопределено;
Иначе
ЕстьКоличествоУпаковок = ТабличнаяЧасть.Выгрузить(Новый Массив).Колонки.Найти("КоличествоУпаковок") <> Неопределено;
КонецЕсли;
Если ТипЗнч(ТабличнаяЧасть) = Тип("ТаблицаЗначений") Тогда
ЕстьКодСтроки = ТабличнаяЧасть.Колонки.Найти("КодСтроки") <> Неопределено
И ТабличнаяЧасть.Колонки.Найти("ЗаказКлиента") <> Неопределено;
Иначе
ТЧДляПроверки = ТабличнаяЧасть.Выгрузить(Новый Массив);
ЕстьКодСтроки = ТЧДляПроверки.Колонки.Найти("КодСтроки") <> Неопределено
И ТЧДляПроверки.Колонки.Найти("ЗаказКлиента") <> Неопределено;
КонецЕсли;
Если ЕстьКоличествоУпаковок Тогда
ДополнительныеКолонки = ?(Параметры.Свойство("РассчитыватьНаборы") И Параметры.РассчитыватьНаборы, "," + "Количество, КоличествоУпаковок, НоменклатураНабора, ХарактеристикаНабора", "");
Иначе
ДополнительныеКолонки = ?(Параметры.Свойство("РассчитыватьНаборы") И Параметры.РассчитыватьНаборы, "," + "Количество, НоменклатураНабора, ХарактеристикаНабора", "");
КонецЕсли;
// Получение выгрузки по табличной части
Таблица = ОбщегоНазначенияУТ.ВыгрузитьТаблицуЗначений(
ТабличнаяЧасть,
ВыделенныеСтроки,
"НомерСтроки, Номенклатура, Характеристика, Упаковка" + ДополнительныеКолонки,
Параметры.КолонкиПоЗначению,
Параметры.ДругиеИменаКолонок);
МаксимальныйИндексСтроки = 0;
Для Каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
Если СтрокаТЧ.НомерСтроки > МаксимальныйИндексСтроки Тогда
МаксимальныйИндексСтроки = СтрокаТЧ.НомерСтроки;
КонецЕсли;
КонецЦикла;
КоэффициентыПропорциональностиРасчетаЦенНаборов = Неопределено;
ДанныеПоКоличествуНаборов = Неопределено;
Если Параметры.Свойство("РассчитыватьНаборы") И Параметры.РассчитыватьНаборы Тогда
Если НЕ ЕстьКоличествоУпаковок Тогда
Таблица.Колонки.Добавить("КоличествоУпаковок", ОбщегоНазначенияУТ.ПолучитьОписаниеТиповЧисла(15,3));
Для Каждого СтрокаТЧ Из Таблица Цикл
СтрокаТЧ.КоличествоУпаковок = СтрокаТЧ.Количество;
КонецЦикла;
КонецЕсли;
КоэффициентыПропорциональностиРасчетаЦенНаборов = НаборыСервер.КоэффициентыРаспределения(Таблица, Параметры);
ДанныеПоКоличествуНаборов = КоличествоНаборов(Таблица);
Наборы = КоэффициентыПропорциональностиРасчетаЦенНаборов.Скопировать();
Наборы.Свернуть("НоменклатураНабора, ХарактеристикаНабора");
Индекс = МаксимальныйИндексСтроки;
Для Каждого Строка Из Наборы Цикл
Индекс = Индекс + 1;
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.НомерСтроки = Индекс;
НоваяСтрока.Номенклатура = Строка.НоменклатураНабора;
НоваяСтрока.Характеристика = Строка.ХарактеристикаНабора;
НоваяСтрока.Упаковка = Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка();
КонецЦикла;
Таблица.Колонки.Удалить("Количество");
Таблица.Колонки.Удалить("КоличествоУпаковок");
КонецЕсли;
// Получение запроса
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Параметры.Дата), Параметры.Дата, ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Валюта", Параметры.Валюта);
Запрос.УстановитьПараметр("Таблица", Таблица);
Запрос.Текст = Запрос.Текст + ПолучитьТекстЗапросаВременнойТаблицыТоваров("втТаблицаТовары");
Если Параметры.Свойство("ВидЦены") Тогда
Запрос.УстановитьПараметр("ВидЦены", Параметры.ВидЦены);
Запрос.Текст = Запрос.Текст + ПолучитьТекстЗапросаВременнойТаблицыЦен("втТаблицаЦены", "втТаблицаТовары", Истина);
Запрос.Текст = Запрос.Текст + "
|ВЫБРАТЬ
| втТаблицаТовары.НомерСтроки КАК НомерСтроки,
| втТаблицаЦены.ВидЦены КАК ВидЦены,
| втТаблицаЦены.Цена КАК Цена
|ИЗ
| втТаблицаТовары КАК втТаблицаТовары
| ЛЕВОЕ СОЕДИНЕНИЕ втТаблицаЦены КАК втТаблицаЦены
| ПО (втТаблицаЦены.НомерСтроки = втТаблицаТовары.НомерСтроки)";
ИначеЕсли Параметры.Свойство("Соглашение") Тогда
Запрос.УстановитьПараметр("Соглашение", Параметры.Соглашение);
Запрос.УстановитьПараметр("Организация", ?(Параметры.Свойство("Организация"), Параметры.Организация, Справочники.Организации.ПустаяСсылка()));
Запрос.УстановитьПараметр("НалогообложениеНДС", ?(Параметры.Свойство("НалогообложениеНДС"), Параметры.НалогообложениеНДС, Перечисления.ТипыНалогообложенияНДС.ПустаяСсылка()));
Запрос.УстановитьПараметр("ВозвращатьМногооборотнуюТару", ?(Параметры.Свойство("ВозвращатьМногооборотнуюТару"), Параметры.ВозвращатьМногооборотнуюТару, Ложь));
Запрос.Текст = Запрос.Текст + ПолучитьТекстЗапросаВременнойТаблицыЦенПоСоглашению("втТаблицаЦеныПоСоглашению", "втТаблицаТовары");
Запрос.Текст = Запрос.Текст + ПолучитьТекстЗапросаВременнойТаблицыЦен("втТаблицаЦеныПоВидуЦен", "втТаблицаЦеныПоСоглашению", Ложь);
Запрос.Текст = Запрос.Текст + "
|ВЫБРАТЬ
| втТаблицаЦеныПоСоглашению.НомерСтроки КАК НомерСтроки,
| втТаблицаЦеныПоСоглашению.ВидЦены КАК ВидЦены,
| втТаблицаЦеныПоСоглашению.СтавкаНДС КАК СтавкаНДС,
| втТаблицаЦеныПоСоглашению.СрокПоставки КАК СрокПоставки,
| ВЫБОР
| КОГДА втТаблицаЦеныПоСоглашению.Цена = 0
| ТОГДА втТаблицаЦеныПоВидуЦен.Цена
| ИНАЧЕ втТаблицаЦеныПоСоглашению.Цена
| КОНЕЦ КАК Цена
|ИЗ
| втТаблицаЦеныПоСоглашению КАК втТаблицаЦеныПоСоглашению
| ЛЕВОЕ СОЕДИНЕНИЕ втТаблицаЦеныПоВидуЦен КАК втТаблицаЦеныПоВидуЦен
| ПО (втТаблицаЦеныПоВидуЦен.НомерСтроки = втТаблицаЦеныПоСоглашению.НомерСтроки)";
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат ЦеныЗаполнены;
КонецЕсли;
СтруктураЗаполнения = Новый Структура(Параметры.ПоляЗаполнения);
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Расчет цен комплектующих набора
Если Выборка.НомерСтроки > МаксимальныйИндексСтроки Тогда
НайденныеСтроки = Таблица.НайтиСтроки(Новый Структура("НомерСтроки", Выборка.НомерСтроки));
Если НайденныеСтроки.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
Отбор = Новый Структура;
Отбор.Вставить("НоменклатураНабора", НайденныеСтроки[0].Номенклатура);
Отбор.Вставить("ХарактеристикаНабора", НайденныеСтроки[0].Характеристика);
НайденныеСтроки = КоэффициентыПропорциональностиРасчетаЦенНаборов.НайтиСтроки(Отбор);
КоличествоНаборов = 1;
ДанныеПоКоличествуНаборовНайденныеСтроки = ДанныеПоКоличествуНаборов.НайтиСтроки(Отбор);
Если ДанныеПоКоличествуНаборовНайденныеСтроки.Количество() > 0 Тогда
КоличествоНаборов = ДанныеПоКоличествуНаборовНайденныеСтроки[0].КоличествоМинимум;
КонецЕсли;
ОбщаяСтоимость = 0;
СуммаКРаспределению = Выборка.Цена * КоличествоНаборов;
СлужебнаяТЧ = Новый ТаблицаЗначений;
СлужебнаяТЧ.Колонки.Добавить("СтрокаТЧ");
СлужебнаяТЧ.Колонки.Добавить("Количество");
СлужебнаяТЧ.Колонки.Добавить("Стоимость");
Для Каждого ТекущаяСтрока Из НайденныеСтроки Цикл
СтрокаТЧ = ТабличнаяЧасть[ТекущаяСтрока.НомерСтроки - 1];
Если ЕстьКодСтроки И СтрокаТЧ.КодСтроки <> 0 Тогда
Продолжить;
КонецЕсли;
Стоимость = ТекущаяСтрока.Цена;
Количество = ?(ЕстьКоличествоУпаковок, СтрокаТЧ.КоличествоУпаковок, СтрокаТЧ.Количество);
НоваяСтрока = СлужебнаяТЧ.Добавить();
НоваяСтрока.СтрокаТЧ = СтрокаТЧ;
НоваяСтрока.Стоимость = Стоимость;
НоваяСтрока.Количество = Количество;
ОбщаяСтоимость = ОбщаяСтоимость + ТекущаяСтрока.Цена;
КонецЦикла;
СлужебнаяТЧ.Сортировать("Количество УБЫВ");
НомерСтроки = 0;
КоличествоСтрок = СлужебнаяТЧ.Количество();
Для Каждого ТекущаяСтрока Из СлужебнаяТЧ Цикл
СтрокаТЧ = ТекущаяСтрока.СтрокаТЧ;
Стоимость = ТекущаяСтрока.Стоимость;
Количество = ТекущаяСтрока.Количество;
НомерСтроки = НомерСтроки + 1;
ЗаполнитьЗначенияСвойств(СтруктураЗаполнения, Выборка);
ЗаполнитьЗначенияСвойств(СтрокаТЧ, СтруктураЗаполнения);
Если Количество <> 0 И ОбщаяСтоимость <> 0 Тогда
СтрокаТЧ.Цена = Окр(((Стоимость / ОбщаяСтоимость) * СуммаКРаспределению) / Количество, 2);
Иначе
СтрокаТЧ.Цена = 0;
КонецЕсли;
ОбщаяСтоимость = ОбщаяСтоимость - Стоимость;
СуммаКРаспределению = СуммаКРаспределению - СтрокаТЧ.Цена * Количество;
Погрешность = 0;
Если НомерСтроки = КоличествоСтрок Тогда
Погрешность = СуммаКРаспределению;
КонецЕсли;
Если СтруктураДействий <> Неопределено Тогда
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомПогрешностиОкругления", Погрешность);
КонецЕсли;
Если СтруктураДействий <> Неопределено Тогда
ОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(СтрокаТЧ, СтруктураДействий, КэшированныеЗначения);
КонецЕсли;
КонецЦикла;
Иначе
ЗаполнитьЗначенияСвойств(СтруктураЗаполнения, Выборка);
Если ТипЗнч(ТабличнаяЧасть) <> Тип("ТаблицаЗначений") Тогда
СтрокаТЧ = ТабличнаяЧасть[Выборка.НомерСтроки - 1];
Иначе
НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(Новый Структура("НомерСтроки", Выборка.НомерСтроки));
Если НайденныеСтроки.Количество() > 0 Тогда
СтрокаТЧ = НайденныеСтроки[0];
Иначе
Продолжить;
КонецЕсли;
КонецЕсли;
ЗаполнитьЗначенияСвойств(СтрокаТЧ, СтруктураЗаполнения);
Если СтруктураДействий <> Неопределено Тогда
ОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(СтрокаТЧ, СтруктураДействий, КэшированныеЗначения);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Показать
Данный кусок из функции на этот участке неправильно предоставляет данные по цене номенклатуры.
ЗаполнитьЗначенияСвойств(СтруктураЗаполнения, Выборка);
Если ТипЗнч(ТабличнаяЧасть) <> Тип("ТаблицаЗначений") Тогда
СтрокаТЧ = ТабличнаяЧасть[Выборка.НомерСтроки - 1];
Иначе
НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(Новый Структура("НомерСтроки", Выборка.НомерСтроки));
Если НайденныеСтроки.Количество() > 0 Тогда
СтрокаТЧ = НайденныеСтроки[0];
Иначе
Продолжить;
КонецЕсли;
КонецЕсли;
ЗаполнитьЗначенияСвойств(СтрокаТЧ, СтруктураЗаполнения);
Если СтруктураДействий <> Неопределено Тогда
ОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(СтрокаТЧ, СтруктураДействий, КэшированныеЗначения);
КонецЕсли;
Показать
Отладчиком уже прошелся.
Проблема выявилась при копировании документа из формы списка.
Из-за неправильной цены, сумма документа неправильно проставляется.
Тут код, который предоставляет цену на текущую дату.
(4) В общем с другом посидели и посмотрели, что сейчас требуется сделать обход по документу.
Получить сумму документа при копировании.
Но есть трудности.
(11) Сейчас покажу.
Приложил два скрина.
На одном я просто открыл документ , чтобы показать какая инфа.
На втором отображаются реквизиты, которые показывают не правильную инфу.
Находятся в подвале.
В цикле все работает.
[1C-CODE]
Для каждого Стр Из ТаблицаТовары Цикл
Стр.Сумма = Стр.Цена * Стр.Количество;
Стр.СуммаНДС = Окр(Стр.Сумма * ( 20 / 100),2);
Стр.СуммаСНДС = Стр.Сумма + Стр.СуммаНДС;
Сообщить(Стр.СуммаНДС);
Сообщить(Стр.СуммаСНДС);
в первоисточнике сумма была одна, а в копии стала иной?
Пользователь тут не при чем, все дело в криворукости "копировщика": в исходном документе цена уже включала НДС, а в копии вы на нее еще раз накручиваете 20%.
(16) Во первых необходимо обязательно контролировать установку "Цена включает НДС" ибо если она включает это одно , а если НДС сверху , то это совсем другие цифры.
Если цена включает , то НДС = Цена *20/120
Если цена не включает , то НДС = Цена *20/100
И у вас разница по ходу из-за того что вы игнорируете эту опцию