вторник, 15 августа 2017 г.

Билет 1

Оперативный учет 


Компания занимается оптовой торговлей. Поступление товара отражается документом «Приходная накладная», продажа – «Расходная накладная». Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части.
Учет товаров ведется в разрезе складов. Поступление и продажа осуществляется с указанием склада (в шапке документа).
При проведении документа «Расходная накладная» необходимо производить списание товара со склада. В том случае, когда товара не хватает, документ проводиться не должен.
Списание себестоимости товаров должно быть организовано по партиям, в зависимости от метода списания (FIFO или LIFO), принятого в учетной политике. Значение учетной политики меняется не чаще одного раза в год. При проведении документа необходимо использовать метод, актуальный на момент проведения.
Для расчета себестоимости при списании товара необходимо учитывать только момент поступления товара в компанию, вне зависимости от того, на какой склад он пришел. Предположим, для метода списания FIFO первое поступление портсигара произошло на склад «Основной» документом «Приходная накладная №1», а потом на склад «Транзитный» документом «Приходная накладная №2». В этом случае при продаже товара со склада «Транзитный» в первую очередь должна быть списана себестоимость портсигара по документу «Приходная накладная №1», так как она пришла раньше.
Необходимо построить отчет по остаткам товара на складах на указанную дату.


Остатки товаров на 01.01.2010

Склад
Номенклатура
Кол-во
Основной



Куртка замшевая
2

Портсигар
2
Транзитный



Куртка замшевая
5

Кинокамера
1
Подзадача 1.7

Решение:
  1. Создаем справочник "Склады";
  2. В документы "Приходная накладная" и "Расходная накладная" добавляем новый реквизит - "Склады", в регистр накопления "Остатки номенклатуры" - новое измерение "Склады";
  3. В справочник "Номенклатура" - добавим реквизит "ВидНоменклатуры" (тип: Перечисление- ВидыНоменклатуры)
  4. Создаем новый регистра накопления "СтоимостьНоменклатуры" (Тип - остатки) Измерения: Партия (Тип - ПриходнаяНакладная), Номенклатура. Ресурсы: Количество, Стоимость. Регистратор - ПриходнаяНаскладаня, РасходнаяНакладная.
  5. Создадим регистр сведений "УчетнаяПолитика" с периодичностью "год" (Ресурс - Учетная политика Тип: Перечисление - Учетная политика)
  6. Создаем общий модуль - "РаботаНаСервере" - (Сервер = Истина, Вызов сервера = Истина)
  7. Создаем последовательность для расчета себестоимости:
  8. Код модуля "РаботаНаСервере" для расчета себестоимости: 
    Листинг модуля:
Процедура СписаниеСебестоимости() Экспорт
ДатаНачала = Последовательности.СписаниеСебестоимости.ПолучитьГраницу().Дата;
ДатаОкончания = ТекущаяДата();
ВыполнитьСписание(ДатаНачала, ДатаОкончания);
КонецПроцедуры

     Процедура выбора документов для расчета себестоимости:

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

     Процедура списания себестоимости:

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

       9. Создаем регламентную операцию которая будет рассчитывать себестоимость (Предопределенная - ИСТИНА, Имя метода - "РаботаНаСервере.СписаниеСебестоимости")

      10. Обработка проведения "ПриходнойНакладной"

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

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

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

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

    
      11.Обработка проведения "Расходной накладной"

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

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

      12. Создаем обработку через которую запустим расчет себестоимости:

      Листинг модуля:

&НаСервере
Процедура РассчитатьСебестоимостьНаСервере()

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

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

&НаКлиенте
Процедура РассчитатьСебестоимость(Команда)
РассчитатьСебестоимостьНаСервере();
КонецПроцедуры

      13. Создадим отчет "Остатки товаров"

Запрос:

ВЫБРАТЬ
ОстаткиНоменклатурыОстатки.Номенклатура,
ОстаткиНоменклатурыОстатки.Склад,
ОстаткиНоменклатурыОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки

Ресурсы:


Параметры:



Макеты:
Компановка:


Оперативный учет 1.7 (Билет 1)


Бухгалтерский учет

Компания занимается торговлей продуктами питания. Учет товаров ведется в разрезе сроков годности. Под сроком годности принимается календарная дата, до которой товар годен к употреблению. На один и тот же товар с разными сроками годности при его поступлении может указываться разная цена. Например, на товар со сроком годности 10 января 2010 цена может быть ниже, чем на товар со сроком годности 30 января 2010. Товар с одинаковым сроком годности может поступать разными документами и по разной цене. Возможна ситуация когда в одном документе один и тот же товар поступает с разными сроками годности (и по разной цене). Учет товаров в разрезе складов не ведется.
Документ «Приходная накладная» реализует следующую проводку:
Дт «Товары» - Кт «Поставщики» на количество и сумму закупаемого товара.
Продажа товара регистрируется документом «Расходная накладная». При продаже срок годности не указывается. В первую очередь списывается товар с наименьшим календарным сроком годности. Себестоимость определяется как средняя по товару по всем срокам годности. Т.е. например если 1 пачка йогурта со сроком годности 10.01.2010 поступила по цене 90 рублей и еще 1 пачка того же йогурта, но со сроком годности 30.01.2010 поступила по цене 110 рублей, то при списании себестоимость одной пачки данного йогурта равна 100 рублей.
Документ «Расходная накладная» реализует следующие проводки:
Дт «Прибыли и убытки» - Кт «Товары» на количество и сумму себестоимости
Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажных ценах.
При проведении документа анализируется наличие этого товара в организации. Если товара не достаточно документ не проводится.
Необходимо создать отчет, выдающий данные о количественном и суммовом остатке товаров.
Остатки товаров на 10.01.2010
Товар
Срок годности
Количество
Сумма
Йогурт

550
110 000

20.01.10
50
10 000

05.02.10
500
100 000
Кефир

20
400

20.01.10
20
400


Сумма для срока годности должна получаться расчетным образом как средняя цена по данному товару умноженная на количество с данным сроком. Средняя цена рассчитывается как общая сумма данного товара поделенная на общее количество данного товара.

Решение:
1.  Настроим план счетов "Управленческий":
- Добавим новый признак учета "Количественный" (Тип - Булево)
- Добавим новый  признак учета субконто "Суммовой" (Тип - Булево)




         
2. Добавим новый вид субконто "Срок годности" (Тип - дата) в предопределенные планы видов характеристик

4. Изменим счет "Товары" в плане счетов:

5. В табличную часть приходной накладной добавим реквизит "Срок годности".
6. Создадим регистр бухгалтерии "Управленческий" (План счетов - "Управленческий", Корреспонденция = ИСТИНА, Представление списка - "Журнал проводок". ) Ресурсы - "Сумма", "Количество".
7. Обработчик проведения "Приходной накладной"

// регистр Управленческий 
Движения.Управленческий.Записывать = Истина;
Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.Товары;
Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики;
Движение.Период = Дата;
Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма;
Движение.КоличествоДт  = ТекСтрокаСписокНоменклатуры.Количество;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = ТекСтрокаСписокНоменклатуры.СрокГодности;
КонецЦикла;

8. Обработчик проведения "Расходной накладной"

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

Движение.Сумма = СуммаПоДокументу;

9.Создадим отчет 

Запрос отчета:

ВЫБРАТЬ
УправленческийОстатки.Субконто1 КАК Товар,
УправленческийОстатки.СуммаОстатокДт КАК Сумма,
УправленческийОстатки1.Субконто2 КАК СрокГодности,
УправленческийОстатки1.КоличествоОстатокДт КАК Количество
ИЗ
РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), , ) КАК УправленческийОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), , ) КАК УправленческийОстатки1
ПО УправленческийОстатки.Субконто1 = УправленческийОстатки1.Субконто1



1 комментарий:

  1. регистр бухгалтерии "Управленческий"
    Ресурс - "Сумма" - Нужно проставить Признак учета субконто - "Суммовой,
    Ресурс - "Количество" - Нужно проставить Признак учета "Количественный".

    ОтветитьУдалить