четверг, 4 июня 2015 г.

1c специалист задача 1.31


Решение:
Предполагаю что способов решения этой задачи очень много, не факт что мне удалось найти самый лучший. Основной вопрос заключается  в том  чтобы определится с количеством и структурой  необходимых регистров. 
Для того чтобы продемонстрировать новую методику проведения используется регистр "Остатки номенклатуры"  с измерением "Номенклатура" и ресурсом "количество". Для вывода отчета добавлен второй регистр "Остатки оборудования" следующей структуры:

Документы будут делать след. движения по регистрам:

Приход:
 "Остатки номенклатуры" +
 "Остатки оборудования" + (со статусом "на складе")

Передача в эксплуатацию:
 "Остатки номенклатуры" -
 "Остатки оборудования" - (со статусом "на складе")
 "Остатки оборудования" + (со статусом "в эксплуатации")

Выбытие
 "Остатки оборудования" - (со статусом "в эксплуатации")

1) Приходная накладная

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.ОстаткиОборудования.Записывать = Истина;
Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Движение.Количество   = ТекСтрокаСписокНоменклатуры.Количество;
Движение = Движения.ОстаткиОборудования.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Движение.СрокГодности = ТекСтрокаСписокНоменклатуры.СрокГодности;
Движение.Статус = Перечисления.СтатусыНоменклатуры.НаСкладе;
Движение.Количество   = ТекСтрокаСписокНоменклатуры.Количество;
Движение.Стоимость   = ТекСтрокаСписокНоменклатуры.Сумма;
КонецЦикла;

КонецПроцедуры

2) Передача в эксплуатацию:



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


3) Выбытие


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

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

КонецПроцедуры

4) Отчет
ВЫБРАТЬ
ОстаткиОборудованияОстатки.Номенклатура КАК Оборудование,
ОстаткиОборудованияОстатки.КоличествоОстаток КАК Количество,
ОстаткиОборудованияОстатки.СтоимостьОстаток КАК Сумма,
РАЗНОСТЬДАТ(&ДатаОтчета, ОстаткиОборудованияОстатки.СрокГодности, ДЕНЬ) КАК ОставшийсяСрокГодности,
РАЗНОСТЬДАТ(&ДатаОтчета, ОстаткиОборудованияОстатки.СрокЭксплуатации, ДЕНЬ) КАК ОставшийсяСрокЭксплуатации
ИЗ
РегистрНакопления.ОстаткиОборудования.Остатки(&ДатаОтчета, Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыНоменклатуры.ВЭксплуатации)) КАК ОстаткиОборудованияОстатки

Скачать решение задачи 1.31 (1с специалист по платформе)

среда, 3 июня 2015 г.

1c специалист задача 1.30


Решение:
1)  Добавлены новые объекты: регистр накопления "Стоимости Товаров" и регистр сведений "Правила ценообразования".
2) С помощью конструктора формируем движения по регистрам "Приходной накладной"
3) Расходная накладная.
Добавим реквизиты:
ЭтоПродажа (булево)
Подразделение (Отправитель)
Получатель (для перемещения)

В модуле формы настроим видимость колонок цена и сумма в зависимости от вида накладной.

&НаКлиенте
Процедура ЭтоПродажаПриИзменении(Элемент)
Элементы.СписокНоменклатурыСумма.Видимость= Объект.ЭтоПродажа;
Элементы.СписокНоменклатурыЦена.Видимость = Объект.ЭтоПродажа;
КонецПроцедуры


&НаКлиенте
Процедура ПриОткрытии(Отказ)
Элементы.СписокНоменклатурыСумма.Видимость= Объект.ЭтоПродажа;
Элементы.СписокНоменклатурыЦена.Видимость = Объект.ЭтоПродажа;
КонецПроцедуры


Добавляем проверку :

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма");
Если ЭтоПродажа и Подразделение = Справочники.Подразделения.ОтделЗакупок Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Нельзя продавать с отдела закупок";
Сообщение.Сообщить();
КонецЕсли;
Если  Не ЭтоПродажа и Подразделение <> Справочники.Подразделения.ОтделЗакупок Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Перемещать товар можно только с отдела закупок";
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры


Переходим к обработке проведения
Процедура получилась не сложной, но довольно громоздкой.

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Очистить();
Движения.ОстаткиНоменклатуры.Записать();

Движения.СтоимостиНоменклатуры.Записывать = Истина;
Движения.СтоимостиНоменклатуры.Очистить();
Движения.СтоимостиНоменклатуры.Записать();


Запрос = Новый Запрос;
МВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МВТ;

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

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлементБлокировки.УстановитьЗначение("Подразделение", Подразделение);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = РезультатЗапроса;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();





Если Не ЭтоПродажа Тогда


Для Каждого ТекСтрока Из СписокНоменклатуры Цикл 
Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрока.Номенклатура;
Движение.Подразделение = Справочники.Подразделения.ОтделЗакупок;
Движение.Количество   = ТекСтрока.Количество;
КонецЦикла;
Движения.ОстаткиНоменклатуры.Записать();




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


Запрос.УстановитьПараметр("ОтделЗакупок", Справочники.Подразделения.ОтделЗакупок);
Запрос.УстановитьПараметр("ТочкаИтогов", Новый Граница(МоментВремени(),ВидГраницы.Включая));

РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда 
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара "+ Выборка.Номенклатура+ " "+ " в количестве "+(- Выборка.Остаток);
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;

Если Не Отказ Тогда


Для Каждого ТекСтрока Из СписокНоменклатуры Цикл 
Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрока.Номенклатура;
Движение.Подразделение = Справочники.Подразделения.ОтделЗакупок;
Движение.Количество   = ТекСтрока.Количество;
КонецЦикла;




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

Запрос.УстановитьПараметр("ТочкаИтогов", Новый Граница(МоментВремени(),ВидГраницы.Исключая));
Запрос.УстановитьПараметр("ТорговаяТочка", Получатель);


РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда 


Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Движение = Движения.СтоимостиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрока.Номенклатура;
Движение.Подразделение = Справочники.Подразделения.ОтделЗакупок;
Движение.Количество   = Выборка.Количество;
Движение.Стоимость   = Выборка.Количество*Выборка.Себестоимость;

Движение = Движения.СтоимостиНоменклатуры.ДобавитьПриход();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрока.Номенклатура;
Движение.Подразделение = Получатель;
Движение.Количество   = Выборка.Количество;
Движение.Стоимость   = Выборка.Количество*(Выборка.Себестоимость+ Выборка.Наценка);
КонецЦикла;
КонецЕсли;
КонецЕсли;

Иначе // Это продажа


Запрос.Текст = "ВЫБРАТЬ
| ДокТЧ.Номенклатура,
| ДокТЧ.Количество,
| ДокТЧ.Сумма,
| ЕСТЬNULL(ОстаткиТРТ.КоличествоОстаток, 0) КАК ОстатокНаТочке,
| ЕСТЬNULL(ОстаткиОЗ.КоличествоОстаток, 0) КАК ОстатокОтделЗакупок,
| ВЫБОР
| КОГДА ЕСТЬNULL(ОстаткиТРТ.КоличествоОстаток, 0) <> 0
| ТОГДА ЕСТЬNULL(ОстаткиТРТ.СтоимостьОстаток, 0) / ЕСТЬNULL(ОстаткиТРТ.КоличествоОстаток, 0)
| ИНАЧЕ 0
| КОНЕЦ КАК СебестоимостьНаТочке,
| ВЫБОР
| КОГДА ЕСТЬNULL(ОстаткиОЗ.КоличествоОстаток, 0) <> 0
| ТОГДА ЕСТЬNULL(ОстаткиОЗ.СтоимостьОстаток, 0) / ЕСТЬNULL(ОстаткиОЗ.КоличествоОстаток, 0)
| ИНАЧЕ 0
| КОНЕЦ КАК СебестоимостьОтделЗакупок,
| ПравилаЦенообразования.Наценка
|ИЗ
| ДокТЧ КАК ДокТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостиНоменклатуры.Остатки(
| &ТочкаИтогов,
| Номенклатура В
| (ВЫБРАТЬ
| ДокТЧ.Номенклатура
| ИЗ
| ДокТЧ)
| И Подразделение = &Подразделение) КАК ОстаткиТРТ
| ПО ДокТЧ.Номенклатура = ОстаткиТРТ.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостиНоменклатуры.Остатки(
| &ТочкаИтогов,
| Подразделение = &ОтделЗакупок
| И Номенклатура В
| (ВЫБРАТЬ
| ДокТЧ.Номенклатура
| ИЗ
| ДокТЧ)) КАК ОстаткиОЗ
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПравилаЦенообразования КАК ПравилаЦенообразования
| ПО (ЕСТЬNULL(ОстаткиОЗ.СтоимостьОстаток, 0) / ЕСТЬNULL(ОстаткиОЗ.КоличествоОстаток, 0) > ПравилаЦенообразования.СебестоимостьОт
| И ЕСТЬNULL(ОстаткиОЗ.СтоимостьОстаток, 0) / ЕСТЬNULL(ОстаткиОЗ.КоличествоОстаток, 0) <= ПравилаЦенообразования.СебестоимостьДо)
| ПО ДокТЧ.Номенклатура = ОстаткиОЗ.Номенклатура
|ГДЕ
| ПравилаЦенообразования.ТорговаяТочка = &Подразделение";

Запрос.УстановитьПараметр("ОтделЗакупок", Справочники.Подразделения.ОтделЗакупок);
Запрос.УстановитьПараметр("ТочкаИтогов", Новый Граница(МоментВремени(),ВидГраницы.Включая));
Запрос.УстановитьПараметр("Подразделение", Подразделение);


РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда 
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Нехватка = Выборка.Количество - (Выборка.ОстатокНаТочке + Выборка.ОстатокОтделЗакупок) ;
НехваткаНаТочке = Выборка.Количество - Выборка.ОстатокНаТочке  ;
Если Нехватка >0 Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара "+ Выборка.Номенклатура+ " "+ " в количестве "+Нехватка;
Сообщение.Сообщить();

ИначеЕсли
НехваткаНаТочке >0 Тогда


// доп. проводка с отдела закупок
Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Подразделение = Справочники.Подразделения.ОтделЗакупок;
Движение.Количество   = НехваткаНаТочке;

Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Подразделение = Подразделение;
Движение.Количество   = НехваткаНаТочке;

Движение = Движения.СтоимостиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Подразделение = Справочники.Подразделения.ОтделЗакупок;
Движение.Количество   = НехваткаНаТочке;
Движение.Стоимость    = НехваткаНаТочке * Выборка.СебестоимостьОтделЗакупок ;

Движение = Движения.СтоимостиНоменклатуры.ДобавитьПриход();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Подразделение = Подразделение;
Движение.Количество   = НехваткаНаТочке;
Движение.Стоимость    = НехваткаНаТочке * (Выборка.СебестоимостьОтделЗакупок+ Выборка.Наценка );



// продажа со точки

Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Подразделение = Подразделение;
Движение.Количество   = Выборка.Количество;

Движение = Движения.СтоимостиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Подразделение = Подразделение;
Движение.Количество   = Выборка.Количество;
Движение.Стоимость    = Выборка.Количество * Выборка.СебестоимостьНаТочке ;


Иначе // всего хватает
Движение = Движения.СтоимостиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Подразделение = Подразделение;
Движение.Количество   = Выборка.Количество;
КонецЕсли;

КонецЦикла;
КонецЕсли;
КонецЕсли; //
КонецПроцедуры

4) Строим отчет по регистру "Стоимости Номенклатуры".