В комплексной конфигурации 7.7 типовой механизм ценообразования не удобный. Имеется обработка "Формирование цен", которая может устанавливать значения в справочнике цен. Но изменение цен зависимых от закупки, когда оформляется "Поступление ТМЦ" не предусмотрено. Нет документа установки цен. Отсутствие явной связи цены с закупкой не позволяет оценить эффективность ценообразования закупок и продаж.
Поэтому необходимо выполнить несложную доработку топовой конфигурации - предусмотреть документ установки цен на основании документа Поступление ТМЦ. Ссылка на документ установки цен в справочнике цен создаст непосредственную связь цены с её причиной - поступлением ТМЦ и повысит прозрачность ценообразования.
Отдельный документ установки цен нужен потому, что пополнение основных запасов на главном складе фирмы должно менять действующие продажные цены, а разовый транзит - не должен менять.
Пример документа формирования цен приведен в во вложенном файле конфигурации 1cv7.md. Если будете объединять конфигурацию с поступления ТМЦ галку снимите, он нужен в файле чтобы документе "Формирование цен" была заполнена ссылка на документ основания в процессе объединения конфигураций. Формирование цен по структуре близок к установке цен номенклатуры ERP.
Перем ВремЗак,ВремОпт,ВремМин,ТекТип;
Перем РегПарт,ТаблИтогов,глФирма,СтарВалЗак,СтарВалПрод;
Перем ДатЦен;
Перем ТЦена, Зак;
Перем ПеренестиВНачалоДняПриИзмененииДаты;
Процедура ПриИзмененииДаты()
ПеренестиВНачалоДняПриИзмененииДаты = 1;
КонецПроцедуры
//Перем кнКалина;
//******************************************************************************
// ИнформацияОНоменклатуре()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Строка информации о Номенклатуре в документе
//
// Описание:
// Формирует строку, включающую название, артикул Номенклатуры, реквизиты партии
//
Функция ИнформацияОНоменклатуре()
ИнфоТекст="";
Если Номенклатура.Выбран()=0 Тогда
Возврат(ИнфоТекст);
КонецЕсли;
ИнфоТекст=ИнфоТекст+СокрЛП(Номенклатура.ПолноеНаименование());
Если ПустоеЗначение(Номенклатура.Артикул)=0 Тогда
ИнфоТекст=?(ИнфоТекст="","",ИнфоТекст+",");
ИнфоТекст=ИнфоТекст+" арт. "+СокрЛП(Номенклатура.Артикул);
КонецЕсли;
Возврат(ИнфоТекст);
КонецФункции //ИнформацияОНоменклатуре()
//*******************************************
Функция ПолучитьЦену(Номен,ТипЦены,Дат,ТекВал)
ТекЦен = 0;
ТекЕд = "";
ТекТип.НайтиПоНаименованию(ТипЦены,0,1);
глВернутьЦену(Номен,ТекТип.ТекущийЭлемент(),Дат,ТекЦен,ТекЕд,ТекВал,,,Фирма);
Возврат ТекЦен;
КонецФункции
//******************************************************************************
// ДобавитьПроцент()
Процедура ДобавитьПроцент()
Если ПроцНац<>0 Тогда
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
Наценка = Наценка+ ПроцНац;
ВремОпт = Закупочные + Закупочные*Наценка/100;
Оптовые = глПересчет(ВремОпт,ВалютаЗакупки,ДатаДок,ВалютаПродажи,ДатаДок);
КонецЦикла;
КонецЕсли;
КонецПроцедуры // ДобавитьПроцент()
//******************************************************************************
Процедура Новая()
Дат = ?(ПустоеЗначение(ДатЦен) = 1,ДатаДок,ДатЦен);
Если Номенклатура.Выбран() = 1 Тогда
Вал = "";
Закупочные = ПолучитьЦену(Номенклатура,"Закупочные",Дат,Вал);
// Закупочные = ПолучитьЦену(Номенклатура,"Закупочные",ДатаДок,Вал);
ВалютаЗакупки = Вал;
Вал = "";
Оптовые = ПолучитьЦену(Номенклатура,"Оптовые",Дат,Вал);
// Оптовые = ПолучитьЦену(Номенклатура,"Оптовые",ДатаДок,Вал);
ВалютаПродажи = Вал;
Минимальные = глПересчет(ПолучитьЦену(Номенклатура,"МинимальнаяПродажи",Дат,Вал),Вал,ДатаДок,ВалютаЗакупки,ДатаДок);
// Минимальные = глПересчет(ПолучитьЦену(Номенклатура,"МинимальнаяПродажи",ДатаДок,Вал),Вал,ДатаДок,ВалютаПродажи,ДатаДок);
ВремЗак = глПересчет(Закупочные,ВалютаЗакупки,ДатаДок,ВалютаПродажи,ДатаДок);
ВремМин = глПересчет(Минимальные,ВалютаЗакупки,ДатаДок,ВалютаПродажи,ДатаДок);
Наценка = ?(ВремЗак=0,0,(Оптовые - ВремЗак)*100/ВремЗак);
Скидка = ?(ВремЗак=0,0,(ВремМин - ВремЗак)*100/ВремЗак);
Партнерские = ВремЗак + ВремЗак*Процент/100;
КонецЕсли;
КонецПроцедуры
//******************************************************************************
Процедура ПриИзмененииЗакупки()
ВремЗак = глПересчет(Закупочные,ВалютаЗакупки,ДатаДок,глРубли,ДатаДок);
Партнерские = ВремЗак + (ВремЗак * Процент / 100);
КонецПроцедуры
//******************************************************************************
Процедура ПриИзмененииПродажи()
ВремОпт = глПересчет(Оптовые,ВалютаПродажи,ДатаДок,ВалютаЗакупки,ДатаДок);
Если кнКалина = 0 Тогда
Наценка = ?(Закупочные=0,0,(ВремОпт - Закупочные)*100/?(Закупочные=0,1,Закупочные));
КонецЕсли;
КонецПроцедуры
//******************************************************************************
Процедура ПриИзмененииМинимальной()
Если кнКалина = 1 Тогда
Возврат;
КонецЕсли;
ВремМин = глПересчет(Минимальные,ВалютаПродажи,ДатаДок,ВалютаЗакупки,ДатаДок);
Скидка = ?(Закупочные=0,0,(ВремМин - Закупочные)*100/?(Закупочные=0,1,Закупочные));
КонецПроцедуры
//*******************************************
Процедура РасчитатьСкидкиНаценки()
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
ПриИзмененииПродажи();
ПриИзмененииМинимальной();
КонецЦикла;
КонецПроцедуры
//******************************************************************************
// ВводНаОсновании(ДокументОснование)
//
// Параметры:
// ДокуменОснование
// Возвращаемое значение:
// нет.
// Описание: Заполняет на основании документа
Процедура ВводНаОсновании(ДокументОснование)
УстановитьНовыйНомер("Фц"+ СокрЛП( Константа.ПрефиксИБ) + СокрЛП( ЮрЛицо.ПрефиксНомеровДокументов));
глЗаполнитьШапкуНаОсн(Контекст,ДокументОснование);
СинонимДокумента = ПредставлениеВида();
СинонимОснования = ДокументОснование.ПредставлениеВида();
Список = глПолучитьСписокВводимыхНаОсновании(ДокументОснование);
Поз = Список.НайтиЗначение(Вид());
// выполним проверку, можно ли вводить документ на основании ДокументОснование
Если Поз = 0 Тогда
// ДокументОснование не найден в списке разрешенных
Предупреждение("Документ """ + СинонимДокумента +
""" нельзя вводить на основании """ + СинонимОснования + """", 60);
СтатусВозврата(0);
Возврат;
КонецЕсли;
//Если ДокументОснование.Проведен() = 0 Тогда
// Сообщить("Документ нельзя вводить на основании не проведенного документа");
// СтатусВозврата(0);
// Возврат;
//КонецЕсли;
Автор = глПользователь;
ТаблТМЦ = СоздатьОбъект("ТаблицаЗначений");
ДокументОснование.ВыгрузитьТабличнуюЧасть(ТаблТМЦ);
Дат = ?(ПустоеЗначение(ДатЦен) = 1,ДатаДок,ДатЦен);
УдалитьСтроки();
ТаблТМЦ.ВыбратьСтроки();
Если ДокументОснование.Вид() = "КорректировкаПоступления" Тогда
Пока ТаблТМЦ.ПолучитьСтроку() = 1 Цикл
НоваяСтрока();
Номенклатура = ТаблТМЦ.Номенклатура;
Попытка
Коэффициент = Номенклатура.БазоваяЕдиница.Коэффициент;
Закупочные = Окр(ТаблТМЦ.Сумма/ТаблТМЦ.Количество/Коэффициент,2,1);
Исключение
Закупочные = Окр(ТаблТМЦ.Цена,2,1);
КонецПопытки;
ВалЗакупки = СоздатьОбъект("Справочник.Валюты");
ВалЗакупки.НайтиПоНаименованию("руб.");
ВалютаЗакупки = ВалЗакупки.ТекущийЭлемент();
Вал = "";
ВремМин = ПолучитьЦену(Номенклатура,"МинимальнаяПродажи",Дат,Вал);
// ВремМин = ПолучитьЦену(Номенклатура,"МинимальнаяПродажи",ДокументОснование.ДатаДок,Вал);
// ВалютаПродажи = Вал;
Оптовые = ПолучитьЦену(Номенклатура,"Оптовые",Дат,ВалютаПродажи);
// Оптовые = ПолучитьЦену(Номенклатура,"Оптовые",ДокументОснование.ДатаДок,ВалютаПродажи);
// Минимальные = ВремМин;
Минимальные = глПересчет(ВремМин,Вал,ДокументОснование.ДатаДок,ВалютаЗакупки,ДокументОснование.ДатаДок);
ВремЗак = глПересчет(Закупочные,ВалютаЗакупки,ДокументОснование.ДатаДок,ВалютаПродажи,ДокументОснование.ДатаДок);
Наценка = ?(ВремЗак=0,0,(Оптовые - ВремЗак)*100/ВремЗак);
Скидка = ?(ВремЗак=0,0,(Минимальные - ВремЗак)*100/ВремЗак);
ВремЗак = глПересчет(Закупочные,ВалютаЗакупки,ДокументОснование.ДатаДок,ВалютаПродажи,ДокументОснование.ДатаДок);
Партнерские = ВремЗак + ВремЗак*Процент/100;
КонецЦикла;
Иначе
Пока ТаблТМЦ.ПолучитьСтроку() = 1 Цикл
НоваяСтрока();
Номенклатура = ТаблТМЦ.Номенклатура;
Попытка
Закупочные = Окр(ТаблТМЦ.Сумма/ТаблТМЦ.Количество/ТаблТМЦ.Коэффициент,2,1);
Исключение
Закупочные = Окр(ТаблТМЦ.ЦенаНовая,2,1);
КонецПопытки;
ВалютаЗакупки = ДокументОснование.Валюта;
Вал = "";
ВремМин = ПолучитьЦену(Номенклатура,"МинимальнаяПродажи",Дат,Вал);
// ВремМин = ПолучитьЦену(Номенклатура,"МинимальнаяПродажи",ДокументОснование.ДатаДок,Вал);
// ВалютаПродажи = Вал;
Оптовые = ПолучитьЦену(Номенклатура,"Оптовые",Дат,ВалютаПродажи);
// Оптовые = ПолучитьЦену(Номенклатура,"Оптовые",ДокументОснование.ДатаДок,ВалютаПродажи);
// Минимальные = ВремМин;
Минимальные = глПересчет(ВремМин,Вал,ДокументОснование.ДатаДок,ВалютаЗакупки,ДокументОснование.ДатаДок);
ВремЗак = глПересчет(Закупочные,ВалютаЗакупки,ДокументОснование.ДатаДок,ВалютаПродажи,ДокументОснование.ДатаДок);
Наценка = ?(ВремЗак=0,0,(Оптовые - ВремЗак)*100/ВремЗак);
Скидка = ?(ВремЗак=0,0,(Минимальные - ВремЗак)*100/ВремЗак);
ВремЗак = глПересчет(Закупочные,ВалютаЗакупки,ДокументОснование.ДатаДок,ВалютаПродажи,ДокументОснование.ДатаДок);
Партнерские = ВремЗак + ВремЗак*Процент/100;
КонецЦикла;
КонецЕсли;
// РасчитатьСкидкиНаценки();
КонецПроцедуры
//******************************************************************************
// ПодготовитьТаблИтогов(ТаблИтогов, Фирма)
//
// Параметры:
// ТаблИтогов - таблица значений итогов регистра партий, которую и надо преобразовать.
// Фирма - элемент справочника Фирмы, фирма, указанная в документе
//
// Возвращаемое значение:
// Нет
//
// Описание:
// Преобразовывает для списания таблицу значений итогов регистра партий в зависимости
// от настройки контроля остатков
//
Процедура ПодготовитьТаблИтогов(ТаблИтогов, Фирма)
Если (Константа.КонтрольОтрицательныхОстатков = Перечисление.СпособыКонтроляОстатковТМЦ.ПоФирме)
или (Константа.КонтрольОтрицательныхОстатков = Перечисление.СпособыКонтроляОстатковТМЦ.НеКонтролировать) Тогда
Возврат; // при такой настройке считаем ТЗ уже готовой к списанию
КонецЕсли;
// В цикле по ТЗ заменим значения всех фирм, кроме переданной, на пустое значение
ПустаяФирма = ПолучитьПустоеЗначение("Справочник.Фирмы");
ТаблИтогов.ВыбратьСтроки();
Пока ТаблИтогов.ПолучитьСтроку() = 1 Цикл
Если ТаблИтогов.Фирма <> Фирма Тогда
ТаблИтогов.Фирма = ПустаяФирма;
КонецЕсли;
КонецЦикла;
// Свернем таблицу по фирме и партии
ТаблИтогов.Свернуть("Фирма,Партия,СтатусПартии,ДатаПартии,Номенклатура,МОЛ,Договор,ДокументПередачи",
"Количество,СуммаУпр,СуммаРуб,СуммаБезНДС,ПродСтоимость");
// В цикле по ТЗ заменим для всех отрицательных остатков значения пустых фирм, на переданное значение
ТаблИтогов.ВыбратьСтроки();
Пока ТаблИтогов.ПолучитьСтроку() = 1 Цикл
Если ТаблИтогов.Количество < 0 Тогда
ТаблИтогов.Фирма = Фирма;
КонецЕсли;
КонецЦикла;
// Свернем таблицу по фирме и партии
ТаблИтогов.Свернуть("Фирма,Партия,СтатусПартии,ДатаПартии,Номенклатура,МОЛ,Договор,ДокументПередачи",
"Количество,СуммаУпр,СуммаРуб,СуммаБезНДС,ПродСтоимость");
КонецПроцедуры // ПодготовитьТаблИтогов()
//*******************************************
Функция ПолучитьСреднюю(Номен)
РегПарт.УстановитьЗначениеФильтра("Номенклатура",Номен,1);
РегПарт.УстановитьЗначениеФильтра("Фирма",глФирма,1);
РегПарт.ВыгрузитьИтоги(ТаблИтогов,1,1);
ПодготовитьТаблИтогов(ТаблИтогов,глФирма);
ТаблИтогов.Сортировать("-Фирма,+СтатусПартии",1);
СредЦен = 0;
Всего = 0;
Сумма =0;
ТаблИтогов.ВыбратьСтроки();
Пока ТаблИтогов.ПолучитьСтроку() = 1 Цикл
Всего = Всего + ТаблИтогов.Количество;
Сумма = Сумма + ТаблИтогов.СуммаРуб;
КонецЦикла;
СредЦен = ?(Всего = 0,0,Сумма/Всего);
Возврат(глПересчет(СредЦен,глРубли,ДатаДок,ВалютаЗакупки,ДатаДок));
КонецФункции
//*******************************************
Процедура ПоКнопкеГруппы()
СпрНом = СоздатьОбъект("Справочник.Номенклатура");
Ответ = Вопрос("Удалить строки документа?","Да+Нет+Отмена", 60);
Если Ответ ="Да" Тогда
УдалитьСтроки();
СпрНом.ВыборГруппы(1);
Если СпрНом.Выбрать("","ФормаСписка") = 1 Тогда
Спр = СпрНом.ТекущийЭлемент();
Если Спр.ЭтоГруппа() = 1 Тогда
СпрНом.ИспользоватьРодителя(Спр);
СпрНом.ВыбратьЭлементы();
Пока СпрНом.ПолучитьЭлемент() = 1 Цикл
Если СпрНом.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;
Если ПоОстаткам=1 Тогда
Если Регистр.ОстаткиТМЦ.СводныйОстаток(,СпрНом.ТекущийЭлемент(),,,"Количество")>0 Тогда
НоваяСтрока();
Номенклатура = СпрНом.ТекущийЭлемент();
КонецЕсли;
Иначе
НоваяСтрока();
Номенклатура = СпрНом.ТекущийЭлемент();
КонецЕсли;
КонецЦикла;
Иначе
Если ПоОстаткам=1 Тогда
Если Регистр.ОстаткиТМЦ.СводныйОстаток(,СпрНом.ТекущийЭлемент(),,,"Количество")>0 Тогда
НоваяСтрока();
Номенклатура = СпрНом.ТекущийЭлемент();
КонецЕсли;
Иначе
НоваяСтрока();
Номенклатура = СпрНом.ТекущийЭлемент();
КонецЕсли;
КонецЕсли;
КонецЕсли;
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Новая();
КонецЦикла;
ИначеЕсли Ответ = "Отмена" Тогда
СтатусВозврата(0);
Возврат;
ИначеЕсли Ответ = "Нет" Тогда
СпрНом.ВыборГруппы(1);
Если СпрНом.Выбрать("","ФормаСписка") = 1 Тогда
Спр = СпрНом.ТекущийЭлемент();
Если Спр.ЭтоГруппа() = 1 Тогда
СпрНом.ИспользоватьРодителя(Спр);
// СпрНом.ВключатьПодчиненные(1);
СпрНом.ВыбратьЭлементы();
Пока СпрНом.ПолучитьЭлемент() = 1 Цикл
Если СпрНом.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;
Если ПоОстаткам=1 Тогда
Если Регистр.ОстаткиТМЦ.СводныйОстаток(,СпрНом.ТекущийЭлемент(),,,"Количество")>0 Тогда
НоваяСтрока();
Номенклатура = СпрНом.ТекущийЭлемент();
Новая();
КонецЕсли;
Иначе
НоваяСтрока();
Номенклатура = СпрНом.ТекущийЭлемент();
Новая();
КонецЕсли;
КонецЦикла;
Иначе
Если ПоОстаткам=1 Тогда
Если Регистр.ОстаткиТМЦ.СводныйОстаток(,СпрНом.ТекущийЭлемент(),,,"Количество")>0 Тогда
НоваяСтрока();
Номенклатура = СпрНом.ТекущийЭлемент();
Новая();
КонецЕсли;
Иначе
НоваяСтрока();
Номенклатура = СпрНом.ТекущийЭлемент();
Новая();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//*******************************************
Процедура ПоКнопкеСредние()
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Закупочные = ПолучитьСреднюю(Номенклатура);
КонецЦикла;
КонецПроцедуры
//******************************************************************************
// ПоКнопкеПодбор()
//
// Параметры:
// нет.
// Возвращаемое значение:
// нет.
// Описание:
Процедура ПоКнопкеПодбор()
Перем Пар;
Пар = СоздатьОбъект("СписокЗначений");
Пар.ДобавитьЗначение(0,"ВыборГруппы");
Пар.ДобавитьЗначение(глЗначениеПоУмолчанию("ОсновнаяФирма"), "Фирма");
Пар.ДобавитьЗначение(0, "ЕстьВидТМЦ");
Пар.ДобавитьЗначение("Нет", "ЦенаВподборе");
Пар.ДобавитьЗначение("Дата", "ТипГраницы");
Пар.ДобавитьЗначение(ДатаДок, "ЗначениеГраницы");
ОткрытьПодбор("Номенклатура", "ДляПодбора", Пар);
КонецПроцедуры // ПоКнопкеПодбор()
//******************************************************************************
Процедура ПриИзмененииНаценки()
ВремОпт = Закупочные + Закупочные*Наценка/100;
Оптовые = глПересчет(ВремОпт,ВалютаЗакупки,ДатаДок,ВалютаПродажи,ДатаДок);
// ПриИзмененииСкидки();
КонецПроцедуры
//******************************************************************************
Процедура ПриИзмененииСкидки()
Если кнКалина = 1 Тогда
Возврат;
КонецЕсли;
ВремМин = Закупочные + Закупочные*Скидка/100;
Минимальные = глПересчет(ВремМин,ВалютаЗакупки,ДатаДок,ВалютаЗакупки,ДатаДок);
КонецПроцедуры
//******************************************************************************
Процедура Установить_скидку()
Если кнКалина = 1 Тогда
Возврат;
КонецЕсли;
НоваяСкидка = 0.5;
Если ВвестиЧисло(НоваяСкидка, "Введите минимальную скидку для пересчета",15,2) = 1 Тогда
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Скидка = НоваяСкидка;
ВремМин = Закупочные + Закупочные*НоваяСкидка/100;
Минимальные = глПересчет(ВремМин,ВалютаЗакупки,ДатаДок,ВалютаЗакупки,ДатаДок);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
//******************************************************************************
Процедура ПриИзмененииВП()
Оптовые = глПересчет(Оптовые,СтарВалПрод,ДатаДок,ВалютаПродажи,ДатаДок);
Минимальные = глПересчет(Минимальные,СтарВалПрод,ДатаДок,ВалютаЗакупки,ДатаДок);
СтарВалПрод = ВалютаПродажи;
КонецПроцедуры
//******************************************************************************
Процедура ПриИзмененииВЗ()
Закупочные = глПересчет(Закупочные,СтарВалЗак,ДатаДок,ВалютаЗакупки,ДатаДок);
СтарВалЗак = ВалютаЗакупки;
КонецПроцедуры
//******************************************************************************
Процедура ЗаполнитьГруппу(Ном)
Если Выбран() = 0 Тогда
Записать();
КонецЕсли;
ДатЦен = ТекущийДокумент();
СпрНом = СоздатьОбъект("Справочник.Номенклатура");
СпрВал = СоздатьОбъект("Справочник.Валюты");
СпрНом.ИспользоватьРодителя(Ном);
СпрНом.ВыбратьЭлементы();
Пока СпрНом.ПолучитьЭлемент() = 1 Цикл
Если СпрНом.ЭтоГруппа() = 1 Тогда
Продолжить;
Иначе
НоваяСтрока();
Номенклатура= СпрНом.ТекущийЭлемент();
Закупочные = ПолучитьЦену(СпрНом,"Закупочные",ДатЦен,ВалютаЗакупки);
Оптовые = ПолучитьЦену(СпрНом,"Оптовые",ДатЦен,ВалютаПродажи);
// Закупочные = ПолучитьЦену(СпрНом,"Закупочные",ДатаДок,ВалютаЗакупки);
// Оптовые = ПолучитьЦену(СпрНом,"Оптовые",ДатаДок,ВалютаПродажи);
Вал = "";
ВремМин = ПолучитьЦену(СпрНом,"МинимальнаяПродажи",ДатЦен,Вал);
// ВремМин = ПолучитьЦену(СпрНом,"МинимальнаяПродажи",ДатаДок,Вал);
Минимальные = глПересчет(ВремМин,Вал,ДатаДок,ВалютаПродажи,ДатаДок);
Партнерские = ПолучитьЦену(СпрНом,"ПродажнаяДляПартнера",ДатЦен,Вал);
// Партнерские = ПолучитьЦену(СпрНом,"ПродажнаяДляПартнера",ДатаДок,Вал);
Партнерские = глПересчет(Партнерские,Вал,ДатаДок,ВалютаПродажи,ДатаДок);
КонецЕсли;
КонецЦикла;
СпрНом.ИспользоватьРодителя("");
РасчитатьСкидкиНаценки();
КонецПроцедуры
//******************************************************************************
// Предопределенная процедура
//
Процедура ОбработкаПодбора(ВыбЗнач, КонтФормыПодбора)
Если Выбран() = 0 Тогда
Записать();
КонецЕсли;
ДатЦен = ТекущийДокумент();
ВыбЗнач.ВыбратьСтроки();
Пока ВыбЗнач.ПолучитьСтроку() <> 0 Цикл
НоваяСтрока();
Номенклатура= ВыбЗнач.Номенклатура;
Закупочные = ПолучитьЦену(Номенклатура,"Закупочные",ДатЦен,ВалютаЗакупки);
Оптовые = ПолучитьЦену(Номенклатура,"Оптовые",ДатЦен,ВалютаПродажи);
// Закупочные = ПолучитьЦену(Номенклатура,"Закупочные",ДатаДок,ВалютаЗакупки);
// Оптовые = ПолучитьЦену(Номенклатура,"Оптовые",ДатаДок,ВалютаПродажи);
Вал = "";
Минимальные = ПолучитьЦену(Номенклатура,"МинимальнаяПродажи",ДатЦен,ВалютаЗакупки);
// Минимальные = ПолучитьЦену(Номенклатура,"МинимальнаяПродажи",ДатаДок,Вал);
Минимальные = глПересчет(Минимальные,Вал,ДатаДок,ВалютаПродажи,ДатаДок);
Партнерские = ПолучитьЦену(Номенклатура,"ПродажнаяДляПартнера",ДатЦен,Вал);
// Партнерские = ПолучитьЦену(Номенклатура,"ПродажнаяДляПартнера",ДатаДок,Вал);
Партнерские = глПересчет(Партнерские,Вал,ДатаДок,ВалютаПродажи,ДатаДок);
КонецЦикла;
РасчитатьСкидкиНаценки();
КонецПроцедуры // ОбработкаПодбора()
//******************************************************************************
// предопределенная процедура
//
Процедура ПоКнопкеСформировать()
КонецПроцедуры
//******************************************************************************
// предопределенная процедура
//
Процедура ПересчитатьСкидкиНаценки()
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Наценка = ?(срНаценка=0,Наценка,срНаценка);
Скидка = ?(срСкидка=0,Скидка,срСкидка);
ВремОптовые = Закупочные + Закупочные*Наценка/100;
ВремМинимальные = Закупочные + Закупочные*Скидка/100;
// Минимальные = Оптовые - Оптовые*срСкидка/100;
ВремПартнерские = Закупочные + Закупочные*Процент/100;
Оптовые = глПересчет(ВремОптовые,ВалютаЗакупки,ДатаДок,ВалютаПродажи,ДатаДок);
Если кнКалина = 0 Тогда
Минимальные = глПересчет(ВремМинимальные,ВалютаЗакупки,ДатаДок,ВалютаЗакупки,ДатаДок);
КонецЕсли;
Партнерские = глПересчет(ВремПартнерские,ВалютаЗакупки,ДатаДок,ВалютаПродажи,ДатаДок);
КонецЦикла;
КонецПроцедуры
//******************************************************************************
// предопределенная процедура
//
Процедура ВводНового(Скопирован)
УстановитьНовыйНомер("Фц"+ СокрЛП( Константа.ПрефиксИБ) + СокрЛП( ЮрЛицо.ПрефиксНомеровДокументов));
Если Скопирован = 1 Тогда
Возврат;
КонецЕсли;
Парам = Форма.Параметр;
Автор = глПользователь;
Процент = 1;
Если ТипЗначенияСтр(Парам) = "Справочник" Тогда
ЗаполнитьГруппу(Парам);
КонецЕсли;
РасчитатьСкидкиНаценки();
Валюта = глРубли;
КонецПроцедуры
Процедура ПриИзмененииГлобВалЗак()
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Если ПустоеЗначение(ВалютаЗакупки) = 1 Тогда
ВалютаЗакупки = ГлобВалЗак;
Продолжить;
КонецЕсли;
Закупочные = глПересчет(Закупочные,ВалютаЗакупки,ДатаДок,ГлобВалЗак,ДатаДок);
ВалютаЗакупки = ГлобВалЗак;
КонецЦикла;
КонецПроцедуры
Процедура ПриИзмененииГлобВалПрод()
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Если ПустоеЗначение(ВалютаПродажи) = 1 Тогда
ВалютаПродажи = ГлобВалПрод;
Продолжить;
КонецЕсли;
Оптовые = глПересчет(Оптовые,ВалютаПродажи,ДатаДок,ГлобВалПрод,ДатаДок);
Минимальные = глПересчет(Минимальные,ВалютаЗакупки,ДатаДок,ГлобВалПрод,ДатаДок);
Партнерские = глПересчет(Партнерские,ВалютаПродажи,ДатаДок,ГлобВалПрод,ДатаДок);
ВалютаПродажи = ГлобВалПрод;
КонецЦикла;
КонецПроцедуры
//******************************************************************************
// предопределенная процедура
//
Процедура ПриНачалеРедактированияСтроки()
СтарВалЗак = ВалютаЗакупки;
СтарВалПрод = ВалютаПродажи;
КонецПроцедуры
//******************************************************************************
// предопределенная процедура
//
Процедура ПриОткрытии()
ПеренестиВНачалоДняПриИзмененииДаты = 0;
Форма.Номенклатура .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Закупочные .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Наценка .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Оптовые .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Скидка .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.Минимальные .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.ВалютаПродажи .ВыполнятьФормулуТолькоПриИзменении(1);
Форма.ВалютаЗакупки .ВыполнятьФормулуТолькоПриИзменении(1);
глПроверкаРазрешенияРедактирования(Контекст);
// Если открыли только на просмотр, то надо кнопки сделать недоступными
Если Форма.ТолькоПросмотр()=1 Тогда
Форма.кнПодбор.Доступность(0);
Форма.кнЗаполнить.Доступность(0);
//Форма.кнСформировать.Доступность(0);
КонецЕсли;
Форма.КнопкаПоУмолчанию("кнЗакрыть");
Если Выбран() = 0 Тогда
Записать();
КонецЕсли;
ДатЦен = ТекущийДокумент();
//РасчитатьСкидкиНаценки();
// Процент = 1;
КонецПроцедуры // ПриОткрытии()
Процедура ПриЗаписи()
глПроверкаТА(Контекст);
Если ДатаДок>ТекущаяДата() Тогда
АвтоВремяНачалоДня();
ИначеЕсли ПеренестиВНачалоДняПриИзмененииДаты = 1 Тогда
АвтоВремяНачалоДня();
КонецЕсли;
КонецПроцедуры
Функция ВычислитьСебестоимость()
ТЦена = 0;
Если глВернутьЦену(Номенклатура,Зак,ДатаДок,ТЦена) = 1 Тогда
КонецЕсли;
Возврат ТЦена;
КонецФункции
ТекТип = СоздатьОбъект("Справочник.ТипыЦен");
ТаблИтогов = СоздатьОбъект("ТаблицаЗначений");
РегПарт = СоздатьОбъект("Регистр.ПартииНаличие");
глФирма = глЗначениеПоУмолчанию("ОсновнаяФирма");
Процент = 0.5;
кнКалина = 0;
СпрТЦен = СоздатьОбъект("Справочник.ТипыЦен");
СпрТЦен.НайтиПоКоду("Цб007"); //Зак.
Зак = СпрТЦен.ТекущийЭлемент();
При проведении документ формирования цен переносит цены из табличной части в справочник по аналогии как это делается в 1С ERP.
Перем ТипЦен,ТекТип;
//*******************************************
Функция УстановитьЦену(Номенклатура, ТипЦены, Цена,ЦенПроц,ЦенВалюта)
// Автоматически расчитываемые не записываем
СпрЦен = СоздатьОбъект("Справочник.Цены");
ДатаЦен = ДатаДок;
Если ТекТип.НайтиПоНаименованию(ТипЦены,0,1)=0 тогда
ТекТип.Новый();
ТекТип.Наименование = ТипЦены;
ТекТип.Записать();
КонецЕсли;
ТипЦен = ТекТип.ТекущийЭлемент();
Если ТипЦен.Рассчитывается = 1 Тогда
Возврат 0;
КонецЕсли;
ЦенаЦены = 0; ЕдЦены = 0; ВалютаЦены = 0; НайденнаяЦена = 0;ПроцЦены = 0;
Рез = глВернутьЦену(Номенклатура, ТипЦен, ДатаЦен, ЦенаЦены, ЕдЦены,ВалютаЦены, ПроцЦены,НайденнаяЦена);
Если (Рез = 1) Или (Рез = -1) Тогда
ВремЦена = глПересчет(Цена, ЦенВалюта, ДатаЦен, ВалютаЦены, ДатаЦен);
ВремЦена = глОкруглить(ВремЦена, ТипЦен.ПорядокОкругления);
Если (ЦенаЦены = ВремЦена)
И (ЕдЦены = Номенклатура.БазоваяЕдиница)
И (ВалютаЦены = ЦенВалюта) Тогда
ИзменилиЦену = 0; // Флаг реального изменения цены для установки свойства
Иначе
СпрЦен.НайтиЭлемент(НайденнаяЦена);
ИзменилиЦену = 1;
КонецЕсли;
Если Рез = -1 Тогда
СпрЦен.НайтиЭлемент(НайденнаяЦена);
СпрЦен.СнятьПометкуУдаления();
КонецЕсли;
Иначе
//Добавляем цену
СпрЦен.ИспользоватьДату(ДатаЦен,1);
СпрЦен.ИспользоватьВладельца(Номенклатура);
СпрЦен.Новый();
СпрЦен.Единица = Номенклатура.БазоваяЕдиница;
СпрЦен.ТипЦен = ТипЦен;
ЕдЦены = Номенклатура.БазоваяЕдиница;
ВремЦена = глОкруглить(Цена, ТипЦен.ПорядокОкругления);
// ВремЦена = Цена;
ВалютаЦены = ЦенВалюта;
ИзменилиЦену = 1;
СпрЦен.Записать();
КонецЕсли;
Если ИзменилиЦену = 1 Тогда
СпрЦен.ИспользоватьДату(ДатаЦен,1);
Эл = СоздатьОбъект("Справочник.Цены");
Эл.НайтиЭлемент(СпрЦен.ТекущийЭлемент());
//СпрЦен.Цена = ВремЦена;
//СпрЦен.Валюта = ВалютаЦены;
//СпрЦен.Процент = ЦенПроц;
УстановитьРеквизитСправочника(Эл,"Цена",Цена,ДатаЦен);
СпрЦен.Валюта = ЦенВалюта;
СпрЦен.Процент = ЦенПроц;
УстановитьРеквизитСправочника(Эл,"Единица",ЕдЦены,ДатаЦен);
СпрЦен.Записать();
КонецЕсли;
Возврат ВремЦена;
КонецФункции // УстановитьЦену()
//*******************************************
Процедура ОбработкаПроведения()
Если ДокОснование.Выбран()=1 Тогда
Если СокрЛП(ДокОснование.Склад.Код)="2" Тогда
СписокНоменклатуры = СоздатьОбъект("СписокЗначений");
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
Если СокрЛП(Номенклатура)>"" Тогда
ВыбНоменклатура = Номенклатура.ТекущийЭлемент();
СписокНоменклатуры.ДобавитьЗначение(ВыбНоменклатура);
КонецЕсли;
КонецЦикла;
Если (СписокНоменклатуры.РазмерСписка()=0) Тогда
ИначеЕсли (НазваниеНабораПрав()="Полный набор прав") Тогда
Иначе
ДатаОстатков = ТекущаяДата();
Запрос = СоздатьОбъект("Запрос");
ПустойКод = "";
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ДатаОстатков по ДатаОстатков;
|Номенклатура = Регистр.ПартииНаличие.Номенклатура;
|Количество = Регистр.ПартииНаличие.Количество;
|СуммУпр = Регистр.ПартииНаличие.СуммаУпр;
|Функция КоличествоНачОст = НачОст(Количество);
|Функция СуммУпрНачОст = НачОст(СуммУпр);
|Группировка Номенклатура без групп;
|Условие(Номенклатура В СписокНоменклатуры);
|";
ТаблОстатковПартии = СоздатьОбъект("ТаблицаЗначений");
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Сообщить("Не выполнен запрос определения текущей себестоимости");
Возврат;
КонецЕсли;
Запрос.Выгрузить(ТаблОстатковПартии,3,0);
ТаблОстатковПартии.Свернуть("Номенклатура","КоличествоНачОст,СуммУпрНачОст");
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
Если СокрЛП(Номенклатура)>"" Тогда
НомСтр = 0;
Если ТаблОстатковПартии.НайтиЗначение(Номенклатура,НомСтр,"Номенклатура")=1 Тогда
ОстатокМОЛ = ТаблОстатковПартии.ПолучитьЗначение(НомСтр,"КоличествоНачОст");
СуммаУпр = ТаблОстатковПартии.ПолучитьЗначение(НомСтр,"СуммУпрНачОст");
Если ОстатокМОЛ>0 Тогда
Если (СуммаУпр/ОстатокМОЛ>Закупочные*4)ИЛИ(СуммаУпр/ОстатокМОЛ*4<Закупочные) Тогда
Сообщить("Ошибка в "+СокрЛП(Номенклатура)+" по "+СокрЛП(СуммаУпр/ОстатокМОЛ)+" за "+СокрЛП(Закупочные));
глПечатьТаблицы(ТаблОстатковПартии,"Нельзя получать "+СокрЛП(Номенклатура)+" по "+СокрЛП(СуммаУпр/ОстатокМОЛ)+" за "+СокрЛП(Закупочные));
СтатусВозврата(0);
возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
глПроверкаТА(Контекст);
Процент = 0.5;
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
УстановитьЦену(Номенклатура,"Закупочные",Закупочные,0,ВалютаЗакупки);
УстановитьЦену(Номенклатура,"Оптовые",Оптовые,Наценка,ВалютаПродажи);
// УстановитьЦену(Номенклатура,"МинимальнаяПродажи",Минимальные,Скидка,ВалютаПродажи);
УстановитьЦену(Номенклатура,"МинимальнаяПродажи",Минимальные,Скидка,ВалютаЗакупки);
УстановитьЦену(Номенклатура,"ПродажнаяДляПартнера",Партнерские,Процент,ВалютаПродажи);
Сообщить("Обрабатываем номенклатуру "+Номенклатура);
КонецЦикла;
КонецПроцедуры
ТекТип = СоздатьОбъект("Справочник.ТипыЦен");
В том случае если ценообразование выбранных клиентов зависит, от закупки (что логично), возможна ситуация что средняя себестоимость товарного запаса на складе окажется ниже чем новая закупочная цена (если поставщик снизил свою цену). Неверно будет допустить, чтобы закупочная цена была установлена ниже средней себестоимости, что может повлечь убытки. По этой же причине нельзя вводить формирование цен на основании транзитный поступлений, а можно только на основании пополнения материальных запасов - но с оглядкой на отчет "проверка формирования цен".
Красные строки в этом отчете означают установленные закупочные цены ниже средней себестоимости товарных запасов. Последняя колонка "Дни запаса" означают сколько еще дней будет действовать данная установленная цена, что позволяет оценить возможный убыток от реализации по сниженной цене, умножив количество дней на количество среднедневной продажи и на разницу между себестоимостью и закупочной ценой.
Можно смотреть динамику изменения цен отдельного товара или группы номенклатуры или анализировать, выгрузив её в Эксель. В данном случае сортировка по наименованию.
При оформлении заявки покупателя и отгрузки клиенту необходимо делать контроль цен на минимальные.
Модуль документа "Заявка покупателя"
Процедура ОбработкаПроведения(ВидыДвижений)
...
// Контроль цен в документе.
ВыбраноПолномочиеПользователяОтключитьКонтрольЦенНижеСебестоимости = глПроверкаВозможностиПревышенияПолномочийПользователем("РазрешитьПоМинимальнымЦенам");
КонтрагентСобственнаяТорговаяТочка = Контрагент.ПринадлежитГруппе(ГруппаСобственныеТорговыеТочки);
Конт = глКонтрольЦенДокумента(Контекст);
Если (Конт = 0) Тогда
Если (Контрагент.Код = "00001395")
или (КонтрагентСобственнаяТорговаяТочка = 1) //или (Контрагент.Код = "Кб000434")
или (Контрагент.Код = "00001376") или (Контрагент.Код = "00001295")
или (ВыбраноПолномочиеПользователяОтключитьКонтрольЦенНижеСебестоимости = 1) Тогда
Иначе
СпрПолномочияПользователейПоКонтрагентам = СоздатьОбъект("Справочник.ПолномочияПользователейПоКонтрагентам");
Если (Контрагент.Код = "Кб001576") //Европа ООО
ИЛИ (СпрПолномочияПользователейПоКонтрагентам.НайтиПоРеквизиту("Покупатель",Контрагент,1)=1) Тогда
Иначе
Ответ = Вопрос("В документе есть цены меньше минимальных. Распечатать?", "Да+Нет",60);
Если Ответ= "Да" Тогда
ОткрытьФормуМодально("Отчет",Контекст,КаталогИБ()+"ExtForms\КонтрольЦен.ert");
КонецЕсли;
//Проверим полномочия на использование цен меньше минимальных
Если глПолучитьПолномочие("РазрешитьПоМинимальнымЦенам") = 0 Тогда
Сообщить("Не разрешено проводить по минимальным ценам.");
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ИначеЕсли Конт = -1 Тогда
глНеПроводить(Контекст, "В документе есть нулевые цены. Документ не проведен!");
СтатусВозврата(0);
Возврат;
ИначеЕсли Конт = -3 Тогда
Если (ИмяПользователя()="Космачев") Тогда
Иначе
глНеПроводить(Контекст, "Проблема с ценами. Документ не проведен!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
ИначеЕсли (Конт = -2) Тогда
Если (ИмяПользователя()="Космачев") Тогда
Иначе
Если ((Контрагент.Код = "00001395")
или (КонтрагентСобственнаяТорговаяТочка = 1) //или (Контрагент.Код = "Кб000434")
или (Контрагент.Код = "00001376") или (Контрагент.Код = "00001295")) и (Проведен()=1) Тогда
Иначе
СпрПолномочияПользователейПоКонтрагентам = СоздатьОбъект("Справочник.ПолномочияПользователейПоКонтрагентам");
Если (Контрагент.Код = "Кб001576") //Европа ООО
ИЛИ (СпрПолномочияПользователейПоКонтрагентам.НайтиПоРеквизиту("Покупатель",Контрагент,1)=1) Тогда
Иначе
Ответ = Вопрос("Продажа ниже себестоимости!. Распечатать?", "Да+Нет",60);
Если Ответ= "Да" Тогда
ОткрытьФормуМодально("Отчет",Контекст,КаталогИБ()+"ExtForms\КонтрольЦен1.ert");
КонецЕсли;
глНеПроводить(Контекст, "Продажа ниже себестоимости. Документ не проведен!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
...
Контроль цен в глобальном модуле
//******************************************************************************
// глКонтрольЦенДокумента(Конт)
//
// Параметры:
// Конт - контекст документа,из которого вызвана процедура
//
// Возвращемое значение:
// 1 - если контроль цен по документу пройден;
// 0 - если контроль цен по документу не пройден.
//
// Описание:
// Функция определяет ситуацию, когда цены в документе меньше цен минимальной продажи
//
Функция глКонтрольЦенДокумента(Конт) Экспорт
Перем ДатаДк; //Дата документа
Перем ВалДок; //Валюта документа
Перем МинЦена; //Минимальная цена
Перем МинМинЦ; //
Перем ЦенаПок; //Покупная цена
Перем Ед ; //Единица цены
Перем ВалМинЦена; //Валюта минимальной цены
Перем ПродЦена; //Цена продажи (за базовую единицу)
Перем КонтрольПройден; //Возвращаемое значение
Если (Константа.КонтрольЦенДокументов = 0)
ИЛИ (ИмяПользователя() = "Космачев") ИЛИ ((НазваниеНабораПрав() = "Полный набор прав")И(глПользователь.Родитель.Код="07")) Тогда
Возврат 1;
КонецЕсли;
СпрНом = СоздатьОбъект("Справочник.Номенклатура");
Если СпрНом.НайтиПоКоду("КК022762")=1 Тогда
НомРаспр1=СпрНом.ТекущийЭлемент();
КонецЕсли;
Если СпрНом.НайтиПоКоду("Цб000053")=1 Тогда
НомРаспр2=СпрНом.ТекущийЭлемент();
КонецЕсли;
ТипЦен2 = СоздатьОбъект("Справочник.ТипыЦен");
ТипЦен2.НайтиПоНаименованию("Закупочные +30%",0,1);//МинимальнаяПродажи6000
МинЦ6000 = ТипЦен2.ТекущийЭлемент();
ТипЦен2 = СоздатьОбъект("Справочник.ТипыЦен");
ТипЦен2.НайтиПоНаименованию("Закупочные +20%",0,1);//МинимальнаяПродажи15000
МинЦ15000 = ТипЦен2.ТекущийЭлемент();
ТипЦен = СоздатьОбъект("Справочник.ТипыЦен");
ТипЦен.НайтиПоНаименованию("Закупочные +18%",0,1);//МинимальнаяПродажи
Если СокрЛП(Константа.ТипЦенДляМинимальнойНаценки) > "" Тогда
ТипЦен = Константа.ТипЦенДляМинимальнойНаценки;//МинимальнаяПродажи
КонецЕсли;
МинЦ = ТипЦен.ТекущийЭлемент();
ТипЦен = СоздатьОбъект("Справочник.ТипыЦен");
ТипЦен.НайтиПоНаименованию("Закупочные",0,1);
МинМинЦ = ТипЦен.ТекущийЭлемент();
ДатаДк = Конт.ДатаДок;
ВалДок = Конт.Валюта;
КонтрольПройден = 1;
//для расчета общей прибыльности
ИтогСебест = 0;
ИтогДоход = 0;
ИтогСумма = 0;
ИтогПроцДоход = 0;
Конт.ВыбратьСтроки();
Пока Конт.ПолучитьСтроку() = 1 Цикл
ПродЦена = Окр(Конт.Сумма/?(Конт.Количество= 0,1,Конт.Количество)/?(Конт.Единица.Коэффициент=0,1,Конт.Единица.Коэффициент),2,1);
Если Конт.Номенклатура.Категория.Код = "Кб000002" Тогда
ИначеЕсли (Конт.Контрагент.НеДействуетОграничениеПоСтроке=0) и (Конт.Сумма<Константа.СуммаОграниченияПоСтроке)
и не(ИмяПользователя()="Космачев") Тогда
Сообщить("В док.№"+Конт.НомерДок+ " стр. "+СокрЛП(Конт.НомерСтроки)+" сумма не превышает минимально допустимую для отгрузки. Документ не проведен!");
Возврат -3;
//ИначеЕсли (ПродЦена = 0) Тогда
ИначеЕсли (ПродЦена = 0)И(СокрЛП(Конт.Склад.Код)<>"10") Тогда
Возврат -1;
Иначе
Если (Конт.Номенклатура.ПринадлежитГруппе(НомРаспр1)=1) или (Конт.Номенклатура.ПринадлежитГруппе(НомРаспр2)=1) Тогда
Продолжить;
КонецЕсли;
Если глВернутьЦену(Конт.Номенклатура,МинМинЦ,ДатаДк,ЦенаПок,Ед,ВалМинЦена,,,Конт.Фирма) <> 0 Тогда
ЦенаПок = ЦенаПок/?(Ед.Коэффициент = 0,1,Ед.Коэффициент); //мин цена за базовую единицу
//Пересчитаем в валюту документа
ЦенаПок = Окр(глПересчет(ЦенаПок,ВалМинЦена,ДатаДк,ВалДок,ДатаДк),2,1);
Если ПродЦена < ЦенаПок Тогда
Возврат -2;
КонецЕсли;
Иначе //Не найдена минимальная цена
Сообщить("В док.№"+Конт.НомерДок+ " стр. "+ Конт.НомерСтроки +" не задана цена закупки для "+ СокрЛП(Конт.Номенклатура));
Возврат 0;
КонецЕсли;
КонецЕсли;
Если Конт.Итог("Сумма")<6000 Тогда
Если глВернутьЦену(Конт.Номенклатура,МинЦ6000,ДатаДк,МинЦена,Ед,ВалМинЦена,,,Конт.Фирма) <> 0 Тогда
МинЦена = МинЦена/?(Ед.Коэффициент = 0,1,Ед.Коэффициент); //мин цена за базовую единицу
//Пересчитаем в валюту документа
МинЦена = Окр(глПересчет(МинЦена,ВалМинЦена,ДатаДк,ВалДок,ДатаДк),2,1);
Если ПродЦена < МинЦена Тогда
//КонтрольПройден = 0;
Сообщить("В док.№"+Конт.НомерДок+ " стр. "+ Конт.НомерСтроки +" цена продажи для "+СокрЛП(Конт.Номенклатура.Код)+" "+СокрЛП(Конт.Номенклатура.ПолнНаименование)+" "+СокрЛП(ПродЦена)+" < минимальной "+СокрЛП(МинЦена));
КонецЕсли;
Иначе //Не найдена минимальная цена
Сообщить("В док.№"+Конт.НомерДок+ " стр. "+ Конт.НомерСтроки +" не задана цена минимальной продажи для "+ СокрЛП(Конт.Номенклатура));
КонтрольПройден = 0;
КонецЕсли;
ИначеЕсли Конт.Итог("Сумма")<15000 Тогда
Если глВернутьЦену(Конт.Номенклатура,МинЦ15000,ДатаДк,МинЦена,Ед,ВалМинЦена,,,Конт.Фирма) <> 0 Тогда
МинЦена = МинЦена/?(Ед.Коэффициент = 0,1,Ед.Коэффициент); //мин цена за базовую единицу
//Пересчитаем в валюту документа
МинЦена = Окр(глПересчет(МинЦена,ВалМинЦена,ДатаДк,ВалДок,ДатаДк),2,1);
Если ПродЦена < МинЦена Тогда
//КонтрольПройден = 0;
Сообщить("В док.№"+Конт.НомерДок+ " стр. "+ Конт.НомерСтроки +" цена продажи для "+СокрЛП(Конт.Номенклатура.Код)+" "+СокрЛП(Конт.Номенклатура.ПолнНаименование)+" "+СокрЛП(ПродЦена)+" < минимальной "+СокрЛП(МинЦена));
КонецЕсли;
Иначе //Не найдена минимальная цена
Сообщить("В док.№"+Конт.НомерДок+ " стр. "+ Конт.НомерСтроки +" не задана цена минимальной продажи для "+ СокрЛП(Конт.Номенклатура));
КонтрольПройден = 0;
КонецЕсли;
Иначе
Если глВернутьЦену(Конт.Номенклатура,МинЦ,ДатаДк,МинЦена,Ед,ВалМинЦена,,,Конт.Фирма) <> 0 Тогда
МинЦена = МинЦена/?(Ед.Коэффициент = 0,1,Ед.Коэффициент); //мин цена за базовую единицу
//Пересчитаем в валюту документа
МинЦена = Окр(глПересчет(МинЦена,ВалМинЦена,ДатаДк,ВалДок,ДатаДк),2,1);
Если ПродЦена < МинЦена Тогда
//КонтрольПройден = 0;
Сообщить("В док.№"+Конт.НомерДок+ " стр. "+ Конт.НомерСтроки +" цена продажи для "+СокрЛП(Конт.Номенклатура.Код)+" "+СокрЛП(Конт.Номенклатура.ПолнНаименование)+" "+СокрЛП(ПродЦена)+" < минимальной "+СокрЛП(МинЦена));
КонецЕсли;
Иначе //Не найдена минимальная цена
Сообщить("В док.№"+Конт.НомерДок+ " стр. "+ Конт.НомерСтроки +" не задана цена минимальной продажи для "+ СокрЛП(Конт.Номенклатура));
КонтрольПройден = 0;
КонецЕсли;
КонецЕсли;
//Контроль общей прибыльности заявки
Себест = ЦенаПок * Конт.Количество;
ИтогСебест = ИтогСебест + Себест;
ИтогСумма = ИтогСумма + Конт.Сумма;
Если глПользователь.Родитель.Код="08" Тогда
Сообщить(СокрЛП(Конт.НомерСтроки)+". "+СокрЛП(Конт.Номенклатура.Код)+": "+СокрЛП(Конт.Сумма)+"-"+СокрЛП(Конт.Количество)+"*"+СокрЛП(ЦенаПок)+"="+СокрЛП(Конт.Сумма)+"-"+СокрЛП(Себест)+"="+СокрЛП(Конт.Сумма-Себест));
КонецЕсли;
КонецЦикла;
ИтогДоход = ИтогСумма - ИтогСебест;
Если (СокрЛП(Конт.Проект.Код) = "77")ИЛИ(СокрЛП(Конт.Проект.Код) = "КЭ") Тогда //кроме 7 дней и КЭШ
ИначеЕсли СокрЛП(Конт.Склад.Код)="10" Тогда //кроме бонуса
Иначе
ИтогДоходПроц = Окр(ИтогДоход/ИтогСумма*100,2);
Если Конт.Итог("Сумма")<6000 Тогда
ПроцентМинимульнойНаченкиТипаЦенМинисмальнойНаценки = МинЦ6000.Процент;
ИначеЕсли Конт.Итог("Сумма")<15000 Тогда
ПроцентМинимульнойНаченкиТипаЦенМинисмальнойНаценки = МинЦ15000.Процент;
Иначе
ПроцентМинимульнойНаченкиТипаЦенМинисмальнойНаценки = Константа.ТипЦенДляМинимальнойНаценки.Процент;
КонецЕсли;
Если ИтогДоходПроц < ПроцентМинимульнойНаченкиТипаЦенМинисмальнойНаценки Тогда
Сообщить("В док.№"+Конт.НомерДок+ " общ.приб-ть "+ СокрЛП(ИтогДоходПроц) +"% (ц.покупки "+ СокрЛП(ИтогСебест)+", прод. "+СокрЛП(ИтогСумма)+", доход "+СокрЛП(ИтогДоход));
Если (НазваниеНабораПрав() = "Полный набор прав") ИЛИ (НазваниеНабораПрав() = "Загрузка")
ИЛИ (ИмяПользователя()="Космачев") Тогда
Иначе
КонтрольПройден = 0;
Сообщить("Документ №"+Конт.НомерДок+ " не проведен!");
Возврат -2;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат КонтрольПройден;
КонецФункции //глКонтрольЦенДокумента
В случае выявления ошибки в продажной цене заявки или реализации или же для решения спорной ситуации с поставщиком, если о цене окончательно передоговорились уже после оформления отгрузки и надо массово переделать документы клиенту, продажные цены в заявках покупателей и реализациях можно исправить. В данном примере перебираются все документы заявки и реализации выбранных контрагентов за указанный период и в них вписываются правильные цены, документы перепроводятся если были проведены до исправления.
Отчеты и обработки написаны в комплексной конфигурации 4.2 (7.70.424). Версия платформы 7.70.027.