//2.1 Взаиморасчеты с покупателями ведутся в разрезе договоров. //С каждым контрагентом может быть заключено произвольное количество договоров. //Задолженность покупателей возникает при проведении документа «Расходная накладная». //В этом документе пользователем указывается сам покупатель(«Контрагент») и договор (договор вместе с контрагентом указывается в шапке документа). //Пользователю должно быть запрещено указывать не соответствующий контрагенту договор. Документ «Расходная накладная» формирует следующую проводку: //Дт «Покупатели» - Кт «Прибыли и убытки» на сумму продажи //Погашение задолженности (оплата переданного покупателю товара)регистрируется с помощью документа «Приход денег». //В табличной части документа указывается контрагент, договор и сумма оплаты. В случае превышения суммы оплаты над суммой задолженности по какому-либо из договоров документ не проводится, но при этом нужно учесть, что задолженность может гаситься частями. Документ «Приход денег» формирует следующие проводки: //Дт «Касса» - Кт «Покупатели» на указанную сумму //Необходимо создать отчет по состоянию взаиморасчетов с покупателями. //В отчете должна быть видна как общая задолженность по контрагенту, так и эта же задолженность, но в разрезе действующих договоров. // //Создаем Спр. Контрагенты и подчиненный Спр.ДоговорыКонтрагентов. Создаем док.Операция. //В шапку расходной добавляем Контрагента и Договор. //Создаем Док.ПриходДенег (тч СписокКонтрагент - Контрагент,ДоговорКонтрагента,Сумма). //РБ - ресурс Сумма. ПВХ ВидыСубконто (Номенкл, Субконто, Контрагент, ДоговорКонтрагентов). //Предопред (ДоговорКонтрагентов,Контрагент,Номенклатура). //ПС - Субконто 2. Предопределенные по умолчанию. // //ДокРасходная Движения.Управленческий.Записывать = Истина; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Контрагент; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ДоговорКонтрагентов] = ДоговорКонтрагента; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Сумма = СуммаПоДокументу; //ДокПриходДенег Движения.Управленческий.Записывать = Истина; Движения.Управленческий.БлокироватьДляИзменения = Истина; Для каждого ЭлементТЧ из СписокКонтрагент цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Касса; Движение.СчетКт = ПланыСчетов.Управленческий.Покупатели; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = ЭлементТЧ.Контрагент; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ДоговорКонтрагентов] = ЭлементТЧ.ДоговорКонтрагента; Движение.Сумма = ЭлементТЧ.Сумма ; КонецЦикла; Движения.Управленческий.Записать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходДенегСписокКонтрагент.Контрагент КАК Контрагент, | ПриходДенегСписокКонтрагент.ДоговорКонтрагента КАК ДоговорКонтрагента |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПриходДенег.СписокКонтрагент КАК ПриходДенегСписокКонтрагент |ГДЕ | ПриходДенегСписокКонтрагент.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ПриходДенегСписокКонтрагент.Контрагент, | ПриходДенегСписокКонтрагент.ДоговорКонтрагента | |ИНДЕКСИРОВАТЬ ПО | Контрагент, | ДоговорКонтрагента |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | УправленческийОстатки.СуммаОстаток КАК СуммаОст, | УправленческийОстатки.Субконто1 КАК Контрагент, | УправленческийОстатки.Субконто2 КАК ДоговорКонтрагента |ИЗ | РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели), | &ВидыСубконто, | (Субконто1, Субконто2) В | (ВЫБРАТЬ | Т.Контрагент, | Т.ДоговорКонтрагента | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстатки |ГДЕ | УправленческийОстатки.СуммаОстаток < 0"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Контрагент); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.ДоговорКонтрагентов); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени(), ВидГраницы.Включая)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка= Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.СуммаОст<0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Сумма оплаты контрагента "+Выборка.Контрагент+" по договору "+выборка.ДоговорКонтрагента+" превышает сумму долга "; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; КонецЦикла; //ОтчетЗадолженностьПокупателей ВЫБРАТЬ УправленческийОстатки.Счет, УправленческийОстатки.Субконто1 КАК Контрагент, УправленческийОстатки.Субконто2 КАК ДоговорКонтрагента, УправленческийОстатки.СуммаОстаток ИЗ РегистрБухгалтерии.Управленческий.Остатки(, Счет = &Счет, &ВидыСубконто, ) КАК УправленческийОстатки //Параметры Счет - Покупатели, ВидыСубконто (Контраегнт, ДоговорКонтрагентов) //2.2 Взаиморасчеты с покупателями ведутся в разрезе договоров с детализацией до документа отгрузки. //С каждым контрагентом может быть заключено произвольное количество договоров. //В каждом договоре указывается дата окончания действия этого договора. //Задолженность покупателей возникает при проведении документа «Расходная накладная». //В этом документе пользователем указывается сам покупатель («Контрагент») и договор (договор вместе с контрагентом указывается в шапке документа). //Пользователю должно быть запрещено указывать не соответствующий контрагенту договор. //Документ «Расходная накладная» формирует следующую проводку: //Дт «Покупатели» - Кт «Прибыли и убытки» на сумму продажи //Погашение задолженности (оплата переданного покупателю товара) регистрируется с помощью документа «Приход денег». //В реквизитах документа указывается контрагент и сумма оплаты. //Погашение задолженности происходит в первую очередь по тем договорам, у которых срок окончания действия самый ранний. //В рамках каждого договора задолженность погашается в хронологическом порядке, начиная с самой первой недооплаченной накладной. //Сумма оплаты не может превосходить сумму задолженности. //В том случае, если сумма оплаты больше суммы общей задолженности, то документ не должен проводиться. //Документ «Приход денег» формирует следующую проводку: //Дт «Касса» - Кт «Покупатели» на расчетную сумму оплат //Необходимо создать отчет по состоянию взаиморасчетов с покупателями. //Создаем Спр. Контрагенты, подчиненный ДоговорыКонтрагентов (Рекв. ДатаОкончания). //Создаем док.Операция. Создаем Док. ПриходДенег (Рекв.Контрагент, СуммаОплаты). //ПВХ (ВидыСубконто: Номенклатура, Субконто, Контрагенты, ДоговорыКонтрагентов, Расходная). //Предопред (ДоговорыКонтрагентов, Контрагенты, Номенклатура, РасходнаяНакладная). //ПС (КолСубконто 3). Предопред. По умолчанию. //ДокРасходная Движения.Управленческий.Записывать = Истина; Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Период = Дата; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ДоговорыКонтрагентов] = ДоговорКонтрагента; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.РасходнаяНакладная] = Ссылка; Движение.Сумма = СуммаПоДокументу; //ДокПриходДенег Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Покупатели); ЭлементБлокировки.УстановитьЗначение("Субконто1", Контрагент); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УправленческийОстатки.Счет, | УправленческийОстатки.Субконто1 КАК Контрагент, | УправленческийОстатки.Субконто2 КАК ДоговорКонтрагента, | УправленческийОстатки.СуммаОстаток КАК СуммаОстаток, | УправленческийОстатки.Субконто3 КАК Документ |ИЗ | РегистрБухгалтерии.Управленческий.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели), &ВидыСубконто, Субконто1 = &Контрагент) КАК УправленческийОстатки | |УПОРЯДОЧИТЬ ПО | УправленческийОстатки.Субконто2.ДатаОкончания, | УправленческийОстатки.Субконто3.МоментВремени |ИТОГИ | СУММА(СуммаОстаток) |ПО | ОБЩИЕ"; ВидыСубконтно = новый Массив; ВидыСубконтно.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Контрагенты); ВидыСубконтно.Добавить(ПланыВидовХарактеристик.ВидыСубконто.ДоговорыКонтрагентов); ВидыСубконтно.Добавить(ПланыВидовХарактеристик.ВидыСубконто.РасходнаяНакладная); Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконтно); Результат = Запрос.Выполнить(); Если Не Результат.Пустой() Тогда ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ВыборкаОбщийИтог.Следующий(); Если СуммаОплаты> ВыборкаОбщийИтог.СуммаОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Сумма оплаты больше задолженности.Задолженность "+ВыборкаОбщийИтог.СуммаОстаток; Сообщение.Сообщить(); Отказ =Истина; Возврат; КонецЕсли; СуммаСписать = СуммаОплаты; Выборка = ВыборкаОбщийИтог.Выбрать(); Пока Выборка.Следующий() и СуммаСписать>0 Цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Касса; Движение.СчетКт = ПланыСчетов.Управленческий.Покупатели; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Выборка.Контрагент; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ДоговорыКонтрагентов] = Выборка.ДоговорКонтрагента; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.РасходнаяНакладная] = Выборка.Документ; Движение.Сумма = Мин(Выборка.СуммаОстаток, СуммаСписать); СуммаСписать = СуммаСписать - Движение.Сумма; КонецЦикла; КонецЕсли; //ОтчетВзаиморасчетыСПокупателями ВЫБРАТЬ УправленческийОстаткиИОбороты.Счет, УправленческийОстаткиИОбороты.Субконто1 КАК Контрагент, УправленческийОстаткиИОбороты.Субконто2 КАК ДоговорКонтрагента, УправленческийОстаткиИОбороты.Субконто3 КАК Документ, УправленческийОстаткиИОбороты.СуммаОборотДт КАК Отгрузка, УправленческийОстаткиИОбороты.СуммаОборотКт КАК Оплата ИЗ РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(, , , , Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели), &ВидыСубконто, ) КАК УправленческийОстаткиИОбороты //ВидыСубконто - Контрагенты, Договоры, Расходная //ОтчетЗадолженностьПокупателей ВЫБРАТЬ УправленческийОстатки.Счет, УправленческийОстатки.Субконто1 КАК Контрагент, УправленческийОстатки.Субконто2 КАК ДоговорКонтрагента, УправленческийОстатки.СуммаОстаток КАК Сумма ИЗ РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели), &ВидыСубконто, ) КАК УправленческийОстатки //2.3 Взаиморасчеты с покупателями ведутся в разрезе договоров. //С каждым контрагентом может быть заключено произвольное количество договоров. //Отпуск товаров покупателям осуществляется только после 100% предоплаты товара. //Внесение денежных средств (предоплаты) регистрируется с помощью документа «Приход денег». //В табличной части документа указывается список контрагентов и сумм, поступивших от них оплат, договор с контрагентом не указывается. //Документ «Приход денег» формирует следующие проводки: //Дт «Касса» - Кт «Покупатели» на сумму предоплаты //Отгрузка товара регистрируется с помощью документа «Расходная накладная». //В этом документе пользователем указывается сам покупатель («Контрагент») и договор. //Пользователю должно быть запрещено, выбирать контрагента и не соответствующий ему договор. //Документ «Расходная накладная» формирует следующую проводку: //Дт «Покупатели» - Кт «Прибыли и убытки» на сумму продажи //Отгружать товар, на сумму превышающую сумму предварительной оплаты запрещено. За выбранный пользователем период необходимо получать информацию: //Создаем Спр. Контрагент и подчиненный ДоговорыКонтрагентов. В расходную в шапку добавляем Контрагента и Договор. Создаем док. Операция. //Создаем Док. Приход денег (тч СписокКонтрагентов: Контрагент, Сумма). ПВХ (виды субконто: Номенклатура, Субконто, Контрагенты, ДогворыКонтрагентов). //Предопр: ДоговорыКонтрагентов, Контрагент, Номенклатура. ПС (Количество субконто 2) //ДокРасходная Движения.Управленческий.Записывать = Истина; Движения.Управленческий.БлокироватьДляИзменения = Истина; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Контрагент; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ДоговорКонтрагента] = ДоговорКонтрагента; Движение.Сумма = СуммаПоДокументу; Движения.Управленческий.Записать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УправленческийОстатки.Счет, | УправленческийОстатки.Субконто1 КАК Контрагент, | УправленческийОстатки.СуммаОстаток |ИЗ | РегистрБухгалтерии.Управленческий.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели), &ВидыСубконто, Субконто1 = &Контрагент) КАК УправленческийОстатки |ГДЕ | УправленческийОстатки.СуммаОстаток > 0"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Контрагент); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.ДоговорКонтрагента); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("МоментВремени",Новый Граница(МоментВремени(), ВидГраницы.Включая)); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Предоплата по контрагенту меньше суммы отгрузки!"; Сообщение.Сообщить(); Отказ =Истина; КонецЦикла; //ДокПриходДенег Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокКонтрагентов Из СписокКонтрагентов Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Касса; Движение.СчетКт = ПланыСчетов.Управленческий.Покупатели; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = ТекСтрокаСписокКонтрагентов.Контрагент; Движение.Период = Дата; Движение.Сумма = ТекСтрокаСписокКонтрагентов.Сумма; КонецЦикла; //Отчет АнализОплат ВЫБРАТЬ УправленческийОстаткиИОбороты.Счет, УправленческийОстаткиИОбороты.Субконто1 КАК Контрагент, УправленческийОстаткиИОбороты.Субконто2 КАК ДоговорКонтрагента, УправленческийОстаткиИОбороты.СуммаОборотДт КАК Сумма, УправленческийОстаткиИОбороты.СуммаНачальныйОстатокКт, УправленческийОстаткиИОбороты.СуммаКонечныйОстатокКт ИЗ РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(, , , , счет = &Счет, &вариантыСубконто, ) КАК УправленческийОстаткиИОбороты //Счет = Покупатели, ВидыСубконто = Контрагент,ДоговорКонтрагента //2.4 Взаиморасчеты с покупателями ведутся в разрезе договоров. С каждым контрагентом может быть заключено произвольное количество договоров. //Задолженность покупателей возникает при отгрузке товара, а погашается при поступлении оплат. //Погашение задолженности покупателя (оплата переданного покупателю товара) регистрируется с помощью документа «Приход денег». //Оплата может происходить либо в счет какого-то определенного договора, и тогда этот договор указывается в шапке документа, либо в счет аванса от данного контрагента, в этом случае договор не указывается. //В случае авансового платежа вся сумма должна быть зачтена в качестве аванса, даже в том случае, когда существуют еще не оплаченные отгрузки. //Документ «Приход денег» формирует следующую проводку: //Дт «Касса» - Кт «Покупатели» на сумму оплаты по договору //либо //Дт «Касса» - Кт «Авансы от покупателей» на сумму аванса //Отгрузка товаров отражается документом «Расходная накладная». В этом документе в шапке указывается покупатель и договор. //Документ «Расходная накладная» формирует следующие проводки: //Дт «Покупатели» - Кт «Прибыли и убытки» на сумму продажи //Дт «Авансы от покупателей» - Кт «Покупатели» на сумму зачтенного //аванса //Сумма зачтенного аванса определяется следующим образом: в момент проведения документа «Расходная накладная» должна происходить проверка оплат по указанному в документе договору. //В том случае, когда сумма оплат меньше суммы накладной, то должна быть произведена проверка наличия авансов от данного контрагента. //При наличии аванса недостающая часть оплаты может быть принята в качестве суммы зачтенного аванса, но только в той части, которая не превышает существующий аванс. //Пользователю должно быть запрещено указывать не соответствующий контрагенту договор как в документе «Приход денег» так и в документе «Расходная накладная». //Необходимо создать отчет о взаиморасчетах с контрагентам по договорам. // // //Создаем Спр. Договоры Подчиненный спр Контрагенту. Добавляем в шапку Расходной Контрагент и Договор. //Создаем Док ПриходДенег. Рекв. Контрагент, Договор, Сумма. //ПВХ (ВидыСубконто: Номенклатура,Контрагенты,Договоры). Предопр: Договоры, Контрагенты,Номенклатура. //ПС (КолСубк 2). Покупатели ( субк: Контрагенты, Договоры), АвансыПокупателей (02.05 субк:Контрагенты). РБ Ресурс Сумма. //ДокРасходная Блокировка = Новый БлокировкаДанных; ЭлБлок = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлБлок.Режим = РежимБлокировкиДанных.Исключительный; ЭлБлок.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Покупатели); ЭлБлок.УстановитьЗначение("Субконто1", Контрагент); ЭлБлок.УстановитьЗначение("Субконто2", Договор); ЭлБлок = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлБлок.Режим = РежимБлокировкиДанных.Исключительный; ЭлБлок.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.АвансыПокупателей); ЭлБлок.УстановитьЗначение("Субконто1", Контрагент); Блокировка.Заблокировать(); Движения.Управленческий.Записать(); Движения.Управленческий.Записывать = Истина; Запрос = Новый Запрос("ВЫБРАТЬ | СУММА(Т.Оплата) КАК Оплата, | СУММА(Т.Аванс) КАК Аванс |ИЗ | (ВЫБРАТЬ | NULL КАК Аванс, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокКт, 0) КАК Оплата | ИЗ | РегистрБухгалтерии.Управленческий.Остатки( | &Момент, | Счет = &Счет, | &Субконто, | Субконто1 = &Контрагент | И Субконто2 = &Договор) КАК УправленческийОстатки | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ЕСТЬNULL(УправленческийОстаткиАванс.СуммаОстатокКт, 0), | NULL | ИЗ | РегистрБухгалтерии.Управленческий.Остатки(&Момент, Счет = &СчетАвансов, , Субконто1 = &Контрагент) КАК УправленческийОстаткиАванс) КАК Т"); Запрос.УстановитьПараметр("Момент", МоментВремени()); Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("Договор", Договор); Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.Покупатели); Запрос.УстановитьПараметр("СчетАвансов", ПланыСчетов.Управленческий.АвансыПокупателей); Субконто = Новый Массив; Субконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Контрагенты); Субконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Договоры); Запрос.УстановитьПараметр("Субконто", Субконто); Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); Движения.Управленческий.Записывать = Истина; Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Период = Дата; Движение.Сумма = СуммаПоДокументу; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Договоры] = Договор; Если СуммаПоДокументу > Выборка.Оплата Тогда Движения.Управленческий.Записывать = Истина; Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.АвансыПокупателей; Движение.СчетКт = ПланыСчетов.Управленческий.Покупатели; Движение.Период = Дата; Движение.Сумма = Мин(Выборка.Аванс, СуммаПоДокументу - Выборка.Оплата); Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Договоры] = Договор; КонецЕсли; //ДокПриходДенег Движения.Управленческий.Записывать = Истина; Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Касса; Если Договор.Пустая() Тогда Движение.СчетКт = ПланыСчетов.Управленческий.АвансыПокупателей; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент; Иначе Движение.СчетКт = ПланыСчетов.Управленческий.Покупатели; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Договоры] = Договор; КонецЕсли; Движение.Период = Дата; Движение.Сумма = СуммаОплаты; //ОтчетВзаиморасчеты ВЫБРАТЬ Т.Контрагент, Т.Договор, СУММА(Т.НачСальдо) КАК НачСальдо, СУММА(Т.Отгружено) КАК Отгружено, СУММА(Т.Оплачено) КАК Оплачено, СУММА(Т.КонСальдо) КАК КонСальдо, СУММА(Т.ЗачтеноАвансов) КАК ЗачтеноАвансов ИЗ (ВЫБРАТЬ Задолженность.Субконто1 КАК Контрагент, Задолженность.Субконто2 КАК Договор, Задолженность.СуммаНачальныйОстаток КАК НачСальдо, Задолженность.СуммаОборотДт КАК Отгружено, Задолженность.СуммаОборотКт КАК Оплачено, Задолженность.СуммаКонечныйОстаток КАК КонСальдо, NULL КАК ЗачтеноАвансов ИЗ РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(, , , , Счет = &Счет, &Субконто, ) КАК Задолженность ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Аванс.Субконто1, "Аванс", Аванс.СуммаНачальныйОстатокКт, Аванс.СуммаОборотДт, Аванс.СуммаОборотКт, Аванс.СуммаКонечныйОстатокКт, NULL ИЗ РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(, , , , Счет = &СчетАвансов, , ) КАК Аванс ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ УправленческийОборотыДтКт.СубконтоКт1, УправленческийОборотыДтКт.СубконтоКт2, NULL, NULL, -УправленческийОборотыДтКт.СуммаОборот, NULL, УправленческийОборотыДтКт.СуммаОборот ИЗ РегистрБухгалтерии.Управленческий.ОборотыДтКт(, , , СчетДт = &СчетАвансов, , СчетКт = &Счет, &Субконто, ) КАК УправленческийОборотыДтКт) КАК Т СГРУППИРОВАТЬ ПО Т.Контрагент, Т.Договор //Субконто = Контрагенты,Договоры, Счет = Покупатели, СчетАвансов = АвансыПокупателей //2.5 Взаиморасчеты с покупателями ведутся в разрезе договоров. С каждым контрагентом может быть заключено произвольное количество договоров. //Задолженность покупателей возникает при отгрузке товара, а погашается при поступлении оплат. //Погашение задолженности покупателя (оплата переданного покупателю товара) регистрируется с помощью документа «Приход денег». //Оплата может происходить как в счет какого-то договора, так и в счет аванса от данного контрагента. //В шапке документа указывается плательщик и сумма платежа. //В табличной части документа указываются договоры, в счет погашения долга по которым должна быть отнесена сумма оплаты. //Погашение задолженности по договорам должно происходить в том порядке, в котором они указаны в табличной части, и в той части, которая совпадает (или не превышает, если сумма платежа недостаточна) с непогашенной суммой отгрузки по каждому договору. //Если сумма платежа превышает сумму задолженности по указанным договорам, то остаток должен быть зачтен как аванс от этого контрагента. //Документ «Приход денег» формирует следующие проводки: //Дт «Касса» - Кт «Покупатели» на сумму оплаты по каждому договору //Дт «Касса» - Кт «Покупатели» на рассчитанную сумму аванса //Отгрузка товаров отражается документом «Расходная накладная». В этом документе в шапке указывается покупатель и договор. Документ «Расходная накладная» формирует следующие проводки: //Дт «Покупатели» - Кт «Прибыли и убытки» на сумму продажи //Дт «Покупатели» - Кт «Покупатели» на сумму зачтенного аванса //Сумма зачтенного аванса определяется следующим образом: в момент проведения документа «Расходная накладная» должна быть произведена проверка наличия авансов от данного контрагента. //При наличии аванса часть его может быть принята в качестве суммы зачтенного аванса, но только в той части, которая не превышает существующий аванс и сумму самой накладной. //Пользователю должно быть запрещено указывать не соответствующий контрагенту договор как в документе «Приход денег» так и в документе «Расходная накладная». //Необходимо создать отчет о взаиморасчетах с контрагентам по договорам. //Создаем Спр. Договоры подчин Контрагенту. В шапку Расходной добавляем Контрагента и договор. //Создаем Док. ВводВЭксплуатацию (тчСписокНоменклатуры: Номенклатура, Количество). Создаем док. ВыбытиеОборудования. //Создаем док Операция. Создаем док ПриходДенег (рекв. Контрагент, Сумма, тчДоговоры - договор.) //ПВХ (ВидыСубконто: Номенклатура, Контрагенты, Субконто, Договоры). Предопр. Договор, Контрагент, Номенклатура. //ПС (кол субк 2) Покупатели (субк: контрагент, договор) РБ: рес.Сумма. //ДокРасходная Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Субконто1", Контрагент); ЭлементБлокировки.УстановитьЗначение("Субконто2", Справочники.Договоры.ПустаяСсылка()); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УправленческийОстатки.СуммаОстатокКт |ИЗ | РегистрБухгалтерии.Управленческий.Остатки( | &Момент, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели), | , | Субконто1 = &Контрагент | И Субконто2 = ЗНАЧЕНИЕ(Справочник.Договоры.ПустаяСсылка)) КАК УправленческийОстатки"; Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("Момент", МоментВремени()); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Если Выборка.Следующий() Тогда Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.Покупатели; Движение.Период = Дата; Движение.Сумма = МИН(СуммаПоДокументу,Выборка.СуммаОстатокКт); Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Контрагент; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Договор] = Справочники.Договоры.ПустаяСсылка(); Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Контрагент; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Договор] = Договор; КонецЕсли; Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Период = Дата; Движение.Сумма = СуммаПоДокументу; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Контрагент; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Договор] = Договор; //ДокВводВЭксплуатацию Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВводВЭксплуатациюСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ВводВЭксплуатациюСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ ДокТЧ |ИЗ | Документ.ВводВЭксплуатацию.СписокНоменклатуры КАК ВводВЭксплуатациюСписокНоменклатуры |ГДЕ | ВводВЭксплуатациюСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ВводВЭксплуатациюСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДокТЧ.Номенклатура КАК Номенклатура, | ДокТЧ.Количество КАК Количество, | ОстаткиНоменклатурыОстатки.СрокГодности, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстаток, | ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, ДокТЧ.Номенклатура.СрокЭксплуатации) КАК СрокЭксплуатации |ИЗ | ДокТЧ КАК ДокТЧ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &Момент, | Номенклатура В | (ВЫБРАТЬ | ДокТЧ.Номенклатура | ИЗ | ДокТЧ) | И СрокГодности > &Дата | И СрокЭксплуатации = ДАТАВРЕМЯ(1, 1, 1)) КАК ОстаткиНоменклатурыОстатки | ПО ДокТЧ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура |ИТОГИ | МАКСИМУМ(Количество), | СУММА(КоличествоОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("Момент", МоментВремени()); Запрос.УстановитьПараметр("Дата",Дата); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаИтоги = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаИтоги.Следующий() Цикл Если ВыборкаИтоги.Количество > ВыборкаИтоги.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Нехватка не просроченного " + ВыборкаИтоги.Номенклатура + " осталось всего " + ВыборкаИтоги.КоличествоОстаток; //Сообщение.Поле = ""; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Выборка = ВыборкаИтоги.Выбрать(); ОсталосьСписать = ВыборкаИтоги.Количество; Пока Выборка.Следующий() И ОсталосьСписать > 0 Цикл Списать = МИН(ОсталосьСписать,Выборка.КоличествоОстаток); // списываем не введеный в эксплуатацию товар Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.СрокГодности = Выборка.СрокГодности; Движение.Количество = Списать; Движение.Сумма = ?(Списать = Выборка.КоличествоОстаток, Выборка.СуммаОстаток,Списать * Выборка.СуммаОстаток / Выборка.КоличествоОстаток ); // вводим в эксплуатацию списанный товар Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.СрокГодности = Выборка.СрокГодности; Движение.СрокЭксплуатации = Выборка.СрокЭксплуатации; Движение.Количество = Списать; Движение.Сумма = ?(Списать = Выборка.КоличествоОстаток, Выборка.СуммаОстаток,Списать * Выборка.СуммаОстаток / Выборка.КоличествоОстаток ); ОсталосьСписать = ОсталосьСписать - Списать; КонецЦикла; КонецЦикла; //ДокВыбытие Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура, | ОстаткиНоменклатурыОстатки.СрокГодности, | ОстаткиНоменклатурыОстатки.СрокЭксплуатации, | ОстаткиНоменклатурыОстатки.КоличествоОстаток, | ОстаткиНоменклатурыОстатки.СуммаОстаток |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &Момент, | ВЫБОР | КОГДА СрокЭксплуатации <> ДАТАВРЕМЯ(1, 1, 1) | ТОГДА СрокЭксплуатации < &Дата | ИНАЧЕ СрокГодности < &Дата | КОНЕЦ) КАК ОстаткиНоменклатурыОстатки"; Запрос.УстановитьПараметр("Дата", Дата); Запрос.УстановитьПараметр("Момент", МоментВремени()); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.СрокГодности = Выборка.СрокГодности; Если Выборка.СрокЭксплуатации <> ДАТА(1,1,1,0,0,0) Тогда Движение.СрокЭксплуатации = Выборка.СрокЭксплуатации; КонецЕсли; Движение.Количество = Выборка.КоличествоОстаток; Движение.Сумма = Выборка.СуммаОстаток; КонецЦикла; //ОтчетОборудованиеВЭксплуатации ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.КоличествоОстаток, ОстаткиНоменклатурыОстатки.СуммаОстаток, РАЗНОСТЬДАТ(&Период,ОстаткиНоменклатурыОстатки.СрокЭксплуатации, ДЕНЬ) КАК СрокЭксплуатации, РАЗНОСТЬДАТ(&Период,ОстаткиНоменклатурыОстатки.СрокГодности, ДЕНЬ) КАК СрокГодности ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки(, СрокЭксплуатации <> ДАТАВРЕМЯ(1, 1, 1)) КАК ОстаткиНоменклатурыОстатки //ОтчетВзаиморасчеты ВЫБРАТЬ УправленческийОстаткиИОбороты.Субконто1 КАК Контрагент, ВЫБОР КОГДА УправленческийОстаткиИОбороты.Субконто2 = ЗНАЧЕНИЕ(Справочник.Договоры.ПустаяСсылка) ТОГДА "Аванс" ИНАЧЕ УправленческийОстаткиИОбороты.Субконто2 КОНЕЦ КАК Договор, - УправленческийОстаткиИОбороты.СуммаНачальныйОстаток КАК СуммаНачальныйОстаток, УправленческийОстаткиИОбороты.СуммаОборотДт КАК Отгружено, ЕСТЬNULL(УправленческийОстаткиИОбороты.СуммаОборотКт, 0) - ЕСТЬNULL(УправленческийОборотыДтКт.СуммаОборот, 0) КАК Оплачено, - УправленческийОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток, ЕСТЬNULL(УправленческийОборотыДтКт.СуммаОборот, 0) КАК ЗачтеноАвансов ИЗ РегистрБухгалтерии.Управленческий.ОстаткиИОбороты КАК УправленческийОстаткиИОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.ОборотыДтКт(, , , СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели), , СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели), , ) КАК УправленческийОборотыДтКт ПО УправленческийОстаткиИОбороты.Субконто1 = УправленческийОборотыДтКт.СубконтоКт1 И УправленческийОстаткиИОбороты.Субконто2 = УправленческийОборотыДтКт.СубконтоКт2 //2.6 Необходимо организовать возможность ведения взаиморасчетов (счет «Покупатели») в разрезе контрагентов и договоров в валюте взаиморасчетов. //С каждым контрагентом может быть заключено любое количество договоров (у каждого может быть своя валюта взаиморасчетов). //Все взаиморасчеты по договору ведутся только в валюте, указанной в этом договоре, и рублевом эквиваленте. //Задолженность покупателей возникает при проведении документа «Расходная накладная». //В этом документе пользователем указывается сам покупатель («Контрагент») и договор. //Все суммы в документе указываются в валюте выбранного договора. Пользователю должно быть запрещено, выбирать контрагента и не соответствующий ему. //Документ «Расходная накладная» формирует следующую проводку: //Дт «Покупатели» - Кт «Прибыли и убытки» //на сумму продажи в валюте взаиморасчетов и в рублях по курсу на дату документа. //Необходимо реализовать документ «Корректировка задолженности», который бы в соответствии с изменившимся курсом валюты взаиморасчетов корректировал рублевую задолженность покупателя. //Т.е. предположим, что при курсе валюты «Валютная» в 10 рублей покупателем был получен товар на 10 единиц «Валютная» (получается, по курсу это 100 рублей). //Курс вырос до 12 рублей за единицу валюты. //В соответствии с этим рублевая сумма задолженности покупателя должна возрасти на 20 рублей. //Документ «Корректировка задолженности» делает следующие проводки: //В случае увеличения рублевого долга покупателя: //Дт «Покупатели» - Кт «Прибыли и убытки» на сумму разницыслучае уменьшения рублевого долга покупателя: //Дт «Прибыли и убытки» - Кт «Покупатели» на сумму разницы //Документ «Корректировка задолженности» вводится как регламентный (один экземпляр корректирует все существующие задолженности). //Необходимо создать отчет, показывающий за выбранный период остатки и изменения состояния взаиморасчетов в рублях вплоть до документа, которым это состояние менялось (документ «Корректировка задолженности» должен попадать в данный отчет). // //Создаем Спр.Договры (рекв. Валюта). В шапку расходной добавляем (Контрагент, Договор, Валюта, Курс,СуммаВал). //Создаем Док КорректировкаЗадолженности. Создаем док РучнаяОперация. РС КурсыВалют. //ПВХ (ВидыСубконто: Номенклатура, Контрагент, Договор). Предопр: Договор, Контрагент, Номенклатура. ПС (Кол суб. 2). //Признак учета Валютный. Покупатели (Валютный, Субк.Контрагенты, Договоры). РБ (изм. Валюта, рес. Сумма, СуммаВал.) //ДокРасходная Процедура ОбработкаПроведения(Отказ, Режим) Движения.Управленческий.Записывать = Истина; Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Период = Дата; Движение.ВалютаДт = Валюта; Движение.СуммаРуб = СуммаВал * Курс; Движение.СуммаВалДт = СуммаВал; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Договоры] = Договор; КонецПроцедуры Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Валюта = Договор.Валюта; Если Не Валюта.Пустая() Тогда Запрос = Новый Запрос("ВЫБРАТЬ | КурсыВалютСрезПоследних.Курс |ИЗ | РегистрСведений.КурсыВалют.СрезПоследних(&Момент, Валюта = &Валюта) КАК КурсыВалютСрезПоследних"); Запрос.УстановитьПараметр("Момент", Дата); Запрос.УстановитьПараметр("Валюта", Договор.Валюта); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Курс = Выборка.Курс; КонецЕсли; КонецЕсли; КонецПроцедуры //ДокКорректировкаЗадолженности Движения.Управленческий.Записать(); МВТ = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос("ВЫБРАТЬ | УправленческийОстатки.Субконто1, | УправленческийОстатки.Субконто2, | УправленческийОстатки.Валюта КАК Валюта, | УправленческийОстатки.СуммаРубОстаток, | УправленческийОстатки.СуммаВалОстаток |ПОМЕСТИТЬ Список |ИЗ | РегистрБухгалтерии.Управленческий.Остатки(&Момент, Счет.Валютный, &Субконто, ) КАК УправленческийОстатки | |ИНДЕКСИРОВАТЬ ПО | Валюта"); Запрос.МенеджерВременныхТаблиц = МВТ; Запрос.УстановитьПараметр("Момент", Новый Граница(КонецМесяца(Дата), ВидГраницы.Включая)); Субконто = Новый Массив; Субконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Контрагенты); Субконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Договоры); Запрос.УстановитьПараметр("Субконто", Субконто); Результат = Запрос.Выполнить(); Блок = Новый БлокировкаДанных; ЭлБлок = Блок.Добавить("РегистрБухгалтерии.Управленческий"); ЭлБлок.ИсточникДанных = Результат; ЭлБлок.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Покупатели); ЭлБлок.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Контрагенты, "Субконто1"); ЭлБлок.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Договоры, "Субконто2"); ЭлБлок.ИспользоватьИзИсточникаДанных("Валюта", "Валюта"); ЭлБлок.Режим = РежимБлокировкиДанных.Исключительный; Блок.Заблокировать(); Запрос = Новый Запрос("ВЫБРАТЬ | Список.Субконто1, | Список.Субконто2, | Список.Валюта, | Список.СуммаВалОстаток * ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) - Список.СуммаРубОстаток КАК КурсоваяРазница |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних( | &Момент, | Валюта В | (ВЫБРАТЬ | Список.Валюта | ИЗ | Список КАК Список)) КАК КурсыВалютСрезПоследних | ПО Список.Валюта = КурсыВалютСрезПоследних.Валюта |ГДЕ | Список.СуммаВалОстаток * ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) - Список.СуммаРубОстаток <> 0"); Запрос.МенеджерВременныхТаблиц = МВТ; Запрос.УстановитьПараметр("Момент", КонецМесяца(Дата)); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.КурсоваяРазница > 0 Тогда Движение = Движения.Управленческий.Добавить(); Движение.ВалютаДт = Выборка.Валюта; Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Выборка.Субконто1; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Договоры] = Выборка.Субконто2; Движение.СуммаРуб = Выборка.КурсоваяРазница; Иначе Движение = Движения.Управленческий.Добавить(); Движение.ВалютаКт = Выборка.Валюта; Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Покупатели; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Выборка.Субконто1; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Договоры] = Выборка.Субконто2; Движение.СуммаРуб = -Выборка.КурсоваяРазница; КонецЕсли; КонецЦикла; Движения.Управленческий.Записывать = Истина; //ОтчетВзаиморасчеты ВЫБРАТЬ УправленческийОстаткиИОбороты.Субконто1, УправленческийОстаткиИОбороты.Субконто2, УправленческийОстаткиИОбороты.СуммаРубНачальныйОстаток, УправленческийОстаткиИОбороты.СуммаРубКонечныйОстаток, УправленческийОстаткиИОбороты.СуммаРубОборот, УправленческийОстаткиИОбороты.Регистратор ИЗ РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(, , Регистратор, Движения, Счет = &Счет, &Субконто, ) КАК УправленческийОстаткиИОбороты Субконто = Контрагенты,Договоры Счет = Покупатели //2.7 Нужно реализовать учет дополнительных затрат, связанных с рекламой продаваемого товара. //Поступление товаров на склад отражается документом «Приходная накладная». //Документ формирует следующие проводки: Дт «Товары» - Кт «Поставщики» на количество и сумму поступившего товара Факт передачи товара со склада (отгрузки) покупателю регистрируется документом «Расходная накладная». //Данный документ формирует следующие проводки: //Дт «Прибыли и убытки» - Кт «Товары» на сумму себестоимости. //Себестоимость определяется как средняя для каждой номенклатурной позиции по всей компании. //Дт «Дебиторка» - Кт «Прибыли и убытки» на сумму в продажных ценах; //При проведении документа анализируется наличие этого товара на указанном в шапке документа складе. //Если товара не достаточно документ не проводится. //Дополнительные затраты на рекламу вводятся в систему с помощью документа «Реклама». //В табличной части этого документа указывается номенклатурная группа товара, и сумма, затраченная на рекламу данной номенклатурной группы. //Отдельно взятый товар относится только к одной номенклатурной группе. //С течением времени привязка товара к номенклатурной группе может изменяться. //Суммы, введенные в документе «Реклама» распределяются при его проведении по всем товарам, которые числятся на складах организации на момент проведения документа пропорционально их общей себестоимости. //Т.е. если в организации (по всем складам) находятся 100 карандашей (номенклатурная группа «Карандаши») на сумму 1 000 рублей и десять авторучек (номенклатурная группа «Авторучки») на ту же сумму, то сумма затрат на рекламу должна распределиться между ними поровну. //Документ «Реклама» делает следующую проводку: //Дт «Товары» - Кт «Общехозяйственные затраты» на сумму распределенных затрат. //Необходимо создать отчет, показывающий по каждому товару историю изменения его себестоимости с детализацией до документа // //Созд. Спр. Склады, НоменклатурыныеГруппы. Создаем док.Операция. //В шапках накладных добавляем Склад. Создаем док.Реклама (тч. НоменклатурныеГр - НоменклатурнаяГруппа, Сумма). //Создаем РС НоменклатурныеГруппы (в пределах дня, независимый, Изм: Номенклатура, НоменклатурныеГруппы). //ПВХ (Виды субк: Номенклатура, Субконто, Склады). Предопр: Номенклатура, Склады. //ПС (Признак учета - Количественный, КолСубк - 2, Признак учета Субк: Суммовой). //Сч.Товары (Количественный, Субк: Склады, Номенклатура (Суммовой)) РБ(рес. Сумма-бал. признак учта субконто суммовой, Количество - признак учета количественный). //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад КАК Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК КолДок, | ТЧДок.Сумма КАК ДокСум, | ТЧДок.Склад, | ЕСТЬNULL(УправленческийОстаткиВсе.КоличествоОстатокДт, 0) КАК КолОст, | ЕСТЬNULL(УправленческийОстаткиВсе.СуммаОстатокДт, 0) КАК СтоимостьОст, | ЕСТЬNULL(УправленческийОстаткиСклад.КоличествоОстатокДт, 0) КАК КоличествоОстатокСклад |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | (Субконто1, Субконто2) В | (ВЫБРАТЬ | Т.Склад, | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстаткиСклад | ПО ТЧДок.Номенклатура = УправленческийОстаткиСклад.Субконто2 | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто2, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстаткиВсе | ПО ТЧДок.Номенклатура = УправленческийОстаткиВсе.Субконто1"; ВидыСубконто = новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто2 = новый Массив; ВидыСубконто2.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("ВидыСубконто2", ВидыСубконто2); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка",Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.КолДок > Выборка.КоличествоОстатокСклад Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+выборка.Номенклатура +" на складе "+Склад+" недостаточно. На остатке:"+Выборка.КоличествоОстатокСклад; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Себестоимость = ?(выборка.КолОст > Выборка.КолДок, выборка.КолДок*выборка.СтоимостьОст/Выборка.КолОст, выборка.СтоимостьОст); Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Период = Дата; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.Сумма = Себестоимость; Движение.КоличествоКт = Выборка.КолДОк; КонецЦикла; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Дебиторы; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Сумма = СуммаПоДокументу; КонецПроцедуры //ДокРеклама Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Запрос = Новый Запрос; ВидыСубконто = новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("Ссылка",Ссылка); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | РекламаНоменклатурныеГр.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа, | СУММА(РекламаНоменклатурныеГр.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.Реклама.НоменклатурныеГр КАК РекламаНоменклатурныеГр |ГДЕ | РекламаНоменклатурныеГр.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РекламаНоменклатурныеГр.НоменклатурнаяГруппа | |ИНДЕКСИРОВАТЬ ПО | НоменклатурнаяГруппа |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | НоменклатурныеГруппыСрезПоследних.Номенклатура КАК Номенклатура, | ТЧДок.Сумма, | ТЧДок.НоменклатурнаяГруппа |ПОМЕСТИТЬ ВТНомГруппы |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НоменклатурныеГруппы.СрезПоследних( | &МоментВремени, | НоменклатурныеГруппы В | (ВЫБРАТЬ | Т.НоменклатурнаяГруппа | ИЗ | ТЧДок КАК Т)) КАК НоменклатурныеГруппыСрезПоследних | ПО ТЧДок.НоменклатурнаяГруппа = НоменклатурныеГруппыСрезПоследних.НоменклатурныеГруппы | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТНомГруппы.Номенклатура, | ВТНомГруппы.Сумма |ИЗ | ВТНомГруппы КАК ВТНомГруппы"; Результат = Запрос.Выполнить(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = Результат ; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Субконто2", "Номенклатура"); Блокировка.Заблокировать(); Запрос.Текст = "ВЫБРАТЬ | ВТНомГруппы.Номенклатура, | ВТНомГруппы.Сумма КАК Сумма, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СуммаОстаток, | ВТНомГруппы.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа |ИЗ | ВТНомГруппы КАК ВТНомГруппы | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ВТНомГруппы КАК Т)) КАК УправленческийОстатки | ПО ВТНомГруппы.Номенклатура = УправленческийОстатки.Субконто1 |ИТОГИ | МАКСИМУМ(Сумма), | СУММА(СуммаОстаток) |ПО | НоменклатурнаяГруппа"; Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока Выборка.Следующий() цикл ОбщаяСтоимость = Выборка.СуммаОстаток; СуммаРаспределить = Выборка.Сумма; выборкаНоменклатура = Выборка.Выбрать(); Пока выборкаНоменклатура.Следующий() цикл СуммаРаспрЗатрат = СуммаРаспределить*выборкаНоменклатура.СуммаОСтаток/ОбщаяСтоимость; Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.ОбщехозяйственныеЗатраты; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = выборкаНоменклатура.Номенклатура; Движение.Период = Дата; Движение.Сумма = СуммаРаспрЗатрат; КонецЦикла; КонецЦикла; КонецПроцедуры //Отчет ИсторияСебестоимости ВЫБРАТЬ УправленческийОстаткиИОбороты.Субконто1 КАК Товар, УправленческийОстаткиИОбороты.Регистратор КАК Документ, ВЫБОР КОГДА УправленческийОстаткиИОбороты.КоличествоКонечныйОстатокДт <> 0 ТОГДА УправленческийОстаткиИОбороты.СуммаКонечныйОстатокДт / УправленческийОстаткиИОбороты.КоличествоКонечныйОстатокДт ИНАЧЕ 0 КОНЕЦ КАК Себестоимость ИЗ РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(, , Регистратор, Движения, Счет = &Счет, &ВидыСубконто, ) КАК УправленческийОстаткиИОбороты ГДЕ НЕ УправленческийОстаткиИОбороты.Регистратор ССЫЛКА Документ.РасходнаяНакладная //2.8 Необходимо реализовать учет дополнительных затрат, связанных с рекламой продаваемого товара. //Факт передачи товара со склада (отгрузки) покупателю регистрируется документом «Расходная накладная». //Данный документ формирует следующие проводки: Дт «Прибыли и убытки» - Кт «Товары» на сумму себестоимости. //Себестоимость определяется как средняя для каждой номенклатурной позиции по всей компании. //Дт «Дебиторка» - Кт «Прибыли и убытки» на сумму в продажных ценах; //При проведении документа анализируется наличие этого товара на указанном в шапке документа складе. //Если товара не достаточно документ не проводится. //Кроме этого в документе «Расходная накладная» заполняется дополнительный реквизит «Проект», т.е. все продажи осуществляются в разрезе проектов (пустым данный реквизит быть не может). //Дополнительные затраты на продажу вводятся в систему с помощью документа «Затраты». //В табличной части этого документа указывается проект, и сумма, затраченная на затраты в рамках данного проекта. //Документы вводятся по мере поступления затрат в течение дня. //Считается, что все затраты должны быть отнесены в счет продаж текущего дня. //Контролировать наличие продаж по данному проекту при проведении документа «Затраты» не нужно. //При проведении документ «Затраты» формируют следующие проводки: Дт «Прибыли и убытки» - Кт «Общехозяйственные затраты» на сумму затрат. //Необходимо построить отчет о продажах с учетом затрат. // //Добавляем Спр. Склады, Проекты. Добавляем в шапки накладных склад, в шапку расходной еще и проект. //Создаем док. Операция. Создаем док. Затраты (тч. СписокПроектов - Проект, сумма) ПВХ (виды субк: номекл, субконто, проекты, склады). //Предопр. Номенклатура, проекты, склады. ПС признак уч. Количественный, КолСубк - 2, Признак учета субконто Суммовой. //Сч Товары (Количественный, Субк: Номенклатура (суммовой), Склады). Сч ПрибылиИУбытки (Субк: Проекты - толькоОб, Суммовой, Номенклатура - толькоОб,Суммовой). //ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ЭлементТЧ.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад; Движение.КоличествоДт = ЭлементТЧ.Количество; Движение.Сумма = ЭлементТЧ.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад КАК Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК КолДок, | ТЧДок.Сумма КАК СумДок, | ТЧДок.Склад, | ЕСТЬNULL(УправленческийОстаткиВсе.СуммаОстатокДт, 0) КАК СтоимостьОст, | ЕСТЬNULL(УправленческийОстаткиВсе.КоличествоОстатокДт, 0) КАК КолОст, | ЕСТЬNULL(УправленческийОстаткиСклад.КоличествоОстатокДт, 0) КАК КолОстСклад |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | (Субконто1, Субконто2) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстаткиСклад | ПО ТЧДок.Номенклатура = УправленческийОстаткиСклад.Субконто1 | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконтоСебестоимость, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстаткиВсе | ПО ТЧДок.Номенклатура = УправленческийОстаткиВсе.Субконто1"; ВидыСубконто = новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады); ВидыСубконтоСебестоимость = новый Массив; ВидыСубконтоСебестоимость.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("ВидыСубконтоСебестоимость", ВидыСубконтоСебестоимость); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.КолДок> Выборка.КолОстСклад Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+Выборка.Номенклатура+" на складе "+Склад+" недостаточно. На остатке:"+выборка.КолОстСклад; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Проекты] = Проект; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура]= Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура]= Выборка.Номенклатура; Движение.КоличествоКт = Выборка.КолДок; Движение.Сумма = ?(выборка.КолОст> Выборка.КолДок, выборка.КолДок*Выборка.СтоимостьОст/Выборка.КолОст,Выборка.СтоимостьОст); Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Дебиторка; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Проекты] = Проект; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура]= Выборка.Номенклатура; Движение.Сумма = Выборка.СумДок; КонецЦикла; КонецПроцедуры //ДокЗатраты Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.ПрибылиУбытки); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокПроектов; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Проекты, "Проект"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗатратыСписокПроектов.Проект КАК Проект, | СУММА(ЗатратыСписокПроектов.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.Затраты.СписокПроектов КАК ЗатратыСписокПроектов |ГДЕ | ЗатратыСписокПроектов.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ЗатратыСписокПроектов.Проект | |ИНДЕКСИРОВАТЬ ПО | Проект |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Проект КАК Проект, | ТЧДок.Сумма КАК Сумма, | ЕСТЬNULL(УправленческийОбороты.КоличествоКорОборотДт, 0) КАК Количество, | УправленческийОбороты.Субконто2 КАК Номенклатура, | УправленческийОбороты.КоличествоКорОборотКт |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Обороты( | &НачалоПериода, | &КонецПериода, | , | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки), | &ВариантыСубконто, | Субконто1 В | (ВЫБРАТЬ | Т.Проект | ИЗ | ТЧДОк КАК Т), | КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | ) КАК УправленческийОбороты | ПО ТЧДок.Проект = УправленческийОбороты.Субконто1 |ИТОГИ | МАКСИМУМ(Сумма), | СУММА(Количество) |ПО | Проект"; ВариантыСубконто = новый Массив; ВариантыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Проекты); ВариантыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); Запрос.УстановитьПараметр("ВариантыСубконто", ВариантыСубконто); Запрос.УстановитьПараметр("КонецПериода", Новый Граница(КонецДня(Дата),ВидГраницы.Включая)); Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаПроект = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаПроект.Следующий() Цикл Выборка = ВыборкаПроект.Выбрать(); СуммаОбщая = ВыборкаПроект.Количество; Пока Выборка.Следующий() и СуммаОбщая>0 цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.ОбщехозяйственныеЗатраты; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Проекты] = Выборка.Проект; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.Сумма = Выборка.Сумма * Выборка.Количество / СуммаОбщая; КонецЦикла; КонецЦикла; КонецПроцедуры //Отчет Продажи ВЫБРАТЬ УправленческийОбороты.Субконто1 КАК Проект, УправленческийОбороты.Субконто2 КАК Номенклатура, УправленческийОбороты.КоличествоКорОборотДт КАК Количество, ВЫБОР КОГДА УправленческийОбороты.КорСчет <> ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ОбщехозяйственныеЗатраты) ТОГДА УправленческийОбороты.СуммаОборотДт ИНАЧЕ 0 КОНЕЦ КАК Себестоимость, УправленческийОбороты.СуммаОборотКт КАК СуммаПродажи, ВЫБОР КОГДА УправленческийОбороты.КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ОбщехозяйственныеЗатраты) ТОГДА УправленческийОбороты.СуммаОборотДт ИНАЧЕ 0 КОНЕЦ КАК СуммаЗатрат ИЗ РегистрБухгалтерии.Управленческий.Обороты(, , , Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки), &ВидыСубконто, , , ) КАК УправленческийОбороты //2.9 Компания занимается торговлей продуктами питания. Учет товаров ведется в разрезе сроков годности и партий товаров. //Под партией понимается документ поступления. Под сроком годности понимается календарная дата, до которой товар годен к употреблению. //Учет товаров в разрезе складов не ведется. //На один и тот же товар с разными сроками годности при его поступлении может указываться разная цена. //Например, на товар со сроком годности 10 января 2010 цена может быть ниже, чем на товар со сроком годности 30 января 2010. //Товар с одинаковым сроком годности может поступать разными документами и по разной цене, но в одном документе не может быть одинаковых товаров с различным сроком годности (и разной ценой). //Срок годности указывается вручную в табличной части документа «Приходная накладная» для каждой номенклатурной позиции. //Документ "Приходная накладная» реализует следующую проводку: //Дт «Товары» - Кт «Поставщики» на количество и сумму закупаемого товара Продажа товара регистрируется документом «Расходная накладная». //При продаже срок годности не указывается. //В первую очередь списывается товар с наименьшим календарным сроком годности (при равных условиях наиболее дорогой). //Себестоимость товара рассчитывается в разрезе партии и срока годности. //Документ «Расходная накладная» реализует следующие проводки: //Дт «Прибыли и убытки» - Кт «Товары» на количество и сумму себестоимости. Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажных //ценах; //При проведении документа анализируется наличие этого товара в организации. //Если товара не достаточно документ не проводится. //Необходимо создать отчет, который за указанный в диалоге период выдавал бы данные об остатках товара на указанные в качестве границ интервала даты, поступления, продажи товаров в разрезе товаров и их сроков годности, партий товаров. //Отчет должен показывать информацию о количестве и сумме. // //Создаем Док.Операция. В тчПриходной добавляем рекв.СрокГодности. //ПВХ (ВидыСубконто: Номенклатура, Субконто, ПриходнаяНакладная). //Предопред: Номенклатура, Партия, СрокГодности (дата). //ПС (Признак учета: Количественный. КолСубконто - 3.) Сч.Товары: Количественный, Субк: Номенклатура, Партия,СрокГодности. //РБ (Количество (количественный), Сумма). //ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура, | ПриходнаяНакладнаяСписокНоменклатуры.Цена, | ПриходнаяНакладнаяСписокНоменклатуры.СрокГодности |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры |ГДЕ | ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура, | ПриходнаяНакладнаяСписокНоменклатуры.Цена, | ПриходнаяНакладнаяСписокНоменклатуры.СрокГодности |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | СУММА(ТЧДок.Цена) КАК Цена, | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТЧДок.СрокГодности) КАК СрокГодности |ИЗ | ТЧДок КАК ТЧДок | |СГРУППИРОВАТЬ ПО | ТЧДок.Номенклатура | |ИМЕЮЩИЕ | (КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТЧДок.Цена) > 1 | ИЛИ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТЧДок.СрокГодности) > 1)"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Для номенклатуры "+ВыборкаДетальныеЗаписи.Номенклатура+" найдены дубли строк!"; Сообщение.Сообщить(); Отказ =Истина; Возврат; КонецЦикла; Движения.Управленческий.Записывать = Истина; Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] =ЭлементТЧ.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Партия]= Ссылка; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности]= ЭлементТЧ.СрокГодности; Движение.КоличествоДт = ЭлементТЧ.Количество; Движение.Сумма = ЭлементТЧ.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | МАКСИМУМ(РасходнаяНакладнаяСписокНоменклатуры.НомерСтроки) КАК НомерСтроки |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК КолДок, | ТЧДок.Сумма КАК СумДок, | ТЧДок.НомерСтроки КАК НомерСтроки, | УправленческийОстатки.Субконто2 КАК Партия, | УправленческийОстатки.Субконто3 КАК СрокГодности, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст, | ВЫБОР | КОГДА ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) <> 0 | ТОГДА ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) / ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) | ИНАЧЕ 0 | КОНЕЦ КАК СебестоимостьНаЕд |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДОк КАК Т)) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1 | |УПОРЯДОЧИТЬ ПО | СрокГодности, | СебестоимостьНаЕд УБЫВ |ИТОГИ | МАКСИМУМ(КолДок), | МАКСИМУМ(СумДок), | МАКСИМУМ(НомерСтроки), | СУММА(КолОст), | СУММА(СумОст) |ПО | Номенклатура, | СрокГодности"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Партия); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.СрокГодности); Запрос.УстановитьПараметр("ВидыСубконто" , ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени" , МоментВремени()); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.КолДок > ВыборкаНоменклатура.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" недостаточно. На остатке:"+ВыборкаНоменклатура.КолОст; Сообщение.Поле = "СписокНоменклатуры["+(ВыборкаНоменклатура.НомерСтроки-1)+"]"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; КоличествоСписать = ВыборкаНоменклатура.КолДок; ВыборкаСрокГодности = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСрокГодности.Следующий() Цикл // Вставить обработку выборки ВыборкаСрокГодности Выборка = ВыборкаСрокГодности.Выбрать(); Пока Выборка.Следующий() и КоличествоСписать >0 Цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Выборка.Партия; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = Выборка.СрокГодности; Движение.КоличествоКт = Мин(Выборка.КолОст, КоличествоСписать); Движение.Сумма = ?(Выборка.КолОст> КоличествоСписать, КоличествоСписать*Выборка.СумОст/Выборка.КолОст, Выборка.СумОст); КоличествоСписать = КоличествоСписать - Движение.КоличествоКт; КонецЦикла; КонецЦикла; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Сумма = ВыборкаНоменклатура.СумДок; КонецЦикла; КонецПроцедуры //Отчет ВедомостьПоТоварам ВЫБРАТЬ УправленческийОстаткиИОбороты.Субконто1 КАК Товар, УправленческийОстаткиИОбороты.Субконто2 КАК Партия, УправленческийОстаткиИОбороты.Субконто3 КАК СрокГодности, УправленческийОстаткиИОбороты.СуммаОборотДт КАК ПриходСумма, УправленческийОстаткиИОбороты.СуммаОборотКт КАК РасходСумма, УправленческийОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачОСтКолич, УправленческийОстаткиИОбороты.СуммаНачальныйОстаток КАК НачОстСумма, УправленческийОстаткиИОбороты.СуммаКонечныйОстаток КАК КонОстСумма, УправленческийОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонОСтКолич, УправленческийОстаткиИОбороты.КоличествоОборотДт КАК ПриходКолич, УправленческийОстаткиИОбороты.КоличествоОборотКт КАК РасходКолич ИЗ РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(, , , , Счет = ЗНАЧЕНИЕ(планСчетов.Управленческий.Товары), &ВидыСубконто, ) КАК УправленческийОстаткиИОбороты //2.10 Компания занимается торговлей продуктами питания. Учет товаров ведется в разрезе сроков годности. //Под сроком годности понимается календарная дата, до которой товар годен к употреблению. //На один и тот же товар с разными сроками годности при его поступлении может указываться разная цена. //Например, на товар со сроком годности 10 января 2010 цена может быть ниже, чем на товар со сроком годности 30 января 2010. //Товар с одинаковым сроком годности может поступать разными документами и по разной цене. //Возможна ситуация когда в одном документе один и тот же товар поступает с разными сроками годности (и по разной цене). //Учет товаров в разрезе складов не ведется. //Срок годности указывается вручную в табличной части документа «Приходная накладная» для каждой номенклатурной позиции. //Документ «Приходная накладная» реализует следующую проводку: //Дт «Товары» - Кт «Поставщики» на количество и сумму закупаемого товара. Продажа товара регистрируется документом «Расходная накладная». //При продаже срок годности не указывается. //В первую очередь списывается товар с наименьшим календарным сроком годности (при равных условиях наиболее дорогой). //Себестоимость рассчитывается как средняя по номенклатурной позиции в разрезе срока годности. //Документ «Расходная накладная» реализует следующие проводки: Дт «Прибыли и убытки» - Кт «Товары» на количество и сумму себестоимости; Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажных ценах. //При проведении документа анализируется наличие этого товара в организации. //Если товара не достаточно документ не проводится. //Необходимо создать отчет о состоянии товарных запасов в количественном и суммовом выражении. // //Создаем Спр. ЦеныНоменклатуры (рев.Цена). В док Приходная в тч добавляем рекв.СрокГодности. //Создаем док.Операция. ПВХ (ВидыСубконто: Номенклатура, Субконто, ЦеныНоменклатуры). //Предопр: Номенклатура, СрокГодности(Дата),Цена(Число). //ПС(Признак учета - Количественный, КолСубконто -3, признак учета субконто Суммовой.) //Сч Товары: Количественный.Субк:Номенклатура (суммовой), СкрокГодности (суммовой), Цена. //РБ(рес. Сумма (бал, суммовой), Количество (небал. количественный)). //ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ЭлементТЧ.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = ЭлементТЧ.СрокГодности; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Цена] = ЭлементТЧ.Цена; Движение.КоличествоДт = ЭлементТЧ.Количество; Движение.Сумма = ЭлементТЧ.Сумма; КонецЦикла; ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК КолДок, | ТЧДок.Сумма КАК СумДок, | УправленческийОстаткиЦена.Субконто2 КАК СрокГодности, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СтоимостьОст, | ЕСТЬNULL(УправленческийОстаткиЦена.КоличествоОстатокДт, 0) КАК КолОстЦена, | УправленческийОстаткиЦена.Субконто3 КАК Цена |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстаткиЦена | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстатки | ПО УправленческийОстаткиЦена.Субконто1 = УправленческийОстатки.Субконто1 | И УправленческийОстаткиЦена.Субконто2 = УправленческийОстатки.Субконто2 | ПО ТЧДок.Номенклатура = УправленческийОстаткиЦена.Субконто1 | |УПОРЯДОЧИТЬ ПО | СрокГодности, | УправленческийОстаткиЦена.Субконто3 УБЫВ |ИТОГИ | МАКСИМУМ(КолДок), | МАКСИМУМ(СумДок), | МАКСИМУМ(КолОст), | МАКСИМУМ(СтоимостьОст), | СУММА(КолОстЦена) |ПО | Номенклатура, | СрокГодности "; ВидыСубконто = новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.СрокГодности); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Цена); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.КолДок > ВыборкаНоменклатура.КолОстЦена Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" недостаточно. На остатке:"+ВыборкаНоменклатура.КолОстЦена; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Выборка = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); КоличествоСписать = ВыборкаНоменклатура.КолДок; Пока Выборка.Следующий() цикл ВыборкаСрокГодности = Выборка.Выбрать(); Пока ВыборкаСрокГодности.Следующий() и КоличествоСписать>0 Цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.КоличествоКт = Мин(ВыборкаСрокГодности.КолОстЦена, КоличествоСписать); Движение.Сумма =Движение.КоличествоКт * ВыборкаСрокГодности.СтоимостьОст/ВыборкаСрокГодности.КолОст; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаСрокГодности.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = ВыборкаСрокГодности.СрокГодности; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Цена] = ВыборкаСрокГодности.Цена; КоличествоСписать = КоличествоСписать - Движение.КоличествоКт; КонецЦикла; КонецЦикла; КонецЦикла; Если не Отказ Тогда Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Сумма = СуммаПоДокументу; КонецЕсли; КонецПроцедуры ОтчетВедомостьПоТоварам ВЫБРАТЬ УправленческийОстаткиИОбороты.Субконто1 КАК Товар, УправленческийОстаткиИОбороты.Субконто2 КАК СрокГодности, УправленческийОстаткиИОбороты.КоличествоНачальныйОстаток, УправленческийОстаткиИОбороты.СуммаНачальныйОстаток, УправленческийОстаткиИОбороты.КоличествоОборотДт, УправленческийОстаткиИОбороты.СуммаОборотДт, УправленческийОстаткиИОбороты.КоличествоОборотКт, УправленческийОстаткиИОбороты.СуммаОборотКт, УправленческийОстаткиИОбороты.КоличествоКонечныйОстаток, УправленческийОстаткиИОбороты.СуммаКонечныйОстаток ИЗ РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(, , , , Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), &ВидыСубконто, ) КАК УправленческийОстаткиИОбороты 2.11 Компания занимается торговлей продуктами питания. Учет товаров ведется в разрезе сроков годности. Под сроком годности понимается календарная дата, до которой товар годен к употреблению. На один и тот же товар с разными сроками годности при его поступлении может указываться разная цена. Например, на товар со сроком годности 10 января 2010 цена может быть ниже, чем на товар со сроком годности 30 января 2010. Товар с одинаковым сроком годности может поступать разными документами и по разной цене. Возможна ситуация когда в одном документе один и тот же товар поступает с разными сроками годности (и по разной цене). Учет товаров в разрезе складов не ведется. Документ «Приходная накладная» реализует следующую проводку: Дт «Товары» - Кт «Поставщики» на количество и сумму закупаемого товара. Продажа товара регистрируется документом «Расходная накладная». При продаже срок годности не указывается. В первую очередь списывается товар с наименьшим календарным сроком годности. Себестоимость определяется как средняя по товару по всем срокам годности. Т.е. например если 1 пачка йогурта со сроком годности 10.01.2010 поступил по цене 90 рублей и еще 1 пачка того же йогурта, но со сроком годности 30.01.2010 поступила по цене 110 рублей, то при списании себестоимость одной пачки данного йогурта равна 100 рублей. Документ «Расходная накладная» реализует следующие проводки: Дт «Прибыли и убытки» - Кт «Товары» на количество и сумму себестоимости; Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажных ценах. При проведении документа анализируется наличие этого товара в организации. Если товара не достаточно документ не проводится. Необходимо создать отчет, выдающий данные о количественном и суммовом остатке выбранных в диалоге товаров (в диалоге должна быть реализована возможность указания списка товаров). В тч приходной добавляем срокГодности(дата). Создаем документ Операция. ПВХ (ВидыСубк: Номенклатура, Субконто). Предопр: Номенклатура, СрокГодности (Дата). ПВХ (признак учета: Количественный. КолСубконто:2 Признак учета Субк: Суммовой). Сч.Товары - Количественный. Субк: Номенклатура-суммовой, СрокГодности. РБ(рес.Сумма, Количество.) ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) // регистр Управленческий Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = ТекСтрокаСписокНоменклатуры.СрокГодности; Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество; Движение.Период = Дата; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; КонецПроцедуры ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК КолДок, | ТЧДок.Сумма КАК СумДок, | УправленческийОстатки.Субконто2 КАК СрокГодности, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст, | ЕСТЬNULL(УправленческийОстаткиВсе.КоличествоОстатокДт, 0) КАК КолОстВсего, | ЕСТЬNULL(УправленческийОстаткиВсе.СуммаОстатокДт, 0) КАК СтомостьОстВсего |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1 | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконтоНом, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстаткиВсе | ПО ТЧДок.Номенклатура = УправленческийОстаткиВсе.Субконто1 | |УПОРЯДОЧИТЬ ПО | СрокГодности |ИТОГИ | МАКСИМУМ(КолДок), | МАКСИМУМ(СумДок), | СУММА(КолОст), | МАКСИМУМ(КолОстВсего), | МАКСИМУМ(СтомостьОстВсего) |ПО | Номенклатура"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.СрокГодности); ВидыСубконтоНом = Новый Массив; ВидыСубконтоНом.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("ВидыСубконтоНом", ВидыСубконтоНом); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.КолДок > ВыборкаНоменклатура.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура +" недостаточно.На остатке "+ВыборкаНоменклатура.КолОстВсего; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Выборка = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ВыборкаНоменклатура.КолДок; Пока Выборка.Следующий() и КоличествоСписать>0 Цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = Выборка.СрокГодности; Движение.КоличествоКт = Мин(Выборка.КолОст, КоличествоСписать); Движение.Сумма = Движение.КоличествоКт* Выборка.СтомостьОстВсего/Выборка.КолОстВсего; КоличествоСписать = КоличествоСписать - Движение.КоличествоКт; КонецЦикла; КонецЦикла; Если не Отказ Тогда Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Сумма = СуммаПоДокументу; КонецЕсли; КонецПроцедуры ОтчетОстаткиТоваров ВЫБРАТЬ УправленческийОстатки.Субконто1 КАК Контрагент, УправленческийОстатки.Субконто2 КАК СрокГодности, УправленческийОстатки.СуммаОстаток КАК Сумма, УправленческийОстатки.КоличествоОстаток КАК Количество ИЗ РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), &ВидыСубконто, ) КАК УправленческийОстатки ВидСубконто = Номенклатура,СрокГодности 2.12 Компания занимается торговлей продуктами питания. Учет товаров ведется в разрезе сроков годности. Под сроком годности понимается календарная дата, до которой товар годен к употреблению. На один и тот же товар с разными сроками годности при его поступлении может указываться разная цена. Например, на товар со сроком годности 10 января 2010 цена может быть ниже, чем на товар со сроком годности 30 января 2010. Товар с одинаковым сроком годности может поступать разными документами и по разной цене. Возможна ситуация когда в одном документе один и тот же товар поступает с разными сроками годности (и по разной цене). Учет товаров в разрезе складов не ведется. Срок годности указывается вручную в табличной части документа «Приходная накладная» для каждой номенклатурной позиции. Документ «Приходная накладная» реализует следующую проводку: Дт «Товары» - Кт «Поставщики» на количество и сумму закупаемого товара. В системе должен быть реализован регламентный документ (формируемый в единственном экземпляре в конце каждого дня), который производил бы списание товаров с истекшим сроком годности, т.е. тех товаров, срок годности которых не превышает дату документа списания. Себестоимостью списываемого товара рассчитывается как «средняя» в разрезе сроков годности. Списание стоимости производится в соответствии с предельной величиной списания. Данное значение устанавливается раз в год (в начале года) и в течение года не меняется. Если стоимость списываемого товара меньше либо равна предельной величине, то она списывается на счет «Общехозяйственные затраты». Если сумма списания больше предельной величина, то сумма превышения списывается на счет «Прибыли и убытки». Таким образом, документ «Списание товаров» делает следующие проводки: Дт «Общехозяйственные затраты» - Кт «Товары» на все («все» относится только к количеству) количество и стоимость (размер списываемой суммы не может превышать предельную величину списания). Если общая сумма списания выше предельной величины, то дополнительно делается следующая проводка: Дт «Прибыли и убытки» - Кт «Товары» на разницу между общей стоимостью списания и предельной величиной. Необходимо иметь возможность сформировать отчет, отражающий остатки товаров в разрезе сроков годности, как в количественном, так и в суммовом выражении. Добавить докОперация. В тчПриходной добавляем срокГодности (Дата). Создаем док. СписаниеТоваров. Создаем РС ПредельнаяВеличинаСписания (В пределах года, независимый. Рес. Сумма) ПВХ (Предопр: Номенклатура, СрокГодности (Дата)). ПС (ПУ. Количественный, КолСубк -2). Сч.Товары -Количесвтенный. Субк:Номенклатура,СрокГодности. РБ (рес. Сумма, Количество). ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ЭлементТЧ.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = ЭлементТЧ.СрокГодности; Движение.КоличествоДт= ЭлементТЧ.Количество; Движение.Сумма = ЭлементТЧ.Сумма; КонецЦикла; КонецПроцедуры ДокСписаниеТоваров роцедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | СписаниеТоваров.Ссылка |ИЗ | Документ.СписаниеТоваров КАК СписаниеТоваров |ГДЕ | СписаниеТоваров.Дата МЕЖДУ &ДатаНач И &ДатаКон | И СписаниеТоваров.Проведен | И СписаниеТоваров.Ссылка <> &Ссылка"; Запрос.УстановитьПараметр("ДатаКон", КонецДня(Дата)); Запрос.УстановитьПараметр("ДатаНач", НачалоДня(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Если Не Результат.Пустой() тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Сегодня ужен введен данный документ"; Сообщение.Сообщить(); Отказ =Истина; Возврат; КонецЕсли; Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); ПредельнаяВеличинаСписания = РегистрыСведений.ПредельнаяВеличинаСписания.ПолучитьПоследнее(Дата).Сумма; Если не ЗначениеЗаполнено(ПредельнаяВеличинаСписания) Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не установлена предельная величина списания"; Сообщение.Сообщить(); Отказ = Истина; Возврат; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УправленческийОстатки.Субконто1 КАК Номенклатура, | УправленческийОстатки.Субконто2 КАК СрокГодности, | УправленческийОстатки.СуммаОстатокДт КАК СуммаОстаток, | УправленческийОстатки.КоличествоОстатокДт КАК КоличествоОстаток |ИЗ | РегистрБухгалтерии.Управленческий.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.управленческий.Товары), &ВидыСубконто, Субконто2 <= &Дата) КАК УправленческийОстатки"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.СрокГодности); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("Дата", Дата); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ОбщехозяйственныеЗатраты; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = Выборка.СрокГодности; Движение.КоличествоКт = Выборка.КоличествоОстаток; Движение.Сумма = Мин(Выборка.СуммаОстаток, ПредельнаяВеличинаСписания); СуммаСписать = Выборка.СуммаОстаток - Движение.Сумма; Если СуммаСписать >0 тогда Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = Выборка.СрокГодности; Движение.Сумма = СуммаСписать; КонецЕсли; КонецЦикла; КонецПроцедуры //ОтчетОстаткиТоваров ВЫБРАТЬ УправленческийОстатки.Субконто1, УправленческийОстатки.Субконто2, УправленческийОстатки.СуммаОстаток, УправленческийОстатки.КоличествоОстаток ИЗ РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), &ВидыСубконто, ) КАК УправленческийОстатки //ВидыСубконто = Номенклатура, СрокГодности //2.13 Компания занимается торговлей продуктами питания. Учет товаров ведется в разрезе сроков годности. //Под сроком годности понимается календарная дата, до которой товар годен к употреблению. //На один и тот же товар с разными сроками годности при его поступлении может указываться разная цена. //Например, на товар со сроком годности 10 января 2010 цена может быть ниже, чем на товар со сроком годности 30 января 2010. //Срок годности указывается вручную в табличной части документа «Приходная накладная» для каждой номенклатурной позиции. //Учет товаров в разрезе складов не ведется. //Документ «Приходная накладная» реализует следующую проводку: Дт «Товары» - Кт «Поставщики» на кол-во и сумму закупаемого товара. //Продажа товара регистрируется документом «Расходная накладная». //При продаже срок годности не указывается. //В первую очередь списывается товар с наименьшим календарным сроком годности (при равных условиях наиболее дорогой). //Себестоимость рассчитывается как средняя по номенклатурной позиции в разрезе срока годности. //Документ «Расходная накладная» реализует следующие проводки: //Дт «Прибыли и убытки» - Кт «Товары» на кол-во и сумму себестоимости; Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажных ценах. //В системе должен быть реализован регламентный документ (формируемый в единственном экземпляре в конце каждого дня), который производил бы списание товаров с истекшим сроком годности, т.е. тех товаров, срок годности которых не превышает дату документа списания. //Себестоимость рассчитывается как при продаже, но ее списание производится на разные счета частично на затраты, а частично на убытки. //Процент, в соответствии с которым осуществляется распределение суммы себестоимости, указывается для каждой номенклатурной группы товара. //Номенклатурные группы реализуются в виде отдельного справочника. //Привязка товара к номенклатурной группе производится через реквизит справочника «Номенклатура». //Принадлежность товара к номенклатурной группе меняться не может. //Процент в соответствии, с которым производится распределение суммы, устанавливается на каждую номенклатурную группу в начале года и в течение года не меняется. //Таким образом, документ «Списание товаров» делает следующие проводки Дт «Общехозяйственные затраты» - Кт «Товары» на все (все относится только к количеству) кол-во и величину стоимости, полученную как указанный для номенклатурной группы процент от себестоимости списываемого товара. //Дт «Прибыли и убытки» - Кт «Товары» на оставшуюся величину себестоимости. // //Создаем СпрНоменклатурныеГруппы. Создаем ДокОперация. //В приходной в тч добавляем СрокГодности (Дата). Создаем Док. СписаниеТоваров. //Создаем РС ПроцентыРаспределения (в пределах года, независимый. Изм. НоменклатурнаяГруппа, Рес. Процент). //ПВХ (Предопр: Номенклатура, СрокГодности (дата), Цена (Число)). //ПС (призУч Количественный, КолСубк 3, ПризнУчСубк: Суммовой). //Сч Товары -Количесвтенный. Субк ? РБ (рес. Сумма. Количество). //ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = ТекСтрокаСписокНоменклатуры.СрокГодности; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Цена] = ТекСтрокаСписокНоменклатуры.Цена; Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество; Движение.Период = Дата; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.БлокироватьДляИзменения = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК КолДок, | ТЧДок.Сумма КАК СумДок, | УправленческийОстаткиСрокГодности.Субконто2 КАК СрокГодности, | ЕСТЬNULL(УправленческийОстаткиСрокГодности.СуммаОстатокДт, 0) КАК СтоимостьОст, | ЕСТЬNULL(УправленческийОстаткиСрокГодности.КоличествоОстатокДт, 0) КАК КолОст, | ЕСТЬNULL(УправленческийОстаткиЦена.КоличествоОстатокДт, 0) КАК КолОстЦена, | УправленческийОстаткиЦена.Субконто3 КАК Цена |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстаткиСрокГодности | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстаткиЦена | ПО УправленческийОстаткиСрокГодности.Субконто1 = УправленческийОстаткиЦена.Субконто1 | И УправленческийОстаткиСрокГодности.Субконто2 = УправленческийОстаткиЦена.Субконто2 | ПО ТЧДок.Номенклатура = УправленческийОстаткиСрокГодности.Субконто1 | |УПОРЯДОЧИТЬ ПО | СрокГодности, | Цена УБЫВ |ИТОГИ | МАКСИМУМ(КолДок), | МАКСИМУМ(СумДок), | МАКСИМУМ(СтоимостьОст), | МАКСИМУМ(КолОст), | СУММА(КолОстЦена) |ПО | Номенклатура, | СрокГодности"; ВидыСубконто = новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.СрокГодности); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Цена); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.КолДок > ВыборкаНоменклатура.КолОстЦена Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" недостаточно. На остатке:"+ВыборкаНоменклатура.КолОстЦена; Сообщение.Сообщить(); Отказ =Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; ВыборкаСрокГодности = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); КоличествоСписать = ВыборкаНоменклатура.КолДок; КоличествоВсего = ВыборкаНоменклатура.КолОстЦена; Пока ВыборкаСрокГодности.Следующий() Цикл СуммаРаспределить = ВыборкаСрокГодности.СтоимостьОст; Выборка = ВыборкаСрокГодности.Выбрать(); Пока Выборка.Следующий() и КоличествоСписать>0 Цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = Выборка.СрокГодности; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Цена] = Выборка.Цена; Движение.КоличествоКт = Мин(Выборка.КолОстЦена, КоличествоСписать); Движение.Сумма = ?(Движение.КоличествоКт = КоличествоВсего,СуммаРаспределить,Движение.КоличествоКт* Выборка.СтоимостьОст/Выборка.КолОст); КоличествоСписать = КоличествоСписать - Движение.КоличествоКт; СуммаРаспределить = СуммаРаспределить - Движение.Сумма; КоличествоВсего = КоличествоВсего - Движение.КоличествоКт; КонецЦикла; КонецЦикла; КонецЦикла; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Сумма = СуммаПоДокументу; КонецПроцедуры //ДокСписаниеТоваров Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписаниеТоваров.Ссылка |ИЗ | Документ.СписаниеТоваров КАК СписаниеТоваров |ГДЕ | СписаниеТоваров.Дата МЕЖДУ &ДатаНач И &ДатаКон | И СписаниеТоваров.Проведен | И СписаниеТоваров.Ссылка <> &Ссылка | |СГРУППИРОВАТЬ ПО | СписаниеТоваров.Ссылка"; Запрос.УстановитьПараметр("ДатаКон", КонецДня(Дата)); Запрос.УстановитьПараметр("ДатаНач", НачалоДня(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Если НЕ Результат.Пустой() тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Регламентный документ уже присутствует"; Сообщение.Сообщить(); Отказ = Истина; Возврат; КонецЕсли; Движения.Управленческий.Записывать = Истина; Движения.Управленческий.БлокироватьДляИзменения=Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УправленческийОстатки.Субконто1 КАК Номенклатура, | УправленческийОстатки.Субконто2 КАК СрокГодности, | УправленческийОстатки.Субконто1.НоменклатурнаяГруппа КАК НомГруппа, | УправленческийОстаткиЦена.Субконто3 КАК Цена, | УправленческийОстатки.СуммаОстатокДт КАК СуммаОстаток, | УправленческийОстаткиЦена.КоличествоОстатокДт КАК КоличествоОстаток |ПОМЕСТИТЬ Остатки |ИЗ | РегистрБухгалтерии.Управленческий.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), &ВидыСубконто, Субконто2 <= &Дата) КАК УправленческийОстатки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), &ВидыСубконто, Субконто2 <= &Дата) КАК УправленческийОстаткиЦена | ПО УправленческийОстатки.Субконто1 = УправленческийОстаткиЦена.Субконто1 | И УправленческийОстатки.Субконто2 = УправленческийОстаткиЦена.Субконто2 | |ИНДЕКСИРОВАТЬ ПО | НомГруппа |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПроцентыРаспределенияСрезПоследних.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа, | ПроцентыРаспределенияСрезПоследних.Процент |ПОМЕСТИТЬ НомГруппы |ИЗ | РегистрСведений.ПроцентыРаспределения.СрезПоследних( | &МоментВремени, | НоменклатурнаяГруппа В | (ВЫБРАТЬ | Т.НомГруппа | ИЗ | Остатки КАК Т)) КАК ПроцентыРаспределенияСрезПоследних | |ИНДЕКСИРОВАТЬ ПО | НоменклатурнаяГруппа |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Остатки.Номенклатура КАК Номенклатура, | Остатки.СрокГодности КАК СрокГодности, | ЕСТЬNULL(НомГруппы.Процент, 1) КАК ПроцентРаспределения, | Остатки.Цена КАК Цена, | Остатки.СуммаОстаток КАК СуммаОстаток, | Остатки.КоличествоОстаток КАК КоличествоОстаток |ИЗ | Остатки КАК Остатки | ЛЕВОЕ СОЕДИНЕНИЕ НомГруппы КАК НомГруппы | ПО Остатки.НомГруппа = НомГруппы.НоменклатурнаяГруппа | |УПОРЯДОЧИТЬ ПО | СрокГодности, | Цена УБЫВ |ИТОГИ | МАКСИМУМ(СуммаОстаток), | СУММА(КоличествоОстаток) |ПО | Номенклатура"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.СрокГодности); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Цена); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("Дата", Дата); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Выборка = ВыборкаНоменклатура.Выбрать(); Пока Выборка.Следующий() цикл Себестоимость = Выборка.СуммаОстаток * Выборка.ПроцентРаспределения/100; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ОбщехозяйственныеЗатраты; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = Выборка.СрокГодности; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Цена] = Выборка.Цена; Движение.КоличествоКт = Выборка.КоличествоОстаток; Движение.Сумма = Себестоимость; Если Выборка.СуммаОстаток > Себестоимость Тогда Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = Выборка.СрокГодности; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Цена] = Выборка.Цена; Движение.Сумма = Выборка.СуммаОстаток - Себестоимость; КонецЕсли; КонецЦикла; КонецЦикла; КонецПроцедуры //Отчет СписаниеПросроченногоТовара ВЫБРАТЬ УправленческийОборотыДтКт.СубконтоКт1 КАК Номенклатура, ВЫБОР КОГДА УправленческийОборотыДтКт.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ОбщехозяйственныеЗатраты) ТОГДА УправленческийОборотыДтКт.СуммаОборот ИНАЧЕ 0 КОНЕЦ КАК СуммаЗатрат, УправленческийОборотыДтКт.КоличествоОборотКт КАК Количество, ВЫБОР КОГДА УправленческийОборотыДтКт.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки) ТОГДА УправленческийОборотыДтКт.СуммаОборот ИНАЧЕ 0 КОНЕЦ КАК СуммаУбытков, УправленческийОборотыДтКт.СубконтоКт2 КАК СрокГодности ИЗ РегистрБухгалтерии.Управленческий.ОборотыДтКт(, , Регистратор, , , СчетКТ = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), &ВидыСубконто, ) КАК УправленческийОборотыДтКт ГДЕ УправленческийОборотыДтКт.Регистратор ССЫЛКА Документ.СписаниеТоваров //Субконто = Номенклатура, СрокГодности //2.14 Необходимо реализовать возможность закупки и продажи редких товаров. Поступление таких товаров осуществляется документом «Приходная накладная». //В документе поступления каждая единица товара оформляется отдельной строкой (с количеством равным 1). //Каждой позиции закупаемого товара присваивается уникальный инвентарный номер (считается, что за уникальностью следит пользователь, автоматизировать получение уникальных инвентарных номеров в рамках задачи не требуется). //Одним документом может оформляться поступление нескольких одинаковых товаров, но с разными инвентарными номерами. //Документ «Приходная накладная» реализует следующую проводку: Дт «Товары» - Кт «Поставщики» на сумму закупаемого товара Продажа товара регистрируется документом «Расходная накладная». //При продаже инвентарный номер вводится в табличную часть документа вручную. //При проведении документа должен производиться контроль наличия указанного в документе товара (по указанному инвентарному номеру). //Себестоимость списываемого товара определяется как средняя по номенклатурной позиции по всем ее инвентарным номерам. //Документ «Расходная накладная» реализует следующие проводки: Дт «Прибыли и убытки» - Кт «Товары» на сумму себестоимости; Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажных ценах. //По данным бухгалтерского учета необходимо сформировать отчет, который за указанный интервал дат показывал бы данные о проданном товаре. // //Создаем спр. ИнвентарныеНомера подчин. спр.Номенклатуре. //В тч накладных добавляем инвентарныйНомер. Создаем док.Операция. //ПВХ (ВидСубконто: Номенклатура, Субконто, ИнвентарныеНомера. //Предопр: ИнвентарныйНомер, Номенклатура). ПС(призн уч: Количественный, КолСубк-2, Призн уч субк - Суммовой). //Сч.Товары - Количественный. Субк - ?. РБ (рес - Сумма, Количество). //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныйНомер] = ТекСтрокаСписокНоменклатуры.ИнвентарныйНомер; Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество; Движение.Период = Дата; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.БлокироватьДляИзменения = Истина; Движения.Управленческий.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныйНомер, "ИнвентарныйНомер"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.ИнвентарныйНомер КАК ИнвентарныйНомер, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.ИнвентарныйНомер | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | ИнвентарныйНомер |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.ИнвентарныйНомер, | МАКСИМУМ(ТЧДок.Количество) КАК КолДОк, | МАКСИМУМ(ТЧДок.Сумма) КАК СумДок, | СУММА(ЕСТЬNULL(УправленческийОстатки.СуммаОстаток, 0)) КАК СумОст, | СУММА(ЕСТЬNULL(УправленческийОстатки.КоличествоОстаток, 0)) КАК КолОст, | СУММА(ВЫБОР | КОГДА УправленческийОстатки.Субконто2 = ТЧДок.ИнвентарныйНомер | ТОГДА ЕСТЬNULL(УправленческийОстатки.КоличествоОстаток, 0) | ИНАЧЕ 0 | КОНЕЦ) КАК КолОстИнв |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1 | |СГРУППИРОВАТЬ ПО | ТЧДок.Номенклатура, | ТЧДок.ИнвентарныйНомер"; ВидыСубконто = новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныйНомер); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока Выборка.Следующий() Цикл Если Выборка.КолДок > Выборка.КолОстИнв Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+Выборка.Номенклатура +"с инвентарным номером "+ Выборка.ИнвентарныйНомер+" недостаточно. На остатке:"+Выборка.КолОстИнв; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; КоличествоСписать = Выборка.КолДок; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныйНомер] = Выборка.ИнвентарныйНомер; Движение.Сумма = Выборка.СумДок; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныйНомер] = Выборка.ИнвентарныйНомер; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныйНомер] = Выборка.ИнвентарныйНомер; Движение.КоличествоКт = Мин(КоличествоСписать, Выборка.КолОстИнв); Движение.Сумма = ?(Выборка.КолОст>КоличествоСписать, КоличествоСписать*выборка.СумОст/Выборка.КолОст, Выборка.СумОст); КонецЦикла; КонецПроцедуры //ОтчетПродажи ВЫБРАТЬ РегистрБухгалтерииОбороты.Субконто1 КАК ИнвентарныйНомер, РегистрБухгалтерииОбороты.СуммаОборотДт КАК Себестоимость, РегистрБухгалтерииОбороты.СуммаОборотКт КАК Продажа ПОМЕСТИТЬ ДанныеПоПродажам ИЗ РегистрБухгалтерии.Управленческий.Обороты({(&НачалоПериода)}, {(&КонецПериода)}, , Счет = &ПрибылиИУбытки, &ВидСубконтоИнвНомера, , , ) КАК РегистрБухгалтерииОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДанныеПоПродажам.ИнвентарныйНомер.Владелец КАК Товар, ДанныеПоПродажам.ИнвентарныйНомер, РегистрБухгалтерииОбороты.СуммаОборотКт КАК Закупка, ДанныеПоПродажам.Себестоимость, ДанныеПоПродажам.Продажа ИЗ ДанныеПоПродажам КАК ДанныеПоПродажам ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Обороты( &БезОграничения, &БезОграничения, , Счет = &Поставщики, , КорСубконто1 В (ВЫБРАТЬ ДанныеПоПродажам.ИнвентарныйНомер ИЗ ДанныеПоПродажам КАК ДанныеПоПродажам), КорСчет = &Товары, &ВидСубконтоИнвНомера) КАК РегистрБухгалтерииОбороты ПО ДанныеПоПродажам.ИнвентарныйНомер = РегистрБухгалтерииОбороты.КорСубконто1 //2.15 Необходимо реализовать возможность закупки и продажи редких товаров. ///Поступление таких товаров осуществляется документом «Приходная накладная». //В документе поступления каждая единица товара оформляется отдельной строкой (с количеством равным 1). //Каждой позиции закупаемого товара присваивается уникальный инвентарный номер (считается, что за уникальностью следит пользователь, автоматизировать получение уникальных инвентарных номеров в рамках задачи не требуется). //Одним документом может оформляться поступление нескольких одинаковых товаров, но с разными инвентарными номерами. //Документ «Приходная накладная» реализует следующую проводку: Дт «Товары» - Кт «Поставщики» на сумму закупаемого товара. //Продажа товара регистрируется документом «Расходная накладная». //При продаже инвентарный номер вводится в табличную часть документа вручную. //При проведении документа должен производиться контроль наличия указанного в документе товара (по указанному инвентарному номеру). //Себестоимостьсписываемого товара определяется по каждой номенклатурной позиции для каждого ее инвентарного номера. //При списании себестоимости следует учесть, что она может быть скорректирована пользователем документом «Операция» и не совпадать с закупочной ценой. //Документ «Расходная накладная» реализует следующие проводки: Дт «Прибыли и убытки» - Кт «Товары» на сумму себестоимости; Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажных ценах. //Также в документе «Расходная накладная» указывается сотрудник, осуществивший продажу. //Необходимо сформировать отчет, который за указанный интервал дат показывал бы данные о продажах товара сотрудниками. // //Создаем Спр. ИнвентарныеНомера подчин. Номенкл. Создаем Спр.Сотрудники. Создаем док. Операция. //В ТЧ накладных добавляем ИнвентарныйНомер. //В Шапку расходной добалвяем Сотрудника. //ПВХ (ВидыСубконто: Номенклатура, Субконто, Сотрудник,ИнвентарныйНомер). Предопр: ИнвентарныйНомер,Сотрудник,Субконто. //ПС - признУч Количественный, КолСубк - 2. Сч.Товары(Количественный, Субк: Номенклатура, ИнвентарныйНомер). //ПрибылиИУбытки (Сотрудник - толькоОб, ИнвентарныйНомер - толькоОб). РБ - Рес.Сумма, Количество. //ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ЭлементТЧ.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныйНомер] = ЭлементТЧ.ИнвентарныйНомер; Движение.КоличествоДт = ЭлементТЧ.Количество; Движение.Сумма = ЭлементТЧ.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.БлокироватьДляИзменения = Истина; Движения.Управленческий.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныйНомер, "ИнвентарныйНомер"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.ИнвентарныйНомер КАК ИнвентарныйНомер, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.ИнвентарныйНомер | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | ИнвентарныйНомер |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.ИнвентарныйНомер, | ТЧДок.Количество КАК КолДок, | ТЧДок.Сумма КАК СумДок, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СтоимостьОст, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | (Субконто1, Субконто2) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.ИнвентарныйНомер | ИЗ | ТЧДОк КАК Т)) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1 | И ТЧДок.ИнвентарныйНомер = УправленческийОстатки.Субконто2"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныйНомер); Запрос.УстановитьПараметр("ВидыСубконто" , ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени" , МоментВремени()); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.КолДок > Выборка.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+Выборка.Номенклатура+" с инвентарным номером "+Выборка.ИнвентарныйНомер+" недостаточно. На остатке:"+Выборка.КолОст; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; КоличествоСписать = Выборка.КолДок; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныйНомер] = Выборка.ИнвентарныйНомер; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныйНомер] = Выборка.ИнвентарныйНомер; Движение.КоличествоКт= КоличествоСписать; Движение.Сумма = ?(Выборка.КолОст> КоличествоСписать,КоличествоСписать*Выборка.СтоимостьОст/Выборка.КолОст, Выборка.СтоимостьОст); Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныйНомер] = Выборка.ИнвентарныйНомер; Движение.Сумма = Выборка.СумДок; КонецЦикла; КонецПроцедуры //ОтчетПРодажи ВЫБРАТЬ УправленческийОбороты.Субконто1 КАК Сотрудник, УправленческийОбороты.Субконто2 КАК ИнвентарныйНОмер, УправленческийОбороты.СуммаОборотДт КАК Стоимость, УправленческийОбороты.СуммаОборотКт КАК Продажа, УправленческийОбороты.Субконто2.Владелец КАК Номенклатура ИЗ РегистрБухгалтерии.Управленческий.Обороты(, , , Счет = &СчетДТ, &ВидыСубконто, , , ) КАК УправленческийОбороты //Счет = ПрибылиИУбытки Субконто = Сотрудник,ИнвентарныйНомер. //2.16 Необходимо реализовать возможность ведения учета товаров в разрезе мест хранения и партий товаров. //Под партией товара понимается документ, регистрирующий его (товара) поступление. //Документ «Приходная накладная» реализует следующую проводку: Дт «Товары» - Кт «Поставщики» на количество и сумму закупаемого товара. //Продажа товара производится с указанного склада и регистрируется документом «Расходная накладная». //При заполнении документа партия товара не указывается. //При проведении производится проверка достаточности количества на указанном складе продаваемого товара. //Документ «Расходная накладная» реализует следующие проводки: Дт «Прибыли и убытки» - Кт «Товары» на количество и сумму себестоимости; Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажных ценах. //При продаже товара списание партий этого товара производится либо по дисциплине LIFO («последним пришел, первым ушел»), либо FIFO («первым пришел, первым ушел»). //Какая из дисциплин будет использоваться, определяется в начале года и в течение года не меняется. //Себестоимость товара рассчитывается в разрезе партий поступления этого товара. //Товар может перемещаться со склада на склад. Данная операция должна быть реализована через документ «Перемещение», где в шапке указываются склад отправитель и склад получатель, а в табличной части перемещаемый товар и его количество. //При перемещении себестоимость товара не меняется. //В случае отсутствия необходимого количества товара на складе отправителе документ не должен проводиться. //Проводки, формируемые при проведении документа «Перемещение»: Дт «Товары» - Кт «Товары» на перемещаемое количество. //Необходимо построить отчет о товарах на складах. // //Создаем Спр.Склады. В расходных добавляем Склад в шапку. Создаем док Операция. Создаем док. ПеремещениеТоваров (Рекв. СкладОтправитель, СкладПолучатель, тч СписокНоменклатуры - Номенклатура, Количество.) ПВХ (ВидыСубконто: Номенклатура,Субконто,Склады, Приходная). Предопр: Номенклатура, Партия, Склад. //ПС (признак учета Количественный, Субконто - 3, ПризнакиУчетаСубконто: Суммовой, Партионный, Количественный). Счет Товары (Количественный, Субк?). РБ - Рес: Сумма(Суммовой), Количесвто(Количественный), КоличесвтоПартия (Количественный,Партионный,) Рекв: Содержание. //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Ссылка; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.Период = Дата; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество; Движение.КоличествоПартияДт = ТекСтрокаСписокНоменклатуры.Количество; Движение.Содержание = "Приход товара"; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.БлокироватьДляИзменения = Истина; Движения.Управленческий.Записать(); МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания; Если Не ЗначениеЗаполнено(МетодСписания) Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не найдены настройки учетной политики"; Сообщение.Сообщить(); ОТказ = Истина; Возврат; КонецЕсли; Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда ПорядокСортировки= " УБЫВ"; Иначе ПорядокСортировки = ""; КонецЕсли; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДОк |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДОк.Номенклатура КАК Номенклатура, | ТЧДОк.Количество КАК КолДок, | ТЧДОк.Сумма КАК СумДок, | УправленческийОстаткиВсе.Субконто2 КАК Партия, | ЕСТЬNULL(УправленческийОстаткиВсе.СуммаОстатокДт, 0) КАК СумОст, | ЕСТЬNULL(УправленческийОстаткиВсе.КоличествоПартияОстатокДт, 0) КАК КолОст, | ЕСТЬNULL(УправленческийОстаткиСклад.КоличествоОстатокДт, 0) КАК КолОстСклад |ИЗ | ТЧДОк КАК ТЧДОк | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т) | И Субконто3 = &Склад) КАК УправленческийОстаткиСклад | ПО ТЧДОк.Номенклатура = УправленческийОстаткиСклад.Субконто1 | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстаткиВсе | ПО (ТЧДОк.Номенклатура = УправленческийОстаткиСклад.Субконто1) | |УПОРЯДОЧИТЬ ПО | Партия "+ПорядокСортировки+" |ИТОГИ | МАКСИМУМ(КолДок), | МАКСИМУМ(СумДок), | СУММА(СумОст), | СУММА(КолОст), | МАКСИМУМ(КолОстСклад) |ПО | Номенклатура"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Партия); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склад); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Склад", Склад); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.КолДок > ВыборкаНоменклатура.КолОстСклад Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" на складе "+Склад+" недостаточно. На остатке:"+ВыборкаНоменклатура.КолОстСклад; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Выборка = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ВыборкаНоменклатура.КолДок; Пока Выборка.Следующий() и КоличествоСписать>0 Цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Выборка.Партия; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад; Движение.КоличествоКт = Мин(КоличествоСписать,Выборка.КолОст); Движение.КоличествоПартияКт = Движение.КоличествоКт; Движение.Сумма = ?(Выборка.КолОст>КоличествоСписать, КоличествоСписать*Выборка.СумОСт/Выборка.КолОст, Выборка.СумОСт); Движение.Содержание = "Списана себестоимость"; КоличествоСписать = КоличествоСписать - Движение.КоличествоКт; КонецЦикла; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Сумма = выборка.СумДок; Движение.Содержание = "Продажа"; КонецЦикла; КонецПроцедуры //ДокПеремещениеТоваров Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.БлокироватьДляИзменения = Истина; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Партия); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склад); Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени(),ВидГраницы.Включая)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ВидыСубконто",ВидыСубконто); Запрос.Текст = "ВЫБРАТЬ | ПеремещениеТоваровСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ПеремещениеТоваровСписокНоменклатуры.Количество) КАК Количество, | ПеремещениеТоваровСписокНоменклатуры.Ссылка.СкладОтправитель как Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПеремещениеТоваров.СписокНоменклатуры КАК ПеремещениеТоваровСписокНоменклатуры |ГДЕ | ПеремещениеТоваровСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ПеремещениеТоваровСписокНоменклатуры.Номенклатура, | ПеремещениеТоваровСписокНоменклатуры.Ссылка.СкладОтправитель | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество |ИЗ | ТЧДок КАК ТЧДок"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.КоличествоДт = Выборка.Количество; Движение.КоличествоКт = Выборка.Количество; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = СкладПолучатель; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = СкладОтправитель; КонецЦикла; Движения.Управленческий.Записать(); Запрос.Текст = "ВЫБРАТЬ | УправленческийОстатки.Субконто1 КАК Номенклатура, | УправленческийОстатки.Субконто3 КАК Склад, | УправленческийОстатки.СуммаОстатокДт КАК Остаток, | ПРЕДСТАВЛЕНИЕ(УправленческийОстатки.Субконто1) КАК НомПредставление, | ПРЕДСТАВЛЕНИЕ(УправленческийОстатки.Субконто3) КАК СкладПредставление |ИЗ | РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | (Субконто1, Субконто3) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстатки |ГДЕ | УправленческийОстатки.КоличествоОстатокДТ < 0" ; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Если не Результат.Пустой() Тогда Отказ = Истина; Пока Выборка.Следующий() цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара"+Выборка.НомПредставление+" недостаточно "; Сообщение.Сообщить(); КонецЦикла; КонецЕсли; КонецПроцедуры //ОтчетОстаткиТоваров ВЫБРАТЬ УправленческийОстатки.Субконто1 КАК Товар, УправленческийОстатки.Субконто2 КАК Склад, УправленческийОстатки.КоличествоОстаток КАК Количество, УправленческийОстатки.СуммаОстаток КАК Сумма ИЗ РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), &ВидыСубконто, ) КАК УправленческийОстатки //ВидыСубконто = Номенклатура, Склад //2.17 Необходимо реализовать возможность ведения учета товаров в разрезе мест хранения и партий товаров. //Под партией товара понимается документ, регистрирующий его (товара) поступление. //Документ «Приходная накладная» реализует следующую проводку: Дт «Товары» - Кт «Поставщики» на количество и сумму закупаемого товара. //Продажа товара производится с указанного склада и регистрируется документом «Расходная накладная». //При заполнении документа партия товара не указывается. //При проведении производится проверка достаточности количества на указанном складе продаваемого товара. //Документ «Расходная накладная» реализует следующие проводки: Дт «Прибыли и убытки» - Кт «Товары» на количество и сумму себестоимости; Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажных ценах. //При продаже товара списание партий этого товара производится либо подисциплине LIFO («последним пришел, первым ушел»), либо FIFO («первым пришел, первым ушел»). //Какая из дисциплин будет использоваться, определяется в начале года и в течение года не меняется. //Себестоимость товара рассчитывается в разрезе партий поступления этого товара на склад, с которого происходит списание. //Товар может перемещаться со склада на склад. //Данная операция должна быть реализована через документ «Перемещение», где в шапке указываются склад отправитель и склад получатель, а в табличной части перемещаемый товар и его количество. //При перемещении себестоимость товара определяется следующим образом: со склада отправителя себестоимость списывается как при продаже, а на склад получатель товар приходит с партией, которой является текущий документ перемещения товаров. //В случае отсутствия необходимого количества товара на складе отправителе документ не должен проводиться. //Проводки, формируемые при проведении документа «Перемещение»: //Дт «Товары» - Кт «Товары» на перемещаемое количество и стоимость. Необходимо построить отчет о продажах товаров со складов. // //Создаем справочник Склады. Добавляем Склад в шапки накладных. //Создаем док Операция. Создаем док ПеремещениеТоваров (рекв. СкладОтправитель,СкладПолучатель, тч. СписокНоменклатуры рекв.Номенклатура, Количество.) //ПВХ (Виды субконто: номенкл.Субконто,склады, приходная, перемещениетоваров). //Предопр: Номенклатура, Партия, Склад. ПС (признУч Количественный, КолСубк - 3) Сч.Товары (Количественный, Субк: Номенклатура, Склад,Партия); //Сч ПрибылиИУбытки(Номенклатура - толькоОБ, Склад - толькоОб). РБ (рес. Сумма, Количество). //ДокПРиходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ЭлементТЧ.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Ссылка; Движение.КоличествоДт = ЭлементТЧ.Количество; Движение.Сумма = ЭлементТЧ.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Записать(); Движения.Управленческий.Записывать = Истина; МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания; Если не ЗначениеЗаполнено(МетодСписания) Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не найдена учетная политика!!!"; Сообщение.Сообщить(); Отказ = Истина; Возврат; КонецЕсли; Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда ПорядокСортировки = " УБЫВ"; Иначе ПорядокСортировки =""; КонецЕсли; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад КАК Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК КолДок, | ТЧДок.Сумма КАК СумДок, | ТЧДок.Склад, | УправленческийОстатки.Субконто3 КАК Партия, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст, | ПРЕДСТАВЛЕНИЕ(ТЧДок.Номенклатура) |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | (Субконто1, Субконто2) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1 | |УПОРЯДОЧИТЬ ПО | Партия "+ПорядокСортировки+" |ИТОГИ | МАКСИМУМ(КолДок), | МАКСИМУМ(СумДок), | СУММА(СумОст), | СУММА(КолОст) |ПО | Номенклатура"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склад); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Партия); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.КолДок > ВыборкаНоменклатура.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара " +ВыборкаНоменклатура.НоменклатураПредставление+" недостаточно.На остатке:"+ВыборкаНоменклатура.КолОст; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Выборка = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ВыборкаНоменклатура.КолДок; Пока Выборка.Следующий() и КоличествоСписать>0 Цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Выборка.Партия; Движение.КоличествоКт = Мин(Выборка.КолОст ,КоличествоСписать); Движение.Сумма = ?(Выборка.КолОст>КоличествоСписать, КоличествоСписать*Выборка.СумОст/Выборка.КолОст, Выборка.СумОст); КоличествоСписать = КоличествоСписать - Движение.КоличествоКт; КонецЦикла; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаНоменклатура.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад; Движение.Сумма = ВыборкаНоменклатура.СумДок; КонецЦикла; КонецПроцедуры //ДокПеремещениеТоваров Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.БлокироватьДляИзменения = Истина; Движения.Записать(); Движения.Управленческий.Записывать = Истина; МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания; Если не ЗначениеЗаполнено(МетодСписания) Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не найдена учетная политика!!!"; Сообщение.Сообщить(); Отказ = Истина; Возврат; КонецЕсли; Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда ПорядокСортировки = " УБЫВ"; Иначе ПорядокСортировки =""; КонецЕсли; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПеремещениеТоваровСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ПеремещениеТоваровСписокНоменклатуры.Количество) КАК Количество, | ПеремещениеТоваровСписокНоменклатуры.Ссылка.СкладОтправитель КАК Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПеремещениеТоваров.СписокНоменклатуры КАК ПеремещениеТоваровСписокНоменклатуры |ГДЕ | ПеремещениеТоваровСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ПеремещениеТоваровСписокНоменклатуры.Номенклатура, | ПеремещениеТоваровСписокНоменклатуры.Ссылка.СкладОтправитель | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК КолДок, | УправленческийОстатки.Субконто3 КАК Партия, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | (Субконто1, Субконто2) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1 | |УПОРЯДОЧИТЬ ПО | Партия |ИТОГИ | МАКСИМУМ(КолДок), | СУММА(СумОст), | СУММА(КолОст) |ПО | Номенклатура"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склад); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Партия); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.КолДок > ВыборкаНоменклатура.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара " +ВыборкаНоменклатура.Номенклатура+" недостаточно.На остатке:"+ВыборкаНоменклатура.КолОст; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Выборка = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ВыборкаНоменклатура.КолДок; Пока Выборка.Следующий() и КоличествоСписать>0 Цикл НеобходимоеКоличество = Мин(Выборка.КолОст ,КоличествоСписать); Себестоимость = ?(Выборка.КолОст>КоличествоСписать, КоличествоСписать*Выборка.СумОст/Выборка.КолОст, Выборка.СумОст); Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = СкладПолучатель; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Ссылка; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = СкладОтправитель; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Выборка.Партия; Движение.КоличествоКт = НеобходимоеКоличество; Движение.КоличествоДт = НеобходимоеКоличество; Движение.Сумма = Себестоимость; КоличествоСписать = КоличествоСписать - Движение.КоличествоКт; КонецЦикла; КонецЦикла; КонецПроцедуры //ОтчетПродажи ВЫБРАТЬ УправленческийОбороты.Субконто1 КАК Товар, УправленческийОбороты.Субконто2 КАК Склад, УправленческийОбороты.СуммаОборотДт КАК Себестоимость, УправленческийОбороты.КоличествоКорОборотДт КАК Количество, УправленческийОбороты.СуммаОборотКт КАК Суммапродажи ИЗ РегистрБухгалтерии.Управленческий.Обороты( , , , Счет = ЗНАЧЕНИЕ(планСчетов.Управленческий.ПрибылиУбытки), &ВидыСубконто, , , ) КАК УправленческийОбороты Субконто = Номенклатура, Склад //2.18 Необходимо реализовать возможность ведения учета товаров в разрезе организаций, мест хранения и партий товаров. //Подразумевается, что для каждой организации баланс будет формировать отдельно (каждая организация это отдельное юридическое лицо). //Склады у организаций «общие» (привязки склада к конкретной организации нет, но товар может принадлежать только одной организации). //Под партией товара понимается документ, регистрирующий его поступление. //Документ «Приходная накладная» реализует следующую проводку: Дт «Товары» - Кт «Поставщики» на количество и сумму закупаемого товара. //В системе необходимо реализовать документ, который осуществлял бы перемещение товара между собственными организациями (с возможным изменением склада компании). //Фактически подобное перемещение будет регистрировать сразу две операции: продажа товара поставщиком покупателю и покупка покупателем товара у поставщика. //Регистрация этих операций будет осуществляться документом «КупляПродажа». //В шапке документа (при его заполнении) указывается организация-покупатель, организация-поставщик, склад организации-покупателя и склад организации-поставщика. //Документ «КупляПродажа» реализует следующие проводки: По организации-поставщику: Дт «Прибыли и убытки» - Кт «Товары» на количество сумму себестоимости. //Себестоимость товара рассчитывается для каждой организации в разрезе партий и складов по каждой номенклатурной позиции. //Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажных ценах; По организации-продавцу: Дт «Товары» - Кт «Поставщики» на сумму закупаемого товара //Необходимо сформировать отчет позволяющий получать информацию о суммах продаж перемещаемого между организациями товара. // //Создаем Спр. Организации, Склады. Добавляем в шапку приходной Организацию и Склад. //Создаем документ Операция. Создаем документ КупляПродажа (рекв. ОрганизацияПокупатель, ОрганизацияПоставщик, СкладОргПокупателя, СкладОрганизацииПоставщика тч. СписокНоменклатуры: Номенклатура, Количество, Цена,Сумма). // ПВХ (Номенкл, Субк, Ораган, Склады, Приходная, КупляПродажа). //ПС(Признак учета: Количественный, КолСубконто - 3) Сч.Товары (Количественный, Субк: Номенклатура, Склады, Партия). //Сч.Покупатели (субк. Организация - толькоОб). РБ - изм. Организация - бал. рес. сумма, количественный. //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Ссылка; Движение.КоличественныйДт = ТекСтрокаСписокНоменклатуры.Количество; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.Период = Дата; Движение.Организация = Организация; КонецЦикла; КонецПроцедуры //ДокКупляПродажа Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.УстановитьЗначение("Организация", ОрганизацияПоставщик); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | КупляПродажаСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(КупляПродажаСписокНоменклатуры.Количество) КАК Количество, | СУММА(КупляПродажаСписокНоменклатуры.Сумма) КАК Сумма, | КупляПродажаСписокНоменклатуры.Ссылка.ОрганизацияПоставщик КАК Организация, | КупляПродажаСписокНоменклатуры.Ссылка.СкладОрганизацииПоставщика КАК Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.КупляПродажа.СписокНоменклатуры КАК КупляПродажаСписокНоменклатуры |ГДЕ | КупляПродажаСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | КупляПродажаСписокНоменклатуры.Номенклатура, | КупляПродажаСписокНоменклатуры.Ссылка.ОрганизацияПоставщик, | КупляПродажаСписокНоменклатуры.Ссылка.СкладОрганизацииПоставщика | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Организация, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК КолДок, | ТЧДок.Сумма КАК СумДок, | УправленческийОстатки.Субконто3 КАК Партия, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст, | ЕСТЬNULL(УправленческийОстатки.КоличественныйОстатокДт, 0) КАК КолОст, | ТЧДок.Склад |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | (Организация, Субконто1, Субконто2) В | (ВЫБРАТЬ | Т.Организация, | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1 | |УПОРЯДОЧИТЬ ПО | Партия |ИТОГИ | МАКСИМУМ(КолДок), | МАКСИМУМ(СумДок), | СУММА(СумОст), | СУММА(КолОст) |ПО | Номенклатура"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Партия); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.КолДок > ВыборкаНоменклатура.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура +" на складе "+СкладОрганизацииПоставщика+" недостаточно.На остатке:"+ВыборкаНоменклатура.КолОст; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Выборка = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ВыборкаНоменклатура.КолДОк; Пока Выборка.Следующий() и КоличествоСписать>0 Цикл НеобходимоеКоличество = Мин(Выборка.КолОСт, КоличествоСписать); Себестоимость = ?(Выборка.КолОст>КоличествоСписать, КоличествоСписать*Выборка.СумОст/Выборка.КолОСт,Выборка.СумОст); Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.Организация = ОрганизацияПоставщик; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = СкладОрганизацииПоставщика; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Выборка.Партия; Движение.Сумма = Себестоимость; Движение.КоличественныйКт = НеобходимоеКоличество; КонецЦикла; Движение = Движения.Управленческий.Добавить(); Движение.Организация = ОрганизацияПокупатель; Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаНоменклатура.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = СкладОргПокупателя; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Ссылка; Движение.КоличественныйДт = ВыборкаНоменклатура.КолДок; Движение.Сумма = ВыборкаНоменклатура.сумДок; КонецЦикла; Если не Отказ Тогда Движение = Движения.Управленческий.Добавить(); Движение.Организация = ОрганизацияПоставщик; Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Организация] = ОрганизацияПокупатель; Движение.Сумма = СписокНоменклатуры.Итог("Сумма"); КонецЕсли; КонецПроцедуры //ОтчетПродажи ВЫБРАТЬ Организации.Ссылка, Организации1.Ссылка КАК Ссылка1 ПОМЕСТИТЬ Организации ИЗ Справочник.Организации КАК Организации, Справочник.Организации КАК Организации1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Организации.Ссылка КАК ОрганизацияОтправитель, Организации.Ссылка1 КАК ОрганизацияПолучатель, УправленческийОборотыДтКт.СуммаОборот КАК Сумма ИЗ Организации КАК Организации ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.ОборотыДтКт(, , , СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели), &видыСубконто, СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки), , ) КАК УправленческийОборотыДтКт ПО Организации.Ссылка = УправленческийОборотыДтКт.СубконтоДт1 И Организации.Ссылка1 = УправленческийОборотыДтКт.Организация //2.19 Необходимо организовать возможность ведения учета товара, приобретаемого для собственных нужд. //Учет такого товара ведется на отдельном счете. Факт поступления такого товара отражается в системе с помощью документа «Приходная накладная». //В табличной части этого документа должен быть признак того, что товар, указанный в данной строке табличной части приобретается для собственных нужд. //Перечень подобных товаров хранится в справочнике «Номенклатура». //Проводки, которые делает документ «Приходная накладная»: В случае поступления обычного товара Дт «Товары» - Кт «Поставщики» на сумму закупаемого товара и его количество. //В случае товара приобретаемого для своих нужд Дт «Материалы» - Кт «Поставщики» на сумму закупаемого товара и его количество Списание товара, приобретаемого для собственных нужд, производится в конце месяца с помощью специального регламентного документа. //Возможны два варианта списания: В конце месяца списывается вся стоимость закупленного товара. //Но при этом товар должен находиться в компании не менее ПОЛНОГО календарного месяца; //В конце месяца списывается только определенная часть стоимости. //Стоимость товара должна списываться равномерно и полностью быть списана за указанный для данного товара срок. //Первое списание товара должно производиться, если он находится в компании не менее ПОЛНОГО календарного месяца. //Списание количества производится при выводе стоимости конкретного материала в ноль. //Вариант списания указывается непосредственно в самой карточке товара и никогда не меняется. //При втором варианте списания также указывается срок полезного использования в «полных» месяцах. //Документ «Собственные нужды» делает следующие проводки: Дт «Прибыли и убытки» - Кт «Материалы» на сумму списываемой себестоимости. //ВАЖНО учесть, что один и тот же товар может приходить в разное время. //Списание стоимости не должно проводиться, в общем, оно должно производиться с учетом порядка поступления. //Т.е. если товар пришел 31 декабря и 5 января, то в конце января списывается только тот, который пришел 31 декабря, стоимость товара пришедшего 5 января не корректируется. //Необходимо создать отчет об остатках товаров // //В спрНоменклатура добавляем СрокПолезногоИспользования (число), ВариантСписания (перечисление), Создаем док Операция, //В тч приходной добавляем Булеов ДляСобственныхНужд. Создаем док СобственныеНужды. //Создаем Перечисление ВариантыСписанияСобственныхНужд (Вариант1, Вариант2). ПВХ (ВидыСубк. Номенклатура, Субконто, Приходная) Предопр. Номенклатура, Партия. //ПС (Количесвтенный, Субконто -2.) СчТовары - Количественный (субк:Номенклатура, Партия.) //СчМатериалы - Количественный, субк: Номенклатура,Партия. //РБ - Количесвто,Сумма. //ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Если ЭлементТЧ.ДляСобственныхНужд Тогда Движение.СчетДт = планыСчетов.Управленческий.Материалы; Движение.СчетКт = планыСчетов.Управленческий.Поставщики; Иначе Движение.СчетДт = планыСчетов.Управленческий.Товары; Движение.СчетКт = планыСчетов.Управленческий.Поставщики; КонецЕсли; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ЭлементТЧ.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Ссылка; Движение.КоличествоДт = ЭлементТЧ.Количество; Движение.Сумма = ЭлементТЧ.Сумма; КонецЦикла; КонецПроцедуры //ДокСобственные Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Материалы); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Партия); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УправленческийОстатки.СуммаОстатокДт КАК СуммаОстаток, | УправленческийОстатки.КоличествоОстатокДт КАК КоличествоОстаток, | УправленческийОстатки.Субконто1 КАК Номенклатура, | УправленческийОстатки.Субконто2 КАК Партия |ПОМЕСТИТЬ ОстаткиВсе |ИЗ | РегистрБухгалтерии.Управленческий.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Материалы), &ВидыСубконто, ДОБАВИТЬКДАТЕ(Субконто2.Дата, МЕСЯЦ, 1) < &Дата) КАК УправленческийОстатки | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Партия |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиВсе.СуммаОстаток, | ОстаткиВсе.КоличествоОстаток, | ОстаткиВсе.Номенклатура, | ОстаткиВсе.Партия, | ЕСТЬNULL(УправленческийОбороты.СуммаОборотДт, 0) КАК СтоимостьНачальная, | ЕСТЬNULL(УправленческийОбороты.КоличествоОборотДт, 0) КАК КоличествоНачальное, | ЕСТЬNULL(ОстаткиВсе.Номенклатура.СрокПолезногоИспользования, 0) КАК СрокПолезногоИспользования, | ОстаткиВсе.Номенклатура.ВариантСписания КАК ВариантСписания, | ВЫБОР | КОГДА ЕСТЬNULL(ОстаткиВсе.Номенклатура.СрокПолезногоИспользования, 0) <> 0 | ТОГДА ВЫБОР | КОГДА ДОБАВИТЬКДАТЕ(ОстаткиВсе.Партия.Дата, МЕСЯЦ, ОстаткиВсе.Номенклатура.СрокПолезногоИспользования) < &Дата | ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ | КОНЕЦ | ИНАЧЕ ЛОЖЬ | КОНЕЦ КАК НужноПолностьюСписатьСумму |ИЗ | ОстаткиВсе КАК ОстаткиВсе | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Обороты( | , | &МоментВремени, | , | Счет = ЗНАЧЕНИЕ(планСчетов.Управленческий.Материалы), | &ВидыСубконто, | (Субконто1, Субконто2) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Партия | ИЗ | ОстаткиВсе КАК Т) | И Субконто1.ВариантСписания = ЗНАЧЕНИЕ(Перечисление.ВариантыСписанияСобственныхНужд.Вариант2), | , | ) КАК УправленческийОбороты | ПО ОстаткиВсе.Номенклатура = УправленческийОбороты.Субконто1 | И ОстаткиВсе.Партия = УправленческийОбороты.Субконто2 | |УПОРЯДОЧИТЬ ПО | ОстаткиВсе.Партия.МоментВремени"; Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("Дата", Дата); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ВариантСписания = Перечисления.ВариантыСписанияСобственныхНужд.Вариант1 Тогда //списываем все полностью Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Материалы; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Выборка.Партия; Движение.КоличествоКт = Выборка.КоличествоОстаток; Движение.Сумма = Выборка.СуммаОстаток; Иначе //списываем частично СтоимостьСписать =?(Выборка.НужноПолностьюСписатьСумму,Выборка.СуммаОстаток, Выборка.КоличествоОстаток*Выборка.СтоимостьНачальная/Выборка.КоличествоНачальное/Выборка.СрокПолезногоИспользования); Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Материалы; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Партия] = Выборка.Партия; Движение.Сумма = СтоимостьСписать; Если Выборка.СуммаОстаток = СтоимостьСписать Тогда Движение.КоличествоКт = Выборка.КоличествоОстаток; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры //ОтчетСостояниеСобственныхТоваров ВЫБРАТЬ УправленческийОстатки.Субконто1 КАК Товар, УправленческийОстатки.СуммаОстаток КАК ОстаточнаяСтоимость, УправленческийОстатки.КоличествоОстаток КАК Количество ИЗ РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Материалы), &ВидыСубконто, ) КАК УправленческийОстатки //2.20 Организация занимается оказанием услуг. //Стоимость услуг определяется в условных единицах, а их оплата происходит в рублях, причем курс условной единицы определяется для каждого контрагента индивидуально. //Расчеты в условных единицах ведутся только с покупателями. //Оказание услуг отражается с помощью документа «Расходная накладная». //Стоимость услуг указывается в условных единицах. При проведении документа формируется проводка: Дт «Покупатели» - Кт «Прибыли и убытки» на сумму оказанных услуг в условных единицах и в рублях (по текущему курсу). //Текущий курс условной единицы рассчитывается автоматически при проведении документа «Расходная накладная» в соответствии со шкалой, устанавливаемой пользователем для каждого контрагента. //Шкала выглядит следующим образом: устанавливаются перед формированием документов продажи на соответствующий период. //При решении задачи можно считать, что документы продажи задним числом не вводятся. //Необходимо создать отчет, из которого можно было рассчитать «средний» курс условной единицы по всем покупателям, приобретавших товар за указанный период. //Отчет формируется за период кратный месяцу. Средний курс оказанных за месяц услуг считается путем деления суммы в рублях на сумму в условных единицах. // //Созд.Спр.Контрагент. В Шапку расходной добавляем Контрагент, СуммаВУЕ, ТЧРасходной - Номенклатура, Количесвто,СуммаВУЕ. //Создаем док. Операция. Создаем РС ШкалаКурсов(в пределах месяца, независ) Изм. Контрагент, Мин, Макс, рес.Курс. //ПВХ (видыС: Номенклатура, Субконто, Контрагент.) //Предопр. Контрагент, Номенклатура. ПС - ПРизнакУчета - УчетСПокупателями. КолСубконто = 1. Сч.Покупатели(УчетСПокупателями = Истина, Субконто = Контрагент). //РБ(Рес. СуммаУЕ-небал, УчетСПокупателями., СуммаРуб - бал). //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Покупатели); ЭлементБлокировки.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Контрагент, Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УправленческийОборотыДтКт.СубконтоДт1, | ЕСТЬNULL(ШкалаКурсовСрезПоследних.Курс, 1) КАК Курс |ИЗ | РегистрБухгалтерии.Управленческий.ОборотыДтКт(&НачалоМесяца, &МоментВремени, , счетДт = ЗНАЧЕНИЕ(планСчетов.Управленческий.Покупатели), &ВидыСубконто, счетКт = ЗНАЧЕНИЕ(планСчетов.Управленческий.ПрибылиУбытки), , СубконтоДт1 = &Контрагент) КАК УправленческийОборотыДтКт | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаКурсов.СрезПоследних(&МоментВремени, Контрагент = &Контрагент) КАК ШкалаКурсовСрезПоследних | ПО (ВЫБОР | КОГДА УправленческийОборотыДтКт.СуммаУЕОборотДт >= ЕСТЬNULL(ШкалаКурсовСрезПоследних.Мин, 0) | И УправленческийОборотыДтКт.СуммаУЕОборотДт < ЕСТЬNULL(ШкалаКурсовСрезПоследних.Макс, 0) | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ = ИСТИНА)"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Контрагент); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени(), ВидГраницы.Включая)); Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда ТекущийКурс = 1; Иначе Выборка = Результат.Выбрать(); Выборка.Следующий(); ТекущийКурс = Выборка.Курс; КонецЕсли; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СуммаУЕДт = СуммаВУЕ; Движение.СуммаРуб = СуммаВУЕ*ТекущийКурс; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Контрагент; КонецПроцедуры //Отчет СреднийКурс ВЫБРАТЬ УправленческийОборотыДтКт.СубконтоДт1 КАК Контрагент, ВЫБОР КОГДА УправленческийОборотыДтКт.СуммаУЕОборотДт <> 0 ТОГДА УправленческийОборотыДтКт.СуммаРубОборот / УправленческийОборотыДтКт.СуммаУЕОборотДт ИНАЧЕ 0 КОНЕЦ КАК Курс, УправленческийОборотыДтКт.Период ИЗ РегистрБухгалтерии.Управленческий.ОборотыДтКт(, , Месяц, СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели), &ВидыСубконто, СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки), , ) КАК УправленческийОборотыДтКт //2.22 бухгалтерского учета в компании не учитываются и реализованы с помощьюмеханизмов оперативного учета (см. задача 1.38.). //Необходимо создать обработку, которая будет формировать сводные проводки в бухгалтерском учете на основании данных оперативного учета. //Формирование проводок должно быть реализовано с помощью служебного документа «Операция», который должен позволять пользователю ввести проводку с любой корреспонденцией. //Предполагается, что данные будут переноситься строго за 1 календарный месяц. //Результатом действия обработки должно быть формирование 2-х документов «Операция» на конец выбранного периода: один документ должен содержать данные обо всех закупках за период, а второй обо всех продажах. //Данные о закупках товаров должны отражаться в бухгалтерском учете проводкой: Дт «Товары» - Кт «Поставщики» на количество и стоимость покупки. //Данные о продажах должны отражаться в бухгалтерском учете проводками: Дт «Покупатели» - Кт «Прибыли и убытки» на сумму продаж; Дт «Прибыли и убытки» - Кт «Товары» на количество и себестоимость продажи. //Учет на счете «Товары» ведется только в разрезе номенклатуры. //Необходимо создать отчет «Шахматка» по оборотам на счетах // //ПС (признак учета кол.) Сч.Товары (Количественный, Субк:Номенклатура). РБ (Сумма, Количество). Создаем обработку ФормированиеСводныхПроводок. Рекв. ТекМесяц. //ФормаОбработки &НаКлиенте Процедура ВыполнитьОперацию(Команда) ВызватьПроцедуруНаСервере(); КонецПроцедуры &НаСервере Процедура ВызватьПроцедуруНаСервере() РеквизитФормыВЗначение("Объект").СформироватьДокументыОперация(); КонецПроцедуры //МодульОбъектаОбработки Процедура СформироватьДокументыОперация() Экспорт НачатьТранзакцию(); Отказ = Ложь; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.УстановитьЗначение("Период", Новый Диапазон(НачалоМесяца(ТекМесяц), КонецМесяца(ТекМесяц))); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Продажи"); ЭлементБлокировки.УстановитьЗначение("Период", Новый Диапазон(НачалоМесяца(ТекМесяц), КонецМесяца(ТекМесяц))); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОстаткиНоменклатурыОбороты.Номенклатура, | ОстаткиНоменклатурыОбороты.КоличествоПриход КАК Количество, | ОстаткиНоменклатурыОбороты.СтоимостьПриход КАК Стоимость |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ОстаткиНоменклатурыОбороты |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.КоличествоОборот КАК Количество, | ПродажиОбороты.СтоимостьОборот КАК Себестоимость, | ПродажиОбороты.СуммаОборот КАК СуммаПродаж |ИЗ | РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)) КАК ПродажиОбороты"; Запрос.УстановитьПараметр("КонецПериода" , Новый Граница(КонецМесяца(ТекМесяц), ВидГраницы.Включая)); Запрос.УстановитьПараметр("НачалоПериода" , НачалоМесяца(ТекМесяц)); Результат = Запрос.ВыполнитьПакет(); //создадим документы по закупка Если не Результат[0].Пустой() Тогда ДокументОбъект = Документы.Операция.СоздатьДокумент(); ДокументОбъект.Дата = КонецМесяца(ТекМесяц); Выборка = Результат[0].Выбрать(); Пока Выборка.Следующий() Цикл НоваяСтрока = ДокументОбъект.Движения.Управленческий.Добавить(); НоваяСтрока.Период = КонецМесяца(ТекМесяц); НоваяСтрока.СчетДт = ПланыСчетов.Управленческий.Товары; НоваяСтрока.СчетКт = ПланыСчетов.Управленческий.Поставщики; НоваяСтрока.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = выборка.Номенклатура; НоваяСтрока.Сумма = Выборка.Стоимость; НоваяСтрока.КоличествоДт = Выборка.Количество; КонецЦикла; попытка ДокументОбъект.Записать(); ДокументОбъект.Движения.Управленческий.Записать(); Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Ошибка!!"+ОписаниеОшибки(); Сообщение.Сообщить(); Отказ = Истина; КонецПопытки; КонецЕсли; //создадим документы по продажам Если не Результат[1].Пустой() Тогда ДокументОбъект = Документы.Операция.СоздатьДокумент(); ДокументОбъект.Дата = КонецМесяца(ТекМесяц); Выборка = Результат[1].Выбрать(); Пока Выборка.Следующий() Цикл НоваяСтрока = ДокументОбъект.Движения.Управленческий.Добавить(); НоваяСтрока.Период = КонецМесяца(ТекМесяц); НоваяСтрока.СчетДт = ПланыСчетов.Управленческий.Покупатели; НоваяСтрока.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; НоваяСтрока.Сумма = Выборка.СуммаПродаж; НоваяСтрока = ДокументОбъект.Движения.Управленческий.Добавить(); НоваяСтрока.Период = КонецМесяца(ТекМесяц); НоваяСтрока.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; НоваяСтрока.СчетКт = ПланыСчетов.Управленческий.Товары; НоваяСтрока.Сумма = Выборка.Себестоимость; НоваяСтрока.КоличествоКт = Выборка.Количество; КонецЦикла; попытка ДокументОбъект.Записать(); ДокументОбъект.Движения.Управленческий.Записать(); Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Ошибка!!"+ОписаниеОшибки(); Сообщение.Сообщить(); Отказ = Истина; КонецПопытки; КонецЕсли; Если не Отказ Тогда ЗафиксироватьТранзакцию(); Иначе ОтменитьТранзакцию(); КонецЕсли; КонецПроцедуры //Отчет Шахматка ВЫБРАТЬ УправленческийОборотыДтКт.СчетДт КАК Счет, УправленческийОборотыДтКт.СчетКт КАК КорСчет, УправленческийОборотыДтКт.СуммаОборот ИЗ РегистрБухгалтерии.Управленческий.ОборотыДтКт(, , , , , , , ) КАК УправленческийОборотыДтКт //Таблица (Строки: Счет, Колонки КорСчет(Счет)) //2.23 Необходимо организовать возможность выдачи денежных займов сотрудникам компании. //Факт выдачи такого займа отражается в системе документом «Выдача займа». //В этом документе указывается, какому сотруднику компании, в каком размере, были выданы денежные средства. //Также указывается срок, в который должен произойти возврат денежных средств. //Документ «Выдача займа» реализует следующую проводку: Дт «Кредиты и займы выданные» - Кт «Касса» //на сумму выданных средств. Наличие денег в кассе контролировать не нужно. //Возврат денежных средств регистрируется с помощью документа «Возврат займа». //В этом документе указывается, какой сотрудник и, какую сумму вернул. //Возвращаемая сумма должна полностью совпадать с суммой полученных в свое время средств. //Если сумма отличается, то документ не должен проводиться. //Сотруднику не могут выдать следующий займ до тех пор, пока он не вернет ранее выданный. //Документ «Возврат займа» реализует следующую проводку: Дт «Касса» - Кт «Кредиты и займы выданные» на сумму возвращаемого займа. //Если займ был возвращен позже указанного срока, в документе дополнительно указывается дата возврата штрафа и документ делает дополнительную проводку: //Дт «Кредиты и займы выданные» - Кт «Прибыли и убытки» на сумму, рассчитываемую как 0,1% от полной суммы предоставленного займа. //Фактически это означает начисление штрафной суммы в виде вновь выданного займа. //Этот займ погашается другим экземпляром документа «Возврат займа». //Штрафные санкции не начисляются, когда сумма штрафа становится меньше 1 копейки. //В системе должен быть предусмотрен отчет о выданных займах. // //Созд.Справ.Сотрудники. Созд.Док. ВыдачаЗайма (Рекв. Сотрудник, СуммаЗайма, СрокВозврата). //Созд. Док. ВозвратЗайма (Рекв. Сотрудник, СуммаВозврата, ДатаВозвратаШтрафа). //Создаем док. Операция. ПВХ (ВидыСубконто: Дата,Булево,Субконто,Сотрудник). //Предопр. Номенклатура, Сотрудник, СрокВозврата, ЭтоШтраф. ПС (кол.Субконто 3) //ДокВыдачаЗайма Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.КредитыИЗаймыВыданные); ЭлементБлокировки.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Сотрудник , Сотрудник); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УправленческийОстатки.СуммаОстаток |ИЗ | РегистрБухгалтерии.Управленческий.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.КредитыИЗаймыВыданные), &ВидыСубконто, Субконто1 = &Сотрудник) КАК УправленческийОстатки |ГДЕ | УправленческийОстатки.СуммаОстаток <> 0"; ВидыСубконто = новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Сотрудник); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Сотрудник", Сотрудник); Результат = Запрос.Выполнить(); Если не Результат.Пустой() Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Сотруднику не может быть выдан займ,так как он не возвратил старый"; Сообщение.Сообщить(); Отказ = Истина; Возврат; КонецЕсли; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = Планысчетов.Управленческий.КредитыИЗаймыВыданные; Движение.СчетКт = ПланыСчетов.Управленческий.Касса; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.СрокВозврата] = СрокВозврата; Движение.Сумма = СуммаЗайма; КонецПроцедуры //ДокВозвратЗайма Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.КредитыИЗаймыВыданные); ЭлементБлокировки.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Сотрудник, Сотрудник); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УправленческийОстатки.Субконто1 КАК Сотрудник, | УправленческийОстатки.Субконто2 КАК СрокВозврата, | УправленческийОстатки.СуммаОстатокДт КАК СуммаЗайма |ИЗ | РегистрБухгалтерии.Управленческий.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.КредитыИЗаймыВыданные), &ВидыСубконто, Субконто1 = &Сотрудник) КАК УправленческийОстатки"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Сотрудник); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.СрокВозврата); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("Сотрудник", Сотрудник); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Результат = Запрос.Выполнить(); Если Не Результат.Пустой() Тогда Выборка = Результат.Выбрать(); Выборка.Следующий(); СуммаПолученныхСредств = Выборка.СуммаЗайма; ПланируемаяДатаВозврата = Выборка.СрокВозврата; Сотрудник = Выборка.Сотрудник; Если СуммаПолученныхСредств<> СуммаВозврат Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Сумма оплаты отличается от выданного займа. Сумма займа "+СуммаПолученныхСредств; Сообщение.Сообщить(); Отказ = Истина; Возврат; КонецЕсли; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Касса; Движение.СчетКт = ПланыСчетов.Управленческий.КредитыИЗаймыВыданные; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокВозврата] = ПланируемаяДатаВозврата; Движение.Сумма = СуммаВозврат; Если ПланируемаяДатаВозврата<Дата Тогда Штраф = СуммаПолученныхСредств*0.1/100; Если Штраф <0.1 тогда Возврат; КонецЕсли; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.КредитыИЗаймыВыданные; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.СрокВозврата] = ДатаВозвратаШтрафа; Движение.Сумма = Штраф; КонецЕсли; КонецЕсли; КонецПроцедуры //ОтчетВыданныеСотрудникамЗаймы ВЫБРАТЬ УправленческийОбороты.Субконто1 КАК Сотрудник, УправленческийОбороты.Субконто2 КАК ПланируемаяДатаВозвращения, УправленческийОбороты.СуммаОборотДт КАК СуммаЗайма, ВЫБОР КОГДА УправленческийОбороты.КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки) ТОГДА "V" ИНАЧЕ "" КОНЕЦ КАК ЯвляетсяШтрафом, МАКСИМУМ(ВЫБОР КОГДА УправленческийОбороты1.СуммаОборотКт > 0 ТОГДА УправленческийОбороты1.Период ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1) КОНЕЦ) КАК РеальнаяДатаВозврата, УправленческийОбороты1.СуммаОборотКт ИЗ РегистрБухгалтерии.Управленческий.Обороты(, , День, Счет = ЗНАЧЕНИЕ(планСчетов.Управленческий.КредитыИЗаймыВыданные), &ВидыСубконто, , КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Касса), ) КАК УправленческийОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Обороты(, , День, Счет = ЗНАЧЕНИЕ(планСчетов.Управленческий.КредитыИЗаймыВыданные), &ВидыСубконто, , КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Касса), ) КАК УправленческийОбороты1 ПО УправленческийОбороты.Субконто2 = УправленческийОбороты1.Субконто2 И УправленческийОбороты.Субконто1 = УправленческийОбороты1.Субконто1 СГРУППИРОВАТЬ ПО УправленческийОбороты.Субконто2, УправленческийОбороты.Субконто1, ВЫБОР КОГДА УправленческийОбороты.КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки) ТОГДА "V" ИНАЧЕ "" КОНЕЦ, УправленческийОбороты.СуммаОборотДт, УправленческийОбороты1.СуммаОборотКт //2.24 Необходимо организовать возможность выдачи денежных займов сотрудникам компании. Факт выдачи такого займа отражается в системе документом «Выдача займа». //В этом документе указывается, какому сотруднику компании, в каком размере, были выданы денежные средства. //Также указывается срок, в который должен произойти возврат денежных средств. //Документ «Выдача займа» реализует следующую проводку: Дт «Кредиты и займы выданные» - Кт «Касса» на сумму выданных средств. //Наличие денег в кассе контролировать не нужно. //Возврат денежных средств регистрируется с помощью документа «Возврат займа». //В этом документе указывается, какой сотрудник и, какую сумму вернул. //Возвращаемая сумма рассчитывается по формуле: Сумма возврата = Выданная сумма + Сумма штрафа. Сумма штрафа = Количество «полных» дней просрочки (день получения и день возвращения не считаются) Х (0,001 Х Выданная сумма). //Займ не может погашаться частями, т.е. если вносимая сумма отличается от расчетной суммы возврата, то документ не должен проводиться. //В случае досрочного возврата займа необходимо погасить выданную сумму займа. //Сотруднику не могут выдать следующий займ до тех пор, пока он не вернет ранее выданный. //Документ «Возврат займа» реализует следующие проводки: Дт «Касса» - Кт «Кредиты и займы выданные» на сумму полученного займа; Дт «Касса» - Кт «Прибыли и убытки» на сумму штрафа. //В системе должен быть предусмотрен отчет о выданных и погашенных займах // //СоздСпр.Сотрудник, создСправ. СрокиВозврата (рекв.СрокВозврата). //Созд. Док. ВыдачаЗайма (рекв. Сотрудник,СрокВозврата, СуммаОплаты). //СоздатьДок. ВозвратЗайма(рекв.Сотрудник,СуммаОплаты). Создать док. Операция. //ПВХ(ВидыСубконто:Дата,Номенклатура,Сотрудник,Субконто,СрокиВозврата). //Предопр.Номенклатура,Сотрудник,СрокВозврата. РБ(рес.Сумма). ПС(кол субк. 2) Сч. КредитыИЗаймыВыданные (Субк.Номенклатура,СрокВозврата). //Сч.ПрибылиИУбытки (Сотрудник - только Об,СрокВОзврата - только Об) //ДокВыдачаЗайма Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.КредитыИЗаймыВыданные); ЭлементБлокировки.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Сотрудник, Сотрудник); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УправленческийОстатки.СуммаОстаток КАК СуммаОст, | УправленческийОстатки.Субконто1 КАК Сотрудник |ИЗ | РегистрБухгалтерии.Управленческий.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.КредитыИЗаймыВыданные), &ВидыСубконто, Субконто1 = &Сотрудник) КАК УправленческийОстатки |ГДЕ | УправленческийОстатки.СуммаОстаток <> 0"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Сотрудник); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Сотрудник", Сотрудник); Результат = Запрос.Выполнить(); Если Не Результат.Пустой() Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "По данному сотруднику обнаружены не закрытые займы!!!"; Сообщение.Сообщить(); Отказ = Истина; Возврат; КонецЕсли; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.КредитыИЗаймыВыданные; Движение.СчетКт = ПланыСчетов.Управленческий.Касса; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.СрокВозврата] = СрокВозврата; Движение.Сумма = СуммаОплаты; КонецПроцедуры //ДокВозвратЗайма Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.КредитыИЗаймыВыданные); ЭлементБлокировки.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Сотрудник, Сотрудник); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УправленческийОстатки.Субконто1 КАК Сотрудник, | УправленческийОстатки.Субконто2 КАК СрокВозврата, | УправленческийОстатки.СуммаОстатокДт КАК СуммаОстатокДт, | ВЫРАЗИТЬ(ВЫБОР | КОГДА РАЗНОСТЬДАТ(УправленческийОстатки.Субконто2.СрокВозврата, &Дата, ДЕНЬ) - 2 < 0 | ТОГДА 0 | ИНАЧЕ РАЗНОСТЬДАТ(УправленческийОстатки.Субконто2.СрокВозврата, &Дата, ДЕНЬ) - 2 | КОНЕЦ * (0.001 * УправленческийОстатки.СуммаОстатокДт) КАК ЧИСЛО(15, 2)) КАК СуммаШтрафа |ИЗ | РегистрБухгалтерии.Управленческий.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.КредитыИЗаймыВыданные), &ВидыСубконто, Субконто1 = &Сотрудник) КАК УправленческийОстатки"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Сотрудник); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.СрокВозврата); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Дата", Дата); Запрос.УстановитьПараметр("Сотрудник", Сотрудник); Результат = Запрос.Выполнить(); Если не Результат.Пустой() Тогда Выборка = Результат.Выбрать(); Выборка.Следующий(); СуммаВозврата = Выборка.СуммаОстатокДт +Выборка.СуммаШтрафа; Если СуммаВозврата<>СуммаОплаты Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Сумма возврата <> сумме оплаты. Сумма возврата с учетом штрафа "+СуммаВозврата; Сообщение.Сообщить(); Отказ = Истина; Возврат; КонецЕсли; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Касса; Движение.СчетКт = ПланыСчетов.Управленческий.КредитыИЗаймыВыданные; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокВозврата] = Выборка.СрокВозврата; Движение.Сумма = Выборка.СуммаОстатокДт; Если Выборка.СуммаШтрафа<>0 Тогда Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Касса; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокВозврата] = Выборка.СрокВозврата; Движение.Сумма = Выборка.СуммаШтрафа; КонецЕсли; КонецЕсли; КонецПроцедуры //Отчет ПоЗаймам ВЫБРАТЬ УправленческийОстатки.Субконто1 КАК Сотрудник, УправленческийОстатки.Субконто2.СрокВозврата КАК СрокВозврата, УправленческийОстатки.СуммаОстатокДт ПОМЕСТИТЬ СотрудникСОстатками ИЗ РегистрБухгалтерии.Управленческий.Остатки(&НачалоПериода, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.КредитыИЗаймыВыданные), &Видысубконто, ) КАК УправленческийОстатки ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ УправленческийОбороты.Субконто1, УправленческийОбороты.Субконто2.СрокВозврата, УправленческийОбороты.СуммаОборотДт ИЗ РегистрБухгалтерии.Управленческий.Обороты(&НачалоПериода, &КонецПериода, , Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.КредитыИЗаймыВыданные), &ВидыСубконто, , КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Касса), ) КАК УправленческийОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СотрудникСОстатками.Сотрудник, СотрудникСОстатками.СрокВозврата КАК ПланируемаяДатаВозвращения, СотрудникСОстатками.СуммаОстатокДт КАК СуммаЗайма, ЕСТЬNULL(УправленческийОбороты.СуммаОборотКт, 0) КАК СуммаШтрафа, УправленческийОбороты.Период КАК РеальнаяДатаВозвращения ИЗ СотрудникСОстатками КАК СотрудникСОстатками ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Обороты(&НачалоПериода, &КонецПериода, День, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки), , , КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Касса), ) КАК УправленческийОбороты ПО СотрудникСОстатками.Сотрудник = УправленческийОбороты.Субконто1 И СотрудникСОстатками.СрокВозврата = УправленческийОбороты.Субконто2.СрокВозврата //2.25 товара отражается документом «Приходная накладная», где помимо всего указывается и курьер. //Данный документ реализует следующую проводку: //Дт «Товары» - Кт «Сотрудники» на сумму поставленного товара. //Курьер может первоначально взять в компании денежные средства, а может приобрести товар за собственные деньги. //Если курьер приобрел товар за собственные средства, то потом их ему возмещают. //Выдача денежных средств (также как и их возмещение) производится с помощью документа «Расход денег». //При выдаче денежных средств авансом (когда ни у курьера перед компанией, ни у компании перед курьером нет никакой задолженности) сумма денежных средств вводится вручную. //Наличие денег в кассе контролировать не нужно. Если курьеру уже выдавались денежные средства, документ не должен проводиться. //Если компания должна курьеру (он приобретал товар за собственные средства) введенная денежная сумма должна полностью погасить задолженность компании перед курьером. //Документ делает следующую проводку: Дт «Сотрудники» - Кт «Касса» на указанную в документе сумму. //Необходимо создать отчет о курьерских доставках. // //СоздСпр Курьеры, Поставщики. В шапку приходной дбавляем Курьера и поставщика. //Создаем док. РасходДенег (рекв. Курьер, Поставщик, СуммаОплаты). //Создаем док. Операция. ПВХ (ВидыС: Номеклатура,Субконто,Курьеры,Поставщики). //Предопр: Номенклатура, Курьер,Постовщик. ПС(количество суб 2). Счет Сотрудники (Субк: Крьер, Поставщик (толькоОБ)). РБ(сумма) //ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = Планысчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Сотрудники; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Курьер] = Курьер; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Поставщик] = Поставщик; Движение.Сумма = СуммаПоДокументу; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Сотрудники); ЭлементБлокировки.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Курьер, Курьер); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УправленческийОстатки.Субконто1, | УправленческийОстатки.СуммаОстаток |ИЗ | РегистрБухгалтерии.Управленческий.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Сотрудники), &ВидыСубконто, Субконто1 = &Сотрудник) КАК УправленческийОстатки"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Курьер); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Сотрудник", Курьер); Результат = Запрос.Выполнить(); СуммаОплатить = СуммаОплаты; Если не Результат.Пустой() Тогда Выборка = Результат.Выбрать(); Выборка.Следующий(); Если Выборка.СуммаОстаток >0 тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Сотруднику уже выдавались денежые средства"; Сообщение.Сообщить(); Отказ =Истина; ИначеЕсли Выборка.СуммаОстаток <0 И -Выборка.СуммаОстаток >СуммаОплаты тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Фирма должа сотруднику "+(-Выборка.СуммаОстаток); Сообщение.Сообщить(); Отказ =Истина; КонецЕсли; КонецЕсли; Если не Отказ тОгда Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Сотрудники; Движение.СчетКт = ПланыСчетов.Управленческий.Касса; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Курьер] = Курьер; Движение.Сумма = СуммаОплаты; КонецЕсли; КонецПроцедуры //Отчет ЗакупкиКурьеров ВЫБРАТЬ УправленческийОбороты.Субконто1 КАК Курьер, УправленческийОбороты.Субконто2 КАК Поставщик, УправленческийОбороты.СуммаОборотКт КАК Сумма ИЗ РегистрБухгалтерии.Управленческий.Обороты(, , , Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Сотрудники), &ВидыСубконто, , КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), ) КАК УправленческийОбороты //2.26 учет по филиалам ведется не на всех счетах. //Известно, что счета «Касса» и «Поставщики» ведутся в разрезе филиалов, а счета «Товары» и «Товары в пути» общие, без учета филиалов. //Аналитика по филиалам на остальных счетах остается на усмотрение разработчика. //Закупка товаров компании производится курьерами. //Факт приобретения товара отражается документом «Приходная накладная», где помимо всего указывается и курьер. //Данный документ реализует следующую проводку: Дт «Товары» - Кт «Поставщики» на сумму поставленного товара. //Предварительно курьер получает в компании денежные средства (для проведения подобных закупок). //При покупке считается, что у курьера есть достаточно денежных средств и контролировать их не надо. //Выдача денежных средств производится с помощью документа «Расход денег». //Документ делает следующую проводку: Дт «Сотрудники» - Кт «Касса» на указанную в документе сумму. //Наличие денег в кассе контролировать не нужно. //Необходимо учесть, что новая сумма может быть выдана курьеру до того, как он полностью отчитался о старой. //Курьеры отчитываются о потраченных средствах с помощью документа «Авансовый отчет». //В шапке этого документа указывается курьер, филиал и приходная накладная, за которую он отчитывается. //Сумма, за которую отчитывается курьер, должна быть рассчитана при проведении документа таким образом, чтобы полностью погасить долг по выбранной накладной. //Документ «Авансовый отчет» реализует следующие проводки: Дт «Поставщики» - Кт «Сотрудники» на сумму, предоставленную к отчету В том случае, когда курьер получил деньги в кассе одного филиала, а отчитывается за закупку, произведенную для другого филиала, должна сформироваться дополнительная проводка по возврату денег в первый филиал и получения их из кассы другого: Дт «Касса» - Кт «Сотрудники» на сумму возврата в первый филиал Дт «Сотрудники» – Кт «Касса» на ту же сумму, но выданную из другого филиала //Следует учитывать, что деньги курьер мог забирать в различных филиалах. //В первую очередь с курьера должны быть списаны деньги, которые он забрал в кассе того же филиала, для которого была произведена закупка товара. //Порядок погашения выданных по остальным филиалам денег, за которые отчитывается курьер, остается на усмотрение разработчика. //По данным бухгалтерского учета необходимо получать отчет о задолженности курьеров перед компанией. //Дополнительно, пользователю должна быть предоставлена возможность детализации выводимых в отчет данных до регистратора записи регистра. //С другой стороны, данные в отчете могут быть представлены и без этой детализации. // //СоздСпр. Сотрудники, Филиалы. В шапке приходной добавляем рекв. //Сотрудник, Филиал. Создаем док. РасходДенег рекв. Сотрудник,Филиал,СуммаОплаты. //Создаем док АвансовыйОтчет рекв. Сотрудник, Филиал, Накладная (докПриходная, в свойстве реквизита об. //Связи Параметров выбора Отбор.Сотрудник(Сотрудник), Отбор.Филиал(Филиал)). //Создаем док Операция. ПВХ (ВидыСубконто: Номенклатура, Субконто, Сотрудники) Предопр. Номенклатура, Сотрудник. //ПС (признак учета УчетПоФилиалам, Кол Субконто 1), Сч.Касса(УчетПоФилиалам), счПоставщики (УчетПоФилиалам), счСотрудники (субк.Сотрудник). //РБ(изм. Филиал, Рес.Сумма) //ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.ФилиалКт = Филиал; Движение.СчетДт = Планысчетов.Управленческий.Товары; Движение.СчетКт = Планысчетов.Управленческий.Поставщики; Движение.Сумма = СуммаПоДокументу; КонецПроцедуры //ДокРасходДенег Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт =ПланыСчетов.Управленческий.Сотрудники; Движение.СчетКт =ПланыСчетов.Управленческий.Касса; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник; // Движение.ФилиалДт = Филиал; Движение.ФилиалКт = Филиал; ДВижение.Сумма = СуммаОплаты; КонецПроцедуры //ДокПриходДенег Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("счет", ПланыСчетов.Управленческий.Сотрудники); ЭлементБлокировки.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Сотрудник, Сотрудник); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УправленческийОстатки.Филиал, | УправленческийОстатки.Субконто1 КАК Сотрудник, | УправленческийОстатки.СуммаОстатокДт КАК Сумма, | ВЫБОР | КОГДА УправленческийОстатки.Филиал = &Филиал | ТОГДА 0 | ИНАЧЕ 1 | КОНЕЦ КАК ПорядокСортировки |ИЗ | РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Сотрудники), | &ВидыСубконто, | Субконто1 = &Сотрудник | ) КАК УправленческийОстатки | |УПОРЯДОЧИТЬ ПО | ПорядокСортировки |ИТОГИ | СУММА(Сумма) |ПО | Сотрудник"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Сотрудник); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Сотрудник", Сотрудник); Запрос.УстановитьПараметр("Филиал", Филиал); Результат = Запрос.Выполнить(); ВыборкаСотрудник = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); СуммаСписать = Накладная.СписокНоменклатуры.Итог("Сумма"); Пока ВыборкаСотрудник.Следующий() Цикл ВыборкаФилиалы = ВыборкаСотрудник.Выбрать(); СписанаСумма = 0; Пока ВыборкаФилиалы.Следующий() и СуммаСписать>0 Цикл НеобходимаяСумма = Мин(СуммаСписать, ВыборкаФилиалы.Сумма); Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Поставщики; Движение.СчетКт = ПланыСчетов.Управленческий.Сотрудники; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник; Движение.ФилиалДт = Филиал; // Движение.ФилиалКт = ВыборкаФилиалы.Филиал; Движение.Сумма = НеобходимаяСумма; Если ВыборкаФилиалы.Филиал <>Филиал Тогда Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Касса; Движение.СчетКт = ПланыСчетов.Управленческий.Сотрудники; Движение.ФилиалДт = ВыборкаФилиалы.Филиал; // Движение.ФилиалКт = ВыборкаФилиалы.Филиал; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник; Движение.Сумма = НеобходимаяСумма; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Сотрудники; Движение.СчетКт = ПланыСчетов.Управленческий.Касса; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник; // Движение.ФилиалДт = Филиал; Движение.ФилиалКт = Филиал; Движение.Сумма = НеобходимаяСумма; КонецЕсли; СуммаСписать = СуммаСписать-НеобходимаяСумма; КонецЦикла; КонецЦикла; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА КонецПроцедуры //2.27 Необходимо организовать возможность учета сборки комплектов по заказам покупателей. Документ «Заказ покупателя» реализовывать не нужно. //Сами комплекты определяются в справочнике «Номенклатура» наравне с обычными товарами, услугами. //В системе также должна храниться информация о составе комплекта (какие номенклатурные позиции и в каком количестве входят в данный комплект). //В состав комплекта не могут входить другие комплекты. //Операция сборки комплекта оформляется в системе с помощью документа «Сборка». //В шапке этого документа указывается покупатель, по чьему заказу формируется комплект, сумма услуги по сборке, собираемый комплект и количество собираемых комплектов. //Так же в шапке документа указывается склад, с которого происходит списание комплектующих, и склад, на который приходуется готовая продукция. //По указанному комплекту (в соответствии с требуемым количеством) при нажатии на кнопку «Заполнить» в табличную часть документа должны загружаться его составляющие (с пересчетом их количества). //Табличная часть не может редактироваться пользователем. Документ «Сборка» реализует следующие проводки: Дт «Основное производство» - Кт «Товары» на списываемое количество комплектующих и их себестоимость; Дт «Товары» - Кт «Основное производство» на собранное количество комплектов и на стоимость списанных комплектующих; //Дт «Товары» - Кт «Вспомогательное пр-во» на стоимость услуги сборки. //Документ не должен проводиться, если соответствующих комплектующих не оказалось в компании. //Учет остатков ведется в разрезе складов, себестоимость определяется как средняя по номенклатурной позиции на складе. //В системе должен быть реализован отчет по собранным комплектам. // //Создаем Спр. Покупатель,Склады. Добавляем в шапку Приходной Склад. Создаем док Сборка (рекв. Покупатель, СуммаУслугиПоСборке, Комплект(номенкл), КоличествоКомплектов, СкладОтправитель, СкладПолучатель. тч СписокНоменклатуры рекв. Номенклатура, Количество). //Модуль формы докСборка &НаКлиенте Процедура КомандаЗаполнитьТЧ(Команда) ЗаполнитьТЧНаСервере(); КонецПроцедуры &НаСервере Процедура ЗаполнитьТЧНаСервере() ДокОбъект = РеквизитФормыВЗначение("Объект"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Комплекты.Номенклатура, | Комплекты.Количество * &Количество КАК Количество |ИЗ | РегистрСведений.Комплекты КАК Комплекты |ГДЕ | Комплекты.Комплект = &Комплект"; Запрос.УстановитьПараметр("Комплект", ДокОбъект.Комплект); Запрос.УстановитьПараметр("Количество", ДокОбъект.КоличествоКомплектов); Результат = Запрос.Выполнить(); ДокОбъект.СписокНоменклатуры.Загрузить(Результат.Выгрузить()); ЗначениеВРеквизитФормы( ДокОбъект,"Объект"); КонецПроцедуры &НаКлиенте Процедура КоличествоКомплектовПриИзменении(Элемент) Если ОБъект.СписокНоменклатуры.Количество() <>0 Тогда Объект.СписокНоменклатуры.Очистить(); КонецЕсли; КонецПроцедуры //Создаем РС Комплекты (незав.Непериод). Изм. Комплект,Номенклатура, Рес.Количество. //ПВХ (ВидыС: Склады, Получатель, Субконто, Номенклатура). Предопр: Номенлкатура, Покупатель, Склад. //ПС (признак учета: кол. кол субконто =3). Сч.Товары (количественный, Субк: Номенклатура, Склад, Покупатель (только об.)) РБ (Сумма, Количество) //ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ЭлементТЧ.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад; Движение.Сумма = ЭлементТЧ.Сумма; Движение.КоличествоДт = ЭлементТЧ.Количество; КонецЦикла; КонецПроцедуры //ДокСборка Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СборкаСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СборкаСписокНоменклатуры.Количество) КАК Количество, | СборкаСписокНоменклатуры.Ссылка.СкладОтправитель КАК Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.Сборка.СписокНоменклатуры КАК СборкаСписокНоменклатуры |ГДЕ | СборкаСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СборкаСписокНоменклатуры.Номенклатура, | СборкаСписокНоменклатуры.Ссылка.СкладОтправитель | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК КолДок, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст, | ПРЕДСТАВЛЕНИЕ(ТЧДок.Номенклатура) |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | (Субконто1, Субконто2) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склад); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); СтоимостьКомплектующих = 0; Пока Выборка.Следующий() Цикл Если Выборка.КолДок > Выборка.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+Выборка.НоменклатураПредставление+" на складе "+СкладОтправитель+" недостаточно.На остатке:"+Выборка.КолОст; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; СписатьКоличество = Выборка.КолДок; Себестоимость = ?(Выборка.КолОст> СписатьКоличество, СписатьКоличество*Выборка.СумОст/Выборка.КолОст, Выборка.СумОст); Движение= Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ОсновноеПроизводство; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = СкладОтправитель; Движение.КоличествоКт = СписатьКоличество; Движение.Сумма = Себестоимость; СтоимостьКомплектующих = СтоимостьКомплектующих + Движение.Сумма; КонецЦикла; Если Отказ Тогда Возврат; КонецЕсли; Движение= Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.ОсновноеПроизводство; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Комплект; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = СкладПолучатель; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Покупатель] = Покупатель; Движение.КоличествоДт = КоличествоКомплектов; Движение.Сумма = СтоимостьКомплектующих; Движение= Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.ВспомогательноеПроизводство; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Комплект; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = СкладПолучатель; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Покупатель] = Покупатель; Движение.Сумма = СуммаУслугиПоСборке; КонецПроцедуры //ОтчетСборкаКомплектов ВЫБРАТЬ УправленческийОбороты.Субконто1 КАК Комплект, УправленческийОбороты.Субконто2 КАК Покупатель, СУММА(УправленческийОбороты.КоличествоОборотДт) КАК Количество, СУММА(ВЫБОР КОГДА УправленческийОбороты.КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ОсновноеПроизводство) ТОГДА УправленческийОбороты.СуммаОборотДт ИНАЧЕ 0 КОНЕЦ) КАК СуммаМатериалов, СУММА(ВЫБОР КОГДА УправленческийОбороты.КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ВспомогательноеПроизводство) ТОГДА УправленческийОбороты.СуммаОборотДт ИНАЧЕ 0 КОНЕЦ) КАК СуммаУслуг ИЗ РегистрБухгалтерии.Управленческий.Обороты(, , , Счет = ЗНАЧЕНИЕ(планСчетов.Управленческий.Товары), &ВидыСубконто, Субконто1.ЭтоКомплект, КорСчет В (ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ОсновноеПроизводство), ЗНАЧЕНИЕ(планСчетов.Управленческий.ВспомогательноеПроизводство)), ) КАК УправленческийОбороты СГРУППИРОВАТЬ ПО УправленческийОбороты.Субконто2, УправленческийОбороты.Субконто1 //2.28 комплекты определяются в справочнике «Номенклатура» наравне с обычными товарами, услугами. //В системе также должна храниться информация о составе комплекта (какие номенклатурные позиции и в каком количестве входят в данный комплект по умолчанию). //В состав комплекта не могут входить другие комплекты. //Операция сборки комплекта оформляется в системе с помощью документа «Сборка». //В шапке этого документа указывается количество собираемых комплектов и сам комплект. //Так же в шапке документа указывается склад, с которого происходит списание комплектующих, и склад, на который приходуется готовая продукция. //По указанному комплекту (в соответствии с требуемым количеством) при нажатии на кнопку «Заполнить» в табличную часть документа должны загружаться его составляющие (с пересчетом их количества). //Состав комплекта может изменяться пользователем (меняются комплектующие, их количество). //Считается, что на производстве из стремятся сделать максимальное количество стандартных комплектов из указанных комплектующих. //Документ «Сборка» реализует следующие проводки: Дт «Основное производство» - Кт «Товары» на списываемое количество комплектующих и их себестоимость; //Дт «Товары» - Кт «Основное производство» на собранное количество комплектов и сумму списанных материалов. //Документ не должен проводиться, если соответствующих комплектующих не оказалось в компании. //Учет остатков ведется в разрезе складов, себестоимость определяется как средняя по номенклатурной позиции на складе. //Необходимо создать отчет о собранных комплектах. // //В спрНоменкл добавляем реквизит: ЭтоКомплект. Добавляем Спр.Склады. //В шапку приходной добавляем Склад. Создаем док. //Сборка (рекв. Комплект, КоличествоКомплектов, СкладОтправитель, СкладПолучатель. тч СписокНоменклатуры: Номенклатура, Количество). //ДокСборка &НаКлиенте Процедура КомандаЗаполнитьТЧ(Команда) ЗаполнитьТЧНаСервере(); КонецПроцедуры &НаСервере Процедура ЗаполнитьТЧНаСервере() ДокОБъект = РеквизитФормыВЗначение("Объект"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Комплекты.Номенклатура, | Комплекты.Количество * &Количество КАК Количество |ИЗ | РегистрСведений.Комплекты КАК Комплекты |ГДЕ | Комплекты.Комплект = &Комплект"; Запрос.УстановитьПараметр("Количество", ДокОБъект.КоличествоКомплектов); Запрос.УстановитьПараметр("Комплект", ДокОБъект.Комплект); Результат = Запрос.Выполнить(); ДокОБъект.СписокНоменклатуры.Загрузить(Результат.Выгрузить()); ЗначениеВРеквизитФормы(ДокОБъект,"Объект"); КонецПроцедуры //Создаем док. Операция. Создаем перечисление ТипыСборки. //ПВХ(видысубконто: Номенклатура, склады, ТипыСборки). Предопр: Номенлатура, Склад, ТипСборки. //ПС(признак учета субк.- количественный, Субконто-3). счТовары - количественный, Субк: Номенклатура, Склад, типСборка - толькоОборот. //Создаем РС Комплекты (Изм. Комплект - параметры выбора Отбор.ЭтоКомплект(Истина), Номенклатура, рес. Количество). РБ Сумма, Кол. //ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ЭлементТЧ.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад; Движение.КоличествоДт = ЭлементТЧ.Количество; Движение.Сумма = ЭлементТЧ.Сумма; КонецЦикла; КонецПроцедуры //ДокСборка Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары ); ЭлементБлокировки.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Склад, СкладОтправитель); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СборкаСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СборкаСписокНоменклатуры.Количество) КАК Количество, | СборкаСписокНоменклатуры.Ссылка.СкладОтправитель КАК Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.Сборка.СписокНоменклатуры КАК СборкаСписокНоменклатуры |ГДЕ | СборкаСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СборкаСписокНоменклатуры.Номенклатура, | СборкаСписокНоменклатуры.Ссылка.СкладОтправитель | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК КолДок, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(планСчетов.Управленческий.Товары), | &ВидыСубконто, | (Субконто1, Субконто2) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК КоличествоДок, | ЕСТЬNULL(Комплекты.Количество, 0) КАК КоличествоКомплект |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Комплекты КАК Комплекты | ПО (Комплекты.Комплект = &Комплект) | И ТЧДок.Номенклатура = Комплекты.Номенклатура |ГДЕ | ТЧДок.Количество <> ЕСТЬNULL(Комплекты.Количество, 0)"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склад); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Комплект", Комплект); Результат = Запрос.ВыполнитьПакет(); Выборка = Результат[1].Выбрать(); Себестоимость = 0; Пока Выборка.Следующий() Цикл Если Выборка.КолДок > Выборка.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+Выборка.Номенклатура+" недостаточно. На остатке:"+Выборка.КолОст; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; НеобходимоСписать = Выборка.КолДок; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ОсновноеПроизводство; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = СкладОтправитель; Движение.КоличествоКт = НеобходимоСписать; Движение.Сумма = ?(Выборка.КолОст> НеобходимоСписать, НеобходимоСписать*Выборка.СумОст/Выборка.КолОст,Выборка.СумОст); Себестоимость = Себестоимость + Движение.Сумма; КонецЦикла; Если Отказ Тогда Возврат; КонецЕсли; Если Результат[2].Пустой() Тогда ТипСборки = Перечисления.ТипыСборки.Стандарт; Иначе ТипСборки = Перечисления.ТипыСборки.Нестандрат; КонецЕсли; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.ОсновноеПроизводство; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Комплект; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = СкладПолучатель; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ТипСборки] = ТипСборки; Движение.КоличествоДт = КоличествоКомплектов; Движение.Сумма = Себестоимость; КонецПроцедуры //ОтчетСборкаКОмплектов ВЫБРАТЬ СУММА(УправленческийОборотыДтКт.КоличествоОборотДт) КАК Собрано, ВЫБОР КОГДА УправленческийОборотыДтКт.СубконтоДт2 = &Стандарт ТОГДА УправленческийОборотыДтКт.КоличествоОборотДт ИНАЧЕ 0 КОНЕЦ КАК Стандарт, ВЫБОР КОГДА УправленческийОборотыДтКт.СубконтоДт2 = &НеСтандарт ТОГДА УправленческийОборотыДтКт.КоличествоОборотДт ИНАЧЕ 0 КОНЕЦ КАК НеСтандарт, УправленческийОборотыДтКт.СубконтоДт1 КАК Комплект ИЗ РегистрБухгалтерии.Управленческий.ОборотыДтКт(, , , СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), &ВидыСубконто, СчетКт = ЗНАЧЕНИЕ(планСчетов.Управленческий.ОсновноеПроизводство), , СубконтоДт1.ЭтоКомплект) КАК УправленческийОборотыДтКт СГРУППИРОВАТЬ ПО УправленческийОборотыДтКт.СубконтоДт1, ВЫБОР КОГДА УправленческийОборотыДтКт.СубконтоДт2 = &Стандарт ТОГДА УправленческийОборотыДтКт.КоличествоОборотДт ИНАЧЕ 0 КОНЕЦ, ВЫБОР КОГДА УправленческийОборотыДтКт.СубконтоДт2 = &НеСтандарт ТОГДА УправленческийОборотыДтКт.КоличествоОборотДт ИНАЧЕ 0 КОНЕЦ //2.29 комплекты определяются в справочнике «Номенклатура» наравне с обычными товарами, услугами. //Операция сборки комплекта оформляется в системе с помощью документа «Сборка». //В шапке этого документа указывается количество собираемых комплектов и сам комплект. //Из чего собирается комплект (какие позиции в него входят и в каком количестве) определяется в табличной части документа. //В системе должна храниться информация о плановом составе комплекта, однако в процессе сборки может происходить пересортица. //В табличной части документа указывается фактический перечень и количество комплектующих, потребовавшихся для сборки. //В состав комплекта не могут входить другие комплекты. Документ «Сборка» реализует следующие проводки: //Дт «Основное производство» - Кт «Товары» на списываемое количество комплектующих и их себестоимость; Дт «Товары» - Кт «Основное производство» //на собранное количество комплектов и сумму списанных материалов. //Документ не должен проводиться, если соответствующих комплектующих не оказалось в компании. //Документом «Расходная накладная» отражается продажа комплектов, отдельные детали продаваться не могут. //В том случае, если каких-либо комплектов нет, то должна произойти сборка непосредственно при отгрузке покупателю. //В этом случае делаются следующие проводки: //Дт «Общехозяйственные затраты» - Кт «Товары» на списываемое количество комплектующих и их себестоимость. Комплектующие списываются в составе и количестве соответствующем плановому составу комплекта; Дт «Товары» - Кт «Общехозяйственные затраты» на собранное количество комплектов и сумму списанных материалов. Дт «Товары» - Кт «Общехозяйственные затраты» на сумму срочной сборки, которая рассчитывается как 5 рублей за каждую комплектующую, участвующую в сборке. Например, если в состав комплекта входят 5 пузырьков и 1 коробка, то сумма сборки этого комплекта составит 5 X 5 + 1 X 5 = 30 рублей. Далее происходит списание всех продаваемых комплектов, проводки документа: //Дт «Прибыли и убытки» - Кт «Товары» на сумму себестоимости комплектов; //Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажных ценах. //В том случае, когда потребного количества комплектов нет, и недостающее количество не может быть собрано, документ не проводится. //Складской учет не ведется, себестоимость для всех операций рассчитывается как средняя по номенклатурной позиции. //Необходимо создать отчеты о наличии комплектов, их продажах и сборках. // //Создаем в справочнике номекл. рекв. ЭтоКомплект. Создаем док. //Сборка (рекв. Комплект, КоличествоКомплектво, тч. СписокКомплектующих - Номенклатура, Количество). //Создаем док Операция. Создаем РС Комплекты (Изм. Комплект (Ведущее, заполнятьИзДанныхЗаполнения. //ПараметрыВыбора Отбор.ЭтоКомплект(Истина)), Номенклатура, рес. Количество). //ПВХ ВиыСубконто(Номенклатура,Субконто). Предопре(Номенклатура). ПС - признак учета Количественный. КолСубконто -1. //Сч.Номенклатура (Количественный, Субк.Номенклатура). ПрибылиИУбытки (Количественный, Субк.Номенклатура -толькоОБ). //РБ. Сумма, Количество. Рег. Приходная,Расходная,Сборка,Операция. //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Управленческий Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); //для начала списшем те комплекты, которые можем списать Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", планыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = новый МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК КолДок, | ВЫБОР | КОГДА ТЧДок.Количество > ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) | ТОГДА ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) | ИНАЧЕ ТЧДок.Количество | КОНЕЦ КАК КоличествоСписать, | ВЫБОР | КОГДА ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) > ТЧДок.Количество | ТОГДА ТЧДок.Количество * ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) / ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) | ИНАЧЕ ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) | КОНЕЦ КАК СуммаСписать, | ТЧДок.Количество - ВЫБОР | КОГДА ТЧДок.Количество > ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) | ТОГДА ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) | ИНАЧЕ ТЧДок.Количество | КОНЕЦ КАК НеобходимоСобрать, | ВЫБОР | КОГДА ТЧДок.Количество <> 0 | ТОГДА ТЧДок.Сумма / ТЧДок.Количество | ИНАЧЕ 0 | КОНЕЦ КАК ЦенаЗаЕдиницу |ПОМЕСТИТЬ Остатки |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), &ВидыСубконто, Субконто1.ЭтоКомплект) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Остатки.Номенклатура, | Остатки.НеобходимоСобрать, | Остатки.ЦенаЗаЕдиницу |ПОМЕСТИТЬ ПозицииПоКоторымНетНаОстатке |ИЗ | Остатки КАК Остатки |ГДЕ | Остатки.НеобходимоСобрать <> 0 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Остатки.Номенклатура, | Остатки.КоличествоСписать, | Остатки.СуммаСписать, | Остатки.ЦенаЗаЕдиницу |ИЗ | Остатки КАК Остатки"; ВидыСубконто = новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.КоличествоСписать = 0 и Выборка.СуммаСписать =0 Тогда Продолжить; КонецЕсли; НеобходимоеКоличество = выборка.КоличествоСписать; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.КоличествоКт = НеобходимоеКоличество; Движение.КоличествоДт = НеобходимоеКоличество; Движение.Сумма = Выборка.СуммаСписать; Себестоимость = Движение.Сумма; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.КоличествоКт = НеобходимоеКоличество; Движение.Сумма = НеобходимоеКоличество*выборка.ЦенаЗаЕдиницу; КонецЦикла; //создадим временную таблицу с данными по комплектующим комплекта Запрос.Текст = "ВЫБРАТЬ | ПозицииПоКоторымНетНаОстатке.Номенклатура КАК Комплект, | Комплекты.Номенклатура КАК Номенклатура, | ЕСТЬNULL(Комплекты.Количество, 0) * ПозицииПоКоторымНетНаОстатке.НеобходимоСобрать КАК Количество, | ЕСТЬNULL(Комплекты.Количество, 0) * ПозицииПоКоторымНетНаОстатке.НеобходимоСобрать * 5 КАК СуммаСрочнойСборки, | ПозицииПоКоторымНетНаОстатке.НеобходимоСобрать КАК КолСобрать, | ПозицииПоКоторымНетНаОстатке.ЦенаЗаЕдиницу |ПОМЕСТИТЬ ТЧКомплекты |ИЗ | ПозицииПоКоторымНетНаОстатке КАК ПозицииПоКоторымНетНаОстатке | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Комплекты КАК Комплекты | ПО ПозицииПоКоторымНетНаОстатке.Номенклатура = Комплекты.Комплект |ГДЕ | Комплекты.Комплект В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ПозицииПоКоторымНетНаОстатке КАК Т) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧКомплеты.Номенклатура |ИЗ | ТЧКомплекты КАК ТЧКомплеты"; Результат = Запрос.Выполнить(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = Результат; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); //оприходуем товар по комплекту и спишем комплект Запрос.Текст = "ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК КоличествоСписать, | ТЧДок.СуммаСрочнойСборки КАК СуммаСрочнойСборки, | ТЧДок.Комплект КАК Комплект, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст, | ТЧДок.КолСобрать КАК КолСобрать, | ТЧДок.ЦенаЗаЕдиницу КАК ЦенаЗаЕдиницу |ПОМЕСТИТЬ ТекОстатки |ИЗ | ТЧКомплекты КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧКомплекты КАК Т)) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТекОстатки.Номенклатура, | ТекОстатки.КоличествоСписать, | ТекОстатки.СуммаСрочнойСборки КАК СуммаСрочнойСборки, | ТекОстатки.Комплект КАК Комплект, | ТекОстатки.КолОст, | ТекОстатки.СумОст, | ТекОстатки.КолСобрать КАК КолСобрать, | ТекОстатки.ЦенаЗаЕдиницу КАК ЦенаЗаЕдиницу |ИЗ | ТекОстатки КАК ТекОстатки |ИТОГИ | СУММА(СуммаСрочнойСборки), | МАКСИМУМ(КолСобрать), | МАКСИМУМ(ЦенаЗаЕдиницу) |ПО | Комплект |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВложенныйЗапрос.Номенклатура, | ВложенныйЗапрос.КолОст, | ВложенныйЗапрос.КоличествоСписать |ИЗ | (ВЫБРАТЬ | ТекОстатки.Номенклатура КАК Номенклатура, | МАКСИМУМ(ТекОстатки.КолОст) КАК КолОст, | СУММА(ТекОстатки.КоличествоСписать) КАК КоличествоСписать | ИЗ | ТекОстатки КАК ТекОстатки | | СГРУППИРОВАТЬ ПО | ТекОстатки.Номенклатура) КАК ВложенныйЗапрос"; Результат = Запрос.ВыполнитьПакет(); ВыборкаПроверкаОстаток = Результат[2].Выбрать(); //проверим. Может быть присутствует одинаковая номенклатура в разных комплектах... Пока ВыборкаПроверкаОстаток.Следующий() цикл Если ВыборкаПроверкаОстаток.КоличествоСписать> ВыборкаПроверкаОстаток.КолОСт Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Недостаточно товара "+ВыборкаПроверкаОстаток.Номенклатура; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; КонецЦикла; Если Отказ Тогда Возврат; КонецЕсли; ВыборкаКомплект = Результат[1].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаКомплект.Следующий() цикл Выборка = ВыборкаКомплект.Выбрать(); Себестоимость = 0; Пока Выборка.Следующий() цикл Если Выборка.КоличествоСписать > Выборка.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "В комплекте "+Выборка.Комплект+" номенклатуры "+Выборка.Номенклатура+" недостаточно.На остатке "+Выборка.КолОст; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; НеобходимоСписать = Мин(Выборка.КоличествоСписать, Выборка.КолОст); Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ОбщехозяйственныеЗатраты; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.номенклатура; Движение.КоличествоКт = НеобходимоСписать; Движение.Сумма = ?(выборка.КолОст> НеобходимоСписать, НеобходимоСписать*Выборка.СумОст/Выборка.КолОст,Выборка.СумОст); Себестоимость = Себестоимость + Движение.Сумма; КонецЦикла; Если Отказ Тогда Продолжить; КонецЕсли; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.ОбщехозяйственныеЗатраты; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаКомплект.Комплект; Движение.КоличествоДт = ВыборкаКомплект.КолСобрать; Движение.Сумма = Себестоимость; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.ОбщехозяйственныеЗатраты; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаКомплект.Комплект; Движение.Сумма = ВыборкаКомплект.СуммаСрочнойСборки; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаКомплект.Комплект; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаКомплект.Комплект; Движение.КоличествоКт = ВыборкаКомплект.КолСобрать; Движение.КоличествоДт = ВыборкаКомплект.КолСобрать; Движение.Сумма = Себестоимость+ВыборкаКомплект.СуммаСрочнойСборки; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаКомплект.Комплект; Движение.КоличествоКт = ВыборкаКомплект.КолСобрать; Движение.Сумма = ВыборкаКомплект.КолСобрать* ВыборкаКомплект.ЦенаЗаЕдиницу; КонецЦикла; КонецПроцедуры //ДокСборка //ФормаДокСборка &НаКлиенте Процедура КомандаЗаполнить(Команда) ЗаполнитьНаСервере(); КонецПроцедуры &НаСервере Процедура ЗаполнитьНаСервере() ДокОбъект = РеквизитФормыВЗначение("Объект"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Комплекты.Номенклатура, | Комплекты.Количество * &Количество КАК Количество |ИЗ | РегистрСведений.Комплекты КАК Комплекты |ГДЕ | Комплекты.Комплект = &Комплект"; Запрос.УстановитьПараметр("Количество", ДокОбъект.КоличествоКомплектов); Запрос.УстановитьПараметр("Комплект", ДокОбъект.Комплект); Результат = Запрос.Выполнить(); ДокОбъект.СписокКомплектующих.Загрузить(Результат.Выгрузить()); ЗначениеВРеквизитФормы(ДокОбъект,"Объект"); КонецПроцедуры //МодульОбъектаСборка Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокКомплектующих; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СборкаСписокКомплектующих.Номенклатура КАК Номенклатура, | СУММА(СборкаСписокКомплектующих.Количество) КАК Количество |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.Сборка.СписокКомплектующих КАК СборкаСписокКомплектующих |ГДЕ | СборкаСписокКомплектующих.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СборкаСписокКомплектующих.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК КолДок, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1"; ВидыСубконто = новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Себестоимость = 0; Пока Выборка.Следующий() Цикл Если Выборка.КолДок > Выборка.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+Выборка.Номенклатура+" недостаточно. На остатке:"+Выборка.КолОст; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; КоличествоСписать = Выборка.КолДок; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = планыСчетов.Управленческий.ОсновноеПроизводство; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.КоличествоКт = КоличествоСписать; Движение.Сумма = ?(Выборка.КолОст> КоличествоСписать, КоличествоСписать*Выборка.СумОст/Выборка.КолОст,Выборка.СумОст); Себестоимость = Себестоимость+ Движение.Сумма; КонецЦикла; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = планыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.ОсновноеПроизводство; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Комплект; Движение.КоличествоДт = КоличествоКомплектов; Движение.Сумма = Себестоимость; КонецПроцедуры //ОтчетОстаткиКомплектов ВЫБРАТЬ УправленческийОстатки.Субконто1 КАК Комплект, УправленческийОстатки.КоличествоОстаток КАК Количество ИЗ РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), &ВидыСубконто, Субконто1.ЭтоКомплект) КАК УправленческийОстатки ОтчетСборкаКомплетковЗаПерид ВЫБРАТЬ УправленческийОборотыДтКт.СубконтоДт1 КАК Комплект, УправленческийОборотыДтКт.КоличествоОборотДт КАК КоличествоПоСборке, 0 КАК КоличествоПрипродаже, УправленческийОборотыДтКт.СуммаОборот КАК СуммаПоСборке, 0 КАК СуммаПоПродаже ИЗ РегистрБухгалтерии.Управленческий.ОборотыДтКт(, , , СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), &ВидыСубконто, СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ОсновноеПроизводство), , СубконтоДт1.ЭтоКомплект) КАК УправленческийОборотыДтКт ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ УправленческийОборотыДтКт.СубконтоДт1, 0, УправленческийОборотыДтКт.КоличествоОборотДт, 0, УправленческийОборотыДтКт.СуммаОборот ИЗ РегистрБухгалтерии.Управленческий.ОборотыДтКт(, , , СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), &ВидыСубконто, СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ОбщехозяйственныеЗатраты), , СубконтоДт1.ЭтоКомплект) КАК УправленческийОборотыДтКт ОтчетПРодажи ВЫБРАТЬ СУММА(УправленческийОбороты.КоличествоОборотДт) КАК Количество, СУММА(ВЫБОР КОГДА УправленческийОбороты.КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары) ТОГДА УправленческийОбороты.СуммаОборотДт ИНАЧЕ 0 КОНЕЦ) КАК Себестоимость, СУММА(ВЫБОР КОГДА УправленческийОбороты.КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели) ТОГДА УправленческийОбороты.СуммаОборотКт ИНАЧЕ 0 КОНЕЦ) КАК Продажа, УправленческийОбороты.Субконто1 КАК Комплект ИЗ РегистрБухгалтерии.Управленческий.Обороты(, , , Счет = ЗНАЧЕНИЕ(планСчетов.Управленческий.ПрибылиУбытки), &ВидыСубконто, , КорСчет В (&СписокКорСчетов), ) КАК УправленческийОбороты СГРУППИРОВАТЬ ПО УправленческийОбороты.Субконто1 //2.30 Компания занимается изготовлением мебели. //Сборка готовой продукции отражается документов «Сборка», где в шапке указывается полученное изделие и его количество, а в табличной части перечень потребовавшихся материалов и работ. //Например, для изготовления 4-х табуреток понадобилось 4 основания, 4 заготовки для ножек, 4 операции по разделке заготовок и покрытие лаком. //При проведении документ «Сборка» формирует проводки: Дт «Основное производство» - Кт «Материалы» на количество и себестоимость списанных материалов. //Себестоимость рассчитывается как средняя по номенклатурной позиции; //Дт «Товары» - Кт «Основное производство» на количество получившихся изделий и его стоимость. //Стоимость готового изделия определяется как себестоимость списанных на его изготовлен6ие материалов плюс стоимость работ. //Стоимость каждой работы меняется не чаще чем 1 раз в месяц и указывается пользователем заблаговременно. //При проведении документа «Сборка» необходимо контролировать наличие необходимых для сборки деталей. //В случае их отсутствия, необходимо выводить соответствующее предупреждение и запрещать проведение документа. //Необходимо построить отчет о производстве мебели за период. В отчете должен расчетным образом определяться средний состав каждого изделия, а также количество собранных изделий и их стоимость. //Количество - для готового изделия это количество собранных изделий в отчетном периоде; для материала это среднее количество, пошедшее на изготовление одного изделия; Сумма - для готового изделия это общая сумма собранных изделий в отчетном периоде; для материала это средняя себестоимость материалов, пошедших на изготовление одного изделия. //Работы по сборке в отчете не детализируются, но входят в стоимость готовых изделий. // //В спр. Номенклатура добавляем: ЭтоИзделие, ЭтоРабота. Создаем док. //Сборка (рекв. Изделие параметры выбра Отбор.ЭтоИзделие(Истина), Отбор.ЭтоГруппа(Ложь), Количество. //тчСписокКомплектующих: Номенклатура Параметры выбора Отбор.ЭтоИзделие(Ложь), Количество). //Создаем док. Операция. ПВХ (виды субконто: Субконто, Номенклатура, предопр: Номенклатура). //ПС. Признак учета: количественный. КолСубконт-1. СчТовары - количество, субк.Номенклатура. //СчОсновноеПроизводство субк.Номенклатура -толькоОб. СчМатериалы, количественный, субкНоменклатура. //Создаем РС СтоимостьРаботПоСборке (в пределах месяца, независ), Изм. Работа (номенклатура. параметры Выбора Отбор.ЭтоРабота(Истина) ) рес. СтоимостьРабот //ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Материалы; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ЭлементТЧ.Номенклатура; Движение.КоличествоДт = ЭлементТЧ.Количество; Движение.Сумма = ЭлементТЧ.Сумма; КонецЦикла; КонецПроцедуры //докСборка Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Материалы); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокКомплектующих; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СборкаСписокКомплектующих.Номенклатура КАК Номенклатура, | СУММА(СборкаСписокКомплектующих.Количество) КАК Количество |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.Сборка.СписокКомплектующих КАК СборкаСписокКомплектующих |ГДЕ | СборкаСписокКомплектующих.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СборкаСписокКомплектующих.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество, | ЕСТЬNULL(СтоимостьРаботПоСборке.СтоимостьРабот, 0) КАК СтоимостьРабот, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Материалы), | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т | ГДЕ | НЕ Т.Номенклатура.ЭтоРабота)) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1 | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтоимостьРаботПоСборке.СрезПоследних( | &МоментВремени, | Работа В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т | ГДЕ | Т.Номенклатура.ЭтоРабота)) КАК СтоимостьРаботПоСборке | ПО ТЧДок.Номенклатура = СтоимостьРаботПоСборке.Работа"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Себестоимость = 0; СтоимостьРабот = 0; Пока Выборка.Следующий() Цикл Если Выборка.СтоимостьРабот<>0 Тогда СтоимостьРабот = СтоимостьРабот + Выборка.СтоимостьРабот*Выборка.Количество; Продолжить; КонецЕсли; Если Выборка.Количество> Выборка.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+Выборка.Номенклатура+" недостаточно. На остатке:"+Выборка.КолОст; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; КолСписать = Выборка.Количество; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ОсновноеПроизводство; Движение.СчетКт = ПланыСчетов.Управленческий.Материалы; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Изделие; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.КоличествоКт = КолСписать; Движение.Сумма = ?(Выборка.КолОст > КолСписать, КолСписать* выборка.СумОст/Выборка.КолОст, выборка.СумОст); Себестоимость = Себестоимость + Движение.Сумма; КонецЦикла; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.ОсновноеПроизводство; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Изделие; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Изделие; Движение.КоличествоДт = Количество; Движение.Сумма = Себестоимость+СтоимостьРабот; КонецПроцедуры //ОтчетСборка ВЫБРАТЬ УправленческийОбороты.Субконто1 КАК Изделие, СУММА(УправленческийОбороты.КоличествоКорОборотКт) КАК КоличествоИзделий, СУММА(УправленческийОбороты.СуммаОборотКт) КАК СуммаИзделие, УправленческийОборотыДетали.КорСубконто1 КАК Деталь, СРЕДНЕЕ(ЕСТЬNULL(УправленческийОборотыДетали.КоличествоКорОборотДт, 0)) КАК КоличествоДеталей, СРЕДНЕЕ(ЕСТЬNULL(УправленческийОборотыДетали.СуммаОборотДт, 0)) КАК СуммаДетали ИЗ РегистрБухгалтерии.Управленческий.Обороты(, , , Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ОсновноеПроизводство), &ВидыСубконто, , КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), ) КАК УправленческийОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Обороты(, , , Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ОсновноеПроизводство), &ВидыСубконто, , КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Материалы), ) КАК УправленческийОборотыДетали ПО УправленческийОбороты.Субконто1 = УправленческийОборотыДетали.Субконто1 СГРУППИРОВАТЬ ПО УправленческийОборотыДетали.КорСубконто1, УправленческийОбороты.Субконто1 //2.31 Необходимо организовать возможность учета продажи комплектов. //Сами комплекты хранятся в справочнике «Номенклатура» наравне с обычными товарами, услугами. //В системе также должна храниться информация о составе комплекта (какие номенклатурные позиции и в каком количестве входят в данный комплект). //В состав комплекта не могут входить другие комплекты. //Операция сборки как таковая в компании не осуществляется. //Когда покупатель приходит получать комплект ответственный сотрудник компании в соответствии со спецификацией отгружает необходимое количество комплектующих. //Продажи осуществляются документом «Расходная накладная». //В табличной части документа могут указываться как комплекты, так и обычные комплектующие. //Документ реализует следующие проводки: Дт «Прибыли и убытки» - Кт «Товары» на количество и себестоимость списываемых комплектующих. //В случае продажи комплекта необходимо списать его комплектующие согласно составу комплекта; Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажных ценах. //Документ не должен проводиться в случае, если не хватает каких-либо комплектующих. //Учет комплектующих ведется в разрезе складов. Себестоимость рассчитывается как средняя по номенклатурной позиции на складе. //Система должна обеспечивать пользователя возможностью ведения складского учета не только на счете «Товары», но и на любом другом выбранным пользователем счете. //Необходимо иметь возможность получать отчет комплектующих проданных в составе комплектов. // //В справочник номенклатура добавляем рекв.ЭтоКомлект. Добавляем спр. Склады. //В шапку накладных добавляем Склад и (приходная - СчетДт, расходная - СчетКт); Создаем док Операция. //Создаем РС Комплекты (изм. Комлект - заполнять из данных заполнения, Параметры выборка Отбор.ЭтоКомлект(Истина), изм. Номенклатуар, рес Количество.) //ПВХ (Номенклатура, Субконто, Склады) Предпр. Номенклатура, склад. ПС. признак учета Количественный. КолСубк = 2. СчТовары - Количественный. Создаем док. Операция //ДокПрихдная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; ТекущийСчет = ?(ЗначениеЗаполнено(СчетДт),СчетДт, ПланыСчетов.Управленческий.Товары); Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ТекущийСчет; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ЭлементТЧ.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад; Движение.КоличествоДт = ЭлементТЧ.Количество; Движение.Сумма = ЭлементТЧ.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); ТекущийСчет = ?(ЗначениеЗаполнено(СчетКт), СчетКт, ПланыСчетов.Управленческий.Товары); ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склад); Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("ВидыСубконто",ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени",МоментВремени()); Запрос.УстановитьПараметр("Ссылка",Ссылка); Запрос.УстановитьПараметр("Счет", ТекущийСчет); Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЕСТЬNULL(Комплекты.Номенклатура, ТЧДок.Номенклатура) КАК Номенклатура, | ВЫБОР | КОГДА Комплекты.Комлект ЕСТЬ NULL | ТОГДА ТЧДок.Количество | ИНАЧЕ ТЧДок.Количество * ЕСТЬNULL(Комплекты.Количество, 0) | КОНЕЦ КАК Количество, | ТЧДок.Сумма, | ТЧДок.Склад, | ТЧДок.Количество КАК КоличествоПоКомплекту, | Комплекты.Комлект |ПОМЕСТИТЬ ТЧСКомплектами |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Комплекты КАК Комплекты | ПО ТЧДок.Номенклатура = Комплекты.Комлект | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧСКомплектами.Номенклатура, | ТЧСКомплектами.Количество, | ТЧСКомплектами.Сумма, | ТЧСКомплектами.Склад |ИЗ | ТЧСКомплектами КАК ТЧСКомплектами"; Результат = Запрос.Выполнить(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ТекущийСчет); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = Результат; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад"); Блокировка.Заблокировать(); Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст, | УправленческийОстатки.Субконто1 КАК Номенклатура |ПОМЕСТИТЬ Остатки |ИЗ | РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = &Счет, | &ВидыСубконто, | (Субконто1, Субконто2) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧСКомплектами КАК Т)) КАК УправленческийОстатки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧСКомплектами.Номенклатура, | СУММА(ТЧСКомплектами.Количество) КАК Количество |ПОМЕСТИТЬ ТЧСгр |ИЗ | ТЧСКомплектами КАК ТЧСКомплектами | |СГРУППИРОВАТЬ ПО | ТЧСКомплектами.Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧСгр.Номенклатура, | ТЧСгр.Количество, | ЕСТЬNULL(Остатки.КолОст, 0) КАК КолОст |ИЗ | ТЧСгр КАК ТЧСгр | ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки | ПО ТЧСгр.Номенклатура = Остатки.Номенклатура |ГДЕ | ТЧСгр.Количество > Остатки.КолОст |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧСКомплектами.Номенклатура, | ТЧСКомплектами.Комлект КАК Комплект, | ТЧСКомплектами.Количество КАК КолДок, | ТЧСКомплектами.КоличествоПоКомплекту КАК КоличествоПоКомплекту, | ЕСТЬNULL(Остатки.КолОст, 0) КАК КолОст, | ЕСТЬNULL(Остатки.СумОст, 0) КАК СумОст, | ТЧСКомплектами.Сумма КАК СумДок |ИЗ | ТЧСКомплектами КАК ТЧСКомплектами | ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки | ПО ТЧСКомплектами.Номенклатура = Остатки.Номенклатура |ИТОГИ | МАКСИМУМ(КоличествоПоКомплекту), | МАКСИМУМ(СумДок) |ПО | Комплект"; Результат = Запрос.ВыполнитьПакет(); Если НЕ Результат[2].Пустой() Тогда Отказ = Истина; ВыборкаПроверкаОстатков = Результат[2].Выбрать(); Пока ВыборкаПроверкаОстатков.Следующий() цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаПроверкаОстатков.Номенклатура+" в количестве:"+ВыборкаПроверкаОстатков.Количество+"недостаточно.На остатке:"+ВыборкаПроверкаОстатков.КолОст; Сообщение.Сообщить(); КонецЦикла; Возврат; КонецЕсли; ВыборкаКомплект = Результат[3].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаКомплект.Следующий() цикл Выборка = ВыборкаКомплект.Выбрать(); Пока Выборка.Следующий() цикл КолСписать = Выборка.КолДок; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ТекущийСчет; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Комплект; Движение.КоличествоКт = КолСписать; Движение.Сумма = ?(Выборка.КолОст>КолСписать, КолСписать*Выборка.СумОст/Выборка.КолОст, Выборка.СумОст); Если ВыборкаКомплект.Комплект = NULL Тогда Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.Сумма = выборка.СумДок; КонецЕсли; КонецЦикла; Если ВыборкаКомплект.Комплект <> NULL Тогда Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаКомплект.Комплект; Движение.Сумма = ВыборкаКомплект.СумДок; КонецЕсли; КонецЦикла; КонецПроцедуры //ОтчетПродажиКомплектов ВЫБРАТЬ УправленческийОбороты.Субконто1 КАК Комплект, УправленческийОбороты.КорСубконто1 КАК Материал, СУММА(ВЫБОР КОГДА УправленческийОбороты.КорСчет = ЗНАЧЕНИЕ(Плансчетов.Управленческий.ТОвары) ТОГДА УправленческийОбороты.КоличествоКорОборотДт ИНАЧЕ 0 КОНЕЦ) КАК Количество, СУММА(ВЫБОР КОГДА УправленческийОбороты.КорСчет = ЗНАЧЕНИЕ(Плансчетов.Управленческий.ТОвары) ТОГДА УправленческийОбороты.СуммаОборотДт ИНАЧЕ 0 КОНЕЦ) КАК Себестоимость, МАКСИМУМ(ВЫБОР КОГДА УправленческийОбороты.КорСчет = ЗНАЧЕНИЕ(Плансчетов.Управленческий.Покупатели) ТОГДА УправленческийОбороты.СуммаОборотКт ИНАЧЕ 0 КОНЕЦ) КАК Продажа ИЗ РегистрБухгалтерии.Управленческий.Обороты( , , , Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки), &ВидыСубконто, Субконто1.ЭтоКомлект, КорСчет = &Счет ИЛИ КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели), ) КАК УправленческийОбороты СГРУППИРОВАТЬ ПО УправленческийОбороты.Субконто1, УправленческийОбороты.КорСубконто1 //2.32 Необходимо организовать возможность учета продажи комплектов. //Сами комплекты хранятся в справочнике «Номенклатура» наравне с обычными товарами, услугами. //В системе также должна храниться информация о составе комплекта (какие номенклатурные позиции и в каком количестве входят в данный комплект). //В состав комплекта не могут входить другие комплекты. //Операция сборки как таковая в компании не осуществляется. //Когда покупатель приходит получать комплект ответственный сотрудник компании в соответствии со спецификацией отгружает необходимое количество комплектующих. //Продажи осуществляются документом «Расходная накладная», причем в табличной части могут указываться как комплекты, так и обычные комплектующие. //Документ реализует следующие проводки: Дт «Прибыли и убытки» - Кт «Товары» на количество и сумму себестоимости товара (обычных позиций и позиций полученных в результате «раскладки» комплектов). //Если товара не хватает, то списывается остаточная стоимость и все указанное в документе количество; Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажных ценах. //В случае если какого-то товара (комплектующей) не хватает, то дополнительно формируется проводка: //Дт «Товары» - Кт «Долги по товару» на недостающее количество товара. Складской учет не ведется. //Себестоимость рассчитывается как средняя по //номенклатурной позиции. Необходимо получить отчет о недоотгруженном товаре. // //В спр.Номенкл создаем реквизит ЭтоКомплект. Создаем Спр. Покупатели. //В шапку расходной добавляем Покупатель. Создаем док.Операция. //Создаем РС Комплекты (незав, непирод. Изм Комплект - зап из данных зап. пар.выб. Отбор.ЭтоКомплект(Истина). //Изм Номенклатура - пар выб. Отбор.ЭтоКомплект(Ложь)), рес. Количество. ПВХ (Виды, субконто Номенклатура, Субконто, покупатели). //Предопр. Номенклатура, покупатель. ПС признак учета Количественный, КолСубконто - 2. Сч.Товары - количественный. субк. Номенклатура. Сч. ДолгиПоТовару - Количественный. субк. НОменклатура, Покупаытьль. РБ (Количество,Сумма). докОперация //ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ЭлементТЧ.Номенклатура; Движение.КоличествоДт = ЭлементТЧ.Количество; Движение.Сумма = ЭлементТЧ.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); Запрос = новый Запрос; Запрос.МенеджерВременныхТаблиц = новый МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЕСТЬNULL(Комплекты.Номенклатура, ТЧДок.Номенклатура) КАК Номенклатура, | СУММА(ВЫБОР | КОГДА Комплекты.Номенклатура ЕСТЬ NULL | ТОГДА ТЧДок.Количество | ИНАЧЕ ЕСТЬNULL(Комплекты.Количество, 0) * ТЧДок.Количество | КОНЕЦ) КАК Количество |ПОМЕСТИТЬ ТЧКомплектующие |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Комплекты КАК Комплекты | ПО ТЧДок.Номенклатура = Комплекты.Комплект | |СГРУППИРОВАТЬ ПО | ЕСТЬNULL(Комплекты.Номенклатура, ТЧДок.Номенклатура) | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧКомплектующие.Номенклатура, | ТЧКомплектующие.Количество |ИЗ | ТЧКомплектующие КАК ТЧКомплектующие"; Результат = Запрос.Выполнить(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет",ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = Результат; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос.Текст = "ВЫБРАТЬ | ТЧКомплектующие.Номенклатура, | ТЧКомплектующие.Количество КАК КолДок, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст |ИЗ | ТЧКомплектующие КАК ТЧКомплектующие | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧКомплектующие КАК Т)) КАК УправленческийОстатки | ПО ТЧКомплектующие.Номенклатура = УправленческийОстатки.Субконто1"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() цикл ТовараНеХватает = Ложь; Если Выборка.КолДок > Выборка.КолОСт Тогда ТовараНеХватает = Истина; КонецЕсли; КоличествоСписать = Выборка.КолДок; Себестоимость = ?(Выборка.КолОст > КоличествоСписать, КоличествоСписать*Выборка.СумОст/Выборка.КолОст, Выборка.СумОст); Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.КоличествоКт = КоличествоСписать; Движение.Сумма = Себестоимость; Если ТовараНеХватает Тогда ТовараНужно = Выборка.КолДок-Выборка.КолОСт; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.ДолгиПоТовару; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Покупатель] = Покупатель; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.КоличествоКт = ТовараНужно; Движение.КоличествоДт = ТовараНужно; КонецЕсли; КонецЦикла; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Сумма = СуммаПоДокументу; КонецПроцедуры //ОтчетНедопоставленныйТовар ВЫБРАТЬ УправленческийОстатки.Субконто1 КАК Покупатель, УправленческийОстатки.Субконто2 КАК Материал, УправленческийОстатки.КоличествоОстатокКт КАК Количество, Комплекты.Комплект ИЗ РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ДолгиПоТовару), &ВидыСубконто, ) КАК УправленческийОстатки ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Комплекты КАК Комплекты ПО УправленческийОстатки.Субконто2 = Комплекты.Номенклатура //2.33 Необходимо реализовать возможность торговли товара с использованием контрагентов – агентов. //Т.е. товар может продаваться самостоятельно (обычным порядком) и через агента. //В обоих случаях используется документ «Расходная накладная». При продаже через агента заполняется дополнительный реквизит шапки «Агент» (из списка контрагентов). //Значение, выбранное в реквизите «Контрагент» не может совпадать со значением, выбранным в реквизите «Агент». //Продажа через агента заключается в том, что агент «приводит» клиента в компанию. //Таким образом, в документе «Расходная накладная» в качестве контрагента указывается реальный покупатель. //В табличной части указываются цены, по которым покупатель приобретает товарные позиции. Агент получает вознаграждение в виде 20% от разницы между продажной стоимостью и себестоимостью проданных с его участием позиций. //Сама выплата вознаграждения агенту отражается ручной операцией. //Документ «Расходная накладная» делает следующие проводки: Дт «Прибыли и убытки» - Кт «Товары» на количество и себестоимость товара; Дт «Покупатели» - Кт «Прибыли и убытки» на сумму продажи. //В случае если товар продается через агента, то делается дополнительная проводка (одна): Дт «Прибыли и убытки» - Кт «Поставщики» на сумму вознаграждения агента. //Документ не должен проводиться в случае, если каких-либо из указанных товаров не хватает. //Учет товаров ведется в разрезе складов. Себестоимость рассчитывается как средняя по номенклатурной позиции на складе. //Система должна обеспечивать пользователя возможностью ведения складского учета не только на счете «Товары», но и на любом другом выбранным пользователем счете. //Необходимо реализовать отчет, показывающий задолженность компании перед агентами. // //Добавляем Спр. Контрагенты,Склады. В шапку приходн. добавляем Склад, Контрагент. В расходную, склад, контрагент, агент. Добавляем перечисление ВидыЗадолженностиПоставщика (Поставщику,Агенту.). ПВХ (видыСубконто Номенклатура, Субконто, контрагенты, Склады, ВидыЗадолженностиПоставщика ) предпор. Номенклатура, контрагенты, Склады, ВидыЗадолженностиПоставщика. ПС - признак учета Количественный. КолСубконто -2. СчТовары - Количественный. субк. номенклатура,Склад. счПоставщики - субк. Контрагент, ВидЗадолженностиПоставщика. РБ - количество,Сумма. док. Операция //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Управленческий Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Контрагент; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ВидЗадолженностиПоставщика] = Перечисления.ВидыЗадолженностиПоставщика.Поставщик; Движение.Период = Дата; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Склад, Склад); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад КАК Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК КолДок, | ТЧДок.Сумма КАК СумДОк, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | (Субконто1, Субконто2) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склад); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Себестоимость = 0; Пока Выборка.Следующий() Цикл Если Выборка.КолДок > Выборка.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+Выборка.Номенклатура+" недостаточно.На остатке:"+Выборка.КолОст; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; КоличествоСписать = Выборка.КолДок; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад; Движение.КоличествоКт = КоличествоСписать; Движение.Сумма = ?(Выборка.КолОст>КоличествоСписать, КоличествоСписать*Выборка.СумОСт/Выборка.КолОст,Выборка.СумОст); Себестоимость = Себестоимость + Движение.Сумма; КонецЦикла; Если Отказ Тогда Возврат; КонецЕсли; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Сумма = СуммаПоДокументу; Если ЗначениеЗаполнено(Агент) Тогда Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Агент; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ВидЗадолженностиПоставщика] = Перечисления.ВидыЗадолженностиПоставщика.Агенту; Движение.Сумма = (СуммаПоДокументу - Себестоимость)*0.2; КонецЕсли; КонецПроцедуры Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Если Контрагент = Агент Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Контрагент = агенту. Ситуации не может быть по условию задачи"; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; КонецПроцедуры //Отчет ЗадолженностьПередАгентом ВЫБРАТЬ УправленческийОстатки.Субконто1 КАК Сотрудник, УправленческийОстатки.СуммаОстатокКт КАК Долг ИЗ РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Поставщики), &ВидыСубконто, Субконто2 = ЗНАЧЕНИЕ(Перечисление.ВидыЗадолженностиПоставщика.Агенту)) КАК УправленческийОстатки //2.34 Необходимо реализовать возможность торговли товара с использованием контрагентов – агентов. Т.е. товар может продаваться самостоятельно (обычным //порядком) и через агента. В обоих случаях используется документ «Расходная накладная». При продаже через агента заполняется дополнительный реквизит //шапки «Агент» (из списка контрагентов). Значение, выбранное в реквизите «Контрагент» не может совпадать со значением выбранным в реквизите «Агент». //Продажа через агента заключается в том, что агент «приводит» клиента в компанию. Т.е в документе «Расходная накладная» в качестве контрагента //указывается реальный покупатель. В табличной части указываются цены, по которым покупатель приобретает товарные позиции. Агент получает //вознаграждение в виде 50% от разницы между продажной стоимостью и себестоимостью проданных с его участием позиций Документ «Расходная накладная» делает следующие проводки: Дт «Прибыли и убытки» - Кт «Товары» на количество и себестоимость товара; Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажи. Документ не должен проводиться в случае, если указанных товаров не хватает в компании. Учет товаров ведется в разрезе складов. Себестоимость рассчитывается как средняя по номенклатурной позиции на складе. Считается, что учет в разрезе складов будет вестись только на счете «Товары». В конце месяца создается документ, который начисляет агентам положенное вознаграждение. Считается, что если после ввода документа «Начисление вознаграждения», в месяце начисления будут изменены данные по продажам через агентов, то допускается перепроведение документа «Начисление вознаграждения». Документ по каждому контрагенту делает проводку: Дт «Прибыли и убытки» - Кт «Поставщики» на расчетную сумму. Сама выплата вознаграждения агенту отражается ручной операцией. Необходимо реализовать отчет, показывающий задолженность компании перед агентами. //Создаем общий модуль ОбщийМодульСтандартныеПроцедуры (Сервер, вызов сервера). Процедура ПерепровестиДокНачисленияОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт Запрос = новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеВознаграждения.Ссылка |ИЗ | Документ.НачислениеВознаграждения КАК НачислениеВознаграждения |ГДЕ | НачислениеВознаграждения.Проведен | И НачислениеВознаграждения.Дата МЕЖДУ &ДатаНач И &ДатаКон"; Запрос.УстановитьПараметр("ДатаНач", НачалоМесяца(Источник.Дата)); Запрос.УстановитьПараметр("ДатаКон", КонецМесяца(Источник.Дата)); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() цикл ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект(); Попытка ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Перепроведен документ начисления вознаграждения"; Сообщение.Сообщить(); Исключение КонецПопытки; КонецЦикла; КонецПроцедуры //Создаем подпискуНаСОбытие ПерепровестиДокНачисления (Источник: ДокументОбъект.РасходнаяНакладная, СОбытие ОбработкаПроведения, Обработчик : ОбщийМодульСтандартныеПроцедуры.ПерепровестиДокНачисленияОбработкаПроведения). //Создаем Спр: Контрагенты,Склады. В шапку приходной склад, Поставщик. //В шапку расходной склад, контрагет, агент. Создаем док НачислениеВознаграждения //Создаем перечисление ВидЗадолженностиПоставщика (Поставщику,Агенту.) //ПВХ (ВидыСубконто: ВидЗадолженностиПоставщика, Номенкл.Субконто,Контрагенты,Склады.). //Предопред. ВидЗадолженностиПоставщика,Номенклатура,Поставщик, склад.). //ПС - признак учета Количественный, КолСубк. - 2. СчТовары - количественный. РБ - Сумма,Количество. Док Операция. //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Управленческий Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.Период = Дата; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Поставщик] = Поставщик; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ВидЗадолженностиПоставщика] = Перечисления.ВидЗадолженностиПоставщика.ПоставкаТоваров; Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокРАсходная Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Если Контрагент = Агент Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Контрагент не может быть равен агенту!!"; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад КАК Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК КолДок, | ТЧДок.Сумма КАК СумДок, | ТЧДок.Склад, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), | &ВидыСубконто, | (Субконто1, Субконто2) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т)) КАК УправленческийОстатки | ПО ТЧДок.Номенклатура = УправленческийОстатки.Субконто1"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склад); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.КолДок> Выборка.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+Выборка.Номенклатура+" недостаточно.На остатке:"+Выборка.КолОст; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ тогда Продолжить; КонецЕсли; Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Поставщик] = Агент; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = Склад; Движение.КоличествоКт = Выборка.КолДОк; Движение.Сумма = ?(Выборка.КолОст>Выборка.КолДок , Выборка.КолДок*Выборка.СумОСт/Выборка.КолОст, Выборка.СумОст); КонецЦикла; Если Отказ Тогда Возврат; КонецЕсли; //продажа Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Поставщик] = Агент; Движение.Сумма = СуммаПоДокументу; Движения.Управленческий.Записать(); КонецПроцедуры //ДокНачислениеВознаграждения Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.УстановитьЗначение("Счет", планыСчетов.Управленческий.ПрибылиУбытки); ЭлементБлокировки.УстановитьЗначение("Период", новый Диапазон(НачалоМесяца(Дата), КонецМесяца(Дата))); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УправленческийОбороты.Субконто1 КАК Агент, | СУММА(ВЫБОР | КОГДА УправленческийОбороты.КорСчет = ЗНАЧЕНИЕ(планСчетов.Управленческий.Товары) | ТОГДА УправленческийОбороты.СуммаОборотДт | ИНАЧЕ 0 | КОНЕЦ) КАК Себестоимость, | СУММА(ВЫБОР | КОГДА УправленческийОбороты.КорСчет = ЗНАЧЕНИЕ(планСчетов.Управленческий.Покупатели) | ТОГДА УправленческийОбороты.СуммаОборотКт | ИНАЧЕ 0 | КОНЕЦ) КАК СуммаПродажи |ИЗ | РегистрБухгалтерии.Управленческий.Обороты( | &НачалоПериода, | &КонецПериода, | , | Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки), | &ВидыСубконто, | , | КорСчет = ЗНАЧЕНИЕ(плансчетов.Управленческий.Товары) | ИЛИ КорСчет = ЗНАЧЕНИЕ(плансчетов.Управленческий.Покупатели), | ) КАК УправленческийОбороты | |СГРУППИРОВАТЬ ПО | УправленческийОбороты.Субконто1"; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Поставщик); Запрос.УстановитьПараметр("ВидыСубконто",ВидыСубконто); Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("КонецПериода", новый Граница(КонецМесяца(Дата),ВидГраницы.Включая)); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Поставщик] = Выборка.Агент; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ВидЗадолженностиПоставщика] = Перечисления.ВидЗадолженностиПоставщика.Агенту; Движение.Сумма = (Выборка.СуммаПродажи-Выборка.Себестоимость)*0.2; КонецЦикла; КонецПроцедуры //Отчет ЗадолженностиПередАгентом ВЫБРАТЬ УправленческийОстатки.СуммаОстатокКт КАК Долг, УправленческийОстатки.Субконто1 КАК Сотрудник ИЗ РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Поставщики), &ВидыСубконто, Субконто2 = ЗНАЧЕНИЕ(Перечисление.ВидЗадолженностиПоставщика.Агенту)) КАК УправленческийОстатки //2.35 Необходимо реализовать возможность торговли товарами по плановой себестоимости. //В течение месяца в организации производится торговля товарами. Факт продажи регистрируется документом «Расходная накладная». //Документ реализует следующие проводки: Дт «Прибыли и убытки» - Кт «Товары» по количеству и на сумму соответствующей плановой себестоимости в этом месяце. //Плановая себестоимость определяется в системе и в течение месяца не меняется (но каждый месяц может быть разной); //Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажных ценах. Контроль остатков при проведении данного документа не производится. //Поступление товаров отражается документом «Приходная накладная» и в связи со спецификой работы компании может вводиться позднее реального поступления. //Следует считать, что поступление товаров будет отражено именно в том месяце, в котором оно происходило. //Также следует считать, что весь купленный товар будет продан в этом же месяце. //Документ «Приходная накладная» делает следующие проводки: Дт «Товары» - Кт «Поставщики» на количество и сумму поступления. //После ввода документов поступления на конец месяца формируется регламентный документ «Корректировка себестоимости». //Его задача «привести» плановую себестоимость к реальной (в соответствии с данными введенными при поступлении). //Документ по каждой товарной позиции делает следующую проводку: //В случае если списанная себестоимость была больше реальной Дт «Товары» - Кт «Прибыли и убытки» на сумму разницы; //В случае если реальная себестоимость была больше списанной Дт «Прибыли и убытки» - Кт «Товары» на сумму разницы. //В системе должен быть предусмотрен отчет по продажам, формируемый за период кратный месяцу. // //Создаем док. КорректировкаСебестоимости Процедура ОбработкаПроведения(Отказ, Режим) Блок = Новый БлокировкаДанных; ЭлБлок = Блок.Добавить("РегистрБухгалтерии.Управленческий"); ЭлБлок.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлБлок.УстановитьЗначение("Период", Новый Диапазон(НачалоМесяца(Дата), КонецМесяца(Дата))); ЭлБлок.Режим = РежимБлокировкиДанных.Исключительный; Блок.Заблокировать(); Движения.Управленческий.Записать(); Движения.Управленческий.Записывать = Истина; Запрос = Новый Запрос("ВЫБРАТЬ | УправленческийОбороты.Субконто1 КАК Товар, | УправленческийОбороты.СуммаОборотДт КАК Приход, | УправленческийОбороты.СуммаОборотКт КАК Списание |ИЗ | РегистрБухгалтерии.Управленческий.Обороты(&ДатаНачала, &ДатаОкончания, , Счет = &СчетТовары, &ВидСубконто, , КорСчет В (&СчетПУ, &СчетПоставщики), ) КАК УправленческийОбороты |ГДЕ | УправленческийОбороты.СуммаОборотДт <> УправленческийОбороты.СуммаОборотКт"); Запрос.УстановитьПараметр("ДатаНачала", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("ДатаОкончания", КонецМесяца(Дата)); Запрос.УстановитьПараметр("СчетТовары", ПланыСчетов.Управленческий.Товары); Запрос.УстановитьПараметр("СчетПУ", ПланыСчетов.Управленческий.ПрибылиУбытки); Запрос.УстановитьПараметр("СчетПоставщики", ПланыСчетов.Управленческий.Поставщики); Запрос.УстановитьПараметр("ВидСубконто", ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Отклонение = Выборка.Приход - Выборка.Списание; Если Отклонение > 0 Тогда Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.Период = Дата; Движение.Сумма = Отклонение; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Товар; Иначе Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Период = Дата; Движение.Сумма = -Отклонение; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Товар; КонецЕсли; КонецЦикла; КонецПроцедуры //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Управленческий Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.Период = Дата; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, Режим) Блок = Новый БлокировкаДанных; ЭлБлок = Блок.Добавить("РегистрСведений.ПлановаяСебестоимость"); ЭлБлок.ИсточникДанных = СписокНоменклатуры; ЭлБлок.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлБлок.УстановитьЗначение("Период", Дата); ЭлБлок.Режим = РежимБлокировкиДанных.Исключительный; Блок.Заблокировать(); Движения.Управленческий.Записывать = Истина; Запрос = Новый Запрос("ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ Список |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.Номенклатура, | Список.Количество, | ЕСТЬNULL(ПлановаяСебестоимостьСрезПоследних.Стоимость, 0) КАК Стоимость |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПлановаяСебестоимость.СрезПоследних( | &Момент, | Номенклатура В | (ВЫБРАТЬ | Список.Номенклатура | ИЗ | Список КАК Список)) КАК ПлановаяСебестоимостьСрезПоследних | ПО Список.Номенклатура = ПлановаяСебестоимостьСрезПоследних.Номенклатура"); Запрос.УстановитьПараметр("Момент", Дата); Запрос.УстановитьПараметр("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.Период = Дата; Движение.Сумма = Выборка.Количество * Выборка.Стоимость; Движение.КоличествоКт = Выборка.Количество; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; КонецЦикла; Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Период = Дата; Движение.Сумма = СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры //ДокРучнаяОперация Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Если Не ЭтоНовый() И Модифицированность() Тогда Набор = РегистрыБухгалтерии.Управленческий.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Набор.УстановитьАктивность(Не ПометкаУдаления); Набор.Записать(); КонецЕсли; КонецПроцедуры //ПВХ (виды номенклатура номенклатура) предопр. номенклатура. //ПС - признак учета. КОличественый. Субконто = 1. счТовары - количественный. субк. номенклатура - только обороты. //Создаем РС ПлановаяСебестоимость (в пределах месяца, независимый. изм.Номенклатура, рес. Стоимость.) // РБ - Сумма,Количестов. //Отчет по продажам ВЫБРАТЬ УправленческийОбороты.Субконто1 КАК Товар, СУММА(УправленческийОбороты.КоличествоОборотКт) КАК Количество, СУММА(УправленческийОбороты.СуммаОборотКт) КАК Списание, СУММА(УправленческийОбороты.СуммаОборотДт) КАК Приход ПОМЕСТИТЬ ВТ ИЗ РегистрБухгалтерии.Управленческий.Обороты(, , Регистратор, Счет = &СчетТовары, &ВидСубконто, , КорСчет В (&СчетПУ, &СчетПоставщики), ) КАК УправленческийОбороты ГДЕ НЕ УправленческийОбороты.Регистратор ССЫЛКА Документ.КорректировкаСебестоимости СГРУППИРОВАТЬ ПО УправленческийОбороты.Субконто1 ИНДЕКСИРОВАТЬ ПО Товар ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ.Товар, ВТ.Количество, ВЫБОР КОГДА ВТ.Количество <> 0 ТОГДА ВТ.Списание / ВТ.Количество ИНАЧЕ 0 КОНЕЦ КАК ПлановаяСебестоимость, ВЫБОР КОГДА ВТ.Количество <> 0 ТОГДА ВТ.Приход / ВТ.Количество ИНАЧЕ 0 КОНЕЦ КАК РеальнаяСебестоимость, ВЫБОР КОГДА ВТ.Количество <> 0 ТОГДА ВТ.Приход / ВТ.Количество ИНАЧЕ 0 КОНЕЦ - ВЫБОР КОГДА ВТ.Количество <> 0 ТОГДА ВТ.Списание / ВТ.Количество ИНАЧЕ 0 КОНЕЦ КАК Разница ИЗ ВТ КАК ВТ //2.36 Бухгалтерский учет в компании ведется в разрезе нескольких юридических лиц (предполагается получение баланса по каждой организации). //В целом компания занимается торговлей продуктами питания. Учет товаров ведется в разрезе складов и сроков годности. //Поступление товаров осуществляется с помощью документа «Приходная накладная». //В табличной части документа для каждой номенклатурной позиции указывается ее срок годности. //Проводки, которые реализует данный документ следующие: Дт «Товары» - Кт «Поставщики» на количество и сумму, указанные в документе. //Продажа товаров регистрируется с помощью окумента «Расходная накладная». //Срок годности в документе не указывается. Считается, что в первую очередь списывается товар с меньшим сроком годности. //Данный документ реализует следующие проводки: Дт «Прибыли и убытки» - Кт «Товары» на количество и себестоимость товара; Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажи. //Документ не проводится, если по указанной в шапке организации нет товара на нужном складе. //Себестоимость товара рассчитывается как средняя стоимость номенклатурной позиции с данным сроком годности на выбранном складе для этого юридического лица. //Необходимо создать отчет, который показывал бы «встречные» продажи в рамках компании (когда одна организация продает товар другой организации). // //СоздСпр ЮрЛица, Склады,СрокиГодности (рекв. дата). Создаем док РучнаяОперация. В шапку приходной добавляем ЮрЛицо,Склад в тч СрокГодности. в шапку расходной добавляем юрЛицо, контрагент,Склад. Создаем РС КонтрагентыЮрЛица (непериод, незав). рекв. Изм. ЮрЛицо, рес. Контрагент. ПВХ (ВидыСубконто: Номенклатура,Контрагент,Склады,СрокиГодности.) Предопред. Номенклатура,Контрагент,Склады,СрокиГодности. ПС - признак учета количественный, Субконто = 3. СчТовары (Количественный, субк:Номенклатура,Склады,СрокиГодности). СчПокупатели субк:Конрагенты. РБ - изм ЮрЛицо (бал), рес.Сумма,Количество //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Управленческий Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.Период = Дата; Движение.ЮрЛицо = ЮрЛицо; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.СрокиГодности] = ТекСтрокаСписокНоменклатуры.СрокГодности; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, Режим) Блок = Новый БлокировкаДанных; ЭлБлок = Блок.Добавить("РегистрБухгалтерии.Управленческий"); ЭлБлок.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлБлок.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Склады, Склад); ЭлБлок.ИсточникДанных = СписокНоменклатуры; ЭлБлок.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклаура"); ЭлБлок.Режим = РежимБлокировкиДанных.Исключительный; Блок.Заблокировать(); Движения.Управленческий.Записать(); Движения.Управленческий.Записывать = Истина; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.СрокиГодности); Запрос = Новый Запрос("ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ Список |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.Номенклатура КАК Номенклатура, | Список.Количество КАК КоличествоДок, | УправленческийОстатки.Субконто3 КАК СрокГодности, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СуммаРег, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КоличествоРег |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &Момент, | Счет = &Счет, | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Список.Номенклатура | ИЗ | Список КАК Список) | И Субконто2 = &Склад | И ЮрЛицо = &ЮрЛицо) КАК УправленческийОстатки | ПО Список.Номенклатура = УправленческийОстатки.Субконто1 |ИТОГИ | МАКСИМУМ(КоличествоДок), | СУММА(КоличествоРег) |ПО | Номенклатура"); Запрос.УстановитьПараметр("Момент", ?(Режим=РежимПроведенияДокумента.Неоперативный, МоментВремени(), Неопределено)); Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.Товары); Запрос.УстановитьПараметр("Склад", Склад); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Запрос.УстановитьПараметр("ЮрЛицо", ЮрЛицо); Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока Выборка.Следующий() Цикл Нехватка = Выборка.КоличествоДок - Выборка.КоличествоРег; Если Нехватка > 0 Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не достаточно товара " + Выборка.Номенклатура + " в количестве " + Нехватка; Сообщение.Сообщить(); КонецЕсли; Если Не Отказ Тогда НужноСписать = Выборка.КоличествоДок; ВыборкаДет = Выборка.Выбрать(); Пока ВыборкаДет.Следующий() И НужноСписать > 0 Цикл СпишемКол = Мин(НужноСписать, ВыборкаДет.КоличествоРег); Если СпишемКол = ВыборкаДет.КоличествоРег Тогда СпишемСум = ВыборкаДет.СуммаРег; Иначе СпишемСум = ?(ВыборкаДет.КоличествоРег=0,0,СпишемКол * ВыборкаДет.СуммаРег / ВыборкаДет.КоличествоРег); КонецЕсли; Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.Период = Дата; Движение.ЮрЛицо = ЮрЛицо; Движение.Сумма = СпишемСум; Движение.КоличествоКт = СпишемКол; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаДет.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокиГодности] = ВыборкаДет.СрокГодности; НужноСписать = НужноСписать - СпишемКол; КонецЦикла; КонецЕсли; КонецЦикла; Если Не Отказ Тогда Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Период = Дата; Движение.ЮрЛицо = ЮрЛицо; Движение.Сумма = СуммаПоДокументу; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент; КонецЕсли; КонецПроцедуры Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры //Отчет ВстречныеПродажи ВЫБРАТЬ ЮрЛица.Ссылка КАК ЮрЛицоОтправитель, ЮрЛица1.Ссылка КАК ЮрЛицоПолучатель ПОМЕСТИТЬ ЮрЛица ИЗ Справочник.ЮрЛица КАК ЮрЛица, Справочник.ЮрЛица КАК ЮрЛица1 ИНДЕКСИРОВАТЬ ПО ЮрЛицоОтправитель, ЮрЛицоПолучатель ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ КонтрагентыЮрЛица.ЮрЛицо КАК ЮрЛицо, КонтрагентыЮрЛица.Контрагент КАК Контрагент ПОМЕСТИТЬ КонтрагентыЮрЛица ИЗ РегистрСведений.КонтрагентыЮрЛица КАК КонтрагентыЮрЛица ИНДЕКСИРОВАТЬ ПО ЮрЛицо, Контрагент ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ УправленческийОбороты.ЮрЛицо КАК ЮрЛицоОтправитель, КонтрагентыЮрЛица.ЮрЛицо КАК ЮрЛицоПолучатель, УправленческийОбороты.СуммаОборотДт КАК Сумма ПОМЕСТИТЬ Продажи ИЗ РегистрБухгалтерии.Управленческий.Обороты( , , , Счет = &СчетПокупатели, &ВидСубконто, Субконто1 В (ВЫБРАТЬ КонтрагентыЮрЛица.Контрагент ИЗ КонтрагентыЮрЛица КАК КонтрагентыЮрЛица), КорСчет = &СчетПУ, ) КАК УправленческийОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтрагентыЮрЛица КАК КонтрагентыЮрЛица ПО УправленческийОбороты.Субконто1 = КонтрагентыЮрЛица.Контрагент ИНДЕКСИРОВАТЬ ПО ЮрЛицоОтправитель, ЮрЛицоПолучатель ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЮрЛица.ЮрЛицоОтправитель, ЮрЛица.ЮрЛицоПолучатель, ВЫБОР КОГДА ЮрЛица.ЮрЛицоОтправитель = ЮрЛица.ЮрЛицоПолучатель ТОГДА "Х" ИНАЧЕ Продажи.Сумма КОНЕЦ КАК Сумма ИЗ ЮрЛица КАК ЮрЛица ЛЕВОЕ СОЕДИНЕНИЕ Продажи КАК Продажи ПО ЮрЛица.ЮрЛицоОтправитель = Продажи.ЮрЛицоОтправитель И ЮрЛица.ЮрЛицоПолучатель = Продажи.ЮрЛицоПолучатель //2.37 Сборка готовых компьютеров происходит из отдельных комплектующих. //Учет комплектующих ведется на счете «Материалы», а готовых изделий на счете «Товары». //Сборка и хранение всех материалов происходят в головном офисе, а готовая продукция развозится на разные склады, поэтому складской учет ведется только по счету «Товары». //Продажа отражается документом «Расходная накладная», причем продаваться могут как готовые компьютеры, так и отдельные комплектующие, которые указываются в одной табличной части. //В документе обязательно должен быть указан склад, с которого будет произведена отгрузка готовых компьютеров. //При проведении документ «Расходная накладная» формирует проводки: Дт «Прибыли и убытки» - Кт «Товары» на количество и себестоимость компьютеров. //Себестоимость рассчитывается как средняя по номенклатурной позиции на складе; Дт «Прибыли и убытки» - Кт «Материалы» на количество и себестоимость комплектующих. //Себестоимость рассчитывается как средняя по номенклатурной позиции; Дт «Покупатели» - Кт «Прибыли и убытки» на сумму в продажи. //Необходимо создать отчеты о наличии товаров и о продажах. // //Добавляем в справочник номенклатура рекв. ГотовыйКомпьютер. Добавляем спр. склады. Добавляем в шапки накладных склады. Добавляем док РучнаяОперация. ПВХ (виды субконто номенклатура ,Склады.) Предопр. Номенлатура ,Склады. ПС - признак учета Количественный. КолСубконто = 2. СчТовары (Количественный . субк. номенклатура, Склады.) счМатериалы (Количественный, субк: Номенклатура). Прибыли и убытки - номенклатура толькоОб. РБ - сумма, количество. //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Управленческий Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Если ТекСтрокаСписокНоменклатуры.Номенклатура.ГотовыйКомпьютер Тогда Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад; Иначе Движение.СчетДт = ПланыСчетов.Управленческий.Материалы; КонецЕсли; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.Период = Дата; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, Режим) Запрос = Новый Запрос("ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ГотовыйКомпьютер КАК ГотовыйКомпьютер |ПОМЕСТИТЬ Список |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | ГотовыйКомпьютер |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.Номенклатура |ПОМЕСТИТЬ Товары |ИЗ | Список КАК Список |ГДЕ | Список.ГотовыйКомпьютер |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.Номенклатура |ПОМЕСТИТЬ Материалы |ИЗ | Список КАК Список |ГДЕ | НЕ Список.ГотовыйКомпьютер"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.ВыполнитьПакет(); Блок = Новый БлокировкаДанных; ЭлБлок = Блок.Добавить("РегистрБухгалтерии.Управленческий"); ЭлБлок.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Материалы); ЭлБлок.ИсточникДанных = Результат[1]; ЭлБлок.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); ЭлБлок.Режим = РежимБлокировкиДанных.Исключительный; Блок.Заблокировать(); Блок = Новый БлокировкаДанных; ЭлБлок = Блок.Добавить("РегистрБухгалтерии.Управленческий"); ЭлБлок.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлБлок.ИсточникДанных = Результат[2]; ЭлБлок.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Склады, Склад); ЭлБлок.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); ЭлБлок.Режим = РежимБлокировкиДанных.Исключительный; Блок.Заблокировать(); Движения.Управленческий.Записать(); Движения.Управленческий.Записывать = Истина; ВидыСубконтоМатериалы = Новый Массив; ВидыСубконтоМатериалы.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконтоТовары = Новый Массив; ВидыСубконтоТовары.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконтоТовары.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады); Запрос = Новый Запрос("ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ГотовыйКомпьютер КАК ГотовыйКомпьютер, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ Список |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ГотовыйКомпьютер | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | ГотовыйКомпьютер |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.Номенклатура, | Список.ГотовыйКомпьютер, | Список.Количество, | Список.Сумма, | ВЫБОР | КОГДА Список.ГотовыйКомпьютер | ТОГДА УправленческийОстаткиТовары.СуммаОстатокДт | ИНАЧЕ УправленческийОстаткиМатериалы.СуммаОстатокДт | КОНЕЦ КАК СуммаРег, | ВЫБОР | КОГДА Список.ГотовыйКомпьютер | ТОГДА УправленческийОстаткиТовары.КоличествоОстатокДт | ИНАЧЕ УправленческийОстаткиМатериалы.КоличествоОстатокДт | КОНЕЦ КАК КоличествоРег |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &Момент, | Счет = &СчетМатериалы, | &ВидыСубконтоМатериалы, | Субконто1 В | (ВЫБРАТЬ | Список.Номенклатура | ИЗ | Список КАК Список | ГДЕ | НЕ Список.ГотовыйКомпьютер)) КАК УправленческийОстаткиМатериалы | ПО Список.Номенклатура = УправленческийОстаткиМатериалы.Субконто1 | И (НЕ Список.ГотовыйКомпьютер) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &Момент, | Счет = &СчетТовары, | &ВидыСубконтоТовары, | Субконто1 В | (ВЫБРАТЬ | Список.Номенклатура | ИЗ | Список КАК Список | ГДЕ | Список.ГотовыйКомпьютер) | И Субконто2 = &Склад) КАК УправленческийОстаткиТовары | ПО (Список.ГотовыйКомпьютер) | И Список.Номенклатура = УправленческийОстаткиТовары.Субконто1"); Запрос.УстановитьПараметр("Момент", ?(Режим=РежимПроведенияДокумента.Неоперативный, МоментВремени(), Неопределено)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Склад", Склад); Запрос.УстановитьПараметр("СчетМатериалы", ПланыСчетов.Управленческий.Материалы); Запрос.УстановитьПараметр("СчетТовары", ПланыСчетов.Управленческий.Товары); Запрос.УстановитьПараметр("ВидыСубконтоМатериалы", ВидыСубконтоМатериалы); Запрос.УстановитьПараметр("ВидыСубконтоТовары", ВидыСубконтоТовары); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Нехватка = Выборка.Количество - Выборка.КоличествоРег; Если Нехватка > 0 Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не достаточно " + Выборка.Номенклатура + " в количестве " + Нехватка; Сообщение.Сообщить(); КонецЕсли; Если Не Отказ Тогда Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Если Выборка.ГотовыйКомпьютер Тогда Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад; Иначе Движение.СчетКт = ПланыСчетов.Управленческий.Материалы; КонецЕсли; Движение.Период = Дата; Если Нехватка = 0 Тогда Движение.Сумма = Выборка.СуммаРег; Иначе Движение.Сумма = ?(Выборка.КОличествоРег=0,0,Выборка.Количество * Выборка.СуммаРег / Выборка.КОличествоРег); КонецЕсли; Движение.КоличествоКт = Выборка.Количество; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.Период = Дата; Движение.Сумма = Выборка.Сумма; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; КонецЕсли; КонецЦикла; КонецПроцедуры //Отчет ОстаткиТоваров ВЫБРАТЬ Т.Товар, Т.Склад, СУММА(Т.Сумма) КАК Сумма, СУММА(Т.Количество) КАК Количество, Т.Порядок ИЗ (ВЫБРАТЬ УправленческийОстатки.Субконто1 КАК Товар, УправленческийОстатки.Субконто2 КАК Склад, УправленческийОстатки.СуммаОстатокДт КАК Сумма, УправленческийОстатки.КоличествоОстатокДт КАК Количество, ВЫБОР КОГДА УправленческийОстатки.Субконто2 = &ЦентральныйСклад ТОГДА 1 ИНАЧЕ 2 КОНЕЦ КАК Порядок ИЗ РегистрБухгалтерии.Управленческий.Остатки(, Счет = &СчетТовары, &ВидыСубконтоТовары, ) КАК УправленческийОстатки ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ УправленческийОстатки.Субконто1, &ЦентральныйСклад, УправленческийОстатки.СуммаОстатокДт, УправленческийОстатки.КоличествоОстатокДт, 1 ИЗ РегистрБухгалтерии.Управленческий.Остатки(, Счет = &СчетМатериалы, &ВидыСубконтоМатериалы, ) КАК УправленческийОстатки) КАК Т СГРУППИРОВАТЬ ПО Т.Товар, Т.Склад, Т.Порядок //ОтчетПродажиТоваров ВЫБРАТЬ УправленческийОбороты.Субконто1 КАК Товар, УправленческийОбороты.СуммаОборотДт КАК Себестоимость, УправленческийОбороты.СуммаОборотКт КАК СуммаПродажи, УправленческийОбороты.КоличествоКорОборотДт КАК Количество ИЗ РегистрБухгалтерии.Управленческий.Обороты(, , , Счет = &СчетПУ, &ВидыСубконто, , КорСчет В (&СчетТовары, &СчетМатериалы, &СчетПокупатели), ) КАК УправленческийОбороты //2.38. Необходимо организовать учет перемещений товаров. Складской учет ведется в рамках одной организации в разрезе складов. //Склады территориально удалены друг от друга. Перемещение из одного склада на другой может идти несколько дней. //Факт отправления регистрируется в системе с помощью документа «Отправление». //В шапке документа указывается склад - отправитель и склад – получатель и ожидаемая дата прибытия товара. //В табличной части указывается перемещаемый товар и его количество. //Документ делает следующие проводки: Дт «Товары в пути» - Кт «Товары» в указанном количестве. Себестоимость определяется как средняя по товару в разрезе склада. //Если на складе отправителе товар в нужном количестве отсутствует, документ не проводится. //Факт прибытия товара на склад получатель отражается документом «Прибытие». //Документ вводится только на основании документа «Отправление». //Считается, что отправляемый товар доходит до получателя в полном объеме, но дата фактического прибытия может отличаться от запланированной. //В документе «Прибытие» указывается только дата фактического прибытия товара и документ отправления. //Документ «Прибытие» реализует следующие проводки: Дт «Товары» - Кт «Товары в пути» количество и стоимость соответствуют количеству и сумме отправленного товара. //Необходимо иметь возможность сформировать отчет о задержках перемещаемого товара. //В отчет должны выводиться данные только о тех перемещениях, у которых прибытие произошло позже запланированного срока. // //Создаем спр.Склады, спр. ДатыПрибытия (рекв. Дата) //В шапку приходной добавляеи Склад.Создаем док Отправление (Рекв. СкладОтправитель, СкладПолучатель, ДатаПРибытия. тч. СписокНоменклатуры - Номенклатура, количество.) //Создаем док Прибытие (рекв. ДокументОтправления, ДатаПрибытия). Создаем док РучнаяОперация. //ПВХ (видыСубконто: Номенлкатура, Склады, ДатаПРибытия, Отправление (докОтправление)) //Предопр: ДатаПРибытия, ДокументыОтправления,Склады, Номенклатура. //ПС признак учета Количественный, колсубконто = 3. СчТовары (Количесвтенный, субк: Номенклатура, Склады, датаПРибытия - толькоОб.). //СчТоварыВПути (субк. ДокументыОтправления (толькоОБ), Склады (толькоОБ),, датыПрибытия (толькоОБ),). РБ - количесво,Сумма. //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Управленческий Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.Период = Дата; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокОтправление Процедура ОбработкаПроведения(Отказ, Режим) Блок = Новый БлокировкаДанных; ЭлБлок = Блок.Добавить("РегистрБухгалтерии.Управленческий"); ЭлБлок.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлБлок.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Склады, СкладОтправитель); ЭлБлок.ИсточникДанных = СписокНоменклатуры; ЭлБлок.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); ЭлБлок.Режим = РежимБлокировкиДанных.Исключительный; Блок.Заблокировать(); Движения.Управленческий.Записать(); Движения.Управленческий.Записывать = Истина; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады); Запрос = Новый Запрос("ВЫБРАТЬ | ОтправлениеСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ОтправлениеСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ Список |ИЗ | Документ.Отправление.СписокНоменклатуры КАК ОтправлениеСписокНоменклатуры |ГДЕ | ОтправлениеСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ОтправлениеСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.Номенклатура, | Список.Количество, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КоличествоРег, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СуммаРег |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &Момент, | Счет = &Счет, | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Список.Номенклатура | ИЗ | Список КАК Список) | И Субконто2 = &Склад) КАК УправленческийОстатки | ПО Список.Номенклатура = УправленческийОстатки.Субконто1"); Запрос.УстановитьПараметр("Момент", ?(Режим=РежимПроведенияДокумента.Неоперативный, МоментВремени(), Неопределено)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Склад", СкладОтправитель); Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.Товары); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Нехватка = Выборка.Количество - Выборка.КоличествоРег; Если Нехватка > 0 Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не достаточно товара " + Выборка.Номенклатура + " в количестве " + Нехватка; Сообщение.Сообщить(); КонецЕсли; Если Не Отказ Тогда Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.ТоварыВПути; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.Период = Дата; Движение.КоличествоКт = Выборка.Количество; Если Нехватка = 0 Тогда Движение.Сумма = Выборка.СуммаРег; Иначе Движение.Сумма = ?(Выборка.КоличествоРег=0,0,Выборка.Количество * Выборка.СуммаРег / Выборка.КоличествоРег); КонецЕсли; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ДокументыОтправления] = Ссылка; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = СкладПолучатель; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ДатыПрибытия] = ДатаПрибытия; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = СкладОтправитель; КонецЕсли; КонецЦикла; КонецПроцедуры //ДокПРибыитые Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Отправление") Тогда // Заполнение шапки ДатаПрибытия = ДанныеЗаполнения.ДатаПрибытия; ДокументОтправления = ДанныеЗаполнения.Ссылка; КонецЕсли; //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ КонецПроцедуры Процедура ОбработкаПроведения(Отказ, Режим) Блок = Новый БлокировкаДанных; ЭлБлок = Блок.Добавить("РегистрБухгалтерии.Управленческий"); ЭлБлок.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.ТоварыВПути); ЭлБлок.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.ДокументыОтправления, ДокументОтправления); ЭлБлок.Режим = РежимБлокировкиДанных.Исключительный; Блок.Заблокировать(); Движения.Управленческий.Записать(); Движения.Управленческий.Записывать = Истина; ВидыСубконтоТоварыВПути = Новый Массив; ВидыСубконтоТоварыВПути.Добавить(ПланыВидовХарактеристик.ВидыСубконто.ДокументыОтправления); ВидыСубконтоТоварыВПути.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады); ВидыСубконтоТоварыВПути.Добавить(ПланыВидовХарактеристик.ВидыСубконто.ДатыПрибытия); ВидыСубконтоТовары = Новый Массив; ВидыСубконтоТовары.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконтоТовары.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады); Запрос = Новый Запрос("ВЫБРАТЬ | УправленческийОборотыДтКт.СубконтоКт1 КАК Товар, | УправленческийОборотыДтКт.СубконтоКт2 КАК СкладОтправитель, | УправленческийОборотыДтКт.СубконтоДт2 КАК СкладПолучатель, | УправленческийОборотыДтКт.СубконтоДт3 КАК ДатаПрибытия, | УправленческийОборотыДтКт.КоличествоОборотДт КАК Количество, | УправленческийОборотыДтКт.СуммаОборот КАК Сумма |ИЗ | РегистрБухгалтерии.Управленческий.ОборотыДтКт(, &ДатаОкончания, , СчетДт = &ТоварыВПути, &ВидыСубконтоТоварыВПути, СчетКт = &Товары, &ВидыСубконтоТовары, СубконтоДт1 = &ДокументОтправления) КАК УправленческийОборотыДтКт"); Запрос.УстановитьПараметр("ДатаОкончания", МоментВремени()); Запрос.УстановитьПараметр("ТоварыВПути", ПланыСчетов.Управленческий.ТоварыВПути); Запрос.УстановитьПараметр("Товары", ПланыСчетов.Управленческий.Товары); Запрос.УстановитьПараметр("ВидыСубконтоТоварыВПути", ВидыСубконтоТоварыВПути); Запрос.УстановитьПараметр("ВидыСубконтоТовары", ВидыСубконтоТовары); Запрос.УстановитьПараметр("ДокументОтправления", ДокументОтправления); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.ТоварыВПути; Движение.Период = Дата; Движение.КоличествоДт = Выборка.Количество; Движение.КоличествоКт = Выборка.Количество; Движение.Сумма = Выборка.Сумма; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Товар; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Выборка.СкладПолучатель; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ДатыПрибытия] = ДатаПрибытия; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ДокументыОтправления] = ДокументОтправления; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Выборка.СкладОтправитель; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ДатыПрибытия] = Выборка.ДатаПрибытия; КонецЦикла; КонецПроцедуры //ОтчетОЗадержках ВЫБРАТЬ УправленческийОборотыДтКт.СубконтоКт2 КАК Отправитель, УправленческийОборотыДтКт.СубконтоДт2 КАК Получатель, УправленческийОборотыДтКт.СубконтоДт3 КАК ДатаПрибытия, УправленческийОборотыДтКт.СубконтоКт3 КАК ДатаОтправления ПОМЕСТИТЬ ВТ ИЗ РегистрБухгалтерии.Управленческий.ОборотыДтКт(, , Регистратор, СчетДт = &СчетТовары, &ВидыСубконтоТовары, СчетКт = &СчетТоварыВПути, &ВидыСубконтоТоварыВПути, ) КАК УправленческийОборотыДтКт ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ.Отправитель, ВТ.Получатель, ВТ.ДатаПрибытия.Дата КАК ДатаПрибытия, РАЗНОСТЬДАТ(ВТ.ДатаОтправления.Дата, ВТ.ДатаПрибытия.Дата, ДЕНЬ) КАК Задержка ИЗ ВТ КАК ВТ //2.39 ведется в рамках одной организации в разрезе складов. Склады территориально удалены друг от друга. //Перемещение из одного склада на другой может идти несколько дней. //Факт отправления регистрируется в системе с помощью документа «Отправление». //В шапке документа указывается склад - отправитель и склад – получатель. //В табличной части указывается перемещаемый товар и его количество. //Документ делает следующие проводки: Дт «Товары в пути» - Кт «Товары» в указанном количестве. //Себестоимость определяется как средняя по товару в разрезе склада. //Если на складе отправителе товар в нужном количестве отсутствует, документ не проводится. //Факт прибытия товара на склад получатель отражается документом «Прибытие». //В документе указываются склад отправитель и получатель, документ отправки, а в табличной части указывается перечень прибывших товаров и их количество. //Товар может теряться в дороге или приходить по частям (табличная часть может подвергаться корректировке), но в результате корректировки недопустимо прибытие товара, который не отправляли. //Документ реализует следующие проводки: Дт «Товары» - Кт «Товары в пути» на количество и стоимость прибывшего товара. //Стоимость одной единицы товара остается неизменной в процессе перемещения и соответствует себестоимости одной единицы отправленного товара. //Необходимо получать отчет о потерях товара. // //СоздСпр Склады. В док шапку приходной добавляем Склад. Создаем Док Отправление (рекв. СкладОтправитель, СкладПолучатель тчСписокНоменклатуры - Номенклатура, количество). Создаем док Прибытие (рекв. СкладОтправитель,СкладПолуачатель, ДокументОтправки тчСписокНоменклатуры - Номенклатура, Количество.) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Управленческий Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.Период = Дата; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокОтправление Процедура ОбработкаПроведения(Отказ, Режим) Блок = Новый БлокировкаДанных; ЭлБлок = Блок.Добавить("РегистрБухгалтерии.Управленческий"); ЭлБлок.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлБлок.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Склады, СкладОтправитель); ЭлБлок.ИсточникДанных = СписокНоменклатуры; ЭлБлок.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); ЭлБлок.Режим = РежимБлокировкиДанных.Исключительный; Блок.Заблокировать(); Движения.Управленческий.Записать(); Движения.Управленческий.Записывать = Истина; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады); Запрос = Новый Запрос("ВЫБРАТЬ | ОтправлениеСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ОтправлениеСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ Список |ИЗ | Документ.Отправление.СписокНоменклатуры КАК ОтправлениеСписокНоменклатуры |ГДЕ | ОтправлениеСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ОтправлениеСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.Номенклатура, | Список.Количество, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СуммаРег, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КоличествоРег |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &Момент, | Счет = &Счет, | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Список.Номенклатура | ИЗ | Список КАК Список) | И Субконто2 = &Склад) КАК УправленческийОстатки | ПО Список.Номенклатура = УправленческийОстатки.Субконто1"); Запрос.УстановитьПараметр("Момент", ?(Режим=РежимПроведенияДокумента.Неоперативный, МоментВремени(), Неопределено)); Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.Товары); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Склад", СкладОтправитель); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Нехватка = Выборка.Количество - Выборка.КоличествоРег; Если Нехватка > 0 Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не достаточно товара " + Выборка.Номенклатура + " в количестве " + Нехватка; Сообщение.Сообщить(); КонецЕсли; Если Не Отказ Тогда Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.ТоварыВПути; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.Период = Дата; Если Нехватка = 0 Тогда Движение.Сумма = Выборка.СуммаРег; Иначе Движение.Сумма = ?(Выборка.КоличествоРег=0,0,Выборка.Количество * Выборка.СуммаРег / Выборка.КоличествоРег); КонецЕсли; Движение.КоличествоДт = Выборка.Количество; Движение.КоличествоКт = Выборка.Количество; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = СкладПолучатель; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ДокументыОтправления] = Ссылка; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = СкладОтправитель; КонецЕсли; КонецЦикла; КонецПроцедуры //Форма докПрибытие &НаКлиенте Процедура Заполнить(Команда) ЗаполнитьСерв(); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // &НаСервере Процедура ЗаполнитьСерв() НачатьТранзакцию(); ДокОбъект = РеквизитФормыВЗначение("Объект"); ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.ДокументыОтправления); Запрос = Новый Запрос("ВЫБРАТЬ | УправленческийОстатки.Субконто1 КАК Номенклатура, | УправленческийОстатки.КоличествоОстатокДт КАК Количество |ИЗ | РегистрБухгалтерии.Управленческий.Остатки( | &Момент, | Счет = &Счет, | &ВидыСубконто, | Субконто2 = &Склад | И Субконто3 = &Документ) КАК УправленческийОстатки"); Запрос.УстановитьПараметр("Момент", ДокОбъект.Дата); Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.ТоварыВПути); Запрос.УстановитьПараметр("Склад", ДокОбъект.СкладПолучатель); Запрос.УстановитьПараметр("Документ", ДокОбъект.ДокументОтправки); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); ДокОбъект.СписокНоменклатуры.Загрузить(Запрос.Выполнить().Выгрузить()); ЗначениеВРеквизитФормы(ДокОбъект, "Объект"); ОтменитьТранзакцию(); КонецПроцедуры // ЗаполнитьСерв() //МодульОбДокПРибытие Процедура ОбработкаПроведения(Отказ, Режим) Блок = Новый БлокировкаДанных; ЭлБлок = Блок.Добавить("РегистрБухгалтерии.Управленческий"); ЭлБлок.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.ТоварыВПути); ЭлБлок.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Склады, СкладПолучатель); ЭлБлок.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.ДокументыОтправления, ДокументОтправки); ЭлБлок.ИсточникДанных = СписокНоменклатуры; ЭлБлок.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блок.Заблокировать(); Движения.Управленческий.Записать(); Движения.Управленческий.Записывать = Истина; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.ДокументыОтправления); Запрос = Новый Запрос("ВЫБРАТЬ | ПрибытиеСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ПрибытиеСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ Список |ИЗ | Документ.Прибытие.СписокНоменклатуры КАК ПрибытиеСписокНоменклатуры |ГДЕ | ПрибытиеСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ПрибытиеСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.Номенклатура, | Список.Количество, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СуммаРег, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КоличествоРег |ИЗ | Список КАК Список | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &Момент, | Счет = &Счет, | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Список.Номенклатура | ИЗ | Список КАК Список) | И Субконто2 = &Склад | И Субконто3 = &Документ) КАК УправленческийОстатки | ПО Список.Номенклатура = УправленческийОстатки.Субконто1"); Запрос.УстановитьПараметр("Момент", ?(Режим=РежимПроведенияДокумента.Неоперативный, МоментВремени(), Неопределено)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.ТоварыВПути); Запрос.УстановитьПараметр("Склад", СкладПолучатель); Запрос.УстановитьПараметр("Документ", ДокументОтправки); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Спишем = Мин(Выборка.Количество, Выборка.КоличествоРег); Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.ТоварыВПути; Движение.Период = Дата; Если Спишем >= Выборка.КоличествоРег Тогда Движение.Сумма = Выборка.СуммаРег; Иначе Движение.Сумма = ?(Выборка.КоличествоРег=0,0,Спишем * Выборка.СуммаРег / Выборка.КоличествоРег); КонецЕсли; Движение.КоличествоДт = Спишем; Движение.КоличествоКт = Спишем; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = СкладПолучатель; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = СкладПолучатель; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ДокументыОтправления] = ДокументОтправки; КонецЦикла; КонецПроцедуры //Создаем докРучнаяОперация, ПВХ (виды субк: Номенклатура, Склады, отправление (докОтправление)). Предопр. Документы отправления, Номенклатура,Склады. //ПС - Количественый. КолСубконто - 3 СчТовары - количественный субк: Номенклатура,Склады. счТоварыВПути - Колиественный, субк: Номенклатура,Склады,ДокументыОтправления. РБ - Сумма,Количество. //Отчет НедошедшиеТовары ВЫБРАТЬ УправленческийОстатки.Субконто2 КАК СкладПрибытия, УправленческийОстатки.Субконто1 КАК Товар, УправленческийОстатки.СуммаОстатокДт КАК Сумма, УправленческийОстатки.КоличествоОстатокДт КАК Количество ИЗ РегистрБухгалтерии.Управленческий.Остатки(, Счет = &Счет, &ВидыСубконто, ) КАК УправленческийОстатки //2.40 Необходимо организовать учет перемещений товаров. Складской учет ведется в рамках одной организации в разрезе складов. //Склады территориально удалены друг от друга. //Перемещение из одного склада на другой может идти несколько дней и осуществляется с помощью сторонних организаций. //Для выполнения подобной перевозки в организации используют услуги сторонней организации. //При выполнении одной перевозки может оказываться несколько услуг (непосредственно сама перевозка, охрана груза и т.п.). //Факт отправления регистрируется в системе с помощью документа «Отправление». //В шапке документа указывается склад - отправитель и склад – получатель. //В табличной части указывается перемещаемый товар и его количество. //Документ делает следующие проводки: Дт «Товары в пути» - Кт «Товары» в указанном количестве. //Себестоимость определяется как средняя по товару в разрезе склада. //Если на складе отправителе товар в нужном количестве отсутствует, документ не проводится. //Факт прибытия товара на склад получатель отражается документом «Прибытие». //Документ вводится только на основании документа «Отправление». //Считается, что отправляемый товар доходит до получателя в полном объеме, но дата фактического прибытия может отличаться от запланированной. //В документе «Прибытие» указывается дата фактического прибытия товара, документ отправления, контрагент, осуществивший перевозку, и сумма, которую необходимо оплатить этому контрагенту. //Документ «Прибытие» реализует следующие проводки: Дт «Товары» - Кт «Товары в пути» количество и стоимость соответствуют количеству и сумме отправленного товара; //Дт «Товары» - Кт «Поставщики» на сумму указанных услуг. Сумма распределяется пропорционально стоимости пришедших товаров. // //СоздСпр. Склады. В шапку приходной добавляем Склад. //Создаем док Отправление (рекв. СкладОтправитель, СкладПолучатель тч. СписокНоменклатуры - Номенклатура, Количество). //ДокОтправление Процедура ОбработкаПроведения(Отказ, Режим) Блок = Новый БлокировкаДанных; ЭлБлок = Блок.Добавить("РегистрБухгалтерии.Управленческий"); ЭлБлок.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлБлок.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.Склады, СкладОтправитель); ЭлБлок.ИсточникДанных = СписокНоменклатуры; ЭлБлок.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блок.Заблокировать(); Движения.Управленческий.Записать(); Движения.Управленческий.Записывать = Истина; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады); Запрос = Новый Запрос("ВЫБРАТЬ | ОтправлениеСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ОтправлениеСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ Список |ИЗ | Документ.Отправление.СписокНоменклатуры КАК ОтправлениеСписокНоменклатуры |ГДЕ | ОтправлениеСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ОтправлениеСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.Номенклатура, | Список.Количество, | ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СуммаРег, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КоличествоРег |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &Момент, | Счет = &Счет, | &ВидыСубконто, | Субконто1 В | (ВЫБРАТЬ | Список.Номенклатура | ИЗ | Список КАК Список) | И Субконто2 = &Склад) КАК УправленческийОстатки | ПО Список.Номенклатура = УправленческийОстатки.Субконто1"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Момент", ?(Режим=РежимПроведенияДокумента.Неоперативный, МоментВремени(), Неопределено)); Запрос.УстановитьПараметр("Склад", СкладОтправитель); Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.Товары); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Нехватка = Выборка.Количество - Выборка.КоличествоРег; Если Нехватка > 0 Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не достаточно товара " + Выборка.Номенклатура + " в количестве " + Нехватка; Сообщение.Сообщить(); КонецЕсли; Если Не Отказ Тогда Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.ТоварыВПути; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.Период = Дата; Если Нехватка = 0 Тогда Движение.Сумма = Выборка.СуммаРег; Иначе Движение.Сумма = ?(Выборка.КоличествоРег=0,0,Выборка.Количество * Выборка.СуммаРег / Выборка.КоличествоРег); КонецЕсли; Движение.КоличествоДт = Выборка.Количество; Движение.КоличествоКт = Выборка.Количество; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = СкладПолучатель; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ДокументыОтправки] = Ссылка; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = СкладОтправитель; КонецЕсли; КонецЦикла; КонецПроцедуры //Создаем док Прибытие (рекв. ДокументОтправки, ДатаПРибытия, Контрагент,Сумма ) Процедура ОбработкаПроведения(Отказ, Режим) Блок = Новый БлокировкаДанных; ЭлБлок = Блок.Добавить("РегистрБухгалтерии.Управленческий"); ЭлБлок.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.ТоварыВПути); ЭлБлок.УстановитьЗначение(ПланыВидовХарактеристик.ВидыСубконто.ДокументыОтправки, ДокументОтправки); ЭлБлок.Режим = РежимБлокировкиДанных.Исключительный; Блок.Заблокировать(); Движения.Управленческий.Записать(); Движения.Управленческий.Записывать = Истина; ВидыСубконто = Новый Массив; ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады); ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.ДокументыОтправки); Запрос = Новый Запрос("ВЫБРАТЬ | УправленческийОстатки.Субконто1 КАК Товар, | УправленческийОстатки.Субконто2 КАК Склад, | УправленческийОстатки.СуммаОстатокДт КАК Сумма, | УправленческийОстатки.КоличествоОстатокДт КАК Количество |ИЗ | РегистрБухгалтерии.Управленческий.Остатки(&Момент, Счет = &Счет, &ВидыСубконто, Субконто3 = &Документ) КАК УправленческийОстатки |ИТОГИ | СУММА(Сумма) |ПО | ОБЩИЕ"); Запрос.УстановитьПараметр("Момент", ?(Режим=РежимПроведенияДокумента.Неоперативный, МоментВремени(), Неопределено)); Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.ТоварыВПути); Запрос.УстановитьПараметр("Документ", ДокументОтправки); Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто); Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Выборка.Следующий(); ОбщаяСумма = Выборка.Сумма; ВыборкаДет = Выборка.Выбрать(); ОстатокСуммы = Сумма; Ном = 1; Пока ВыборкаДет.Следующий() Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.ТоварыВПути; Движение.Период = Дата; Движение.Сумма = ВыборкаДет.Сумма; Движение.КоличествоДт = ВыборкаДет.Количество; Движение.КоличествоКт = ВыборкаДет.Количество; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаДет.Товар; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = ВыборкаДет.Склад; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаДет.Товар; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = ВыборкаДет.Склад; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ДокументыОтправки] = ДокументОтправки; СуммаДоп = ?(ОбщаяСумма=0,0,Сумма * ВыборкаДет.Сумма / ОбщаяСумма); Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Покупатели; Движение.Период = Дата; Если Ном = ВыборкаДет.Количество() Тогда Движение.Сумма = ОстатокСуммы; Иначе Движение.Сумма = СуммаДоп; КонецЕсли; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаДет.Товар; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = ВыборкаДет.Склад; ОстатокСуммы = ОстатокСуммы - Движение.Сумма; Ном = Ном + 1; КонецЦикла; КонецПроцедуры Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Отправление") Тогда // Заполнение шапки ДокументОтправки = ДанныеЗаполнения.Ссылка; КонецЕсли; //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ КонецПроцедуры //Создаем док РучнаяОперация. Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Если Не ЭтоНовый() И Модифицированность() Тогда Набор = РегистрыБухгалтерии.Управленческий.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Набор.УстановитьАктивность(Не ПометкаУдаления); Набор.Записать(); КонецЕсли; КонецПроцедуры //ОтчетОстаткиТоваров ВЫБРАТЬ УправленческийОстатки.Субконто2 КАК Склад, УправленческийОстатки.Субконто1 КАК Товар, УправленческийОстатки.СуммаОстатокДт КАК Сумма, УправленческийОстатки.КоличествоОстатокДт КАК Количество, ВЫБОР КОГДА УправленческийОстатки.Субконто2 = &СкладЦентральный ТОГДА 1 ИНАЧЕ 2 КОНЕЦ КАК Порядок ИЗ РегистрБухгалтерии.Управленческий.Остатки(, Счет = &Счет, &ВидыСубконто, ) КАК УправленческийОстатки //ПВХ (ВидыСубконто: Номенклатура,Склады, Отправление). Предопр (ДокументыОтправки,Номенклатура, Склады.) РБ - Количесвтенный, Субконто - 3. СчТовары - Количесвтенный субк:Номенклатура, Склады. счТоварыВПути - Количесвтеный. субк: Номенклатура, Склады, ДокументыОтправки. РБ - Сума, Количсвто. //Рассчет суммы по строке Процедура РассчитатьСумму(СтрокаТЧ) Экспорт СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена; КонецПроцедуры &НаКлиенте Процедура СписокНоменклатурыКоличествоПриИзменении(Элемент) ОбщегоНазначения.РассчитатьСумму(Элементы.СписокНоменклатуры.ТекущиеДанные); КонецПроцедуры //При записи приходной Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма"); ЕстьОшибка = Ложь; Для Каждого СтрокаТЧ Из СписокНоменклатуры Цикл Если СтрокаТЧ.Номенклатура.ЭтоУслуга Тогда Сообщить("В строке " + СтрокаТЧ.НомерСтроки + " введена услуга. Услуги приходовать нельзя"); ЕстьОшибка = Истина; КонецЕсли; КонецЦикла; Отказ = ЕстьОшибка; КонецПроцедуры //1.1 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. //И услуги и товары указываются в одной табличной части. //Складской учет товаров не ведется. При проведении расходной накладной при нехватке товара необходимо выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //Списание себестоимости товаров должно быть организовано по партиям, в зависимости от текущего значения принятого на этот год в учетной политике метода списания себестоимости (FIFO или LIFO). //Еще раз подчеркивается – учетная политика действует год. На следующий год метод списания может смениться. // //Создаем РС УчетнаяПолитика (Рес. МетодСписания). ОстаткиНоменклатуры (Номенклатура, Партия, Количество,Себестоимость). //Продажи (Номенклатура, Количество,Стоимость,Сумма). //ДокРасходная МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания; Если не ЗначениеЗаполнено(МетодСписания) тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Заполните настройки учетной политики!"; Сообщение.Сообщить(); Отказ = Истина; Иначе Если МетодСписания = Перечисления.УчетнаяПолитика.ФИФО тогда ПорядокСортировки = ""; Иначе ПорядокСортировки = " УБЫВ"; КонецЕсли; Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Цена) КАК Цена, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | ОстаткиНоменклатурыОстатки.Партия, | ТЧДок.ВидНоменклатуры КАК ВидНоменклатуры |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная | ГДЕ | НЕ РасходнаяНакладная.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга))) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.МоментВремени"+ПорядокСортировки+" |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток), | МАКСИМУМ(ВидНоменклатуры) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени" , МоментВремени()); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Номенклатура"); Пока ВыборкаНоменклатура.Следующий() Цикл // Вставить обработку выборки ВыборкаНоменклатура Стоимость = 0; Если не ВыборкаНоменклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга тогда Если ВыборкаНоменклатура.ДокументКоличество > ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" с количеством "+ВыборкаНоменклатура.ДокументКоличество+" недостаточно. На остатке :"+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; ВыборкаПартия = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ОсталосьСписать = ВыборкаНоменклатура.ДокументКоличество; Пока ВыборкаПартия.Следующий() и ОсталосьСписать >0 Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаПартия.Номенклатура; Движение.Партия = ВыборкаПартия.Партия; Движение.Количество = Мин(ВыборкаПартия.КоличествоОстаток, ОсталосьСписать); Движение.Стоимость = ? (ВыборкаПартия.КоличествоОстаток>ОсталосьСписать , ОсталосьСписать*ВыборкаПартия.СтоимостьОстаток/ВыборкаПартия.КоличествоОстаток, ВыборкаПартия.СтоимостьОстаток); ОсталосьСписать = ОсталосьСписать - Движение.Количество; Стоимость = Стоимость + Движение.Стоимость; КонецЦикла; КонецЕсли; Движение = Движения.Продажи.Добавить(); Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Период = Дата; Движение.Количество = ВыборкаНоменклатура.ДокументКоличество; Движение.Сумма = ВыборкаНоменклатура.ДокументСумма; Движение.Стоимость = Стоимость; КонецЦикла; КонецЕсли; //ОтчетОстаткиНоменклатуры ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.Партия, ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество, ОстаткиНоменклатурыОстатки.СтоимостьОстаток КАК Стоимость ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки ОтчетПродажи ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Себестоимость, ПродажиОбороты.СуммаОборот КАК Продажа ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты //1.2 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. //И услуги и товары указываются в одной табличной части. //Складской учет товаров не ведется. //При проведении расходной накладной при нехватке товара необходимо выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //Списание себестоимости товаров должно быть организовано по партиям, в зависимости от текущего значения принятого на этот год в учетной политике метода списания себестоимости (FIFO или LIFO) и указанной в документе (в шапке документа) партии. //Еще раз подчеркивается – учетная политика действует год. //На следующий год метод списания может смениться. В первую очередь должен списываться товар из указанной в шапке партии. //В случае, если товара по выбранной партии не хватает (или нет), то товар списывается в соответствии с текущей учетной политикой. // //Добавляем в шапку расходной партию. ОстаткиНоменклатуры(Номенклатура, Партия, Количество,Стоимость). //Продажи (Номенклатура, Количество,Стоимость,Сумма) //ДокРасходная МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания; Если не ЗначениеЗаполнено(МетодСписания) тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Укажите настройки учетной политики!"; Сообщение.Сообщить(); Отказ = Истина; Иначе Если МетодСписания = Перечисления.УчетнаяПолитика.ФИФО Тогда ПорядокСортировки = " ВОЗР"; Иначе ПорядокСортировки = " УБЫВ"; КонецЕсли; Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧ |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧ.Номенклатура КАК Номенклатура, | ТЧ.Количество КАК ДокументКоличество, | ТЧ.Сумма КАК ДокументСумма, | ОстаткиНоменклатурыОстатки.Партия КАК Партия, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | ВЫБОР | КОГДА ОстаткиНоменклатурыОстатки.Партия = &ПартияИзДокумента | ТОГДА 0 | ИНАЧЕ 1 | КОНЕЦ КАК ПорядокСортировкиПартия |ИЗ | ТЧ КАК ТЧ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | ТЧ.Номенклатура | ИЗ | ТЧ КАК ТЧ | ГДЕ | ТЧ.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга))) КАК ОстаткиНоменклатурыОстатки | ПО ТЧ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ПорядокСортировкиПартия, | Партия "+ПорядокСортировки+" |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура, | Партия"; Запрос.УстановитьПараметр("МоментВремени" , МоментВремени()); Запрос.УстановитьПараметр("ПартияИзДокумента" , Партия); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл // Вставить обработку выборки ВыборкаНоменклатура Стоимость = 0; Если не ВыборкаНоменклатура.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда Если ВыборкаНоменклатура.ДокументКоличество > ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара: "+ВыборкаНоменклатура.Номенклатура+" с количеством "+ВыборкаНоменклатура.ДокументКоличество+" недостаточно. Остаток:"+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; ВыборкаПартия = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ОсталосьСписать = ВыборкаНоменклатура.ДокументКоличество; Пока ВыборкаПартия.Следующий() И ОсталосьСписать>0 Цикл // Вставить обработку выборки ВыборкаПартия Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаПартия.Номенклатура; Движение.Партия = ВыборкаПартия.Партия; Движение.Количество = Мин(ВыборкаПартия.КоличествоОстаток, ОсталосьСписать); Движение.Стоимость = ?(ВыборкаПартия.КоличествоОстаток>ОсталосьСписать, ОсталосьСписать*ВыборкаПартия.СтоимостьОстаток/ВыборкаПартия.КоличествоОстаток,ВыборкаПартия.СтоимостьОстаток); ОсталосьСписать = ОсталосьСписать - Движение.Количество; Стоимость = Стоимость+ Движение.Стоимость; КонецЦикла; КонецЕсли; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Количество = ВыборкаНоменклатура.ДокументКоличество; Движение.Сумма = ВыборкаНоменклатура.ДокументСумма; Движение.Стоимость = Стоимость; КонецЦикла; КонецЕсли; //Отчет ОстаткиНоменклатуры ВЫБРАТЬ РАЗРЕШЕННЫЕ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.Партия, ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество, ОстаткиНоменклатурыОстатки.СтоимостьОстаток КАК Стоимость ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки Отчет Продажи ВЫБРАТЬ РАЗРЕШЕННЫЕ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Себестоимость, ПродажиОбороты.СуммаОборот КАК Продажа ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты //1.3 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части. //Складской учет товаров не ведется. //При проведении расходной накладной при нехватке товара необходимо выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //В документе «Расходная накладная», а табличной части для каждого товара пользователь указывает партию, которую необходимо списать. //В том случае, если товара по указанной партии не хватает, документ не проводится и выводится соответствующее сообщение о нехватке. // //Добавляем в тч расходной партию. ОстаткиНоменклатуры(Номенклатура, Партия, Количество,Стоимость). Продажи (Номенклатура, Количество,Стоимость,Сумма). //ДокРасходная Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Партия", "Партия"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Партия КАК Партия, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ТЧ |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Партия, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Партия, | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧ.Партия, | ТЧ.Номенклатура, | ТЧ.Сумма КАК ДокументСумма, | ТЧ.Количество КАК ДокументКоличество, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток |ИЗ | ТЧ КАК ТЧ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | ТЧ.Номенклатура | ИЗ | ТЧ КАК ТЧ | ГДЕ | ТЧ.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)) | И Партия В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | ТЧ.Партия | ИЗ | ТЧ КАК ТЧ)) КАК ОстаткиНоменклатурыОстатки | ПО ТЧ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | И ТЧ.Партия = ОстаткиНоменклатурыОстатки.Партия"; Запрос.УстановитьПараметр("МоментВремени" , МоментВремени()); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Себестоимость = 0; Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Если НЕ Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда Если ВыборкаДетальныеЗаписи.ДокументКоличество >ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Для номенклатуры "+ ВыборкаДетальныеЗаписи.Номенклатура +" с количеством "+ВыборкаДетальныеЗаписи.ДокументКоличество+" недостаточно. На остатке:"+ВыборкаДетальныеЗаписи.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; Иначе Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = Номенклатура; Движение.Партия = ВыборкаДетальныеЗаписи.Партия; Движение.Количество = ВыборкаДетальныеЗаписи.ДокументКоличество; Движение.Стоимость = ВыборкаДетальныеЗаписи.ДокументКоличество * ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток; Себестоимость = Движение.Стоимость; КонецЕсли; КонецЕсли; Движение = ДВижения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = Номенклатура; Движение.Количество = ВыборкаДетальныеЗаписи.ДокументКоличество; Движение.Сумма = ВыборкаДетальныеЗаписи.ДокументСумма; Движение.Стоимость = Себестоимость; КонецЦикла; //ОтчетОстаткиНоменклатуры ВЫБРАТЬ РАЗРЕШЕННЫЕ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.Партия, ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество, ОстаткиНоменклатурыОстатки.СтоимостьОстаток КАК Стоимость ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки //ОтчетПродажи ВЫБРАТЬ РАЗРЕШЕННЫЕ МАКСИМУМ(ПродажиОбороты.Период) КАК МаксимумПериод, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.Регистратор) КАК КоличествоОтгрузок, ПродажиОбороты.Номенклатура, СУММА(ПродажиОбороты.КоличествоОборот) КАК Количество, СУММА(ПродажиОбороты.СтоимостьОборот) КАК Себестоимость, СУММА(ПродажиОбороты.СуммаОборот) КАК Продажа, МИНИМУМ(ПродажиОбороты.Период) КАК МинимумПериод ИЗ РегистрНакопления.Продажи.Обороты(, , Регистратор, ) КАК ПродажиОбороты СГРУППИРОВАТЬ ПО ПродажиОбороты.Номенклатура //1.4 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Складской учет товаров не ведется. //При проведении расходной накладной при нехватке товара необходимо выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //Списание себестоимости товаров должно быть организовано по партиям, в зависимости от текущего значения принятого на этот год в учетной политике метода списания себестоимости (FIFO или LIFO) и указанной в документе (в табличной части документа) партии. //Еще раз подчеркивается – учетная политика действует год. //На следующий год метод списания может смениться. //В первую очередь должен списываться товар из указанной в табличной части партии. //В случае если товара по выбранной партии не хватает (или нет), то товар списывается в соответствии с текущей учетной политикой. // //ОстаткиНоменклатуры (Номенкл,Партия,Кол,Стоимость), Продажи (Номенклатура,Количество,Сумма,Стоимость) //ДокРасходная Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания; Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда ПорядокСортировки = " УБЫВ"; Иначе ПорядокСортировки = ""; КонецЕсли; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.Партия |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Партия |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура, | ОстаткиНоменклатурыОстатки.Партия, | ОстаткиНоменклатурыОстатки.КоличествоОстаток, | ОстаткиНоменклатурыОстатки.СтоимостьОстаток |ПОМЕСТИТЬ ВсеОстатки |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная)) КАК ОстаткиНоменклатурыОстатки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | 1 КАК ПорядокСортировки, | ТЧДок.Номенклатура, | ТЧДок.Партия, | ВЫБОР | КОГДА ВсеОстатки.КоличествоОстаток > ТЧДок.Количество | ТОГДА ТЧДок.Количество | ИНАЧЕ ВсеОстатки.КоличествоОстаток | КОНЕЦ КАК КоличествоПоВыбраннойПартии, | ВЫБОР | КОГДА ВсеОстатки.КоличествоОстаток > ТЧДок.Количество | ТОГДА ТЧДок.Количество * ВсеОстатки.СтоимостьОстаток / ВсеОстатки.КоличествоОстаток | ИНАЧЕ ВсеОстатки.СтоимостьОстаток | КОНЕЦ КАК СтоимостьПоВыбраннойПартии |ПОМЕСТИТЬ ПартииДокумента |ИЗ | ТЧДок КАК ТЧДок | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеОстатки КАК ВсеОстатки | ПО ТЧДок.Номенклатура = ВсеОстатки.Номенклатура | И ТЧДок.Партия = ВсеОстатки.Партия | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | 2, | ТЧДок.Номенклатура, | ТЧДок.Партия, | ВЫБОР | КОГДА ВсеОстатки.КоличествоОстаток > ТЧДок.Количество | ТОГДА ВсеОстатки.КоличествоОстаток - ТЧДок.Количество | ИНАЧЕ 0 | КОНЕЦ, | ВЫБОР | КОГДА ВсеОстатки.КоличествоОстаток > ТЧДок.Количество | ТОГДА ВсеОстатки.СтоимостьОстаток - ТЧДок.Количество * ВсеОстатки.СтоимостьОстаток / ВсеОстатки.КоличествоОстаток | ИНАЧЕ 0 | КОНЕЦ |ИЗ | ТЧДок КАК ТЧДок | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеОстатки КАК ВсеОстатки | ПО ТЧДок.Номенклатура = ВсеОстатки.Номенклатура | И ТЧДок.Партия = ВсеОстатки.Партия |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | 2 КАК ПорядокСортировки, | ПартииДокумента.Номенклатура, | ПартииДокумента.Партия, | -ПартииДокумента.КоличествоПоВыбраннойПартии КАК КоличествоПоВыбраннойПартии, | -ПартииДокумента.СтоимостьПоВыбраннойПартии КАК СтоимостьПоВыбраннойПартии |ПОМЕСТИТЬ ОстальныеПартии |ИЗ | ПартииДокумента КАК ПартииДокумента | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | 2, | ВсеОстатки.Номенклатура, | ВсеОстатки.Партия, | ВсеОстатки.КоличествоОстаток, | ВсеОстатки.СтоимостьОстаток |ИЗ | ВсеОстатки КАК ВсеОстатки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстальныеПартии.ПорядокСортировки, | ОстальныеПартии.Номенклатура, | ОстальныеПартии.Партия, | СУММА(ОстальныеПартии.КоличествоПоВыбраннойПартии) КАК КоличествоПоВыбраннойПартии, | СУММА(ОстальныеПартии.СтоимостьПоВыбраннойПартии) КАК СтоимостьПоВыбраннойПартии |ПОМЕСТИТЬ ОстальныеПартииСгр |ИЗ | ОстальныеПартии КАК ОстальныеПартии | |СГРУППИРОВАТЬ ПО | ОстальныеПартии.Партия, | ОстальныеПартии.Номенклатура, | ОстальныеПартии.ПорядокСортировки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиПоПартиям.ПорядокСортировки, | ОстаткиПоПартиям.Номенклатура, | ОстаткиПоПартиям.Партия, | СУММА(ОстаткиПоПартиям.КоличествоПоВыбраннойПартии) КАК КоличествоПоВыбраннойПартии, | СУММА(ОстаткиПоПартиям.СтоимостьПоВыбраннойПартии) КАК СтоимостьПоВыбраннойПартии |ПОМЕСТИТЬ ОстаткиТоваров |ИЗ | (ВЫБРАТЬ | ПартииДокумента.ПорядокСортировки КАК ПорядокСортировки, | ПартииДокумента.Номенклатура КАК Номенклатура, | ПартииДокумента.Партия КАК Партия, | ПартииДокумента.КоличествоПоВыбраннойПартии КАК КоличествоПоВыбраннойПартии, | ПартииДокумента.СтоимостьПоВыбраннойПартии КАК СтоимостьПоВыбраннойПартии | ИЗ | ПартииДокумента КАК ПартииДокумента | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ОстальныеПартииСгр.ПорядокСортировки, | ОстальныеПартииСгр.Номенклатура, | ОстальныеПартииСгр.Партия, | ОстальныеПартииСгр.КоличествоПоВыбраннойПартии, | ОстальныеПартииСгр.СтоимостьПоВыбраннойПартии | ИЗ | ОстальныеПартииСгр КАК ОстальныеПартииСгр) КАК ОстаткиПоПартиям | |СГРУППИРОВАТЬ ПО | ОстаткиПоПартиям.Партия, | ОстаткиПоПартиям.Номенклатура, | ОстаткиПоПартиям.ПорядокСортировки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Накладная.Номенклатура КАК Номенклатура, | Накладная.Количество КАК ДокументКоличество, | Накладная.Сумма КАК ДокументСумма, | ЕСТЬNULL(ОстаткиТоваров.КоличествоПоВыбраннойПартии, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиТоваров.СтоимостьПоВыбраннойПартии, 0) КАК СтоимостьОстаток, | ОстаткиТоваров.Партия |ИЗ | (ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | СУММА(ТЧДок.Количество) КАК Количество, | СУММА(ТЧДок.Сумма) КАК Сумма | ИЗ | ТЧДок КАК ТЧДок | | СГРУППИРОВАТЬ ПО | ТЧДок.Номенклатура) КАК Накладная | ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиТоваров КАК ОстаткиТоваров | ПО Накладная.Номенклатура = ОстаткиТоваров.Номенклатура | |УПОРЯДОЧИТЬ ПО | ОстаткиТоваров.ПорядокСортировки, | ОстаткиТоваров.Партия.МоментВремени"+ПорядокСортировки+" |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("Ссылка" , Ссылка); Запрос.УстановитьПараметр("МоментВремени" , МоментВремени()); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Номенклатура"); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.ДокументКоличество >ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Недостаточно товара "+ВыборкаНоменклатура.Номенклатура+" с количеством:"+ВыборкаНоменклатура.ДокументКоличество+" на остатке: "+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; Себестоимость = 0; Выборка = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ВыборкаНоменклатура.ДокументКоличество; Пока Выборка.Следующий() и КоличествоСписать>0 цикл Если Выборка.КоличествоОстаток = 0 Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Партия = Выборка.Партия; Движение.Количество = Мин(Выборка.КоличествоОстаток, КоличествоСписать); Движение.Стоимость = ?(Выборка.КоличествоОстаток>КоличествоСписать, КоличествоСписать*Выборка.СтоимостьОстаток/Выборка.КоличествоОстаток,Выборка.СтоимостьОстаток); Себестоимость = Себестоимость + Движение.Стоимость; КоличествоСписать = КоличествоСписать- Движение.Количество; КонецЦикла; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Количество = ВыборкаНоменклатура.ДокументКоличество; Движение.Стоимость = Себестоимость; Движение.Сумма = ВыборкаНоменклатура.ДокументСумма; КонецЦикла; //ОтчетОСтаткиНоменклатуры ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.Партия, ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество, ОстаткиНоменклатурыОстатки.СтоимостьОстаток КАК Стоимость ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки ОтчетПродажи ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Себестоимость, ПродажиОбороты.СуммаОборот КАК Продажа, ПродажиОбороты.СуммаОборот - ПродажиОбороты.СтоимостьОборот КАК Прибыль ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты //1.5 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Помимо продажи товара, могут оказываться дополнительные услуги, например подоставке. //И услуги и товары указываются в одной табличной части. Складской учет товаров не ведется. //При проведении расходной накладной при нехватке товара необходимо выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //Списание себестоимости должно быть организовано по партиям, в зависимости от текущего значения принятого в учетной политике метода списания себестоимости (FIFO, по средней или LIFO). //Учетная политика может меняться каждый день, ее изменение фиксируется соответствующим документом. //Считается, что документы задним числом не вводятся, но старые документы могут неоперативно перепроводиться. // //ОстаткиНоменклатуры (Номенклатура,Партия,Количество,Стоимость),Продажи(Номенклатура,Количество,Стоимость,Сумма). //Добавляем в перечисление ПоСредней. // //ДокПриходная МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания; // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Если МетодСписания <> Перечисления.УчетнаяПолитика.ПоСредней Тогда Движение.Партия = Ссылка; КонецЕсли; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; //ДокРасходная Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания; Если МетодСписания.Пустая() Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не установлена учетная политика!!!"; Сообщение.Сообщить(); Отказ = Истина; Возврат; КонецЕсли; Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда ПорядокСортировки = " УБЫВ"; Иначе ПорядокСортировки = ""; КонецЕсли; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ТЧДок.ВидНоменклатуры КАК ВидНоменклатуры, | ОстаткиНоменклатурыОстатки.Партия, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная | ГДЕ | РасходнаяНакладная.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга))) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.МоментВремени "+ПорядокСортировки+" |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | МАКСИМУМ(ВидНоменклатуры), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени" , ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено,МоментВремени())); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Себестоимость = 0; Если ВыборкаНоменклатура.ВидНоменклатуры <> Перечисления.ВидыНоменклатуры.Услуга Тогда Если ВыборкаНоменклатура.ДокументКоличество > ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура +" с количество "+ВыборкаНоменклатура.ДокументКоличество + "недостаточно. На остатке:"+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; Иначе ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ВыборкаНоменклатура.ДокументКоличество; Пока ВыборкаДетальныеЗаписи.Следующий() и КоличествоСписать>0 Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Партия = ВыборкаДетальныеЗаписи.Партия; Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстаток,КоличествоСписать); Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстаток>КоличествоСписать,КоличествоСписать*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); Себестоимость = Себестоимость + Движение.Стоимость; КоличествоСписать = КоличествоСписать - Движение.Количество; КонецЦикла; КонецЕсли; КонецЕсли; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Количество = ВыборкаНоменклатура.ДокументКоличество; Движение.Стоимость = Себестоимость; Движение.Сумма = ВыборкаНоменклатура.ДокументСумма; КонецЦикла; //ДокИзменениеУчетнойПолитики // регистр УчетнаяПолитика Движения.УчетнаяПолитика.Записывать = Истина; Движение = Движения.УчетнаяПолитика.Добавить(); Движение.Период = Дата; Движение.МетодСписания = МетодСписания; Если МетодСписания = Перечисления.УчетнаяПолитика.ПоСредней Тогда Движения.ОстаткиНоменклатуры.Записывать=Истина; Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура, | ОстаткиНоменклатурыОстатки.Партия КАК Партия, | ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток, | ОстаткиНоменклатурыОстатки.СтоимостьОстаток КАК СтоимостьОстаток |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки(&МоментВремени, ) КАК ОстаткиНоменклатурыОстатки | |УПОРЯДОЧИТЬ ПО | Номенклатура, | Партия |ИТОГИ | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура"); Пока ВыборкаНоменклатура.Следующий() цикл Выборка = ВыборкаНоменклатура.Выбрать(); Пока Выборка.Следующий() цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Номенклатура = Выборка.Номенклатура; Движение.Период = Дата; Движение.Партия = Выборка.Партия; Движение.Количество = Выборка.КоличествоОстаток; Движение.Стоимость = Выборка.СтоимостьОстаток; КонецЦикла; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Партия = Документы.ПриходнаяНакладная.ПустаяСсылка(); Движение.Количество = ВыборкаНоменклатура.КоличествоОстаток; Движение.Стоимость = ВыборкаНоменклатура.СтоимостьОстаток; КонецЦикла; КонецЕсли; //ОтчетОстаткиНоменклатуры ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.Партия, ОстаткиНоменклатурыОстатки.КоличествоОстаток, ОстаткиНоменклатурыОстатки.СтоимостьОстаток ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки ОтчетПродажи ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Себестоимость, ПродажиОбороты.СуммаОборот КАК Продажа, ПродажиОбороты.СуммаОборот - ПродажиОбороты.СтоимостьОборот КАК Прибыль ИЗ РегистрНакопления.Продажи.Обороты(, , День, ) КАК ПродажиОбороты //1.6 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Учет товаров ведется в разрезе сроков годностей. При поступлении товара для каждого товара может быть указан свой срок годности. //Складской учет товаров не ведется. Списание себестоимости товаров должно быть организовано по партиям, в зависимости от срока годности. //В том случае, когда по разным партиям приходил товар с одинаковым сроком годности, в первую очередь необходимо списывать более дорогой (по себестоимости за одну единицу) товар. //Специфика работы организации заключается в том, что информация о поступлении товаров на склад может происходить значительно позднее самого поступления товаров, при этом документы задним числом не вводятся. //Таким образом, возможна ситуация, когда продается товар, которого в системе еще нет. //В решении должна быть реализована возможность подобной продажи товара, отсутствующего (по данным учета) на складе. //Запрет продажи товара с «отрицательными остатками» или разрешение определяется учетной политикой организации, которая может меняться только в начале года. //Документы задним числом вводить нельзя, но можно открыть существующий документ и перепровести его. // //ОстаткиНоменклатуры(Номенклатура,СрокГодности,Партия,Количество,Сумма),Продажи (Номенклатура,СрокГодности,Количество,Сумма,Стоимость). СрокГодности - Дата. Добавляем регистр сведений учетная политика ресурс РазрешеноПревышениОстатка. //ПриходнаяНакладная Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина; Движения.Продажи.Записывать = Истина; Движения.Продажи.Записать(); Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход(); Движение.Период = Дата; Движение.Номенклатура = ЭлементТЧ.Номенклатура; Движение.СрокГодности = ЭлементТЧ.СрокГодности; Движение.Количество = ЭлементТЧ.Количество; Движение.Партия = Ссылка; Движение.Стоимость = ЭлементТЧ.Сумма; КонецЦикла; Движения.ОстаткиНоменклатуры.Записать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | ПриходнаяНакладнаяСписокНоменклатуры.СрокГодности КАК СрокГодности |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры |ГДЕ | ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура, | ПриходнаяНакладнаяСписокНоменклатуры.СрокГодности | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | СрокГодности |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ТЧДок.СрокГодности КАК СрокГодности, | ВЫБОР | КОГДА ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) > ТЧДок.Количество | ТОГДА -ТЧДок.Количество | ИНАЧЕ -ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) | КОНЕЦ КАК КоличествоСписать, | ПродажиОбороты.СуммаОборот / ПродажиОбороты.КоличествоОборот КАК ЦенаПродажи, | ПродажиОбороты.СуммаОборот, | ПродажиОбороты.КоличествоОборот, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) / ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 1) КАК Себестоимость |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т) | И Партия = ЗНАЧЕНИЕ(Документ.ПриходнаяНакладная.ПустаяСсылка)) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(, &МоментВремени, , СрокГодности = ДАТАВРЕМЯ(1, 1, 1)) КАК ПродажиОбороты | ПО ТЧДок.Номенклатура = ПродажиОбороты.Номенклатура | |УПОРЯДОЧИТЬ ПО | СрокГодности, | Себестоимость |ИТОГИ | МАКСИМУМ(КоличествоСписать) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл // Вставить обработку выборки ВыборкаНоменклатура Выборка = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ВыборкаНоменклатура.КоличествоСписать; Пока Выборка.Следующий() и КоличествоСписать>0 Цикл СписываемКолич = Мин(Выборка.ДокументКоличество, КоличествоСписать); //сторнируем остатки Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Количество = -СписываемКолич; //приходуем остатки Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Партия = Ссылка; Движение.СрокГодности = Выборка.СрокГодности; Движение.Количество = СписываемКолич; Движение.Стоимость = СписываемКолич * Выборка.ДокументСумма/Выборка.ДокументКоличество; Себестоимость = Движение.Стоимость; //сторнируем продажи Движение= Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Количество = -1*СписываемКолич; Движение.Сумма = -1* СписываемКолич*Выборка.ЦенаПродажи; //приходуем продажи Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = Выборка.номенклатура; Движение.СрокГодности = Выборка.СрокГодности; Движение.Количество = СписываемКолич; Движение.Сумма = СписываемКолич*Выборка.ЦенаПродажи; Движение.Стоимость = Себестоимость; КонецЦикла; КонецЦикла; //ДокРасходная Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; РезрешеноПревышениеОстатка = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).РазрешеноПревышениОстатка; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокКол, | ТЧДок.Сумма КАК ДокСум, | ОстаткиНоменклатурыОстатки.СрокГодности КАК СрокГодности, | ОстаткиНоменклатурыОстатки.Партия, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КолОст, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОст, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) / ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 1) КАК СебестоимостьЗаЕдиницу |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т) | И Партия <> ЗНАЧЕНИЕ(Документ.ПриходнаяНакладная.ПустаяСсылка)) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | СрокГодности, | СебестоимостьЗаЕдиницу |ИТОГИ | МАКСИМУМ(ДокКол), | МАКСИМУМ(ДокСум), | СУММА(КолОст), | СУММА(СтоимостьОст) |ПО | Номенклатура, | СрокГодности"; Запрос.УстановитьПараметр("МоментВремени",?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.ДокКол > ВыборкаНоменклатура.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" недостаточно. На остатке:"+ВыборкаНоменклатура.КолОст; Сообщение.Сообщить(); Отказ = не РезрешеноПревышениеОстатка; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; ВыборкаСрокГодности = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); КоличествоСписать = ВыборкаНоменклатура.ДокКол; Пока ВыборкаСрокГодности.Следующий() Цикл ВыборкаДетальныеЗаписи = ВыборкаСрокГодности.Выбрать(); Себестоимость =0 ; СписаноКол =0; Пока ВыборкаДетальныеЗаписи.Следующий() и КоличествоСписать>0 Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Партия = ВыборкаДетальныеЗаписи.Партия; Движение.СрокГодности = ВыборкаДетальныеЗаписи.СрокГодности; Если ВыборкаДетальныеЗаписи.КолОст = 0 Или ВыборкаДетальныеЗаписи.СтоимостьОСт = 0 Тогда Движение.Количество = КоличествоСписать; Движение.Стоимость = 0; Иначе Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КолОст, КоличествоСписать); Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КолОст>КоличествоСписать, КоличествоСписать*ВыборкаДетальныеЗаписи.СтоимостьОст/ВыборкаДетальныеЗаписи.КолОст,ВыборкаДетальныеЗаписи.СтоимостьОст); КонецЕсли; КоличествоСписать = КоличествоСписать - Движение.Количество; Себестоимость = Себестоимость + Движение.Стоимость; СписаноКол = СписаноКол + Движение.Количество; КонецЦикла; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаСрокГодности.Номенклатура; Движение.СрокГодности = ВыборкаСрокГодности.СрокГодности; Движение.Количество = СписаноКол; Движение.Стоимость = Себестоимость; Движение.Сумма = СписаноКол * ВыборкаСрокГодности.ДокСум/ВыборкаСрокГодности.ДокКол; КонецЦикла; КонецЦикла; //Отчет Продажи ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.СрокГодности, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СуммаОборот КАК Продажа, ПродажиОбороты.СтоимостьОборот КАК Себестоимость ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты //ОтчетВедомостьПоПартиям ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.СрокГодности, ОстаткиНоменклатурыОстаткиИОбороты.Партия, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьПриход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьРасход ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты КАК ОстаткиНоменклатурыОстаткиИОбороты //1.7 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части. //Учет товаров ведется в разрезе складов. Поступление и продажа осуществляются с указанием склада (в шапке документа). //При проведении документа «Расходная накладная» необходимо производить только списание товара со склада. //В том случае, когда товара не хватает, документ проводиться не должен. //Расчет себестоимости списанного товара должен происходить позднее с помощью регламентной обработки «Расчет себестоимости». //Запуск этой обработки должен происходить автоматически с использованием регламентного задания, но может быть произведен и вручную по желанию пользователя. //Обработка должна автоматически определять самый первый документ, нуждающийся в расчете себестоимости, и рассчитывать себестоимость для всех остальных документов начиная с него. //Списание себестоимости должно быть организовано по партиям, в зависимости от текущего значения принятого на этот год в учетной политике метода списания себестоимости (FIFO или LIFO). //Еще раз подчеркивается – учетная политика действует год. На следующий год метод списания может смениться. //Для расчета себестоимости при списании товара необходимо учитывать только момент поступления товара в компанию, вне зависимости от того, на какой склад он пришел. //Предположим, для метода списания FIFO первое поступление портсигара произошло на склад «Основной» документом «Приходная накладная №1», а потом на склад «Транзитный» документом «Приходная накладная №2». //В этом случае при продаже товара со склада «Транзитный» в первую очередь должна быть списана себестоимость портсигара по документу «Приходная накладная №1», так как она пришла раньше. // //ОстаткиНоменклатуры(Номенклатура,Склад,Количесвто), //Продажи (Номенклатура,Количество,Сумма,Стоимость), //СтоимостьНоменклатуры (Номенклатура,Партия,Количество,Стоимость). //РегламентноеЗадание:РегламентноеЗадание(РасчитатьсебестоимостьСервер.РасчитыатьСебестоимость,) //СоздатьОбщийМодуль РасчетСебестоимостиСервер (Сервер, ВызовСервера). Добавляем в шапки накладных Склад. //Создать обработку РасчетСебестоимости (две команды). //Создать Последовательность (Основная, Использование - неПеремещать, Входящие - Расходная, ДвиженияВлияющие - ОстаткиНоменклатуры) //ФормаОбработки &НаКлиенте Процедура КомандаРассчитатьСебестоимость(Команда) РасчетСебестоимостиСервер.РасчитатьСебестоимость(); КонецПроцедуры &НаКлиенте Процедура КомандаВывестиГраницуПоследовательности(Команда) ВывестиГраницуНаСервере(); КонецПроцедуры &НаСервере Процедура ВывестиГраницуНаСервере() ТекПоследовательность = Последовательности.Основная.ПолучитьГраницу(); Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ""+ТекПоследовательность; Сообщение.Сообщить(); КонецПроцедуры //МодульМенеджераРасходной Функция РасчетСебестоимости(Ссылка) Экспорт ТекДата = Ссылка.Дата; ТекМоментВремени = Ссылка.МоментВремени(); Отказ = Ложь; МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(ТекДата).МетодСписания; Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда ПорядокСортировки = " УБЫВ"; Иначе ПорядокСортировки = ""; КонецЕсли; НачатьТранзакцию(); НаборСтоимостьНоменклатуры = РегистрыНакопления.СтоимостьНоменклатуры.СоздатьНаборЗаписей(); НаборСтоимостьНоменклатуры.Отбор.Регистратор.Установить(Ссылка); НаборСтоимостьНоменклатуры.Записать(); НаборПродажи = РегистрыНакопления.Продажи.СоздатьНаборЗаписей(); НаборПродажи.Отбор.Регистратор.Установить(Ссылка); НаборПродажи.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.СтоимостьНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = Ссылка.СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СписокНоменклатуры.Количество, | СписокНоменклатуры.Сумма, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ТЧДок.ВидНоменклатуры КАК ВидНоменклатуры, | СтоимостьНоменклатурыОстатки.Партия, | ЕСТЬNULL(СтоимостьНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(СтоимостьНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная | ГДЕ | РасходнаяНакладная.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга))) КАК СтоимостьНоменклатурыОстатки | ПО ТЧДок.Номенклатура = СтоимостьНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | СтоимостьНоменклатурыОстатки.Партия.МоментВремени"+ПорядокСортировки+" |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | МАКСИМУМ(ВидНоменклатуры), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени" , ТекМоментВремени); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Себестоимость = 0; Если ВыборкаНоменклатура.ВидНоменклатуры <> Перечисления.ВидыНоменклатуры.Услуга Тогда Если ВыборкаНоменклатура.ДокументКоличество> ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Для номенклатуры "+ВыборкаНоменклатура.Номенклатура+" с количеством "+ВыборкаНоменклатура.ДокументКоличество + " недостаточно. На остатке:"+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; Иначе КоличествоСписать = ВыборкаНоменклатура.ДокументКоличество; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() и КоличествоСписать>0 Цикл Движение = НаборСтоимостьНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = ТекДата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Партия = ВыборкаДетальныеЗаписи.Партия; Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстаток,КоличествоСписать); Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстаток>КоличествоСписать, КоличествоСписать*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); Себестоимость = Себестоимость+Движение.Стоимость; КоличествоСписать = КоличествоСписать- Движение.Количество; КонецЦикла; КонецЕсли; КонецЕсли; Движение = НаборПродажи.Добавить(); Движение.Период = ТекДата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Количество = ВыборкаНоменклатура.ДокументКоличество; Движение.Сумма = ВыборкаНоменклатура.ДокументСумма; Движение.Стоимость = Себестоимость; КонецЦикла; Если не Отказ Тогда НаборСтоимостьНоменклатуры.Записать(); НаборПродажи.Записать(); ЗафиксироватьТранзакцию(); Иначе ОтменитьТранзакцию(); КонецЕсли; Возврат Не Отказ; КонецФункции //ОбщийМодуль Процедура РасчитатьСебестоимость() Экспорт ГраницаПоследовательности = Последовательности.Основная.ПолучитьГраницу(); ПоследнийМоментВремени = Неопределено; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Основная.Регистратор, | Основная.Период, | Основная.МоментВремени |ИЗ | Последовательность.Основная КАК Основная |ГДЕ | Основная.МоментВремени >= &МоментВремени | И Основная.Регистратор.Проведен"; Запрос.УстановитьПараметр("МоментВремени", ГраницаПоследовательности); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если Документы.РасходнаяНакладная.РасчетСебестоимости(ВыборкаДетальныеЗаписи.Регистратор) Тогда ПоследнийМоментВремени = ВыборкаДетальныеЗаписи.МоментВремени; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Изменена себестоимость в документе:"+ВыборкаДетальныеЗаписи.Регистратор; Сообщение.Сообщить(); Иначе Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Последовательность прервана на документе:"+ВыборкаДетальныеЗаписи.Регистратор; Сообщение.Сообщить(); КонецЕсли; КонецЦикла; Если ПоследнийМоментВремени <>Неопределено Тогда Последовательности.Основная.УстановитьГраницу(ПоследнийМоментВремени); КонецЕсли; КонецПроцедуры //ДокПриходная // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.СтоимостьНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Если ТекСтрокаСписокНоменклатуры.Номенклатура.ВидНоменклатуры <>Перечисления.ВидыНоменклатуры.Услуга Тогда Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение = Движения.СтоимостьНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Партия = Ссылка; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЕсли; КонецЦикла; ДокРасходная Движения.СтоимостьНоменклатуры.Записывать = Истина; Движения.Продажи.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ТЧДок.ВидНоменклатуры КАК ВидНоменклатуры, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ОстаткиНоменклатурыОстатки.Склад |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная | ГДЕ | РасходнаяНакладная.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)) | И Склад = &Склад) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | Номенклатура |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | МАКСИМУМ(ВидНоменклатуры), | СУММА(КоличествоОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения=РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Склад" , Склад); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.ВидНоменклатуры <> Перечисления.ВидыНоменклатуры.Услуга Тогда Если ВыборкаНоменклатура.ДокументКоличество> ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" на складе "+Склад + " недостаточно. На остатке:"+ ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; Выборка = ВыборкаНоменклатура.Выбрать(); Пока Выборка.Следующий() цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Склад = Склад; Движение.Количество = Выборка.ДокументКоличество; КонецЦикла; КонецЕсли; КонецЦикла; ОтчетПродажи ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СуммаОборот КАК Продажа, ПродажиОбороты.СтоимостьОборот КАК Себестоимость, ПродажиОбороты.СуммаОборот - ПродажиОбороты.СтоимостьОборот КАК Прибыль ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты Отчет ОстаткиТоваров ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.Склад, ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки //1.8 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Закупка товара происходит только в отдел закупок, а непосредственно продажа происходит в торговых точках. //Перемещение товара происходит по трансфертной цене и также отражается документом «Расходная накладная», при этом цена продажи не указывается. //Товар может перемещаться только из отдела закупок в торговую точку. //Трансфертная цена определяется как себестоимость перемещаемого товара, увеличенная на процент наценки, задаваемый для каждой торговой точки. //При продаже товара необходимо в первую очередь контролировать хватает ли товара в данной торговой точке. //Если нет – необходимо программно создать документ по перемещению недостающего товара из отдела закупок. //В том случае, когда и в отделе закупок товара не хватает, документ для перемещения не создается, а продажа не производится (документ не проводится). //Себестоимость товаров рассчитывается как средняя по отделу. // //Справочник Отдел (реквизит ПроцентНаценки), //ОстаткиНоменклатуры (Номенклатура,Отдел,Количество,Стоимость). //В шапку расходной добавляем (Перемещение - Булево, Отдел.) // //ДокПриходная Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Отдел = Справочники.Отдел.ОтделЗакупок; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Если Перемещение Тогда ОбработатьСобытияПриПеремещенииТоваров(РежимПроведения, Отказ); Иначе ОбработатьСобытияПриПродажиТоваров(РежимПроведения, Отказ); КонецЕсли; КонецПроцедуры Процедура ОбработатьСобытияПриПеремещенииТоваров(РежимПроведения, Отказ) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК КолДок, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КолОст, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СумОст |ИЗ | ТЧДок КАК ТЧДок, | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.номенклатура | ИЗ | ТЧДОк КАК Т) | И Отдел = ЗНАЧЕНИЕ(Справочник.Отдел.ОтделЗакупок)) КАК ОстаткиНоменклатурыОстатки"; Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.КолДок >Выборка.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+Выборка.Номенклатура+" в отделе закупок недостаточно.На остатке:"+Выборка.КолОст; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; КоличествоСписать = Выборка.КолДок; Себестоимость = ?(Выборка.КолОст>КоличествоСписать, КоличествоСписать*Выборка.СумОст/Выборка.КолОст, выборка.СумОст); Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Отдел = Справочники.Отдел.ОтделЗакупок; Движение.Количество = КоличествоСписать; Движение.Стоимость = Себестоимость; Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Отдел = Отдел; Движение.Количество = КоличествоСписать; Движение.Стоимость = Себестоимость*Отдел.ПроцентНаценки/100; КонецЦикла; КонецПроцедуры Процедура ОбработатьСобытияПриПродажиТоваров(РежимПроведения, Отказ) НачатьТранзакцию(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Отдел КАК Отдел |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Отдел | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Отдел |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура, | ОстаткиНоменклатурыОстатки.Отдел, | ОстаткиНоменклатурыОстатки.КоличествоОстаток, | ОстаткиНоменклатурыОстатки.СтоимостьОстаток |ПОМЕСТИТЬ Остатки |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, Отдел) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Отдел | ИЗ | ТЧДок КАК Т)) КАК ОстаткиНоменклатурыОстатки | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура, | ОстаткиНоменклатурыОстатки.Отдел, | ОстаткиНоменклатурыОстатки.КоличествоОстаток, | ОстаткиНоменклатурыОстатки.СтоимостьОстаток |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, Отдел) В | (ВЫБРАТЬ | Т.Номенклатура, | ЗНАЧЕНИЕ(Справочник.Отдел.ОтделЗакупок) | ИЗ | ТЧДок КАК Т)) КАК ОстаткиНоменклатурыОстатки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Остатки.Номенклатура КАК Номенклатура, | Остатки.Отдел КАК Отдел, | СУММА(Остатки.КоличествоОстаток) КАК КоличествоОстаток, | СУММА(Остатки.СтоимостьОстаток) КАК СтоимостьОстаток |ПОМЕСТИТЬ ОстаткиСгр |ИЗ | Остатки КАК Остатки | |СГРУППИРОВАТЬ ПО | Остатки.Отдел, | Остатки.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Отдел |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК КолДок, | ТЧДок.Сумма КАК Сумма, | ОстаткиСгр.Отдел КАК Отдел, | ЕСТЬNULL(ОстаткиСгр.КоличествоОстаток, 0) КАК КолОст, | ЕСТЬNULL(ОстаткиСгр.СтоимостьОстаток, 0) КАК СумОст, | ВЫБОР | КОГДА ОстаткиСгр.Отдел = ЗНАЧЕНИЕ(Справочник.Отдел.ОтделЗакупок) | ТОГДА 2 | ИНАЧЕ 1 | КОНЕЦ КАК ПорядокСортировки |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиСгр КАК ОстаткиСгр | ПО ТЧДок.Номенклатура = ОстаткиСгр.Номенклатура | |УПОРЯДОЧИТЬ ПО | ПорядокСортировки |ИТОГИ | МАКСИМУМ(КолДок), | МАКСИМУМ(Сумма), | СУММА(КолОст), | СУММА(СумОст) |ПО | Номенклатура, | Отдел"; Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); ТаблицаЗнч = Новый ТаблицаЗначений; ТаблицаЗнч.Колонки.Добавить("Отдел"); ТаблицаЗнч.Колонки.Добавить("Номенклатура"); ТаблицаЗнч.Колонки.Добавить("Количество"); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.КолДок >ВыборкаНоменклатура.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" недостаточно.На остатке:"+ВыборкаНоменклатура.КолОСт; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; ВыборкаОтдел = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); КоличествоСписать = ВыборкаНоменклатура.КолДок; Пока ВыборкаОтдел.Следующий() и КоличествоСписать>0 Цикл НеобходимоСписать = МИН(ВыборкаОтдел.КолОст, КоличествоСписать); Себестоимость = ?(ВыборкаОтдел.КолОст >НеобходимоСписать, НеобходимоСписать*ВыборкаОтдел.СумОСт/ВыборкаОтдел.КолОст, ВыборкаОтдел.СумОст); Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаОтдел.Номенклатура; Движение.Отдел = Отдел; Движение.Количество = НеобходимоСписать; Движение.Стоимость = Себестоимость*?(ВыборкаОтдел.ПорядокСортировки = 2,Отдел.ПроцентНаценки/100,1); КоличествоСписать = КоличествоСписать-НеобходимоСписать; Если ВыборкаОтдел.ПорядокСортировки = 2 Тогда НоваяСтрока = ТаблицаЗнч.Добавить(); НоваяСтрока.Номенклатура = ВыборкаОтдел.Номенклатура; НоваяСтрока.Количество = НеобходимоСписать; КонецЕсли; КонецЦикла; КонецЦикла; Если ТаблицаЗнч.Количество() >0 Тогда ДокументОбъект = Документы.РасходнаяНакладная.СоздатьДокумент(); ДокументОбъект.Дата = Дата-1; ДокументОбъект.Перемещение = Истина; ДокументОбъект.Отдел = Отдел; Для каждого СтрокаТЧ из ТаблицаЗнч цикл новаяСтрока = ДокументОбъект.СписокНоменклатуры.Добавить(); НоваяСтрока.Номенклатура = СтрокаТЧ.Номенклатура; НоваяСтрока.Количество = СтрокаТЧ.Количество; КонецЦикла; Попытка ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ОписаниеОшибки(); Сообщение.Сообщить(); Отказ = Истина; КонецПопытки; КонецЕсли; Если Отказ Тогда ОтменитьТранзакцию(); Иначе ЗафиксироватьТранзакцию(); КонецЕсли; КонецПроцедуры //Отчет ДвиженияТоваров ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура КАК Товар, ОстаткиНоменклатурыОстаткиИОбороты.Отдел, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьПриход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьРасход ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты КАК ОстаткиНоменклатурыОстаткиИОбороты //1.9 Компания занимается оптовой торговлей. Взаиморасчеты с покупателями ведутся в разрезе проектов. //Поступление денежных средств от покупателя отражается документом «Приход денег», отгрузка товаров документом «Расходная накладная». //И в документе «Приход денег» и в документе «Расходная накладная» может быть указан только один проект (проект в реквизите шапки). //В том случае, когда в документе «Приход денег» указан проект, необходимо проверить сумму отгрузок по этому проекту. //Если была отгрузка, то происходит погашение задолженности. Если сумма платежа превышает сумму отгрузки, то оставшиеся деньги должны быть зачтены как аванс. //Аванс числится просто за контрагентом, без учета проекта. //Если проект в документе «Приход денег» не указан, то погашаются задолженности по проектам в порядке их даты оплаты (дата оплаты указывается в проекте). //В случае, когда сумма платежа больше всех долгов по отгрузке, оставшаяся сумма также зачитывается как аванс. //При проведении документа «Расходная накладная» необходимо производить проверку авансов. В том случае, если аванс есть, необходимо его погасить. //Оставшаяся сумма должна быть учтена как долг по проекту по отгрузке. Учет остатков номенклатуры не ведется. // //Справочники Контрагенты, Проект(реквизит ДатаОплаты). ВзаиморасчетыСПокупателями (Контрагент,Проект,Сумма). // //ДокРасходная Движения.ВзаиморасчетыСПокупателями.Записывать = Истина; Движения.ВзаиморасчетыСПокупателями.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСПокупателями"); ЭлементБлокировки.УстановитьЗначение("Контрагент" , Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | ВзаиморасчетыСПокупателямиОстатки.Контрагент, | ВзаиморасчетыСПокупателямиОстатки.Проект, | ВзаиморасчетыСПокупателямиОстатки.СуммаОстаток |ИЗ | РегистрНакопления.ВзаиморасчетыСПокупателями.Остатки( | &МоментВремени, | Контрагент = &Контрагент | И Проект = ЗНАЧЕНИЕ(Справочник.проекты.Аванс)) КАК ВзаиморасчетыСПокупателямиОстатки |ГДЕ | ВзаиморасчетыСПокупателямиОстатки.СуммаОстаток > 0"; Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); ДенегСписать = СуммаПоДокументу; Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Движение = Движения.ВзаиморасчетыСПокупателями.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = ВыборкаДетальныеЗаписи.Контрагент; Движение.Проект = Справочники.Проекты.Аванс; Движение.Сумма = Мин(ДенегСписать, ВыборкаДетальныеЗаписи.СуммаОстаток); ДенегСписать = ДенегСписать-Движение.Сумма; КонецЦикла; Если ДенегСписать>0 Тогда Движение = Движения.ВзаиморасчетыСПокупателями.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Проект = Проект; Движение.Сумма = ДенегСписать; КонецЕсли; //ДокПриходДенег Движения.ВзаиморасчетыСПокупателями.Записывать = Истина; Движения.ВзаиморасчетыСПокупателями.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСПокупателями"); ЭлементБлокировки.УстановитьЗначение("Контрагент" , Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | ВзаиморасчетыСПокупателямиОстатки.Контрагент, | ВзаиморасчетыСПокупателямиОстатки.Проект, | ВзаиморасчетыСПокупателямиОстатки.СуммаОстаток |ИЗ | РегистрНакопления.ВзаиморасчетыСПокупателями.Остатки( | &МоментВремени, | Контрагент = &Контрагент | "+?(ЗначениеЗаполнено(Проект),"И Проект = &Проект","")+") КАК ВзаиморасчетыСПокупателямиОстатки | //УпорядочитьПо_"; Запрос.Текст = СтрЗаменить(Запрос.Текст,"//УпорядочитьПо_","УПОРЯДОЧИТЬ ПО ВзаиморасчетыСПокупателямиОстатки.Проект.ДатаОплаты"); Запрос.УстановитьПараметр("Контрагент" , Контрагент); Запрос.УстановитьПараметр("МоментВремени" , МоментВремени()); Запрос.УстановитьПараметр("Проект" , Проект); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); ДенегСписать = СуммаПоДокументу; Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Движение = Движения.ВзаиморасчетыСПокупателями.ДобавитьПриход(); Движение.Период = Дата; Движение.Контрагент = ВыборкаДетальныеЗаписи.Контрагент; Движение.Проект = ВыборкаДетальныеЗаписи.Проект; Движение.Сумма = Мин(-ВыборкаДетальныеЗаписи.СуммаОстаток , ДенегСписать); ДенегСписать = ДенегСписать -Движение.Сумма; КонецЦикла; Если ДенегСписать>0 Тогда Движение = Движения.ВзаиморасчетыСПокупателями.ДобавитьПриход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Проект = Справочники.Проекты.Аванс; Движение.Сумма = ДенегСписать; КонецЕсли; //Отчет СостояниеВзаиморасчетов ВЫБРАТЬ ВзаиморасчетыСПокупателямиОстатки.Контрагент, ВзаиморасчетыСПокупателямиОстатки.Проект, ВзаиморасчетыСПокупателямиОстатки.СуммаОстаток КАК Сумма ИЗ РегистрНакопления.ВзаиморасчетыСПокупателями.Остатки КАК ВзаиморасчетыСПокупателямиОстатки Отчет ВзаиморасчетыЗаПериод ВЫБРАТЬ ВзаиморасчетыСПокупателямиОстаткиИОбороты.Контрагент, ВзаиморасчетыСПокупателямиОстаткиИОбороты.Проект, ВзаиморасчетыСПокупателямиОстаткиИОбороты.СуммаНачальныйОстаток КАК НачальныйОстаток, ВзаиморасчетыСПокупателямиОстаткиИОбороты.СуммаКонечныйОстаток КАК КонечныйОстаток, ВзаиморасчетыСПокупателямиОстаткиИОбороты.СуммаОборот, ВзаиморасчетыСПокупателямиОстаткиИОбороты.СуммаПриход КАК Оплата, ВзаиморасчетыСПокупателямиОстаткиИОбороты.СуммаРасход КАК Отгрузка ИЗ РегистрНакопления.ВзаиморасчетыСПокупателями.ОстаткиИОбороты КАК ВзаиморасчетыСПокупателямиОстаткиИОбороты //1.10 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Продажа происходит с учетом единиц измерения, т.е. для каждой номенклатурной позиции может быть произвольное количество единиц измерения, например: штука; пачка из 10 штук; контейнер из 500 штук и т.д. //Если в накладной будет указана продажа 3-х пачек, то должны быть списаны 30 штук. //Кроме того, в расходной накладной могут также быть указаны услуги (например, доставка). //И товары и услуги необходимо указывать в одной табличной части. Учет товаров ведется в разрезе складов. //В документах по поступлению и продаже товаров указан только один склад (склад – реквизит шапки). //При продаже себестоимость товара рассчитывается как средняя по всей компании в целом, и проверяется остаток на складе, с которого производится отгрузка. //Например, если купили 1 рулон утеплителя за 1000 рублей и оприходовали его на первый склад, а второй такой же рулон утеплителя купили за 2000 рублей, но оприходовали на второй склад, то при продаже себестоимость этого утеплителя будет рассчитана как средняя, т.е. составит (1000+2000)/2 = 1500 рублей, и продать возможно не более одного рулона с каждого склада. // //Справочники (Производитель,Склады,единицыИзмерения - рекв.коэффициент 15,2). //ПВХ Производитель. РС ДополнительныеХарактеристики Изм Объект (Номенкл), Рес. Свойство (ПВХ СвойстваОбъектов), //Рекв.Значение (Характеристика). ОстаткиНоменклатуры (Номенклатура,Склад,Количество), //СтоимостьНоменклатуры (Номенклатура,Количество,Стоимость.) //ДокРасходная Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.СтоимостьНоменклатуры.Записывать = Истина; Движения.СтоимостьНоменклатуры.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.УстановитьЗначение("Склад", Склад); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.СтоимостьНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество * РасходнаяНакладнаяСписокНоменклатуры.ЕдиницаИзмерения.Коэффициент) КАК ДокументКоличество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК ДокументСумма, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.ДокументКоличество, | ТЧДок.ДокументСумма, | ТЧДок.ВидНоменклатуры, | ЕСТЬNULL(СтоимостьНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(СтоимостьНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстатокСклад, | ОстаткиНоменклатурыОстатки.Склад |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная | ГДЕ | РасходнаяНакладная.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)) | И Склад = &Склад) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная | ГДЕ | РасходнаяНакладная.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга))) КАК СтоимостьНоменклатурыОстатки | ПО ТЧДок.Номенклатура = СтоимостьНоменклатурыОстатки.Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Склад" , Склад); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если ВыборкаДетальныеЗаписи.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга тогда Продолжить; КонецЕсли; Если ВыборкаДетальныеЗаписи.ДокументКоличество> ВыборкаДетальныеЗаписи.КоличествоОстатокСклад Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаДетальныеЗаписи.Номенклатура+" с количеством "+ВыборкаДетальныеЗаписи.ДокументКоличество+" недостаточно. На остатке:"+ВыборкаДетальныеЗаписи.КоличествоОстатокСклад; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Склад = ВыборкаДетальныеЗаписи.Склад; Движение.Количество = ВыборкаДетальныеЗаписи.ДокументКоличество; Движение = Движения.СтоимостьНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Количество = ВыборкаДетальныеЗаписи.ДокументКоличество; Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстаток>ВыборкаДетальныеЗаписи.ДокументКоличество,ВыборкаДетальныеЗаписи.ДокументКоличество*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); КонецЦикла; //Отчет ВедомостьПоСкладу ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.Склад, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоОборот, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход, ВЫБОР КОГДА ЕСТЬNULL(СтоимостьНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, 0) <> 0 ТОГДА ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток * ЕСТЬNULL(СтоимостьНоменклатурыОстаткиИОбороты.СтоимостьНачальныйОстаток, 0) / ЕСТЬNULL(СтоимостьНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, 0) ИНАЧЕ 0 КОНЕЦ КАК СтоимостьНачальныйОстаток, ВЫБОР КОГДА ЕСТЬNULL(СтоимостьНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток, 0) <> 0 ТОГДА ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток * ЕСТЬNULL(СтоимостьНоменклатурыОстаткиИОбороты.СтоимостьКонечныйОстаток, 0) / ЕСТЬNULL(СтоимостьНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток, 0) ИНАЧЕ 0 КОНЕЦ КАК СтоимостьКонечныйОстаток, ВЫБОР КОГДА ЕСТЬNULL(СтоимостьНоменклатурыОстаткиИОбороты.КоличествоПриход, 0) <> 0 ТОГДА ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход * ЕСТЬNULL(СтоимостьНоменклатурыОстаткиИОбороты.СтоимостьПриход, 0) / ЕСТЬNULL(СтоимостьНоменклатурыОстаткиИОбороты.КоличествоПриход, 0) ИНАЧЕ 0 КОНЕЦ КАК СтоимостьПриход, ВЫБОР КОГДА ЕСТЬNULL(СтоимостьНоменклатурыОстаткиИОбороты.КоличествоРасход, 0) <> 0 ТОГДА ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход * ЕСТЬNULL(СтоимостьНоменклатурыОстаткиИОбороты.СтоимостьРасход, 0) / ЕСТЬNULL(СтоимостьНоменклатурыОстаткиИОбороты.КоличествоРасход, 0) ИНАЧЕ 0 КОНЕЦ КАК СтоимостьРасход, ДополнительныеХарактеристики.Значение ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(, , , , {(Склад = &Склад)}) КАК ОстаткиНоменклатурыОстаткиИОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьНоменклатуры.ОстаткиИОбороты КАК СтоимостьНоменклатурыОстаткиИОбороты ПО ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура = СтоимостьНоменклатурыОстаткиИОбороты.Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеХарактеристики КАК ДополнительныеХарактеристики ПО ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура = ДополнительныеХарактеристики.Объект {ХАРАКТЕРИСТИКИ ТИП(Справочник.Номенклатура) ВИДЫХАРАКТЕРИСТИК ПланВидовХарактеристик.СвойстваОбъектов ПОЛЕКЛЮЧА Ссылка ПОЛЕИМЕНИ Наименование ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения ЗНАЧЕНИЯХАРАКТЕРИСТИК РегистрСведений.ДополнительныеХарактеристики ПОЛЕОБЪЕКТА Объект ПОЛЕВИДА Свойство ПОЛЕЗНАЧЕНИЯ Значение } //1.11 Организация занимается продажей экзотических товаров. //Принята следующая схема работы: в момент оформления заказа на товар (документ «Заказ покупателя») происходит его (товара) резервирование, причем реально этого товара в это время может и не быть. //Непосредственно отгрузка товара по заказу со склада и снятие резерва оформляется документом «Расходная накладная». //Следует учесть, что отгрузка товаров по одному заказу может производиться с разных складов, но в документе «Расходная накладная» склад может быть только один. //Необходимо предоставить пользователю возможность указать в заказе количество резервируемого товара. //При этом следует контролировать количество резерва, чтобы оно не превышало количество заказанного товара. //В момент проведения «Расходной накладной» производится проверка наличия свободного товара (товар на всех складах минус резерв по всем остальным заказам). //В том случае, если свободного товара достаточно для отгрузки, и на выбранном складе есть необходимое количество, то документ проводится, в противном случае выдается сообщение о недостаче свободного товара или товара на складе, и документ не проводится. //Отгрузка может происходить только на основании заказа, накладная, не относящаяся ни к одному заказу, не может быть введена. //Предполагается, что заказ будет отгружен полностью. Себестоимость товара рассчитывается как средняя по складу. //Например: //Если на складе есть 10 штук авторских ручек и выписан заказ на 7 ручек, то по этому заказу можно отгрузить товар, поскольку есть свободное количество и на складе товара хватает. //Если те же 10 ручек находятся на разных складах – 8 и 2, то тогда с первого склада товар отгрузить можно, а со второго нет. //Если 10 ручек находятся на одном складе, но заказов выписано 2, на 7 и 8 штук. //В этом случае свободного товара недостаточно и отгрузить его нельзя. // //Док ЗаказПокупателя ТЧ Номенклатура,Количество,РезервКоличество. //ОстаткиНоменклатуры (Номенклатура,Склад,Количество,Стоимость). РН ТоварыВРезерве (Номенклатура, ДокументРезерва,Количество). // //ДокПриходная Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; //ДокРасходная Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.ТоварыВРезерве.Записывать = Истина; Движения.ТоварыВРезерве.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.УстановитьЗначение("Склад", Склад); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыВРезерве"); ЭлементБлокировки.УстановитьЗначение("ДокументРезерва", ЗаказПокупателя); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ЕСТЬNULL(ОстаткиНоменклатурыВсе.КоличествоОстаток, 0) КАК КоличествоОстатокОбщ, | ОстаткиНоменклатурыСклад.Склад, | ЕСТЬNULL(ОстаткиНоменклатурыСклад.КоличествоОстаток, 0) КАК КоличествоОстатокСклад, | ЕСТЬNULL(ОстаткиНоменклатурыСклад.СтоимостьОстаток, 0) КАК СтоимостьОстатокСклад, | ЕСТЬNULL(ТоварыВРезервеВсе.КоличествоОстаток, 0) КАК КоличествоРезервВсе, | ЕСТЬNULL(ТоварыВРезервеСвои.КоличествоОстаток, 0) КАК КоличествоРезервСвои |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная)) КАК ОстаткиНоменклатурыВсе | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыВсе.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная) | И Склад = &Склад) КАК ОстаткиНоменклатурыСклад | ПО (ТЧДок.Номенклатура = ОстаткиНоменклатурыВсе.Номенклатура) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезерве.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная) | И ДокументРезерва <> &ДокументРезерв) КАК ТоварыВРезервеВсе | ПО ТЧДок.Номенклатура = ТоварыВРезервеВсе.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезерве.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная) | И ДокументРезерва = &ДокументРезерв) КАК ТоварыВРезервеСвои | ПО ТЧДок.Номенклатура = ТоварыВРезервеСвои.Номенклатура"; Запрос.УстановитьПараметр("ДокументРезерв", ЗаказПокупателя); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Склад", Склад); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл СвободныйТовар = ВыборкаДетальныеЗаписи.КоличествоОстатокОбщ-ВыборкаДетальныеЗаписи.КоличествоРезервВсе; Если ВыборкаДетальныеЗаписи.ДокументКоличество > СвободныйТовар Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Свободного товара "+ВыборкаДетальныеЗаписи.Номенклатура+" недостаточно. На остатке:"+СвободныйТовар; Сообщение.Сообщить(); Отказ = Истина; ИначеЕсли ВыборкаДетальныеЗаписи.ДокументКоличество > ВыборкаДетальныеЗаписи.КоличествоОстатокСклад Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "товара "+ВыборкаДетальныеЗаписи.Номенклатура+"на складе недостаточно. На остатке:"+ВыборкаДетальныеЗаписи.КоличествоОстатокСклад; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Количество = ВыборкаДетальныеЗаписи.ДокументКоличество; Движение.Период = Дата; Движение.Склад = ВыборкаДетальныеЗаписи.Склад; Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстатокСклад>ВыборкаДетальныеЗаписи.ДокументКоличество, ВыборкаДетальныеЗаписи.ДокументКоличество*ВыборкаДетальныеЗаписи.СтоимостьОстатокСклад/ВыборкаДетальныеЗаписи.КоличествоОстатокСклад,ВыборкаДетальныеЗаписи.СтоимостьОстатокСклад); Если ВыборкаДетальныеЗаписи.КоличествоРезервСвои <>0 Тогда Движение = Движения.ТоварыВРезерве.ДобавитьРасход(); Движение.ДокументРезерва = ЗаказПокупателя; Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоРезервСвои, ВыборкаДетальныеЗаписи.ДокументКоличество); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; КонецЕсли; КонецЦикла; //ДокЗаказПокупателя // регистр ТоварыВРезерве Приход Движения.ТоварыВРезерве.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Если ТекСтрокаСписокНоменклатуры.РезервКоличество> ТекСтрокаСписокНоменклатуры.Количество Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Для товара "+ТекСтрокаСписокНоменклатуры.Номенклатура+" количество резерва > количества"; Сообщение.Сообщить(); ОТказ = Истина; Продолжить; КонецЕсли; Движение = Движения.ТоварыВРезерве.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.ДокументРезерва = Ссылка; Движение.Количество = ТекСтрокаСписокНоменклатуры.РезервКоличество; КонецЦикла; //ОтчетОстаткиТоваров ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.Склад, ОстаткиНоменклатурыОстатки.КоличествоОстаток, 1 КАК Порядок ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ТоварыВРезервеОстатки.Номенклатура, "Резерв", ТоварыВРезервеОстатки.КоличествоОстаток, 2 ИЗ РегистрНакопления.ТоварыВРезерве.Остатки КАК ТоварыВРезервеОстатки //1.12 Компания занимается оптовой торговлей. Принята следующая схема работы: поступление товаров отражается документом «Приходная накладная». //По предварительной договоренности с покупателем менеджер может оформить резерв (документ «Резервирование товара»), причем наличие товара в этот момент не важно, товар может отсутствовать. //Непосредственно отгрузка товараbпокупателю отражается документом «Расходная накладная», при этом происходитvснятие резерва. //Учет товаров ведется в разрезе складов. В документах «Приходная накладная» и Расходная накладная» склад только один (склад – реквизит шапки). //При проведении расходной накладной необходимо проверить наличие товара на складе и «свободного» (будет описано далее) товара. //В том случае, когда товара недостаточно, документ не проводится и выводится соответствующее сообщение об ошибке. //У каждого менеджера есть приоритет, чем больше приоритет, тем более ответственный менеджер и тем важнее его продажи. //Таким образом, если два менеджера одновременно зарезервировали один и тот же товара, то менеджер с большим приоритетом может продать товар, зарезервированный менеджером с меньшим приоритетом. //Менеджер с низким приоритетом продать чужой резерв не имеет права. //Таким образом, «свободный» товар менеджера определяется как товар на всех складах минус резерв всех остальных менеджеров с приоритетом большим либо таким же, как и у текущего менеджера. //Приоритет устанавливается для каждого менеджера индивидуально и может меняться не чаще чем 1 раз в месяц. //При продаже необходимо использовать приоритет менеджера, актуальный на дату продажи. //Себестоимость товара рассчитывается как средняя по складу. // //Создаем Док РезервированиеТовара(рекв.Менеджер - СпрСсылка Менеджеры, ТЧ Номенклатура, Количество). //РС ПриоритетыМенеджеров (Изм Менеджер, Рес. Приоритет). ОстаткиНоменклатуры (Номенклатура, Склад, Количество, Стоимость). //ТоварыВРезерве (Номенклатура, Менеджер, Количество). //ДокРасходная Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.ТоварыВРезерве.Записывать = Истина; Движения.ТоварыВРезерве.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.УстановитьЗначение("Склад", Склад); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыВРезерве"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПриоритетыМенеджеровДок.Менеджер КАК Менеджер, | ПриоритетыМенеджеровВсех.Приоритет КАК Приоритет |ПОМЕСТИТЬ ПриоритетыМенеджеров |ИЗ | РегистрСведений.ПриоритетыМенеджеров.СрезПоследних(&Дата, Менеджер = &Менеджер) КАК ПриоритетыМенеджеровДок | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПриоритетыМенеджеров.СрезПоследних(&Дата, Менеджер <> &Менеджер) КАК ПриоритетыМенеджеровВсех | ПО ПриоритетыМенеджеровДок.Приоритет >= ПриоритетыМенеджеровВсех.Приоритет | |ИНДЕКСИРОВАТЬ ПО | Менеджер, | Приоритет |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ЕСТЬNULL(ОстаткиНоменклатурыВсе.КоличествоОстаток, 0) КАК КоличествоОстатокВесь, | ОстаткиНоменклатурыСклад.Склад КАК Склад, | ЕСТЬNULL(ОстаткиНоменклатурыСклад.КоличествоОстаток, 0) КАК КоличествоОстатокСклад, | ЕСТЬNULL(ОстаткиНоменклатурыСклад.СтоимостьОстаток, 0) КАК СтоимостьОстатокСклад, | ЕСТЬNULL(ТоварыВРезервеВсе.КоличествоОстаток, 0) КАК КоличествоОстатокРезерВесь, | ЕСТЬNULL(ТоварыВРезервеОстатки.КоличествоОстаток, 0) КАК КоличествоОстатокРезервСвой, | ТЧДок.Номенклатура.Представление |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РаходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РаходнаяНакладная)) КАК ОстаткиНоменклатурыВсе | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыВсе.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезерве.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная) | И Менеджер В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | ТЧПриоритеты.Менеджер | ИЗ | ПриоритетыМенеджеров КАК ТЧПриоритеты)) КАК ТоварыВРезервеВсе | ПО ТЧДок.Номенклатура = ТоварыВРезервеВсе.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РаходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РаходнаяНакладная) | И Склад = &Склад) КАК ОстаткиНоменклатурыСклад | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыСклад.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезерве.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | РаходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РаходнаяНакладная) | И Менеджер = &Менеджер) КАК ТоварыВРезервеОстатки | ПО ТЧДок.Номенклатура = ТоварыВРезервеОстатки.Номенклатура"; Запрос.УстановитьПараметр("Дата", Дата); Запрос.УстановитьПараметр("Менеджер", Менеджер); Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения=РежимПроведенияДокумента.Неоперативный,МоментВремени(),Неопределено)); Запрос.УстановитьПараметр("Склад", Склад); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл СвободныйОстаток = ВыборкаДетальныеЗаписи.КоличествоОстатокВесь-ВыборкаДетальныеЗаписи.КоличествоОстатокРезерВесь; КоличествоПоДокументу = ВыборкаДетальныеЗаписи.ДокументКоличество; Если КоличествоПоДокументу >ВыборкаДетальныеЗаписи.КоличествоОстатокСклад тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаДетальныеЗаписи.НоменклатураПредставление +" на складе "+ВыборкаДетальныеЗаписи.Склад +" в количестве "+КоличествоПоДокументу+" недостаточно. На остатке :"+ВыборкаДетальныеЗаписи.КоличествоОстатокСклад; Сообщение.Сообщить(); Отказ = Истина; ИначеЕсли КоличествоПоДокументу>СвободныйОстаток Тогда Сообщение = новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаДетальныеЗаписи.НоменклатураПредставление +" в количестве "+КоличествоПоДокументу +" недостаточно на свободном остатке. На остатке :"+СвободныйОстаток; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Склад = ВыборкаДетальныеЗаписи.Склад; Движение.Количество = КоличествоПоДокументу; Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстатокСклад> КоличествоПоДокументу, КоличествоПоДокументу*ВыборкаДетальныеЗаписи.СтоимостьОстатокСклад/ВыборкаДетальныеЗаписи.КоличествоОстатокСклад,ВыборкаДетальныеЗаписи.СтоимостьОстатокСклад); Движение.Период = Дата; Если ВыборкаДетальныеЗаписи.КоличествоОстатокРезервСвой>0 тогда Движение = Движения.ТоварыВРезерве.ДобавитьРасход(); Движение.Период = Дата; Движение.Менеджер = ВыборкаДетальныеЗаписи.Менеджер; Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстатокРезервСвой, КоличествоПоДокументу); КонецЕсли; КонецЦикла; //ДокРезервированиеТовара Движения.ТоварыВРезерве.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ТоварыВРезерве.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Менеджер = Менеджер; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; //Отчет ОстаткиТоваров ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.Склад, ОстаткиНоменклатурыОстатки.КоличествоОстаток ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ТоварыВРезервеОстатки.Номенклатура, "Резерв", ТоварыВРезервеОстатки.КоличествоОстаток ИЗ РегистрНакопления.ТоварыВРезерве.Остатки КАК ТоварыВРезервеОстатки Отчет РезервыТоваров ВЫБРАТЬ ТоварыВРезервеОстатки.Номенклатура, ТоварыВРезервеОстатки.Менеджер КАК Менеджер, ТоварыВРезервеОстатки.КоличествоОстаток, ПриоритетыМенеджеровСрезПоследних.Приоритет КАК Приоритет ИЗ РегистрНакопления.ТоварыВРезерве.Остатки КАК ТоварыВРезервеОстатки ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПриоритетыМенеджеров.СрезПоследних(&Период, ) КАК ПриоритетыМенеджеровСрезПоследних ПО ТоварыВРезервеОстатки.Менеджер = ПриоритетыМенеджеровСрезПоследних.Менеджер ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, "Остаток", ОстаткиНоменклатурыОстатки.КоличествоОстаток, 99999 ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки УПОРЯДОЧИТЬ ПО Приоритет, Менеджер //1.13 Компания занимается оптовой торговлей складских стеллажей и их комплектующих. //Закупка комплектующих отражается документом «Приходная накладная», продажа - «Расходная накладная». //Каждый стеллаж представляет собой некоторый фиксированный набор комплектующих (например, 4 стойки, 5 полок и 20 болтов). //Необходимо обеспечить уникальность деталей, т.е. одна и та же деталь не может относиться к разным стеллажам. //Учет остатков ведется в разрезе складов. В документах «Приходная накладная» и «Расходная накладная» склад только один (склад – реквизит шапки). //Возможна продажа как отдельных комплектующих, так и целых стеллажей, причем и стеллажи и их комплектующие указываются в одной табличной части. //В случае продажи стеллажа осуществляется списание со склада соответствующего количества комплектующих. //В том случае, если каких-либо комплектующих на складе не хватает, документ проводится не должен. //Учет себестоимости деталей вести не требуется. Создать отчет, который в разрезе складов Создаем РС Комплектующие (Изм Стеллаж, Деталь Рес. Количество). // //ОстаткиНоменклатуры (Номенклатура, Склад, Количество). Справочник Склады. Добавляем Склад в шапки накладых. //ДокРасходная Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения=РежимПроведенияДокумента.Оперативный,Неопределено, новый Граница(МоментВремени(),ВидГраницы.Включая))); Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Склад, | ЕСТЬNULL(Комплектующие.Деталь, ТЧДок.Номенклатура) КАК Номенклатура, | ВЫБОР | КОГДА ЕСТЬNULL(Комплектующие.Количество, 0) = 0 | ТОГДА ТЧДок.Количество | ИНАЧЕ ТЧДок.Количество * ЕСТЬNULL(Комплектующие.Количество, 0) | КОНЕЦ КАК Количество |ПОМЕСТИТЬ ТЧКомплектующие |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Комплектующие КАК Комплектующие | ПО ТЧДок.Номенклатура = Комплектующие.Стеллаж |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧКомплектующие.Склад, | ТЧКомплектующие.Номенклатура, | ТЧКомплектующие.Количество |ИЗ | ТЧКомплектующие КАК ТЧКомплектующие"; Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); ЗаполнитьЗначенияСвойств(Движение, ВыборкаДетальныеЗаписи); Движение.Период = Дата; КонецЦикла; Движения.Записать(); Запрос.Текст = "ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура, | ОстаткиНоменклатурыОстатки.Склад, | ОстаткиНоменклатурыОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, Склад) В | (ВЫБРАТЬ | РасходнаяНакладная.Номенклатура, | РасходнаяНакладная.Склад | ИЗ | ТЧКомплектующие КАК РасходнаяНакладная)) КАК ОстаткиНоменклатурыОстатки |ГДЕ | ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Недостаточно товара "+выборка.Номенклатура +" на складе "+Выборка.Склад; Сообщение.Сообщить(); Отказ = Истина; КонецЦикла; //ФормаСпискаНоменклатуры &НаКлиенте Процедура СписокПриАктивизацииСтроки(Элемент) Если Элементы.Список.ТекущаяСтрока <> Неопределено тогда СписокКомплектующих.Параметры.УстановитьЗначениеПараметра("Стеллаж",Элементы.Список.ТекущаяСтрока); КонецЕсли; КонецПроцедуры //ОтчетНаличиеДеталейНаДату ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.Склад, ОстаткиНоменклатурыОстатки.КоличествоОстаток, Комплектующие.Стеллаж ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Комплектующие КАК Комплектующие ПО ОстаткиНоменклатурыОстатки.Номенклатура = Комплектующие.Деталь ОтчетНаличиеСтеллажейНаДату ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Склад, Комплектующие.Стеллаж, МИНИМУМ(ВЫБОР КОГДА Комплектующие.Количество ЕСТЬ NULL ТОГДА ОстаткиНоменклатурыОстатки.КоличествоОстаток ИНАЧЕ ОстаткиНоменклатурыОстатки.КоличествоОстаток / Комплектующие.Количество КОНЕЦ) КАК Количество ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Комплектующие КАК Комплектующие ПО ОстаткиНоменклатурыОстатки.Номенклатура = Комплектующие.Деталь СГРУППИРОВАТЬ ПО ОстаткиНоменклатурыОстатки.Склад, Комплектующие.Стеллаж //1.14 Товар на складе размещается в ячейках. //При поступлении на склад каждый товар помещается в отдельную ячейку, которая однозначно определяется своим рядом и стеллажом. //При продаже товара определяется способ отгрузки: сразу или с доставкой. //Если товар отгружается сразу, то чтобы быстрее осуществить продажу в первую очередь должен отпускаться ближайший товар. //Если же производится доставка товара, то тогда должен списываться товар, до которого неудобнее всего добираться. //Критерием удобства отгрузки (расстояние) служит сумма номера ряда и номера стеллажа. //После проведения расходной накладной должна формироваться печатная форма, в которой будет указано, из каких ячеек должен быть получен товар. // //Создаем спр.Ячейки(рекв.Ряд (число), Стеллаж(Число)). //ОстаткиНоменклатуры (Изм. Номенклатура,Ячейка, Рес.Количество). //Перечисление СпособОтгрузки (Сразу, СДоставкой). Приходная реквизит ТЧ Ячейка. Расходная Реквизит шапки Способ Отгрузки. //ДокРасходная Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Ячейка", "Ячейка"); Блокировка.Заблокировать(); Если СпособОтгрузки = Перечисления.СпособОтгрузки.СДоставкой тогда ПорядокСортировки = " УБЫВ"; Иначе ПорядокСортировки = ""; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ОстаткиНоменклатурыОстатки.Ячейка, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.Ячейка.Ряд, 0) + ЕСТЬNULL(ОстаткиНоменклатурыОстатки.Ячейка.Стеллаж, 0) КАК ПорядокСортировки |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная)) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ПорядокСортировки"+ПорядокСортировки+" |ИТОГИ | МАКСИМУМ(ДокументКоличество), | СУММА(КоличествоОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.ДокументКоличество >ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" с количеством "+ВыборкаНоменклатура.ДокументКоличество+" недостаточно" ; Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); ОсталосьСписать = ВыборкаНоменклатура.ДокументКоличество; Пока ВыборкаДетальныеЗаписи.Следующий() и ОсталосьСписать>0 Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Ячейка = ВыборкаДетальныеЗаписи.Ячейка; Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстаток, ОсталосьСписать); ОсталосьСписать = ОсталосьСписать- Движение.Количество; КонецЦикла; КонецЦикла; //В Расходной Команда ПечатьНакладная &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) Если НЕ ПараметрыВыполненияКоманды.Источник.Объект.Проведен тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Распечатать документ можно только после проведения"; Сообщение.Сообщить(); Возврат; КонецЕсли; ТабличныйДокумент = новый ТабличныйДокумент; ПечатьСервер(ТабличныйДокумент,ПараметрКоманды[0]); ТабличныйДокумент.Показать(); КонецПроцедуры Функция ПечатьСервер(ТабличныйДокумент, СсылкаДок) Документы.РасходнаяНакладная.ПечатьНакладная(ТабличныйДокумент,СсылкаДок); КонецФункции //В модуле менеджера расходной Функция ПечатьНакладная(ТабДокумент, Ссылка) Экспорт Макет = ПолучитьМакет("Накладная"); ОбластьМакета = Макет.ПолучитьОбласть("Заголовок"); ОбластьМакета.Параметры.Номер = Ссылка.Номер; ОбластьМакета.Параметры.Дата = Формат(Ссылка.Дата,"ДФ=dd.MM.yyyy"); ТабДокумент.Вывести(ОбластьМакета); ОбластьМакета = Макет.ПолучитьОбласть("Шапка"); ТабДокумент.Вывести(ОбластьМакета); Запрос = новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Цена) КАК Цена |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиНоменклатурыОбороты.Номенклатура КАК Номенклатура, | ОстаткиНоменклатурыОбороты.Ячейка, | ОстаткиНоменклатурыОбороты.КоличествоРасход |ПОМЕСТИТЬ ОборотыПоНоменклатуре |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Обороты( | &Дата, | &Дата, | Регистратор, | Номенклатура В | (ВЫБРАТЬ | ТЧ.Номенклатура | ИЗ | ТЧДок КАК ТЧ)) КАК ОстаткиНоменклатурыОбороты |ГДЕ | ОстаткиНоменклатурыОбороты.Регистратор = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ТЧДок.Цена КАК ДокументЦена, | ОборотыПоНоменклатуре.Ячейка КАК Ячейка, | ЕСТЬNULL(ОборотыПоНоменклатуре.КоличествоРасход, 0) КАК КоличествоРегл |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ОборотыПоНоменклатуре КАК ОборотыПоНоменклатуре | ПО ТЧДок.Номенклатура = ОборотыПоНоменклатуре.Номенклатура |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | МАКСИМУМ(ДокументЦена), | СУММА(КоличествоРегл) |ПО | Номенклатура"; Запрос.УстановитьПараметр("Ссылка" , Ссылка); Запрос.УстановитьПараметр("Дата" , Ссылка.Дата); Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Номенклатура"); Пока Выборка.Следующий() цикл ОбластьМакета = Макет.ПолучитьОбласть("Товар"); ОбластьМакета.Параметры.Заполнить(Выборка); ТабДокумент.Вывести(ОбластьМакета); ВыборкаДетальныеЗаписи = выборка.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() цикл ОбластьМакета = Макет.ПолучитьОбласть("Ячейка"); ОбластьМакета.Параметры.Стеллаж = "Ст.№"+ВыборкаДетальныеЗаписи.Ячейка.Стеллаж; ОбластьМакета.Параметры.Ячейка = "Яч. "+ВыборкаДетальныеЗаписи.Ячейка.Стеллаж+"/"+ВыборкаДетальныеЗаписи.Ячейка.Ряд; Количество = ВыборкаДетальныеЗаписи.КоличествоРегл; Цена = ?(ВыборкаДетальныеЗаписи.ДокументКоличество =0,0,ВыборкаДетальныеЗаписи.ДокументСумма/ВыборкаДетальныеЗаписи.ДокументКоличество); Стоимость = Количество*Цена; ОбластьМакета.Параметры.Количество = Количество; ОбластьМакета.Параметры.Цена = Цена; ОбластьМакета.Параметры.Сумма = Стоимость; ТабДокумент.Вывести(ОбластьМакета); КонецЦикла; КонецЦикла; ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет; ТабДокумент.АвтоМасштаб = Истина; КонецФункции //1.15 Организация занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Продажа происходит с учетом единиц измерения, т.е. для каждой номенклатурной позиции может быть произвольное количество единиц измерения, например: штука; пачка из 10 штук; контейнер из 500 штук и т.д. //Если в накладной будет указана продажа 3-х пачек, то должны быть списаны 30 штук. //Учет товаров ведется в разрезе складов. В документах по поступлению и продаже товаров указан только один склад (склад – реквизит шапки). //Товар может передаваться со склада на склад документом «Расходная накладная». //В этом случае в качестве покупателя указывается склад получатель и колонки «цена» и «сумма» должны становиться невидимыми. //Перемещение по складам происходит без изменения стоимости товара. //Себестоимость товара рассчитывается как средняя по складу. //После продажи на следующий день (или позднее) в систему вводится дополнительная информация о сумме затрат на доставку товаров, которая определяется следующим образом: в документе «Распределение затрат» указывается сумма доставки и перечень накладных, на которые эта сумма должна распределиться. //Далее сумма распределяется на товары из этих накладных, пропорционально списанной их (товаров) себестоимости. // //Создаем Справочники Склады, ЕдиницыИзмерения (Рекв.Коэфициент), //Контрагенты.ОстаткиНоменклатуры(Номенклатура,Склад,Количество,Стоимость). //Продажи (Номенклатура, Накладная (Расходная), Количество,Сумма,Себестоимость). //В шапке приходной реквизит склад. В шапке Расходной, реквизит Склад, ПеремещениеТовара (булево), //Получатель (Составной тип: Склад,Контрагент). В ТЧ единица измерения. Док РаспределениеЗатрат Рекв СуммаДоставки, ТЧ СписокНакладных, рекв. Накладная. //В модуле формы расходной &НаКлиенте Процедура ПеремещениеТовараПриИзменении(Элемент) УстановитьВидимостьЭлементовТЧ(); КонецПроцедуры &НаКлиенте Процедура УстановитьВидимостьЭлементовТЧ() ЭтаФорма.Элементы.СписокНоменклатуры.ПодчиненныеЭлементы.СписокНоменклатурыЦена.Видимость = НЕ Объект.ПеремещениеТовара; ЭтаФорма.Элементы.СписокНоменклатуры.ПодчиненныеЭлементы.СписокНоменклатурыСумма.Видимость = НЕ Объект.ПеремещениеТовара; КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) УстановитьВидимостьЭлементовТЧ(); КонецПроцедуры &НаКлиенте Процедура ПолеПолучательНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) Если Объект.ПеремещениеТовара Тогда Элемент.ОграничениеТипа = Новый ОписаниеТипов("СправочникСсылка.Склады"); Иначе Элемент.ОграничениеТипа = Новый ОписаниеТипов("СправочникСсылка.Контрагенты"); КонецЕсли; Элемент.ВыбиратьТип = Ложь; КонецПроцедуры //ДокРасходная Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.УстановитьЗначение("Склад", Склад); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество * РасходнаяНакладнаяСписокНоменклатуры.ЕдиницаИзмерения.Коэффициент) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Склад, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, Склад) В | (ВЫБРАТЬ | РасходнаяНакладная.Номенклатура, | РасходнаяНакладная.Склад | ИЗ | ТЧДок КАК РасходнаяНакладная)) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.ДокументКоличество > ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" на остатке в количестве "+ВыборкаНоменклатура.ДокументКоличество+" недостаточно"; Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; Себестоимость = 0; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ВыборкаНоменклатура.ДокументКоличество; Пока ВыборкаДетальныеЗаписи.Следующий() и КоличествоСписать>0 Цикл Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстаток, КоличествоСписать); Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстаток>КоличествоСписать, КоличествоСписать*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Период = Дата; Движение.Склад = Склад; Движение.Количество = Количество; Движение.Стоимость = Стоимость; Себестоимость = Себестоимость + Движение.Стоимость; КоличествоСписать = КоличествоСписать - Движение.Количество; Если ПеремещениеТовара Тогда Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход(); Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Период = Дата; Движение.Склад = Получатель; Движение.Количество = Количество; Движение.Стоимость = Стоимость; КонецЕсли; КонецЦикла; Если не ПеремещениеТовара Тогда Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Накладная = Ссылка; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Количество = ВыборкаНоменклатура.ДокументКоличество; Движение.Сумма =ВыборкаНоменклатура.ДокументСумма; Движение.Себестоимость = Себестоимость; КонецЕсли; КонецЦикла; //Док РаспределениеЗатрат Движения.Продажи.Записывать = Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Продажи"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНакладных; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Накладная", "Накладная"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНакладных.Накладная КАК Накладная |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РаспределениеЗатрат.СписокНакладных КАК СписокНакладных |ГДЕ | СписокНакладных.Ссылка = &Ссылка | И НЕ СписокНакладных.Накладная.ПеремещениеТовара | |СГРУППИРОВАТЬ ПО | СписокНакладных.Накладная | |ИНДЕКСИРОВАТЬ ПО | Накладная |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.СебестоимостьОборот КАК Себестоимость, | ПродажиОбороты.Накладная |ИЗ | РегистрНакопления.Продажи.Обороты( | , | , | , | Накладная В | (ВЫБРАТЬ | РаспрЗатрат.Накладная | ИЗ | ТЧДок КАК РаспрЗатрат)) КАК ПродажиОбороты |ИТОГИ | СУММА(Себестоимость) |ПО | ОБЩИЕ"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ВыборкаОбщийИтог.Следующий(); // Общий итог НеобходимоРаспределитьСумма = СуммаДоставки; ОбщаяСтоимость = ВыборкаОбщийИтог.Себестоимость; Если ОбщаяСтоимость = 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Нет базы распределения"; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если не Отказ Тогда ВыборкаДетальныеЗаписи = ВыборкаОбщийИтог.Выбрать(); Счетчик = 1; Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Накладная = ВыборкаДетальныеЗаписи.Накладная; Движение.Себестоимость = ?(Счетчик =ВыборкаДетальныеЗаписи.Количество(), НеобходимоРаспределитьСумма, НеобходимоРаспределитьСумма*ВыборкаДетальныеЗаписи.Себестоимость/ОбщаяСтоимость ); Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Счетчик = Счетчик+1; НеобходимоРаспределитьСумма = НеобходимоРаспределитьСумма-Движение.Себестоимость; КонецЦикла; Если НеобходимоРаспределитьСумма<>0 и ВыборкаДетальныеЗаписи.Количество() <>0 тогда Движение.Себестоимость = Движение.Себестоимость+НеобходимоРаспределитьСумма; КонецЕсли; КонецЕсли; // //Отчет Продажи ВЫБРАТЬ ПродажиОбороты.Номенклатура КАК Номенклатура, ПродажиОбороты.Накладная КАК Накладная, СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот, СУММА(ПродажиОбороты.СуммаОборот) КАК СуммаОборот, СУММА(ПродажиОбороты.СебестоимостьОборот) КАК СебестоимостьОборот ПОМЕСТИТЬ ОборотыЗаПериод ИЗ РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, ) КАК ПродажиОбороты ГДЕ ПродажиОбороты.Регистратор ССЫЛКА Документ.РасходнаяНакладная СГРУППИРОВАТЬ ПО ПродажиОбороты.Номенклатура, ПродажиОбороты.Накладная ИНДЕКСИРОВАТЬ ПО Номенклатура, Накладная ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.Накладная, СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот, СУММА(ПродажиОбороты.СуммаОборот) КАК СуммаОборот, СУММА(ПродажиОбороты.СебестоимостьОборот) КАК СебестоимостьОборот ПОМЕСТИТЬ СебестоимостьРаспределение ИЗ РегистрНакопления.Продажи.Обороты( , , Регистратор, (Накладная, Номенклатура) В (ВЫБРАТЬ Продажи.Накладная, Продажи.Номенклатура ИЗ ОборотыЗаПериод КАК Продажи)) КАК ПродажиОбороты ГДЕ ПродажиОбороты.Регистратор ССЫЛКА Документ.РаспределениеЗатрат СГРУППИРОВАТЬ ПО ПродажиОбороты.Номенклатура, ПродажиОбороты.Накладная ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ОборотыЗаПериод.Номенклатура, ОборотыЗаПериод.Накладная, ОборотыЗаПериод.КоличествоОборот КАК Количество, ОборотыЗаПериод.СуммаОборот КАК Продажа, ОборотыЗаПериод.СебестоимостьОборот + ЕСТЬNULL(СебестоимостьРаспределение.СебестоимостьОборот, 0) КАК Себестоимость, ОборотыЗаПериод.СуммаОборот - (ОборотыЗаПериод.СебестоимостьОборот + ЕСТЬNULL(СебестоимостьРаспределение.СебестоимостьОборот, 0)) КАК Прибыль ИЗ ОборотыЗаПериод КАК ОборотыЗаПериод ЛЕВОЕ СОЕДИНЕНИЕ СебестоимостьРаспределение КАК СебестоимостьРаспределение ПО ОборотыЗаПериод.Номенклатура = СебестоимостьРаспределение.Номенклатура И ОборотыЗаПериод.Накладная = СебестоимостьРаспределение.Накладная //1.16 Компания занимается оптовой торговлей складских стеллажей и их комплектующих. //При этом каждый стеллаж представляет собой некоторый фиксированный набор комплектующих (например, 4 стойки, 5 полок и 20 болтов). //Считается, что для каждого стеллажа детали стандартные, т.е. одна и та же деталь может относиться к разным стеллажам. //Закупка комплектующих отражается документом «Приходная накладная», продажа - «Расходная накладная». //Учет остатков ведется в разрезе складов. //В документах «Приходная накладная» и «Расходная накладная» склад только один (склад – реквизит шапки). //Продажи оформляются документом «Расходная накладная», в которой приводится полный перечень отпускаемых комплектующих. //Себестоимость номенклатуры рассчитывается как средняя по складу. //Каждую неделю в систему вводится документ «План продаж», в котором указывается предполагаемое количество стеллажей и их комплектующих, которые планируется продать. //Стеллажи и их комплектующие указываются в одной табличной части. //При проведении этого документа происходит проверка наличия нужного количества комплектующих и, если их не хватает, должен программно сформироваться документ «План закупок», в котором должны быть указаны недостающие комплектующие и их количество. //В том случае, если «План закупок» на эту неделю уже существует и отличается от предполагаемого, то он должен быть удален (помечен на удаление) и сформирован новый документ. // //Создаем Спр.Склады. Приходная добавляем в шапку Склад. //Расходная, добавляем в шапку склад. //Создаем док. ПланПродаж (тч СписокНоменклатуры: Номенклатура, Количество). //Аналогичный ДокПланЗакупок. РС КомплектующиеСтеллажей (Изм Стеллаж, Комплектующее, Рес. Количество). //РС ПланЗакупок (Рег.ПланЗакупок, В пределах дня. Изм. Номенкл. Ресурс Количество.) //ДокРасходная Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиТоваров"); ЭлементБлокировки.УстановитьЗначение("Склад", Склад); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.Ссылка.Склад КАК Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Ссылка.Склад | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ТЧДок.Склад, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, Склад) В | (ВЫБРАТЬ | РасходнаяНакладная.Номенклатура, | РасходнаяНакладная.Склад | ИЗ | ТЧДок КАК РасходнаяНакладная)) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения=РежимПроведенияДокумента.Оперативный,Неопределено,МоментВремени())); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл КоличествоСписать = ВыборкаДетальныеЗаписи.ДокументКоличество; Если КоличествоСписать > ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаДетальныеЗаписи.Номенклатура+" на складе "+Склад+" недостаточно. На остатке:"+ВыборкаДетальныеЗаписи.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Склад = ВыборкаДетальныеЗаписи.Склад; Движение.Период = Дата; Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстаток, КоличествоСписать); Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстаток>КоличествоСписать, КоличествоСписать*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); КонецЦикла; //ДокПланПродаж Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПланПродаж.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СУММА(ВЫБОР | КОГДА КомлектующиеСтелажей.Стеллаж ЕСТЬ NULL | ТОГДА ТЧДок.Количество | ИНАЧЕ ТЧДок.Количество * ЕСТЬNULL(КомлектующиеСтелажей.Количество, 0) | КОНЕЦ) КАК Количество, | ЕСТЬNULL(КомлектующиеСтелажей.Комплектующее, ТЧДок.Номенклатура) КАК Номенклатура |ПОМЕСТИТЬ ТаблицаДокСтеллаж |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КомлектующиеСтелажей КАК КомлектующиеСтелажей | ПО ТЧДок.Номенклатура = КомлектующиеСтелажей.Стеллаж | |СГРУППИРОВАТЬ ПО | ЕСТЬNULL(КомлектующиеСтелажей.Комплектующее, ТЧДок.Номенклатура) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТаблицаДокСтеллаж.Количество, | ТаблицаДокСтеллаж.Номенклатура |ИЗ | ТаблицаДокСтеллаж КАК ТаблицаДокСтеллаж"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = Результат; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос.Текст = "ВЫБРАТЬ | ТаблицаДокСтеллаж.Номенклатура КАК Номенклатура, | ВЫБОР | КОГДА ТаблицаДокСтеллаж.Количество - ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) > 0 | ТОГДА ТаблицаДокСтеллаж.Количество - ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) | ИНАЧЕ 0 | КОНЕЦ КАК Количество |ПОМЕСТИТЬ Закупить |ИЗ | ТаблицаДокСтеллаж КАК ТаблицаДокСтеллаж | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.НОменклатура | ИЗ | ТаблицаДокСтеллаж КАК Т)) КАК ОстаткиНоменклатурыОстатки | ПО ТаблицаДокСтеллаж.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПланЗакупокСрезПоследних.Регистратор, | ПланЗакупокСрезПоследних.Номенклатура КАК Номенклатура, | ПланЗакупокСрезПоследних.Количество |ПОМЕСТИТЬ Закуплено |ИЗ | РегистрСведений.ПланЗакупок.СрезПоследних( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТаблицаДокСтеллаж КАК Т)) КАК ПланЗакупокСрезПоследних | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВложенныйЗапрос.Номенклатура, | ВложенныйЗапрос.Количество |ИЗ | (ВЫБРАТЬ | ВложенныйЗапрос.Номенклатура КАК Номенклатура, | СУММА(ВложенныйЗапрос.Количество) КАК Количество | ИЗ | (ВЫБРАТЬ | Закупить.Номенклатура КАК Номенклатура, | Закупить.Количество КАК Количество | ИЗ | Закупить КАК Закупить | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | Закуплено.Номенклатура, | -Закуплено.Количество | ИЗ | Закуплено КАК Закуплено) КАК ВложенныйЗапрос | | СГРУППИРОВАТЬ ПО | ВложенныйЗапрос.Номенклатура) КАК ВложенныйЗапрос |ГДЕ | ВложенныйЗапрос.Количество <> 0 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Закуплено.Регистратор, | Закуплено.Номенклатура, | Закуплено.Количество |ИЗ | Закуплено КАК Закуплено |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Закупить.Номенклатура, | Закупить.Количество |ИЗ | Закупить КАК Закупить"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Результат = Запрос.ВыполнитьПакет(); Если НЕ Результат[2].Пустой() Тогда ВыборкаДокументы = Результат[3].Выбрать(); Пока ВыборкаДокументы.Следующий() цикл ДокументОбъект = ВыборкаДокументы.Регистратор.ПолучитьОбъект(); ДокументОбъект.УстановитьПометкуУдаления(Истина); КонецЦикла; ТЧДок = Результат[4].Выгрузить(); НовыйДокумент = Документы.ПланЗакупок.СоздатьДокумент(); НовыйДокумент.Дата = НачалоНедели(Дата); НовыйДокумент.СписокНоменклатуры.Загрузить(ТЧДок); Попытка НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение); Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Созданы документы!"; Сообщение.Сообщить(); Исключение КонецПопытки; Иначе Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не нужно создавать документы"; Сообщение.Сообщить(); КонецЕсли; //ДокПланЗакупок Процедура ОбработкаПроведения(Отказ, РежимПроведения) // регистр ПланЗакупок Движения.ПланЗакупок.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ПланЗакупок.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; КонецПроцедуры Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Дата = НачалоНедели(Дата); КонецПроцедуры //1.17 Компания занимается оптовой торговлей складских стеллажей и их комплектующих. //При этом каждый стеллаж представляет собой некоторый фиксированный набор комплектующих (например, 4 стойки, 5 полок и 20 болтов). //Считается, что для каждого стеллажа детали стандартные, т.е. одна и та же деталь может относиться к разным стеллажам. //Закупка комплектующих отражается документом «Приходная накладная», продажа - «Расходная накладная». //Учет остатков ведется в разрезе складов. В документах «Приходная накладная» и «Расходная накладная» склад только один (склад – реквизит шапки). //Продажи оформляются документом «Расходная накладная», в которой приводится полный перечень отпускаемых комплектующих. //Себестоимость номенклатуры рассчитывается как средняя по складу. //Каждую неделю в систему вводится документ «План продаж», в котором указывается предполагаемое количество стеллажей и их комплектующих, которые планируется продать. //Стеллажи и их комплектующие указываются в одной табличной части. //При проведении этого документа происходит проверка наличия нужного количества комплектующих и, если их не хватает, в системе должна отразиться информация о плане закупок, в котором должны быть указаны недостающие комплектующие и их количество. //В том случае, если план закупок на эту неделю уже существует, то он должен быть скорректирован до актуального. //Можно считать, что документ «План продаж» задним числом не вводится, но существующий документ может быть перепроведен. //Создаем Спр.Склады.В ТЧ приходной и расходной добавляем Склад. Создаем Док. ПланПродаж. //ТЧ СписокНоменклатуры (Номенклатура, Количество). Создаем РС Стеллажи (Изм. Стеллаж, Деталь. Рес. Кол). //ОстаткиНоменклатуры (Номенклатура, Склад, Количество,Стоимость). //РН ПланЗакупок (Обороты Рег.ПланПродаж Изм. Номенклатура, Рес. Количество) //ДокРасходная Движения.ОстаткиНоменклатуры.Записывать = Истина; Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.УстановитьЗначение("Склад", Склад); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная) | И Склад = &Склад) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Склад" , Склад); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл НеобходимоСписатьКоличество = ВыборкаДетальныеЗаписи.ДокументКоличество; Если НеобходимоСписатьКоличество> ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаДетальныеЗаписи.Номенклатура+" на складе "+Склад+" недостаточно."; Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Склад = Склад; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстаток, НеобходимоСписатьКоличество); Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстаток>НеобходимоСписатьКоличество, НеобходимоСписатьКоличество*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток, ВыборкаДетальныеЗаписи.СтоимостьОстаток); КонецЦикла; //ДокПланПродаж Движения.ПланЗакупок.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПланПродаж.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЕСТЬNULL(Стеллажи.Делать, ТЧДок.Номенклатура) КАК Номенклатура, | ВЫБОР | КОГДА Стеллажи.Делать ЕСТЬ NULL | ТОГДА ТЧДок.Количество | ИНАЧЕ ТЧДок.Количество * ЕСТЬNULL(Стеллажи.Количество, 0) | КОНЕЦ КАК Количество |ПОМЕСТИТЬ ОБщаяТаблица |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Стеллажи КАК Стеллажи | ПО ТЧДок.Номенклатура = Стеллажи.Стеллаж |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОБщаяТаблица.Номенклатура, | ВЫБОР | КОГДА ОБщаяТаблица.Количество - ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) > 0 | ТОГДА ОБщаяТаблица.Количество - ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) | ИНАЧЕ 0 | КОНЕЦ КАК Количество |ИЗ | ОБщаяТаблица КАК ОБщаяТаблица | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | СписокНом.Номенклатура | ИЗ | ОбщаяТаблица КАК СписокНом)) КАК ОстаткиНоменклатурыОстатки | ПО ОБщаяТаблица.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения=РежимПроведенияДокумента.Оперативный,НЕопределено,МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Движение = Движения.ПланЗакупок.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Количество = ВыборкаДетальныеЗаписи.Количество; КонецЦикла; //ОтчетСостояниеТоваров ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.Склад, ОстаткиНоменклатурыОстатки.КоличествоОстаток, 1 КАК ПорядокСортировки ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки(&ДатаПериод, ) КАК ОстаткиНоменклатурыОстатки ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПланЗакупокОбороты.Номенклатура, "План закупок", ПланЗакупокОбороты.КоличествоОборот, 2 ИЗ РегистрНакопления.ПланЗакупок.Обороты(НАЧАЛОПЕРИОДА(&ДатаПериод, НЕДЕЛЯ), КОНЕЦПЕРИОДА(&ДатаПериод, НЕДЕЛЯ), , ) КАК ПланЗакупокОбороты УПОРЯДОЧИТЬ ПО ПорядокСортировки //1.18 Компания занимается оптовой торговлей. //Отгрузка товара осуществляется по предоплате. Оплата оформляется документом «Приход денег», а отпуск товара документом «Расходная накладная». //Для постоянных покупателей может быть предоставлен кредит на некоторый срок. //Срок и размер кредита определяется для каждого контрагента индивидуально. //В том случае, если сумма накладной меньше суммы предоставленного ему кредита, то может быть произведена отгрузка товаров без поступления денег. //Далее, пока не превышен размер кредита, могут быть оформлены еще накладные, но только пока самая первая неоплаченная накладная не будет просрочена больше, чем на срок кредита. //Например, если покупателю предоставлен кредит на 1000 и 5 дней, то взаимоотношения с ним выглядят следующим образом: никаких задолженностей нет, 1-го числа происходит отгрузка на сумму 600 и 2-го числа оплата на сумму 100, тогда 3-го числа можно произвести еще отгрузку, но на сумму не более 500, пока не превышена сумма кредита. //8-го числа отгрузок не может быть, поскольку превышен срок кредита. //При поступлении денег гасятся задолженности по накладным, начиная с самой первой недоплаченной накладной, а остаток денежных средств засчитывается как предоплата. // //Создаем Спр. Контрагенты (рекв. СрокКредита (Число), //РазмерКредита (Число)). В шапку расходной добавляем Контрагент. //Создаем Док. Приход денег. Реквизиты: Контрагент, Сумма. В остаткиНоменклатуры не пишем. //РН ВзаиморасчетыСКонтрагентами (Остатки, Изм. Контрагент, Накладаня, Рес. Сумма, Регистраторы: Расходная, ПриходДенег) //ДокРасходная Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина; Движения.ВзаиморасчетыСКонтрагентами.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСКонтрагентами"); ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СУММА(ВложенныйЗапрос.Предоплата) КАК Предоплата, | СУММА(ВложенныйЗапрос.Долг) КАК Долг, | СУММА(ВложенныйЗапрос.СрокЗадолженности) КАК СрокЗадолженности |ИЗ | (ВЫБРАТЬ | Предоплаты.СуммаОстаток КАК Предоплата, | 0 КАК Долг, | 0 КАК СрокЗадолженности | ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки( | &МоментВремени, | Контрагент = &Контрагент | И Накладная = ЗНАЧЕНИЕ(Документ.РасходнаяНакладная.ПустаяСсылка)) КАК Предоплаты | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | 0, | ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток, | РАЗНОСТЬДАТ(ВзаиморасчетыСКонтрагентамиОстатки.Накладная.Дата, &Дата, ДЕНЬ) | ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки( | &МоментВремени, | Контрагент = &Контрагент | И Накладная <> ЗНАЧЕНИЕ(Документ.РасходнаяНакладная.ПустаяСсылка)) КАК ВзаиморасчетыСКонтрагентамиОстатки) КАК ВложенныйЗапрос"; Запрос.УстановитьПараметр("Дата" , Дата); Запрос.УстановитьПараметр("Контрагент" , Контрагент); Запрос.УстановитьПараметр("МоментВремени" , ?(РежимПроведения=РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); СуммаРазмерКредита = Контрагент.РазмерКредита; СрокКредита = Контрагент.СрокКредита; Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Предоплата = ВыборкаДетальныеЗаписи.Предоплата; Долг = ВыборкаДетальныеЗаписи.Долг; НеобходимаяСумма = СуммаПоДокументу-Предоплата + Долг; Если НеобходимаяСумма>СуммаРазмерКредита Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Недостаточно "+ НеобходимаяСумма+" суммы по кредиту."; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если ВыборкаДетальныеЗаписи.СрокЗадолженности>СрокКредита Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = " Превышен срок кредита."; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ тогда Продолжить; КонецЕсли; Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход(); Движение.Контрагент = Контрагент; Движение.Накладная = Ссылка; Движение.Период = Дата; Движение.Сумма = СуммаПоДокументу; Если Предоплата >0 тогда НеобходимоСписать = Мин(Предоплата, СуммаПоДокументу); Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Сумма = НеобходимоСписать; Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход(); Движение.Контрагент = Контрагент; Движение.Накладная = Ссылка; Движение.Период = Дата; Движение.Сумма = НеобходимоСписать; КонецЕсли; КонецЦикла; //ДокПриходДенег Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина; Движения.ВзаиморасчетыСКонтрагентами.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСКонтрагентами"); ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВзаиморасчетыСКонтрагентамиОстатки.Накладная, | ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток, | ВзаиморасчетыСКонтрагентамиОстатки.Контрагент |ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки( | &МоментВремени, | Контрагент = &Контрагент | И Накладная <> ЗНАЧЕНИЕ(Документ.РасходнаяНакладная.ПустаяСсылка)) КАК ВзаиморасчетыСКонтрагентамиОстатки"; Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); НеобходимоСписатьСумма = Сумма; Пока ВыборкаДетальныеЗаписи.Следующий() и НеобходимоСписатьСумма>0 Цикл Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Накладная = ВыборкаДетальныеЗаписи.Накладная; Движение.Сумма = Мин(ВыборкаДетальныеЗаписи.СуммаОстаток, НеобходимоСписатьСумма); НеобходимоСписатьСумма = НеобходимоСписатьСумма-Движение.Сумма; КонецЦикла; Если НеобходимоСписатьСумма>0 Тогда Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Сумма = НеобходимоСписатьСумма; КонецЕсли; //ОтчетВзаиморасчетыЗаПериод ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Контрагент, ВЫБОР КОГДА ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Накладная = ЗНАЧЕНИЕ(Документ.РасходнаяНакладная.ПустаяСсылка) ТОГДА "предоплата" ИНАЧЕ ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Накладная КОНЕЦ КАК Накладная, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаНачальныйОстаток, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаКонечныйОстаток, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаПриход КАК Оплата, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаРасход КАК Отгрузка ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(, , , , ) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты //1.19 Компания занимается оптовой торговлей. У некоторых товаров могут быть аналоги – другие позиции номенклатуры с теми же потребительскими свойствами и ценой, причем таких аналогов у товара может быть несколько. //Каждой номенклатурной позиции присваивается уникальный артикул. //Считается, что пользователь сам контролирует уникальность артикулов и назначает их вручную. //Закупка товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Учет остатков ведется в разрезе складов. В документах «Приходная накладная» и «Расходная накладная» склад только один (склад – реквизит шапки). //Продажи оформляются документом «Расходная накладная». В случае нехватки товара автоматически должен списываться его аналог. //В том случае, когда не хватает не только товара, но и всех его аналогов, документ не должен проводиться. //Порядок списания аналогов определяется артикулом. //Следует учитывать, что один и тот же товар может являться аналогом различных номенклатурных позиций. //Себестоимость товаров рассчитывается как средняя по складу. // //Создаем Спр. Склады, Кластеры. В шапках накладных добавляем Склад. //Создаем Док. УстановкаАналогов рекв.Номенклатура, Аналог. //Создаем РС СоставКластера (ПоПозицииРегистратора, Изм.Номенклатура Рес.Кластер) //Рег.УстановкаАналогов. ОстаткиНоменклатуры (Номенклатура, Склад, Количество, Стоимость). //Продажи (Номенклатура, НоменклатураПродажи, Количесвто, Сумма,Стоимость) //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Очистить(); Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; // Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ВТДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТДок.Номенклатура, | ВТДок.Количество, | ВТДок.Сумма, | СоставКластераСрезПоследних.Кластер КАК Кластер |ПОМЕСТИТЬ ВтКластеры |ИЗ | ВТДок КАК ВТДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставКластера.СрезПоследних(&МоментВремени, ) КАК СоставКластераСрезПоследних | ПО ВТДок.Номенклатура = СоставКластераСрезПоследних.Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВтКластеры.Номенклатура, | ВтКластеры.Количество, | ВтКластеры.Сумма, | ВтКластеры.Кластер, | ЕСТЬNULL(СоставКластераСрезПоследних.Номенклатура, ВтКластеры.Номенклатура) КАК Аналог |ПОМЕСТИТЬ ВТАналоги |ИЗ | ВтКластеры КАК ВтКластеры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставКластера.СрезПоследних(&МоментВремени, ) КАК СоставКластераСрезПоследних | ПО ВтКластеры.Кластер = СоставКластераСрезПоследних.Кластер |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТАналоги.Номенклатура КАК Номенклатура, | ВТАналоги.Количество КАК ДокументКоличество, | ВТАналоги.Сумма КАК ДокументСумма, | ВТАналоги.Аналог, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | ВЫБОР | КОГДА ВТАналоги.Номенклатура = ВТАналоги.Аналог | ТОГДА 0 | ИНАЧЕ 1 | КОНЕЦ КАК Поле1 |ИЗ | ВТАналоги КАК ВТАналоги | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ВТ.Аналог | ИЗ | ВТАналоги КАК ВТ) | И Склад = &Склад) КАК ОстаткиНоменклатурыОстатки | ПО ВТАналоги.Аналог = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | Поле1, | ВТАналоги.Аналог.Артикул |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Склад", Склад); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Дата", Дата); Результат = Запрос.Выполнить(); ТаблицаЗначение = Новый ТаблицаЗначений; ТаблицаЗначение.Колонки.Добавить("Номенклатура"); ТаблицаЗначение.Колонки.Добавить("Списано"); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл КоличествоСписать = ВыборкаНоменклатура.ДокументКоличество; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() и КоличествоСписать>0 Цикл ТекСтрока = ТаблицаЗначение.Найти(ВыборкаДетальныеЗаписи.Аналог); Если ТекСтрока = Неопределено Тогда ТекСтрока = ТаблицаЗначение.Добавить(); ТекСтрока.Номенклатура = ВыборкаДетальныеЗаписи.Аналог; ТекСтрока.Списано = 0; КонецЕсли; Остаток = ВыборкаДетальныеЗаписи.КоличествоОстаток - ТекСтрока.Списано; Если Остаток<=0 Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Аналог; Движение.Склад = Склад; Движение.Количество = Мин(Остаток, КоличествоСписать); Движение.Стоимость = ?(Остаток> КоличествоСписать, КоличествоСписать*ВыборкаДетальныеЗаписи.СтоимостьОстаток/Остаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.НоменклатураПродажи = ВыборкаДетальныеЗаписи.Аналог; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Количество = Мин(Остаток, КоличествоСписать); Движение.Сумма = КоличествоСписать*ВыборкаДетальныеЗаписи.ДокументСумма/ВыборкаДетальныеЗаписи.ДокументКоличество; Движение.Стоимость = ?(Остаток> КоличествоСписать, КоличествоСписать*ВыборкаДетальныеЗаписи.СтоимостьОстаток/Остаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); КоличествоСписать = КоличествоСписать - Движение.Количество; ТекСтрока.Списано = ТекСтрока.Списано +Движение.Количество; КонецЦикла; Если КоличествоСписать>0 Тогда Сообщение = новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" с количеством "+КоличествоСписать+" недостаточно"; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; КонецЦикла; КонецПроцедуры //ДокУстановкаАналогов Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.СоставКластера.Записывать = Истина; Движения.СоставКластера.Очистить(); Движения.СоставКластера.Записать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УстановкаАналогов.Номенклатура, | УстановкаАналогов.Аналог, | ЕСТЬNULL(СоставКластераАналог.Кластер, 0) КАК КластерАналог, | ЕСТЬNULL(СоставКластераНоменклатуре.Кластер, 0) КАК КластерНоменклатура |ПОМЕСТИТЬ ВТКластеры |ИЗ | Документ.УстановкаАналогов КАК УстановкаАналогов | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставКластера.СрезПоследних(&Дата, Номенклатура = &Номенклатура) КАК СоставКластераНоменклатуре | ПО УстановкаАналогов.Номенклатура = СоставКластераНоменклатуре.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставКластера.СрезПоследних(&Дата, Номенклатура = &Аналог) КАК СоставКластераАналог | ПО (УстановкаАналогов.Аналог = СоставКластераНоменклатуре.Номенклатура) |ГДЕ | УстановкаАналогов.Ссылка = &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТКластеры.Номенклатура, | ВТКластеры.Аналог, | ВТКластеры.КластерАналог, | ВТКластеры.КластерНоменклатура, | СоставКластераСрезПоследних.Номенклатура КАК НоменклатураКластера |ИЗ | ВТКластеры КАК ВТКластеры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставКластера.СрезПоследних(&Дата, ) КАК СоставКластераСрезПоследних | ПО ВТКластеры.КластерАналог = СоставКластераСрезПоследних.Кластер | И (ВТКластеры.КластерАналог <> 0) | И (ВТКластеры.КластерНоменклатура <> 0) | И (ВТКластеры.КластерАналог <> ВТКластеры.КластерНоменклатура)"; Запрос.УстановитьПараметр("Аналог" , Аналог); Запрос.УстановитьПараметр("Дата" , Дата); Запрос.УстановитьПараметр("Номенклатура" , Номенклатура); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); ВыборкаДетальныеЗаписи.Следующий(); Если ВыборкаДетальныеЗаписи.КластерНоменклатура = 0 и ВыборкаДетальныеЗаписи.КластерАналог = 0 Тогда Кластер = Справочники.Кластеры.СоздатьЭлемент(); Кластер.Наименование = ВыборкаДетальныеЗаписи.Номенклатура.Наименование+";"+ВыборкаДетальныеЗаписи.Аналог.Наименование; Кластер.Записать(); Запись = Движения.СоставКластера.Добавить(); Запись.Период = Дата; Запись.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Запись.Кластер = Кластер.Ссылка; Запись = Движения.СоставКластера.Добавить(); Запись.Период = Дата; Запись.Номенклатура = ВыборкаДетальныеЗаписи.Аналог; Запись.Кластер = Кластер.Ссылка; ИначеЕсли ВыборкаДетальныеЗаписи.КластерНоменклатура<>0 и ВыборкаДетальныеЗаписи.КластерАналог<>0 И ВыборкаДетальныеЗаписи.КластерНоменклатура<> ВыборкаДетальныеЗаписи.КластерАналог Тогда Кластер = ВыборкаДетальныеЗаписи.КластерНоменклатура.ПолучитьОбъект(); Повторять = Истина; Пока Повторять цикл Запись = Движения.СоставКластера.Добавить(); Запись.Период = Дата; Запись.Номенклатура = ВыборкаДетальныеЗаписи.НоменклатураКластера; Запись.Кластер = ВыборкаДетальныеЗаписи.КластерНоменклатура; Кластер.Наименование = Кластер.Наименование+""+ВыборкаДетальныеЗаписи.НоменклатураКластера.Наименование; Повторять = ВыборкаДетальныеЗаписи.Следующий(); КонецЦикла; Кластер.Записать(); ИначеЕсли ВыборкаДетальныеЗаписи.КластерНоменклатура<>0 и ВыборкаДетальныеЗаписи.КластерАналог=0 Тогда Запись = Движения.СоставКластера.Добавить(); Запись.Период = Дата; Запись.Номенклатура = ВыборкаДетальныеЗаписи.Аналог; Запись.Кластер = ВыборкаДетальныеЗаписи.КластерНоменклатура; Кластер = ВыборкаДетальныеЗаписи.КластерНоменклатура.ПолучитьОбъект(); Кластер.Наименование = Кластер.Наименование+""+ВыборкаДетальныеЗаписи.Аналог.Наименование; Кластер.Записать(); ИначеЕсли ВыборкаДетальныеЗаписи.КластерНоменклатура=0 и ВыборкаДетальныеЗаписи.КластерАналог<>0 Тогда Запись = Движения.СоставКластера.Добавить(); Запись.Период = Дата; Запись.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Запись.Кластер = ВыборкаДетальныеЗаписи.КластерАналог; Кластер = ВыборкаДетальныеЗаписи.КластерАналог.ПолучитьОбъект(); Кластер.Наименование = Кластер.Наименование+""+ВыборкаДетальныеЗаписи.Номенклатура.Наименование; Кластер.Записать(); КонецЕсли; КонецПроцедуры //Отчет Продажи ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.НоменклатураПродажи КАК Продано, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СуммаОборот КАК Продажа, ПродажиОбороты.СтоимостьОборот КАК Себестоимость, ПродажиОбороты.СуммаОборот - ПродажиОбороты.СтоимостьОборот КАК Прибыль ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты //1.20 Компания занимается оптовой торговлей. //Все операции отражаются документами «Приходная накладная», «Расходная накладная», «Приход денег» и «Расход денег», причем для каждого из них может быть указана своя статья затрат. //Таким образом, документ «Расход денег» может отражать операции например по оплате поставщику или возврата от покупателя в зависимости от выбранной статьи затрат. //Структурно компания состоит из нескольких подразделений. //В целях ведения управленческого учета для каждого отдела заводится бюджет (документ «Бюджет») на предстоящий месяц с указанием всех предполагаемых статей затрат, сумм по ним и возможного превышения этих сумм в суммовом выражении. //Следует считать, что каждое подразделение может вводить несколько документов «Бюджет», данные которых должны суммироваться для формирования итогового бюджета. //В целях контроля над исполнением бюджета при проведении любого документа должен происходить анализ фактических затрат и выводится соответствующее предупреждение, в случае превышения над бюджетом. //Например, если по статье «оплата поставщикам» запланировано 100 000 и 20 000, то при суммарной оплате более 100 000 и более 120 000 должны быть выданы соответствующие предупреждения. //Можно считать, что документы задним числом не вводятся, но существующие документы могут быть перепроведены. //Необходимо создать отчет по исполнению бюджета за период, кратный месяцу. // //Создаем Спр.СтатьиЗатрат, В шапки накладных добавляем Подразделение и СтатьюЗатрат. //Создаем док. ПриходДенег (рекв. Подразделение,СтатьяЗатрат,СуммаПоДокументу), //Создаем док. РасходДенег (рекв. Подразделение,СтатьяЗатрат,СуммаПоДокументу). //Создаем док. Бюджет (рекв. СтатьяЗатрат,Сумма,ПревышениеПоСумме, тч.СтатьяЗатрат, Сумма, ПревышениеПоСумме. //РН Бюджет Обороты Рег. ПрихНакл, РасхНакл, ПриходДенег, РасходДенег, Бюджет.(Подразделение, СтатьяЗатрат, СуммаПлан, СуммаФакт, СуммаПревышение). //Создаем общий модуль пПроведениеДокументов и процедуру ПодпискаНаСобытиеОбработкаПроведенияОбработкаПроведения //Создаем подписку на событие ПодпискаНаСобытиеОбработкаПроведения (Источник: ПриходДенег, РасходДенег, Приходная, Расходная), //событие обработкаПроведения Обработчик: пПроведениеДокументов.ПодпискаНаСобытиеОбработкаПроведенияОбработкаПроведения. //Док Бюджет Процедура ОбработкаПроведения(Отказ, Режим) // регистр Бюджет Движения.Бюджет.Записывать = Истина; Для Каждого ТекСтрокаСписокСтатьяЗатрат Из СписокСтатьяЗатрат Цикл Движение = Движения.Бюджет.Добавить(); Движение.Период = Дата; Движение.Подразделение = Подразделение; Движение.СтатьяЗатрат = ТекСтрокаСписокСтатьяЗатрат.СтатьяЗатрат; Движение.СуммаПлан = ТекСтрокаСписокСтатьяЗатрат.Сумма; Движение.СуммаПревышение = ТекСтрокаСписокСтатьяЗатрат.ПревышениеПоСумме; КонецЦикла; КонецПроцедуры //ОбщийМодуль Процедура ПодпискаНаСобытиеОбработкаПроведенияОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт ДокументОбъект = Источник; пТекущаяДата = Источник.Дата; Подразделение = Источник.Подразделение; СтатьяЗатрат = Источник.СтатьяЗатрат; Движение = ДокументОбъект.Движения.Бюджет; Движение.Записывать = Истина; Движение.Очистить(); Движение.Записать(); Движение.БлокироватьДляИзменения = Истина; НоваяЗапись = Движение.Добавить(); НоваяЗапись.Период = пТекущаяДата; НоваяЗапись.Подразделение = Подразделение; НоваяЗапись.СтатьяЗатрат = СтатьяЗатрат; НоваяЗапись.СуммаФакт = Источник.СуммаПоДокументу; Движение.Записать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ИнформацияПоБюджету.Подразделение, | ИнформацияПоБюджету.СтатьяЗатрат, | СУММА(ИнформацияПоБюджету.СуммаПланОборот) КАК СуммаПлан, | СУММА(ИнформацияПоБюджету.СуммаПревышениеОборот) КАК СуммаПревышение, | СУММА(ИнформацияПоБюджету.СуммаФакт) КАК СуммаФакт, | СУММА(ИнформацияПоБюджету.СуммаПланОборот + ИнформацияПоБюджету.СуммаПревышениеОборот) КАК ОбщееПревышение |ИЗ | (ВЫБРАТЬ | БюджетОборотыПлан.Подразделение КАК Подразделение, | БюджетОборотыПлан.СтатьяЗатрат КАК СтатьяЗатрат, | БюджетОборотыПлан.СуммаПланОборот КАК СуммаПланОборот, | БюджетОборотыПлан.СуммаПревышениеОборот КАК СуммаПревышениеОборот, | 0 КАК СуммаФакт | ИЗ | РегистрНакопления.Бюджет.Обороты( | &НачалоПериода, | &КонецПериода, | , | Подразделение = &Подразделение | И СтатьяЗатрат = &СтатьяЗатрат) КАК БюджетОборотыПлан | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | БюджетОборотыФакт.Подразделение, | БюджетОборотыФакт.СтатьяЗатрат, | 0, | 0, | БюджетОборотыФакт.СуммаФактОборот | ИЗ | РегистрНакопления.Бюджет.Обороты( | &НачалоПериода, | &МоментВремени, | , | Подразделение = &Подразделение | И СтатьяЗатрат = &СтатьяЗатрат) КАК БюджетОборотыФакт) КАК ИнформацияПоБюджету | |СГРУППИРОВАТЬ ПО | ИнформацияПоБюджету.СтатьяЗатрат, | ИнформацияПоБюджету.Подразделение"; Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(пТекущаяДата)); Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(пТекущаяДата)); Запрос.УстановитьПараметр("МоментВремени", ДокументОбъект.МоментВремени()); Запрос.УстановитьПараметр("Подразделение", Подразделение); Запрос.УстановитьПараметр("СтатьяЗатрат", СтатьяЗатрат); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если ВыборкаДетальныеЗаписи.СуммаФакт > ВыборкаДетальныеЗаписи.СуммаПлан Тогда Сообщение = новый СообщениеПользователю; Сообщение.Текст = "Для подразделения "+Подразделение+" по статье затрат "+СтатьяЗатрат+"превышен бюджет"; Сообщение.Сообщить(); КонецЕсли; Если ВыборкаДетальныеЗаписи.СуммаФакт > ВыборкаДетальныеЗаписи.ОбщееПревышение Тогда Сообщение = новый СообщениеПользователю; Сообщение.Текст = "Для подразделения "+Подразделение+" по статье затрат "+СтатьяЗатрат+"превышен бюджет с учетом возможного превышения"; Сообщение.Сообщить(); КонецЕсли; КонецЦикла; КонецПроцедуры //Отчет ИсполнениеБюджета ВЫБРАТЬ РАЗРЕШЕННЫЕ БюджетОбороты.Период, БюджетОбороты.Подразделение, БюджетОбороты.СтатьяЗатрат, БюджетОбороты.СуммаПланОборот КАК План, БюджетОбороты.СуммаФактОборот КАК Факт, ВЫБОР КОГДА БюджетОбороты.СуммаПланОборот = 0 ТОГДА 0 ИНАЧЕ ВЫРАЗИТЬ(БюджетОбороты.СуммаФактОборот / БюджетОбороты.СуммаПланОборот * 100 КАК ЧИСЛО(15, 0)) КОНЕЦ КАК ПроцентИсп ИЗ РегистрНакопления.Бюджет.Обороты(, , Месяц, ) КАК БюджетОбороты //1.21 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа – «Расходная накладная». //Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. //И услуги и товары указываются в одной табличной части. //Учет товаров ведется в разрезе складов. Каждый из складов имеет свой приоритет, который может меняться не чаще чем 1 раз в месяц. //При проведении расходной накладной необходимо в первую очередь контролировать хватает ли товара вообще. //Если нет – выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //Списание себестоимости товаров должно быть организовано по складам, в зависимости от текущего (на момент проведения документа) значения их приоритета. //В первую очередь товар списывается со склада с минимальным приоритетом, потом со следующего склада с большим приоритетом и т.д. //Себестоимость товаров рассчитывается как средняя по складу. //Поступление товара происходит на один выбранный пользователем в документе «Приходная накладная» склад. //Закупки производятся менеджерами, причем менеджер никак не связан со складом, на который приходуется товар. //Необходимо построить отчеты о закупках за период товаров менеджерами и анализ продаж за период // //Создаем Спр. Склады, Менеджеры. В шапку приходной добавляем Склад, Менеджер. //Создаем РС ПриоритетыСкладов (в пределах месяца, независимый). //Склад, приоритет. ОстаткиНоменклатуры (Номенклатура, Склад, колиество,Стоимость). //Закупки (Обороты) Менеджер,Номенклатура,Склад,Количество. Продажи (Номенклатура, Количество, Сумма, Стоимость) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Закупки.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Если ТекСтрокаСписокНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; Движение = Движения.Закупки.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Менеджер = Менеджер; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЕсли; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПриоритетыСкладовСрезПоследних.Склад КАК Склад, | ПриоритетыСкладовСрезПоследних.Приоритет |ПОМЕСТИТЬ СкладПриоритет |ИЗ | РегистрСведений.ПриоритетыСкладов.СрезПоследних(&Дата, ) КАК ПриоритетыСкладовСрезПоследних | |ИНДЕКСИРОВАТЬ ПО | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ТЧДок.ВидНоменклатуры КАК ВидНоменклатуры, | ОстаткиНоменклатурыОстатки.Склад, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | расходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК расходнаяНакладная | ГДЕ | расходнаяНакладная.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар))) КАК ОстаткиНоменклатурыОстатки | ЛЕВОЕ СОЕДИНЕНИЕ СкладПриоритет КАК СкладПриоритет | ПО ОстаткиНоменклатурыОстатки.Склад = СкладПриоритет.Склад | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | СкладПриоритет.Приоритет |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | МАКСИМУМ(ВидНоменклатуры), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("Дата" , Дата); Запрос.УстановитьПараметр("МоментВремени" , ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено,МоментВремени())); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Себестоимость = 0; Если ВыборкаНоменклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда КоличествоПоДокументу = ВыборкаНоменклатура.ДокументКоличество; Если КоличествоПоДокументу > ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" в количестве "+КоличествоПоДокументу+" недостаточно. На остатке:"+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; КоличествоСписать = КоличествоПоДокументу; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() и КоличествоСписать>0 Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Период = Дата; Движение.Склад = ВыборкаДетальныеЗаписи.Склад; Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстаток, КоличествоСписать); Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстаток>КоличествоСписать, КоличествоСписать*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); КоличествоСписать = КоличествоСписать - Движение.Количество; Себестоимость = Себестоимость+Движение.Стоимость; КонецЦикла; КонецЕсли; Движение = Движения.Продажи.Добавить(); Движение.Количество = ВыборкаНоменклатура.ДокументКоличество; Движение.Стоимость = Себестоимость; Движение.Сумма = ВыборкаНоменклатура.ДокументСумма; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Период = Дата; КонецЦикла; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА КонецПроцедуры //Отчет Закупки ВЫБРАТЬ ЗакупкиОбороты.Менеджер, ЗакупкиОбороты.Номенклатура, ЗакупкиОбороты.Склад, ЗакупкиОбороты.КоличествоОборот КАК Количество ИЗ РегистрНакопления.Закупки.Обороты КАК ЗакупкиОбороты //ОтчетПРодажи ВЫБРАТЬ МИНИМУМ(ПродажиОбороты.Период) КАК ПериодМин, МАКСИМУМ(ПродажиОбороты.Период) КАК ПериодМакс, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.Регистратор) КАК КоличествоОтгрузок, ПродажиОбороты.Номенклатура, СУММА(ПродажиОбороты.КоличествоОборот) КАК Количество, СУММА(ПродажиОбороты.СуммаОборот) КАК Продажа, СУММА(ПродажиОбороты.СтоимостьОборот) КАК Себестоимость ИЗ РегистрНакопления.Продажи.Обороты(, , Регистратор, ) КАК ПродажиОбороты СГРУППИРОВАТЬ ПО ПродажиОбороты.Номенклатура //1.22 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. //И услуги и товары указываются в одной табличной части. Учет товаров ведется в разрезе складов. //Каждый из складов имеет свой приоритет, который может меняться не чаще чем 1 раз в месяц. //При проведении расходной накладной необходимо в первую очередь контролировать хватает ли товара вообще. //Если нет – выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //Списание себестоимости товаров должно быть организовано по складам, в зависимости от текущего значения их приоритета и выбранного в документе склада. //В первую очередь товар списывается со склада, указанного в шапке документа, далее со склада с минимальным приоритетом, потом со следующего склада с большим приоритетом и т.д. пока не спишется все необходимое количество. //Себестоимость товаров рассчитывается как средняя по складу. Поступление товара происходит на один выбранный пользователем в документе «Приходная накладная» склад. //Необходимо построить отчет по движениям товаров за период по количеству и сумме. // //Создаем. Спр. Склады. В документе приходная и расходная в шапке добавляем Склад. //Создаем РС ПриоритетыСкладов (независимый, в пределах месяца) Изм.Склады. Рес.Приоритет. //ОстаткиНоменклатуры (Номенклатура, Склад, количество, стоимость.) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | ВидНоменклатуры |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ТЧДок.ВидНоменклатуры КАК ВидНоменклатуры, | ОстаткиНоменклатурыОстатки.Склад, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | ВЫБОР | КОГДА ОстаткиНоменклатурыОстатки.Склад = &Склад | ТОГДА 0 | ИНАЧЕ 1 | КОНЕЦ КАК ПорядокСортировки |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная | ГДЕ | РасходнаяНакладная.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар))) КАК ОстаткиНоменклатурыОстатки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПриоритетыСкладов.СрезПоследних(&МоментВремени, ) КАК ПриоритетыСкладовСрезПоследних | ПО ОстаткиНоменклатурыОстатки.Склад = ПриоритетыСкладовСрезПоследних.Склады | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ПорядокСортировки, | ПриоритетыСкладовСрезПоследних.Приоритет |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | МАКСИМУМ(ВидНоменклатуры), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Склад" , Склад); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда Продолжить; КонецЕсли; КоличествоПоДокументу = ВыборкаНоменклатура.ДокументКоличество; Если КоличествоПоДокументу>ВыборкаНоменклатура.КоличествоОстаток тогда Сообщение = Новый СообщениеПользователю; Сообщение .Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" в количестве "+КоличествоПоДокументу+" недостаточно.На остатке:"+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; КоличествоСписать = КоличествоПоДокументу; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() и КоличествоСписать>0 Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Период = Дата; Движение.Склад = ВыборкаДетальныеЗаписи.Склад; Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстаток, КоличествоСписать); Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстаток>КоличествоСписать, КоличествоСписать*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); КоличествоСписать = КоличествоСписать - Движение.Количество; КонецЦикла; КонецЦикла; КонецПроцедуры //Отчет ДвижениеТоваров ВЫБРАТЬ РАЗРЕШЕННЫЕ ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.Склад, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьПриход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьРасход ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(, , , , ) КАК ОстаткиНоменклатурыОстаткиИОбороты //1.23 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Продажа происходит с учетом единиц измерения, т.е. для каждой номенклатурной позиции может быть произвольное количество единиц измерения, например: штука; пачка из 10 штук; контейнер из 500 штук и т.д. //Если в накладной будет указана продажа 3-х пачек, то должны быть списаны 30 штук. //Кроме того, в расходной накладной могут также быть указаны услуги (например, доставка). //И товары и услуги необходимо указывать в одной табличной части. Учет товаров ведется в разрезе складов. //При проведении расходной накладной необходимо в первую очередь контролировать хватает ли товара вообще. //Если нет – выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //Списание себестоимости товаров должно быть организовано только по складам, указанным для него в табличной части документа. //Себестоимость товара рассчитывается как средняя по складу. //Поступление товара происходит на один выбранный пользователем в документе «Приходная накладная» склад. //Необходимо построить отчет по анализу продаж товаров за период. //Прибыль рассчитывается: «Сумма продаж» - «Себестоимость» рассчитывается как: «Дата первой отгрузки» - «Дата последней отгрузки» / «количество отгрузок». //В том случае, когда отгрузка была только одна, то в колонке Интервал выводится «разовая». //Срок – расчетный показатель срок последней отгрузки (в днях), определяющий, как давно прошла последняя отгрузка. //Он рассчитывается как: «Конец периода отчета» - «Дата последнего документа отгрузки». // //СоздСпр. Склады, ЕдиницыИзмерения (рекв. Коэффициент). //В шапку приходной добавляем Склад, в тчРасходной добавляем ЕдиницаИзмерения,Склад. //ОстаткиНоменклатуры (Номенклатура,Склад, Количество,Стоимость) Продажи (Номенклатура, Количество,Сумма,Стоимость) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Если ТекСтрокаСписокНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Номенклатура "+ТекСтрокаСписокНоменклатуры.Номенклатура+" является услугой.Строка пропущена"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры, | СУММА(СписокНоменклатуры.Количество * СписокНоменклатуры.ЕдиницаИзмерения.Коэффициент) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.Склад КАК Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры, | СписокНоменклатуры.Склад | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура, | ОстаткиНоменклатурыОстатки.КоличествоОстаток, | ОстаткиНоменклатурыОстатки.СтоимостьОстаток |ПОМЕСТИТЬ ОстаткиВсе |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная | ГДЕ | РасходнаяНакладная.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.товар))) КАК ОстаткиНоменклатурыОстатки | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.ВидНоменклатуры КАК ВидНоменклатуры, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ТЧДок.Склад, | ЕСТЬNULL(ОстаткиНоменклатурыПоСкладам.КоличествоОстаток, 0) КАК КоличествоОстатокСклад, | ЕСТЬNULL(ОстаткиНоменклатурыПоСкладам.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | ЕСТЬNULL(ОстаткиВсе.КоличествоОстаток, 0) КАК КоличествоОстатокВсего |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиВсе КАК ОстаткиВсе | ПО ТЧДок.Номенклатура = ОстаткиВсе.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, Склад) В | (ВЫБРАТЬ | РасходнаяНакладная.Номенклатура, | РасходнаяНакладная.Склад | ИЗ | ТЧДок КАК РасходнаяНакладная | ГДЕ | РасходнаяНакладная.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.товар))) КАК ОстаткиНоменклатурыПоСкладам | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыПоСкладам.Номенклатура | И ТЧДок.Склад = ОстаткиНоменклатурыПоСкладам.Склад |ИТОГИ | МАКСИМУМ(ВидНоменклатуры), | СУММА(ДокументКоличество), | СУММА(ДокументСумма), | СУММА(КоличествоОстатокСклад), | СУММА(СтоимостьОстаток), | МАКСИМУМ(КоличествоОстатокВсего) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Себестоимость = 0; Если ВыборкаНоменклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда ДокКоличество = ВыборкаНоменклатура.ДокументКоличество; Если ДокКоличество> ВыборкаНоменклатура.КоличествоОстатокВсего Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура +" с количеством "+ДокКоличество + " недостаточно. Всего на остатке:"+ВыборкаНоменклатура.КоличествоОстатокВсего; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если ВыборкаДетальныеЗаписи.ДокументКоличество > ВыборкаДетальныеЗаписи.КоличествоОстатокСклад тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура +" с количеством "+ВыборкаДетальныеЗаписи.ДокументКоличество + " на складе :"+ ВыборкаДетальныеЗаписи.Склад+" недостаточно. На остатке:"+ВыборкаДетальныеЗаписи.КоличествоОстатокСклад; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Период = Дата; Движение.Склад = ВыборкаДетальныеЗаписи.Склад; Движение.Количество = ВыборкаДетальныеЗаписи.ДокументКоличество; Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстатокСклад>ВыборкаДетальныеЗаписи.ДокументКоличество,ВыборкаДетальныеЗаписи.ДокументКоличество*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстатокСклад,ВыборкаДетальныеЗаписи.СтоимостьОстаток); Себестоимость = Себестоимость + Движение.Стоимость; КонецЦикла; // конец обход детальные записи КонецЕсли; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Стоимость = Себестоимость; Движение.Количество = ВыборкаНоменклатура.ДокументКоличество; Движение.Сумма = ВыборкаНоменклатура.ДокументСумма; КонецЦикла; // конец обход номенклатура КонецПроцедуры //ОтчетПродажи ВЫБРАТЬ МАКСИМУМ(ПродажиОбороты.Период) КАК ПериодМакс, МАКСИМУМ(ПродажиОбороты.Период) КАК ПериодМин, ПродажиОбороты.Номенклатура, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.Регистратор) КАК КоличествоОтгрузок, СУММА(ПродажиОбороты.КоличествоОборот) КАК Количество, СУММА(ПродажиОбороты.СуммаОборот) КАК Продажа, СУММА(ПродажиОбороты.СтоимостьОборот) КАК Себестоиомость ИЗ РегистрНакопления.Продажи.Обороты(, , Регистратор, ) КАК ПродажиОбороты СГРУППИРОВАТЬ ПО ПродажиОбороты.Номенклатура //1.24 Компания занимается оптовой торговлей. //Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Учет товаров ведется в разрезе складов. Каждый из складов имеет свой приоритет, который не меняется. //При проведении расходной накладной необходимо в первую очередь контролировать хватает ли товара вообще. //Если нет – выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //Списание себестоимости должно быть организовано по складам, в зависимости от текущего значения их приоритета и выбранного в документе склада. //В первую очередь товар списывается со склада, указанного для данного товара в табличной части документа, далее со склада с минимальным приоритетом, потом со следующего склада с большим приоритетом и т.д. //Пока не спишется все необходимое количество. Если склад не указан, то происходит списание со складов, согласно их приоритету. //Себестоимость товаров рассчитывается как средняя по складу. //Поступление товара происходит на один выбранный пользователем в документе «Приходная накладная» склад. //Необходимо построить отчет по движениям товаров за период по количеству и сумме. // //СоздСпр. Склады (рекв.Приоритет). ОстаткиНоменклатуры (Номенклатура,Склад,Количество,СТоимость), В шапке приходной -склад, в тч.Расходной - склад. //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.Склад КАК Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Склад | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура, | ОстаткиНоменклатурыОстатки.КоличествоОстаток, | ОстаткиНоменклатурыОстатки.СтоимостьОстаток, | ОстаткиНоменклатурыОстатки.Склад КАК Склад |ПОМЕСТИТЬ ОстаткиВсе |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | РасходнаяНакладная.Номенклатура | ИЗ | ТЧДок КАК РасходнаяНакладная)) КАК ОстаткиНоменклатурыОстатки | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Склад КАК Склад, | ВЫБОР | КОГДА ОстаткиВсе.КоличествоОстаток > ТЧДок.Количество | ТОГДА ТЧДок.Количество | ИНАЧЕ ОстаткиВсе.КоличествоОстаток | КОНЕЦ КАК КоличествоПоВыбранномуСкладу, | ВЫБОР | КОГДА ОстаткиВсе.КоличествоОстаток > ТЧДок.Количество | ТОГДА ТЧДок.Количество * ОстаткиВсе.СтоимостьОстаток / ОстаткиВсе.КоличествоОстаток | ИНАЧЕ ОстаткиВсе.СтоимостьОстаток | КОНЕЦ КАК СтоимостьПоВыбранномуСкладу, | 1 КАК ПорядокСортировки |ПОМЕСТИТЬ ОстаткиПоСкладамДок |ИЗ | ТЧДок КАК ТЧДок | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОстаткиВсе КАК ОстаткиВсе | ПО ТЧДок.Номенклатура = ОстаткиВсе.Номенклатура | И ТЧДок.Склад = ОстаткиВсе.Склад | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Склад, | ВЫБОР | КОГДА ОстаткиВсе.КоличествоОстаток > ТЧДок.Количество | ТОГДА ОстаткиВсе.КоличествоОстаток - ТЧДок.Количество | ИНАЧЕ 0 | КОНЕЦ, | ВЫБОР | КОГДА ОстаткиВсе.КоличествоОстаток > ТЧДок.Количество | ТОГДА ОстаткиВсе.СтоимостьОстаток - ТЧДок.Количество * ОстаткиВсе.СтоимостьОстаток / ОстаткиВсе.КоличествоОстаток | ИНАЧЕ 0 | КОНЕЦ, | 2 |ИЗ | ТЧДок КАК ТЧДок | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОстаткиВсе КАК ОстаткиВсе | ПО ТЧДок.Номенклатура = ОстаткиВсе.Номенклатура | И ТЧДок.Склад = ОстаткиВсе.Склад | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВложенныйЗапрос.Номенклатура КАК Номенклатура, | ВложенныйЗапрос.Склад КАК Склад, | СУММА(ВложенныйЗапрос.КоличествоПоВыбранномуСкладу) КАК КоличествоПоВыбранномуСкладу, | СУММА(ВложенныйЗапрос.СтоимостьПоВыбранномуСкладу) КАК СтоимостьПоВыбранномуСкладу, | ВложенныйЗапрос.ПорядокСортировки |ПОМЕСТИТЬ ОстаткиПоДокВсе |ИЗ | (ВЫБРАТЬ | ОстаткиПоСкладамДок.Номенклатура КАК Номенклатура, | ОстаткиПоСкладамДок.Склад КАК Склад, | -ОстаткиПоСкладамДок.КоличествоПоВыбранномуСкладу КАК КоличествоПоВыбранномуСкладу, | -ОстаткиПоСкладамДок.СтоимостьПоВыбранномуСкладу КАК СтоимостьПоВыбранномуСкладу, | 2 КАК ПорядокСортировки | ИЗ | ОстаткиПоСкладамДок КАК ОстаткиПоСкладамДок | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ОстаткиВсе.Номенклатура, | ОстаткиВсе.Склад, | ОстаткиВсе.КоличествоОстаток, | ОстаткиВсе.СтоимостьОстаток, | 2 | ИЗ | ОстаткиВсе КАК ОстаткиВсе) КАК ВложенныйЗапрос | |СГРУППИРОВАТЬ ПО | ВложенныйЗапрос.Номенклатура, | ВложенныйЗапрос.Склад, | ВложенныйЗапрос.ПорядокСортировки | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВложенныйЗапрос.Номенклатура КАК Номенклатура, | ВложенныйЗапрос.Склад КАК Склад, | СУММА(ВложенныйЗапрос.КоличествоПоВыбранномуСкладу) КАК КоличествоПоВыбранномуСкладу, | СУММА(ВложенныйЗапрос.СтоимостьПоВыбранномуСкладу) КАК СтоимостьПоВыбранномуСкладу, | ВложенныйЗапрос.ПорядокСортировки |ПОМЕСТИТЬ Остатки |ИЗ | (ВЫБРАТЬ | ОстаткиПоСкладамДок.Номенклатура КАК Номенклатура, | ОстаткиПоСкладамДок.Склад КАК Склад, | ОстаткиПоСкладамДок.КоличествоПоВыбранномуСкладу КАК КоличествоПоВыбранномуСкладу, | ОстаткиПоСкладамДок.СтоимостьПоВыбранномуСкладу КАК СтоимостьПоВыбранномуСкладу, | ОстаткиПоСкладамДок.ПорядокСортировки КАК ПорядокСортировки | ИЗ | ОстаткиПоСкладамДок КАК ОстаткиПоСкладамДок | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ОстаткиПоДокВсе.Номенклатура, | ОстаткиПоДокВсе.Склад, | ОстаткиПоДокВсе.КоличествоПоВыбранномуСкладу, | ОстаткиПоДокВсе.СтоимостьПоВыбранномуСкладу, | ОстаткиПоДокВсе.ПорядокСортировки | ИЗ | ОстаткиПоДокВсе КАК ОстаткиПоДокВсе) КАК ВложенныйЗапрос | |СГРУППИРОВАТЬ ПО | ВложенныйЗапрос.Склад, | ВложенныйЗапрос.Номенклатура, | ВложенныйЗапрос.ПорядокСортировки | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Накладная.Номенклатура КАК Номенклатура, | Накладная.Количество КАК ДокументКоличество, | Накладная.Сумма КАК ДокументСумма, | Остатки.Склад, | ЕСТЬNULL(Остатки.КоличествоПоВыбранномуСкладу, 0) КАК КоличествоОстаток, | ЕСТЬNULL(Остатки.СтоимостьПоВыбранномуСкладу, 0) КАК СтоимостьОстаток |ИЗ | (ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | СУММА(ТЧДок.Количество) КАК Количество, | СУММА(ТЧДок.Сумма) КАК Сумма | ИЗ | ТЧДок КАК ТЧДок | | СГРУППИРОВАТЬ ПО | ТЧДок.Номенклатура) КАК Накладная | ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки | ПО Накладная.Номенклатура = Остатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | Остатки.ПорядокСортировки, | Остатки.Склад.Приоритет |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("Ссылка" , Ссылка); Запрос.УстановитьПараметр("МоментВремени" , ?(РежимПроведения = РежимПроведенияДокумента.Оперативный,Неопределено,МоментВремени())); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл ДокументКоличество = ВыборкаНоменклатура.ДокументКоличество; Если ДокументКоличество> ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" с количеством "+ВыборкаНоменклатура.ДокументКоличество+" недостаточно. На остатке:"+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; // ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ДокументКоличество; Пока ВыборкаДетальныеЗаписи.Следующий() и КоличествоСписать>0 Цикл Если ВыборкаДетальныеЗаписи.КоличествоОстаток = 0 Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Период = Дата; Движение.Склад = ВыборкаДетальныеЗаписи.Склад; Движение.Стоимость =?(ВыборкаДетальныеЗаписи.КоличествоОстаток >КоличествоСписать, КоличествоСписать*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстаток, КоличествоСписать); КоличествоСписать = КоличествоСписать - Движение.Количество; КонецЦикла; КонецЦикла; КонецПроцедуры //ОтчетДвижениеТоваров ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Склад, ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьПриход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьРасход ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты КАК ОстаткиНоменклатурыОстаткиИОбороты //1.25 Компания занимается оптовой торговлей. Взаиморасчеты с покупателями ведутся в разрезе счетов. //Покупателю выставляется счет (документ «Счет»), на основании которого далее происходит отгрузка документами «Расходная накладная», причем накладных по одному счету может быть несколько. //Считается, что товар по счету в конце концов будет отгружен полностью, а накладные могут быть только на основании счета. //При выставлении счета каждый раз оговаривается срок (количество дней), в который покупатель должен оплатить товар, причем срок отсчитывается относительно даты полной отгрузки товара по этому счету. //В том случае, если товар по счету отгружен полностью, срок оплаты истек, а покупатель оплатил не всю сумму, ему насчитываются пени. //Для расчета пеней пользователями раз в неделю формируется документ «Пени», в котором автоматически должны рассчитываться пени по формуле: «количество дней просрочки» * «% пени» * «оставшаяся сумма задолженности по счету». //Просрочка отсчитывается от даты полной отгрузки плюс срок оплаты (из счета). //Процент пеней также указывается в каждом счете. В сумму задолженности включаются пени. //Складской учет товаров не ведется. Можно считать, что документы задним числом не вводятся, но существующие документы могут перепроводиться. //При поступлении оплаты (документ «Приход денег») в первую очередь покрывается задолженность по самым старым счетам. //В документе «Приход денег» указывается только покупатель и сумма, а распределение по задолженности должно происходить автоматически при проведении документа. //Необходимо построить отчет для анализа состояния счетов на выбранную дату и анализ счета за период. // //СоздСпр. Контрагенты. Создаем док. Счет (рекв. СрокОплаты (число), //Процент, контрагент, СуммаПоДокументу. тчСписокНоменклатуры Номеклатура, количество,Цена,Сумма), //Создаем док ПриходДенег (Контрагент, СуммаПоДок). Создаем док. Пеня (рекв. Неделя - дата). //В шапку расходной добавляем Контрагент, Счет. ОстаткиНоменклатуры(Номенклатура, Количество). //РН ЗаказыПоСчетам (остатки, Счет,НОменклатура,Количество). РН ВзаиморасчетыСПокупателями (остатки, Контрагент, Счет, Сумма) //ДокРасходная Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Счет") Тогда // Заполнение шапки Контрагент = ДанныеЗаполнения.Контрагент; Счет = ДанныеЗаполнения.Ссылка; СуммаПоДокументу = ДанныеЗаполнения.СуммаПоДокументу; Для Каждого ТекСтрокаСписокНоменклатуры Из ДанныеЗаполнения.СписокНоменклатуры Цикл НоваяСтрока = СписокНоменклатуры.Добавить(); НоваяСтрока.Количество = ТекСтрокаСписокНоменклатуры.Количество; НоваяСтрока.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; НоваяСтрока.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; НоваяСтрока.Цена = ТекСтрокаСписокНоменклатуры.Цена; КонецЦикла; КонецЕсли; //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ЗаказыПоСчетам.Записывать = Истина; Движения.ЗаказыПоСчетам.Записать(); Движения.ВзаиморасчетыСПокупателями.Записывать = Истина; Движения.ЗаказыПоСчетам.БлокироватьДляИзменения = Истина; Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.ЗаказыПоСчетам.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ЭлементТЧ.Номенклатура; Движение.Счет = Счет; Движение.Количество = ЭлементТЧ.Количество; КонецЦикла; Движения.ЗаказыПоСчетам.Записать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ ВТТовары |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЗаказыПоСчетамОстатки.Счет, | ЗаказыПоСчетамОстатки.Номенклатура, | ЗаказыПоСчетамОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ЗаказыПоСчетам.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ТЧ.Номенклатура | ИЗ | ВТТовары КАК ТЧ) | И Счет = &Счет) КАК ЗаказыПоСчетамОстатки |ГДЕ | ЗаказыПоСчетамОстатки.КоличествоОстаток < 0"; Запрос.УстановитьПараметр("МоментВремени",?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, Новый Граница(МоментВремени(),ВидГраницы.Включая))); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Счет", Счет); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Если Не Результат.Пустой() Тогда Отказ = Истина; Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаДетальныеЗаписи.Номенклатура+" по счету "+Счет+" нехватает. На остатке:"+ВыборкаДетальныеЗаписи.КоличествоОстаток; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); КонецЦикла; КонецЕсли; Если Не Отказ Тогда Движение = Движения.ВзаиморасчетыСПокупателями.ДобавитьПриход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Счет = Счет; Движение.Сумма = СуммаПоДокументу; КонецЕсли; КонецПроцедуры //ДокСчет Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ЗаказыПоСчетам Приход Движения.ЗаказыПоСчетам.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ЗаказыПоСчетам.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Счет = Ссылка; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокПриходДенег Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ВзаиморасчетыСПокупателями.Записывать = Истина; Движения.ВзаиморасчетыСПокупателями.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСПокупателями"); ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВзаиморасчетыСПокупателямиОстатки.Контрагент, | ВзаиморасчетыСПокупателямиОстатки.Счет, | ВзаиморасчетыСПокупателямиОстатки.СуммаОстаток КАК СуммаОстаток |ИЗ | РегистрНакопления.ВзаиморасчетыСПокупателями.Остатки(&МоментВремени, Контрагент = &Контрагент) КАК ВзаиморасчетыСПокупателямиОстатки | |УПОРЯДОЧИТЬ ПО | ВзаиморасчетыСПокупателямиОстатки.Счет.МоментВремени |ИТОГИ | СУММА(СуммаОстаток) |ПО | ОБЩИЕ"; Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения= РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Результат = Запрос.Выполнить(); ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ВыборкаОбщийИтог.Следующий(); // Общий итог Если СуммаПоДок>ВыборкаОбщийИтог.СуммаОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Оплата превышает допустимую задолженность: "+ВыборкаОбщийИтог.СуммаОстаток; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; Возврат; КонецЕсли; ВыборкаДетальныеЗаписи = ВыборкаОбщийИтог.Выбрать(); Списать = СуммаПоДок; Пока ВыборкаДетальныеЗаписи.Следующий() и Списать>0 Цикл Движение = Движения.ВзаиморасчетыСПокупателями.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = ВыборкаДетальныеЗаписи.Контрагент; Движение.Счет = ВыборкаДетальныеЗаписи.Счет; Движение.Сумма = Мин(ВыборкаДетальныеЗаписи.СуммаОстаток, Списать); Списать = Списать - Движение.Сумма; КонецЦикла; КонецПроцедуры //ДокПеня Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ВзаиморасчетыСПокупателями.Записывать = Истина; Движения.ВзаиморасчетыСПокупателями.Записать(); Движения.ВзаиморасчетыСПокупателями.БлокироватьДляИзменения = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗаказыПоСчетамОстатки.Счет КАК Счет, | ЗаказыПоСчетамОстатки.Номенклатура, | ЗаказыПоСчетамОстатки.КоличествоОстаток |ПОМЕСТИТЬ ВтНеотгруженныеТовары |ИЗ | РегистрНакопления.ЗаказыПоСчетам.Остатки(&КонецПериода, ) КАК ЗаказыПоСчетамОстатки | |ИНДЕКСИРОВАТЬ ПО | Счет |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВзаиморасчетыСПокупателямиОстатки.Контрагент КАК Контрагент, | ВзаиморасчетыСПокупателямиОстатки.Счет КАК Счет, | ВзаиморасчетыСПокупателямиОстатки.СуммаОстаток |ПОМЕСТИТЬ ВТОтгруженныеНеоплаченные |ИЗ | РегистрНакопления.ВзаиморасчетыСПокупателями.Остатки( | &КонецПериода, | НЕ Счет В | (ВЫБРАТЬ | Т.Счет | ИЗ | ВТНеотгруженныеТовары КАК Т)) КАК ВзаиморасчетыСПокупателямиОстатки | |ИНДЕКСИРОВАТЬ ПО | Счет |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЗаказыПоСчетамОбороты.Счет КАК Счет, | ДОБАВИТЬКДАТЕ(ЗаказыПоСчетамОбороты.Период, ДЕНЬ, ЗаказыПоСчетамОбороты.Счет.СрокОплаты) КАК ДатаПланируемойОплаты, | СУММА(ЗаказыПоСчетамОбороты.КоличествоРасход) КАК КоличествоРасход |ПОМЕСТИТЬ ТЧЗаказы |ИЗ | РегистрНакопления.ЗаказыПоСчетам.Обороты( | , | &КонецПериода, | День, | Счет В | (ВЫБРАТЬ | Т.Счет | ИЗ | ВТОтгруженныеНеоплаченные КАК Т)) КАК ЗаказыПоСчетамОбороты | |СГРУППИРОВАТЬ ПО | ЗаказыПоСчетамОбороты.Счет, | ДОБАВИТЬКДАТЕ(ЗаказыПоСчетамОбороты.Период, ДЕНЬ, ЗаказыПоСчетамОбороты.Счет.СрокОплаты) | |ИНДЕКСИРОВАТЬ ПО | Счет |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВзаиморасчетыСПокупателямиОстаткиИОбороты.Период, | ВзаиморасчетыСПокупателямиОстаткиИОбороты.Контрагент КАК Контрагент, | ВзаиморасчетыСПокупателямиОстаткиИОбороты.Счет КАК Счет, | ВзаиморасчетыСПокупателямиОстаткиИОбороты.СуммаНачальныйОстаток, | ВзаиморасчетыСПокупателямиОстаткиИОбороты.СуммаКонечныйОстаток, | ТЧЗаказы.ДатаПланируемойОплаты, | ТЧЗаказы.Счет.Процент КАК ПроцентПени |ИЗ | РегистрНакопления.ВзаиморасчетыСПокупателями.ОстаткиИОбороты( | &НачалоНедели, | &КонецПериода, | День, | ДвиженияИГраницыПериода, | Счет В | (ВЫБРАТЬ | Т.Счет | ИЗ | ТЧЗаказы КАК Т)) КАК ВзаиморасчетыСПокупателямиОстаткиИОбороты | ЛЕВОЕ СОЕДИНЕНИЕ ТЧЗаказы КАК ТЧЗаказы | ПО ВзаиморасчетыСПокупателямиОстаткиИОбороты.Счет = ТЧЗаказы.Счет |ИТОГИ ПО | Контрагент, | Счет"; Запрос.УстановитьПараметр("КонецПериода", новый Граница(КонецНедели(Неделя), ВидГраницы.Включая)); Запрос.УстановитьПараметр("НачалоНедели", Неделя); Результат = Запрос.Выполнить(); ВыборкаКонтрагент = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаКонтрагент.Следующий() Цикл ВыборкаСчет = ВыборкаКонтрагент.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСчет.Следующий() Цикл ВыборкаДни = ВыборкаСчет.Выбрать(); СуммаПени = 0; ТекДата = Неделя; Пока ВыборкаДни.Следующий() Цикл Пока ТекДата<=ВыборкаДни.Период Цикл Если ТекДата> ВыборкаДни.ДатаПланируемойОплаты Тогда СуммаДолга = ?(ТекДата = ВыборкаДни.Период, ВыборкаДни.СуммаКонечныйОстаток,ВыборкаДни.СуммаНачальныйОстаток); СуммаПени = СуммаПени +1*ВыборкаДни.ПроцентПени/100*СуммаДолга; КонецЕсли; ТекДата = ТекДата+24*3600; КонецЦикла; КонецЦикла; Движение = Движения.ВзаиморасчетыСПокупателями.ДобавитьПриход(); Движение.Период = Дата; Движение.Контрагент = ВыборкаСчет.Контрагент; Движение.Счет = ВыборкаСчет.Счет; Движение.Сумма = СуммаПени; КонецЦикла; КонецЦикла; КонецПроцедуры Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Неделя = НачалоНедели(Неделя); КонецПроцедуры //ОтчетАнализСостоянияСчетов ВЫБРАТЬ ЗаказыПоСчетамОстатки.Счет КАК Счет, ЗаказыПоСчетамОстатки.Номенклатура, ЗаказыПоСчетамОстатки.КоличествоОстаток ПОМЕСТИТЬ ВтНеотгруженныеТовар ИЗ РегистрНакопления.ЗаказыПоСчетам.Остатки(&Период, ) КАК ЗаказыПоСчетамОстатки ИНДЕКСИРОВАТЬ ПО Счет ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МАКСИМУМ(ЗаказыПоСчетамОбороты.Период) КАК Период, ЗаказыПоСчетамОбороты.Счет, СУММА(ЗаказыПоСчетамОбороты.КоличествоРасход) КАК КоличествоРасход ПОМЕСТИТЬ ВТЗаказы ИЗ РегистрНакопления.ЗаказыПоСчетам.Обороты( , &Период, День, НЕ Счет В (ВЫБРАТЬ Т.Счет ИЗ ВтНеотгруженныеТовар КАК Т)) КАК ЗаказыПоСчетамОбороты СГРУППИРОВАТЬ ПО ЗаказыПоСчетамОбороты.Счет ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЕСТЬNULL(ВтНеотгруженныеТовар.Счет, ВТЗаказы.Счет) КАК Счет, ВТЗаказы.Период КАК ДатаПолнойОтгрузки ПОМЕСТИТЬ ТЧОбщая ИЗ ВтНеотгруженныеТовар КАК ВтНеотгруженныеТовар ПОЛНОЕ СОЕДИНЕНИЕ ВТЗаказы КАК ВТЗаказы ПО ВтНеотгруженныеТовар.Счет = ВТЗаказы.Счет ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВзаиморасчетыСПокупателямиОстатки.Счет, ВзаиморасчетыСПокупателямиОстатки.СуммаОстаток, ТЧОбщая.ДатаПолнойОтгрузки ИЗ РегистрНакопления.ВзаиморасчетыСПокупателями.Остатки( &Период, Счет В (ВЫБРАТЬ Т.Счет ИЗ ТЧОбщая КАК Т)) КАК ВзаиморасчетыСПокупателямиОстатки ПОЛНОЕ СОЕДИНЕНИЕ ТЧОбщая КАК ТЧОбщая ПО ВзаиморасчетыСПокупателямиОстатки.Счет = ТЧОбщая.Счет УПОРЯДОЧИТЬ ПО ТЧОбщая.Счет //ОтчетАнализСчета ВЫБРАТЬ ВзаиморасчетыСПокупателямиОстаткиИОбороты.Регистратор, ВзаиморасчетыСПокупателямиОстаткиИОбороты.СуммаПриход КАК Задолженность, ВзаиморасчетыСПокупателямиОстаткиИОбороты.СуммаРасход КАК Оплачено ИЗ РегистрНакопления.ВзаиморасчетыСПокупателями.ОстаткиИОбороты(, , Регистратор, , {(Счет = &Счет)}) КАК ВзаиморасчетыСПокупателямиОстаткиИОбороты //1.26 Компания занимается оптовой торговлей. Взаиморасчеты с покупателями ведутся в разрезе счетов. //Покупателю выставляется счет, на основании которого далее происходит отгрузка документами «Расходная накладная», причем накладных по одному счету может быть несколько. //Считается, что товар по счету в конце концов будет отгружен полностью, а накладные могут быть только на основании счета. //При выставлении счета каждый раз оговаривается срок (количество дней), в который покупател должен оплатить товар, причем срок отсчитывается относительно даты полной отгрузки товара по этому счету. //В том случае, если товар по счету отгружен полностью, срок оплаты истек, а покупатель оплатил не до конца, ему насчитываются пени. //Для расчета пеней пользователями раз в неделю формируется документ «Пени», в котором автоматически должны рассчитываться пени по формуле: «Кол-во дней просрочки» * «% пени» * «оставшаяся сумма долга по счету». //Просрочка отсчитывается от даты полной отгрузки плюс срок оплаты (из счета). Процент пеней также указывается в каждом счете. //Пени на пени не начисляются. Складской учет товаров не ведется. //Можно считать, что документы задним числом не вводятся, но существующие документы могут перепроводиться. //При поступлении оплаты (документ «Приход денег») в первую очередь покрывается задолженность по пеням, а уже потом оставшаяся сумма засчитывается как оплата товара. //В документе «Приход денег» указывается покупатель, общая сумма платежа и перечень оплачиваемых счетов, а распределение по задолженности должно происходить автоматически при проведении документа. //Следует считать, что переплат нет, т.е. по каждому счету контрагент заплатит не больше своей задолженности. //Авансовых платежей нет. Распределение оплат должно происходить согласно дате выставления счета, начиная с самого раннего недооплаченного счета. //Необходимо построить отчет для анализа состояния счетов на выбранную дату и анализ счета за период. // //СоздаемСпр Контрагенты. В шапку расходной добавляем Счет и контрагента. //Создаем док.Счет (СрокОплаты, Процент,СуммаПоДокументу,Контрагент. тчСписокНоменклатуры Номенклатура,Количество,Цена,Сумма.) //Создаем док ПриходДенег (рекв.СуммаОплаты,Контрагент). ТЧ СписокСчетов (рекв.Счет). //Создаем док Пени (рекв.Неделя - дата). РН ЗаказыПоСчетам (остатки, Счет, Номенклатура, количество). //РН ВзаиморасчетыСПокупателями (остатки, Счет,Контрагент, Сумма, СуммаПеня) //ДокРасходная Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Счет") Тогда // Заполнение шапки Контрагент = ДанныеЗаполнения.Контрагент; Счет = ДанныеЗаполнения.Ссылка; СуммаПоДокументу = ДанныеЗаполнения.СуммаПоДокументу; Для Каждого ТекСтрокаСписокНоменклатуры Из ДанныеЗаполнения.СписокНоменклатуры Цикл НоваяСтрока = СписокНоменклатуры.Добавить(); НоваяСтрока.Количество = ТекСтрокаСписокНоменклатуры.Количество; НоваяСтрока.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; НоваяСтрока.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; НоваяСтрока.Цена = ТекСтрокаСписокНоменклатуры.Цена; КонецЦикла; КонецЕсли; //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ЗаказыПоСчетам.Записывать = Истина; Движения.ЗаказыПоСчетам.БлокироватьДляИзменения = Истина; Движения.ВзаиморасчетыСПокупателями.Записывать = Истина; Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.ЗаказыПоСчетам.ДобавитьРасход(); ЗаполнитьЗначенияСвойств(Движение, ЭлементТЧ); Движение.Период = Дата; Движение.Счет = Счет; КонецЦикла; Движения.ЗаказыПоСчетам.Записать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЗаказыПоСчетамОстатки.Счет, | ЗаказыПоСчетамОстатки.Номенклатура, | ЗаказыПоСчетамОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ЗаказыПоСчетам.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т) | И Счет = &Счет) КАК ЗаказыПоСчетамОстатки |ГДЕ | ЗаказыПоСчетамОстатки.КоличествоОстаток < 0"; Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени(), ВидГраницы.Включая)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Счет", Счет); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Если Не Результат.Пустой() Тогда Отказ = Истина; Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаДетальныеЗаписи.Номенклатура +" по счету "+Счет+" недостаточно."; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); КонецЦикла; КонецЕсли; Если Не Отказ Тогда Движение = Движения.ВзаиморасчетыСПокупателями.ДобавитьПриход(); Движение.Контрагент = Контрагент; Движение.Период = Дата; Движение.Сумма = СуммаПоДокументу; Движение.Счет = Счет; КонецЕсли; КонецПроцедуры //ДокСчет Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ЗаказыПоСчетам Приход Движения.ЗаказыПоСчетам.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ЗаказыПоСчетам.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Счет = Ссылка; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокПриходДенег Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ВзаиморасчетыСПокупателями.Записывать = Истина; Движения.ВзаиморасчетыСПокупателями.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСПокупателями"); ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокСчетов; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Счет", "Счет"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходДенегСписокСчетов.Счет КАК Счет |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПриходДенег.СписокСчетов КАК ПриходДенегСписокСчетов |ГДЕ | ПриходДенегСписокСчетов.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ПриходДенегСписокСчетов.Счет | |ИНДЕКСИРОВАТЬ ПО | Счет |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВзаиморасчетыСПокупателямиОстатки.Счет, | ВзаиморасчетыСПокупателямиОстатки.Контрагент, | ВзаиморасчетыСПокупателямиОстатки.СуммаОстаток КАК СуммаОстаток, | ВзаиморасчетыСПокупателямиОстатки.СуммаПеняОстаток КАК СуммаПеняОстаток |ИЗ | РегистрНакопления.ВзаиморасчетыСПокупателями.Остатки( | &МоментВремени, | Счет В | (ВЫБРАТЬ | Т.Счет | ИЗ | ТЧДок КАК Т) | И Контрагент = &Контрагент) КАК ВзаиморасчетыСПокупателямиОстатки | |УПОРЯДОЧИТЬ ПО | ВзаиморасчетыСПокупателямиОстатки.Счет.МоментВремени |ИТОГИ | СУММА(СуммаОстаток), | СУММА(СуммаПеняОстаток) |ПО | ОБЩИЕ"; Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено,МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ВыборкаОбщийИтог.Следующий(); // Общий итог НеобходимоОплатить = ВыборкаОбщийИтог.СуммаОстаток +ВыборкаОбщийИтог.СуммаПеняОстаток; Если СуммаОплаты > НеобходимоОплатить Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Сумма оплаты в размере "+СуммаОплаты + " превышает сумму, необходимую оплатить "+НеобходимоОплатить; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; Возврат; КонецЕсли; ВыборкаДетальныеЗаписи = ВыборкаОбщийИтог.Выбрать(); СуммаСписать = СуммаОплаты; Пока ВыборкаДетальныеЗаписи.Следующий() и СуммаСписать >0 Цикл Движение = Движения.ВзаиморасчетыСПокупателями.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Счет = ВыборкаДетальныеЗаписи.Счет; Движение.СуммаПеня = Мин(ВыборкаДетальныеЗаписи.СуммаПеняОстаток, СуммаСписать); СуммаСписать = СуммаСписать - Движение.СуммаПеня; Движение.Сумма = Мин (ВыборкаДетальныеЗаписи.СуммаОстаток, СуммаСписать); СуммаСписать = СуммаСписать - Движение.Сумма; КонецЦикла; КонецПроцедуры //ДокПени Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ВзаиморасчетыСПокупателями.Записывать = Истина; Движения.ВзаиморасчетыСПокупателями.Записать(); Движения.ВзаиморасчетыСПокупателями.БлокироватьДляИзменения = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗаказыПоСчетамОстатки.Счет КАК Счет, | ЗаказыПоСчетамОстатки.КоличествоОстаток |ПОМЕСТИТЬ ВТНеотгруженныеТовары |ИЗ | РегистрНакопления.ЗаказыПоСчетам.Остатки(&КонецПериода, ) КАК ЗаказыПоСчетамОстатки | |ИНДЕКСИРОВАТЬ ПО | Счет |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВзаиморасчетыСПокупателямиОстатки.Счет КАК Счет, | ВзаиморасчетыСПокупателямиОстатки.СуммаОстаток |ПОМЕСТИТЬ ВТОтгруженныеНеоплаченные |ИЗ | РегистрНакопления.ВзаиморасчетыСПокупателями.Остатки( | &КонецПериода, | НЕ Счет В | (ВЫБРАТЬ | Т.Счет | ИЗ | ВТНеотгруженныеТовары КАК Т)) КАК ВзаиморасчетыСПокупателямиОстатки | |ИНДЕКСИРОВАТЬ ПО | Счет |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЗаказыПоСчетамОбороты.Счет КАК Счет, | ЗаказыПоСчетамОбороты.КоличествоРасход, | ДОБАВИТЬКДАТЕ(ЗаказыПоСчетамОбороты.Период, ДЕНЬ, ЗаказыПоСчетамОбороты.Счет.СрокОплаты) КАК ДатаПланируемойОплаты |ПОМЕСТИТЬ ВТЗаказы |ИЗ | РегистрНакопления.ЗаказыПоСчетам.Обороты( | , | &КонецПериода, | День, | Счет В | (ВЫБРАТЬ | Т.Счет | ИЗ | ВТОтгруженныеНеоплаченные КАК Т)) КАК ЗаказыПоСчетамОбороты | |ИНДЕКСИРОВАТЬ ПО | Счет |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВзаиморасчетыСПокупателямиОстаткиИОбороты.Счет КАК Счет, | ВзаиморасчетыСПокупателямиОстаткиИОбороты.Контрагент КАК Контрагент, | ВзаиморасчетыСПокупателямиОстаткиИОбороты.Период, | ВзаиморасчетыСПокупателямиОстаткиИОбороты.СуммаНачальныйОстаток КАК НачОст, | ВзаиморасчетыСПокупателямиОстаткиИОбороты.СуммаКонечныйОстаток КАК КонОст, | ВТЗаказы.ДатаПланируемойОплаты, | ЕСТЬNULL(ВТЗаказы.Счет.Процент, 0) КАК ПроцентПени |ИЗ | РегистрНакопления.ВзаиморасчетыСПокупателями.ОстаткиИОбороты( | &НачалоНедели, | &КонецПериода, | День, | ДвиженияИГраницыПериода, | Счет В | (ВЫБРАТЬ | Т.Счет | ИЗ | ВтЗаказы КАК Т)) КАК ВзаиморасчетыСПокупателямиОстаткиИОбороты | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТЗаказы КАК ВТЗаказы | ПО ВзаиморасчетыСПокупателямиОстаткиИОбороты.Счет = ВТЗаказы.Счет |ИТОГИ ПО | Контрагент, | Счет"; Запрос.УстановитьПараметр("КонецПериода", Новый Граница(КонецНедели(Неделя), ВидГраницы.Включая)); Запрос.УстановитьПараметр("НачалоНедели", Неделя); Результат = Запрос.Выполнить(); ВыборкаКонтрагент = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаКонтрагент.Следующий() Цикл // Вставить обработку выборки ВыборкаКонтрагент ВыборкаСчет = ВыборкаКонтрагент.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСчет.Следующий() Цикл // Вставить обработку выборки ВыборкаСчет СуммаПени = 0; ТекДень = Неделя; ВыборкаДни = ВыборкаСчет.Выбрать(); Пока ВыборкаДни.Следующий() Цикл Пока ТекДень<= ВыборкаДни.Период цикл Если ТекДень> ВыборкаДни.ДатаПланируемойОплаты Тогда СуммаДолга = ?(ТекДень = ВыборкаДни.Период , ВыборкаДни.КонОст, ВыборкаДни.НачОст); СуммаПени = СуммаПени+1*ВыборкаДни.ПроцентПени/100*СуммаДолга; КонецЕсли; ТекДень = ТекДень+24*3600; КонецЦикла; КонецЦикла; Движение = Движения.ВзаиморасчетыСПокупателями.ДобавитьПриход(); Движение.Период = Дата; Движение.Контрагент = ВыборкаСчет.Контрагент; Движение.Счет = ВыборкаСчет.Счет; Движение.СуммаПеня = СуммаПени; КонецЦикла; КонецЦикла; КонецПроцедуры Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Неделя = НачалоНедели( Неделя); КонецПроцедуры //тчет АнализСостоянияСчетов ВЫБРАТЬ ЗаказыПоСчетамОстатки.Счет, ЗаказыПоСчетамОстатки.КоличествоОстаток ПОМЕСТИТЬ ВТНеотгруженныеСчета ИЗ РегистрНакопления.ЗаказыПоСчетам.Остатки(&Период, ) КАК ЗаказыПоСчетамОстатки ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МАКСИМУМ(ЗаказыПоСчетамОбороты.Период) КАК Период, ЗаказыПоСчетамОбороты.Счет, СУММА(ЗаказыПоСчетамОбороты.КоличествоРасход) КАК КоличествоРасход ПОМЕСТИТЬ ВТЗаказы ИЗ РегистрНакопления.ЗаказыПоСчетам.Обороты( , &Период, День, НЕ Счет В (ВЫБРАТЬ Т.Счет ИЗ ВТНеотгруженныеСчета КАК Т)) КАК ЗаказыПоСчетамОбороты СГРУППИРОВАТЬ ПО ЗаказыПоСчетамОбороты.Счет ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЕСТЬNULL(ВТНеотгруженныеСчета.Счет, ВТЗаказы.Счет) КАК Счет, ВТЗаказы.Период КАК ДатаПолнойОтгрузки ПОМЕСТИТЬ ТЧобщая ИЗ ВТНеотгруженныеСчета КАК ВТНеотгруженныеСчета ПОЛНОЕ СОЕДИНЕНИЕ ВТЗаказы КАК ВТЗаказы ПО ВТНеотгруженныеСчета.Счет = ВТЗаказы.Счет ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВзаиморасчетыСПокупателямиОстатки.Счет КАК Счет, ВзаиморасчетыСПокупателямиОстатки.СуммаОстаток КАК ЗадолженностьПоСчету, ВзаиморасчетыСПокупателямиОстатки.СуммаПеняОстаток КАК ЗадолженностьПоПеням, ТЧобщая.ДатаПолнойОтгрузки ИЗ РегистрНакопления.ВзаиморасчетыСПокупателями.Остатки( &Период, Счет В (ВЫБРАТЬ Т.Счет ИЗ ТЧОбщая КАК Т)) КАК ВзаиморасчетыСПокупателямиОстатки ПОЛНОЕ СОЕДИНЕНИЕ ТЧобщая КАК ТЧобщая ПО ВзаиморасчетыСПокупателямиОстатки.Счет = ТЧобщая.Счет УПОРЯДОЧИТЬ ПО Счет //ОтчетАнализСчета ВЫБРАТЬ ВзаиморасчетыСПокупателямиОстаткиИОбороты.Счет, ВзаиморасчетыСПокупателямиОстаткиИОбороты.Контрагент, ВзаиморасчетыСПокупателямиОстаткиИОбороты.СуммаПриход КАК Отгружено, ВзаиморасчетыСПокупателямиОстаткиИОбороты.СуммаРасход КАК Оплачено, ВзаиморасчетыСПокупателямиОстаткиИОбороты.Регистратор, ВзаиморасчетыСПокупателямиОстаткиИОбороты.СуммаПеняОборот КАК Пени ИЗ РегистрНакопления.ВзаиморасчетыСПокупателями.ОстаткиИОбороты(, , Регистратор, , {(Счет = &Счет)}) КАК ВзаиморасчетыСПокупателямиОстаткиИОбороты //1.27 Компания занимается оптовой торговлей. //Отгрузка товаров покупателю отражается документом «Расходная накладная», причем каждая накладная может быть выставлена в своей валюте. //Оплата от покупателя приходит в рублях и отражается документом «Приход денег». //Одна оплата может относиться к нескольким накладным, в этом случае при проведении документа автоматически закрывается долг покупателя по отгрузке, начиная с самой ранней недоплаченной накладной и т.д. //Курс валюты берется на дату оплаты. В том случае, если сумма оплат превышает долг по отгрузке, то эта переплата засчитывается как аванс. //При отгрузке товара необходимо проверять наличие аванса от покупателя. //Если есть аванс, то он засчитывается как оплата накладной по курсу на дату накладной. //Складской учет товаров не ведется. Необходимо построить отчеты по взаиморасчетам за период и по продажам за период в произвольной валюте. // //В шапку расходной доб. Контрагент, Валюта. //РН ВзаиморасчетыСКонтрагентами (Изм.Накладная, Контрагент, Валюта, рес.Сумма.) РН Продажи (изм. Контрагент, рес.Сумма.) //Создаем док.ПриходДенег (рекв.СуммаПоДокументу,КОнтрагент) //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина; Движения.ВзаиморасчетыСКонтрагентами.Записать(); Движения.Продажи.Записывать = Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСКонтрагентами"); ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); СтруктураКурса = Новый Структура; СтруктураКурса.Вставить("Валюта", Валюта); КурсПоДокументу = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата,СтруктураКурса); СуммаПоКурсу = КурсПоДокументу.Курс*СуммаПоДокументу; СписатьСумма = СуммаПоКурсу; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВзаиморасчетыСКонтрагентамиОстатки.Накладная, | ВзаиморасчетыСКонтрагентамиОстатки.Контрагент, | ВзаиморасчетыСКонтрагентамиОстатки.Валюта, | ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток |ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки( | &МоментВремени, | Контрагент = &Контрагент | И Накладная = ЗНАЧЕНИЕ(Документ.РасходнаяНакладная.ПустаяСсылка)) КАК ВзаиморасчетыСКонтрагентамиОстатки"; Запрос.УстановитьПараметр("Контрагент" , Контрагент); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() и СписатьСумма>0 Цикл Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход(); Движение.Период = Дата; Движение.Валюта = ВыборкаДетальныеЗаписи.Валюта; Движение.Контрагент = Контрагент; Движение.Сумма = Мин(ВыборкаДетальныеЗаписи.СуммаОстаток, СписатьСумма); СписатьСумма = СписатьСумма - Движение.Сумма; КонецЦикла; Если СписатьСумма >0 ТОгда Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход(); Движение.Период = Дата; Движение.Накладная = Ссылка; Движение.Валюта = Валюта; Движение.Контрагент = Контрагент; Движение.Сумма = СписатьСумма/КурсПоДокументу.Курс; КонецЕсли; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Сумма = СуммаПоКурсу; КонецПроцедуры //ДокПриходДенег Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина; Движения.ВзаиморасчетыСКонтрагентами.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСКонтрагентами"); ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВзаиморасчетыСКонтрагентамиОстатки.Накладная КАК Накладная, | ВзаиморасчетыСКонтрагентамиОстатки.Контрагент КАК Контрагент, | ВзаиморасчетыСКонтрагентамиОстатки.Валюта КАК Валюта, | ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток, | ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) КАК Курс |ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&МоментВремени, Контрагент = &Контрагент) КАК ВзаиморасчетыСКонтрагентамиОстатки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&МоментВремени, ) КАК КурсыВалютСрезПоследних | ПО ВзаиморасчетыСКонтрагентамиОстатки.Валюта = КурсыВалютСрезПоследних.Валюта | |УПОРЯДОЧИТЬ ПО | ВзаиморасчетыСКонтрагентамиОстатки.Накладная.МоментВремени |ИТОГИ ПО | Контрагент, | Накладная"; Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено,МоментВремени())); Результат = Запрос.Выполнить(); ВыборкаКонтрагент = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); СуммаСписать = СуммаПоДокументу; Пока ВыборкаКонтрагент.Следующий() Цикл ВыборкаНакладная = ВыборкаКонтрагент.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНакладная.Следующий() Цикл ВыборкаДетальныеЗаписи = ВыборкаНакладная.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() и СуммаСписать >0 Цикл СуммаОстРубль = ВыборкаДетальныеЗаписи.СуммаОстаток * ВыборкаДетальныеЗаписи.Курс; СуммаСУчетомКурса = Мин(СуммаОстРубль, СуммаСписать); Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход(); Движение.Период = Дата; Движение.Валюта = ВыборкаДетальныеЗаписи.Валюта; Движение.Контрагент = ВыборкаДетальныеЗаписи.Контрагент; Движение.Накладная = ВыборкаДетальныеЗаписи.Накладная; Движение.Сумма = СуммаСУчетомКурса/ВыборкаДетальныеЗаписи.Курс; СуммаСписать = СуммаСписать - СуммаСУчетомКурса; КонецЦикла; КонецЦикла; КонецЦикла; Если СуммаСписать >0 Тогда Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход(); Движение.Период = Дата; Движение.Валюта = Справочники.Валюты.РоссийскийРубль; Движение.Контрагент = Контрагент; Движение.Сумма = СуммаСписать; КонецЕсли; КонецПроцедуры //ОтчетВзаиморасчетыЗаПериод ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Валюта, ВЫБОР КОГДА ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Накладная = ЗНАЧЕНИЕ(Документ.РасходнаяНакладная.ПустаяСсылка) ТОГДА "аванс" ИНАЧЕ ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Накладная КОНЕЦ КАК Накладная, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаНачальныйОстаток, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаПриход КАК Отгружено, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаРасход КАК Оплачено, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаКонечныйОстаток ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты //ОтчетПродажи ВЫБРАТЬ ВложенныйЗапрос.Курс, ВложенныйЗапрос.Период КАК Период ПОМЕСТИТЬ КурсыВалют ИЗ (ВЫБРАТЬ КурсыВалютСрезПоследних.Курс КАК Курс, &НачалоПериода КАК Период ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&НачалоПериода, Валюта = &Валюта) КАК КурсыВалютСрезПоследних ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ КурсыВалют.Курс, КурсыВалют.Период ИЗ РегистрСведений.КурсыВалют КАК КурсыВалют ГДЕ КурсыВалют.Валюта = &Валюта И КурсыВалют.Период > &НачалоПериода И КурсыВалют.Период <= &КонецПериода) КАК ВложенныйЗапрос СГРУППИРОВАТЬ ПО ВложенныйЗапрос.Курс, ВложенныйЗапрос.Период ИНДЕКСИРОВАТЬ ПО Период ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПродажиОбороты.Контрагент, ПродажиОбороты.СуммаОборот КАК СуммаРуб, ВЫБОР КОГДА ЕСТЬNULL(КурсыВалют.Курс, 0) <> 0 ТОГДА ПродажиОбороты.СуммаОборот / КурсыВалют.Курс ИНАЧЕ 110 КОНЕЦ КАК СуммаВал ИЗ РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК ПродажиОбороты ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалют ПО ПродажиОбороты.Период >= КурсыВалют.Период //1.28 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. //И услуги и товары указываются в одной табличной части. Складской учет товаров не ведется. //При проведении расходной накладной необходимо в первую очередь контролировать хватает ли товара вообще. //Если нет – выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //Списание себестоимости товаров должно быть организовано по партиям, в зависимости от текущего значения принятого на этот год в учетной политике метода списания себестоимости (FIFO или LIFO). //Еще раз подчеркивается – учетная политика действует год. //На следующий год метод списания может смениться. //Затраты на закупку вводятся отдельным документам «Дополнительные затраты» с указанием суммы затрат и партии (партия указана в шапке документа). //Сумма затрат увеличивает себестоимость товара партии пропорционально количеству товара. //Если какой-либо товар из этой партии уже продан, то себестоимость продажи должна быть скорректирована, согласно проданному количеству без перепроведения документа продажи. //Документ «Дополнительные затраты» не будет сниматься с проведения. //Следует считать, что документы задним числом вводить нельзя, но можно перепроводить существующие документы. //Необходимо построить отчет по продажам товаров за период и остаткам товара на указанную дату. //В отчетах себестоимость должна отражаться с учетом распределенных затрат, вне зависимости от того, в каком периоде был введен документ «Дополнительные затраты». // //В спрНоменклатуру добавляем рекв.ВидНоменклатуры. //Создаем докДополнительныеЗатраты (рекв. Партия, СуммаПоДокументу). //Создаем РС УчетнаяПолитика в пределах года(рес.МетодСписания.). ОстаткиНоменклатуры (изм. Номеклатура, Партия, рес.Количество,СТоимость, ДопЗатрата) //РН Продажи (изм. Номенклатура, рес. Количесвто,Сумма,Стоимость,ДопЗатрата) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Партия = Ссылка; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания; Если МетодСписания.Пустая() Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не установлена учетная политика. По умолчанию метод списания ФИФО"; Сообщение.Сообщить(); КонецЕсли; Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда ПорядокСортировки = " УБЫВ"; Иначе ПорядокСортировки = ""; КонецЕсли; Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры |ПОМЕСТИТЬ ВТТовары |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | ВидНоменклатуры |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТТовары.Номенклатура КАК Номенклатура, | ВТТовары.Количество КАК ДокументКоличество, | ВТТовары.Сумма КАК ДокументСумма, | ВТТовары.ВидНоменклатуры КАК ВидНоменклатуры, | ОстаткиНоменклатурыОстатки.Партия, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток |ИЗ | ВТТовары КАК ВТТовары | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | РасходнаяНакладная.Номенклатура | ИЗ | ВТТовары КАК РасходнаяНакладная | ГДЕ | РасходнаяНакладная.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар))) КАК ОстаткиНоменклатурыОстатки | ПО ВТТовары.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.МоментВремени |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | МАКСИМУМ(ВидНоменклатуры), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Себестоимость = 0; Если ВыборкаНоменклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда ДокументКоличество = ВыборкаНоменклатура.ДокументКоличество; КоличествоОстаток = ВыборкаНоменклатура.КоличествоОстаток; Если ДокументКоличество > КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура +" с количеством "+ДокументКоличество+" недостаточно. На остатке:"+КоличествоОстаток; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ДокументКоличество; Пока ВыборкаДетальныеЗаписи.Следующий() и КоличествоСписать>0 Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Партия = ВыборкаДетальныеЗаписи.Партия; Движение.Количество = МИН(ВыборкаДетальныеЗаписи.КоличествоОстаток, КоличествоСписать); Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстаток > КоличествоСписать, КоличествоСписать*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); КоличествоСписать = КоличествоСписать - Движение.Количество; Себестоимость = Себестоимость+ Движение.Стоимость; КонецЦикла; КонецЕсли; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Стоимость = Себестоимость; Движение.Количество = ВыборкаНоменклатура.ДокументКоличество; Движение.Сумма = ВыборкаНоменклатура.ДокументСумма; КонецЦикла; КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.УстановитьЗначение("Партия", Партия); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОстаткиНоменклатурыОбороты.Номенклатура КАК Номенклатура, | ОстаткиНоменклатурыОбороты.Партия, | ОстаткиНоменклатурыОбороты.КоличествоПриход КАК КоличествоПриход, | ОстаткиНоменклатурыОбороты.КоличествоРасход КАК КоличествоРасход, | ОстаткиНоменклатурыОбороты.Период КАК Период |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Обороты(, , Регистратор, Партия = &Партия) КАК ОстаткиНоменклатурыОбороты |ИТОГИ | СУММА(КоличествоПриход), | СУММА(КоличествоРасход) |ПО | ОБЩИЕ"; Запрос.УстановитьПараметр("Партия" , Партия); Результат = Запрос.Выполнить(); СуммаСписать = СуммаПоДокументу; ВыборкаОбщиеИтоги = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ВыборкаОбщиеИтоги.Следующий(); ОбщееКоличество = ВыборкаОбщиеИтоги.КоличествоПриход; ВыборкаДетальныеЗаписи = ВыборкаОбщиеИтоги.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если ВыборкаДетальныеЗаписи.КоличествоПриход >0 Тогда Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход(); Движение.Период = ВыборкаДетальныеЗаписи.Период; Движение.Партия = Партия; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.ДопЗатрата = СуммаПоДокументу * ВыборкаДетальныеЗаписи.КоличествоПриход / ОбщееКоличество; КонецЕсли; Если ВыборкаДетальныеЗаписи.КоличествоРасход >0 Тогда Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = ВыборкаДетальныеЗаписи.Период-1; Движение.Партия = Партия; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.ДопЗатрата = СуммаПоДокументу * ВыборкаДетальныеЗаписи.КоличествоРасход / ОбщееКоличество; Себестоимость = Движение.ДопЗатрата; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.ДопЗатрата = Себестоимость; КонецЕсли; КонецЦикла; КонецПроцедуры //ОтчетПродажи ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СуммаОборот КАК Продажа, ПродажиОбороты.СтоимостьОборот + ПродажиОбороты.ДопЗатратаОборот КАК Себестоимость, ПродажиОбороты.ДопЗатратаОборот ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты //ОтчетОстаткиТоваров ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.Партия, ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество, ОстаткиНоменклатурыОстатки.СтоимостьОстаток + ОстаткиНоменклатурыОстатки.ДопЗатратаОстаток КАК Стоимость ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки //1.29 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. //И услуги и товары указываются в одной табличной части. Складской учет товаров не ведется. //При проведении расходной накладной необходимо в первую очередь контролировать хватает ли товара вообще. //Если нет – выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //Списание себестоимости товаров должно быть организовано по партиям, в зависимости от текущего значения принятого на этот год в учетной политике метода списания себестоимости (FIFO или LIFO). //Еще раз подчеркивается – учетная политика действует год. //На следующий год метод списания может смениться. //Затраты на закупку вводятся отдельным документам «Дополнительные затраты» с указанием суммы затрат и партии (партии указаны в табличной части). //Сумма затрат увеличивает себестоимость товара партии пропорционально количеству товара. //Следует считать, что затраты вводятся до того, как этот товар будет списан. //При продаже себестоимость товара рассчитывается с учетом дополнительных затрат. //Документ «Дополнительные затраты» может сниматься с проведения или корректироваться задним числом. //В этом случае, если товар был уже продан, то его себестоимость должна быть скорректирована без перепроведения самих документов продажи. //Необходимо построить отчет по продажам товаров за период и остаткам товара на указанную дату. //В отчетах себестоимость должна отражаться с учетом распределенных затрат, вне зависимости от того, в каком периоде был введен документ «Дополнительные затраты». //СоздаемОбщийМодуль РасчетСебестоимости (сервер). Процедура ПересчетСебестоимости(Источник) Набор = Источник.Движения.ОстаткиНоменклатуры; Набор.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = Источник.СписокПартий; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Партия", "Партия"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеЗатратыСписокПартий.Партия КАК Партия |ПОМЕСТИТЬ ТЧДОК |ИЗ | Документ.ДополнительныеЗатраты.СписокПартий КАК ДополнительныеЗатратыСписокПартий |ГДЕ | ДополнительныеЗатратыСписокПартий.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ДополнительныеЗатратыСписокПартий.Партия | |ИНДЕКСИРОВАТЬ ПО | Партия |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиНоменклатурыОбороты.Регистратор |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Обороты( | , | , | Регистратор, | Партия В | (ВЫБРАТЬ | Т.Партия | ИЗ | ТЧДОК КАК Т)) КАК ОстаткиНоменклатурыОбороты"; Запрос.УстановитьПараметр("Ссылка",Источник.Ссылка); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл ДокОбъект = ВыборкаДетальныеЗаписи.Регистратор.ПолучитьОбъект(); ДокОбъект.Записать(РежимЗаписиДокумента.Проведение); КонецЦикла; КонецПроцедуры Процедура ПодпискаНаСобытие1ОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт ПересчетСебестоимости(Источник); КонецПроцедуры Процедура УдалениеОбработкаУдаленияПроведения(Источник, Отказ) Экспорт ПересчетСебестоимости(Источник); КонецПроцедуры //Создаем док ДополнительныеЗатраты (тч СписокПартий - Партия, Сумма) //Создаем подписку на событие ПодпискаНаСобытиеПроведениеДокРеализации (Источник ДокументОбъект.ДополнительныеЗатраты, ОбработкаПроведения, РасчетСебестоимости.ПодпискаНаСобытие1ОбработкаПроведения) //СоздаемПодпмскуНАСобитые Удаление (Источник ДокументОбъект.ДополнительныеЗатраты, ОбработкаУдаленияПроведения, Обработчик: РасчетСебестоимости.УдалениеОбработкаУдаленияПроведения). //В СпрНоменклатура добавляем реквизит ВидНоменклатуры. Создаем РС УчетнаяПолитика В пределах года (рес. методСписания). ОстаткиНоменклатуры (номенклатура, партия, количество, Стоимость). РН Продажи (Номенклатура, Количество, Стоимость,Сумма). //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Партия = Ссылка; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; КонецПроцедуры //ДкРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания; Если МетодСписания.Пустая() Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не установлена учетная политика. По-умолчания метод списания :ФИФО"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); КонецЕсли; Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда ПорядокСортировки = " УБЫВ"; Иначе ПорядокСортировки = ""; КонецЕсли; Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать=Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | ВидНоменклатуры |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ТЧДок.ВидНоменклатуры КАК ВидНоменклатуры, | ОстаткиНоменклатурыОстатки.Партия, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток,0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток,0) КАК СтоимостьОстаток |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ТЧ.Номенклатура | ИЗ | ТЧДок КАК ТЧ | ГДЕ | ТЧ.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар))) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.МоментВремени "+ПорядокСортировки+" |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | МАКСИМУМ(ВидНоменклатуры), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Себестоимость = 0; Если ВыборкаНоменклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда Если ВыборкаНоменклатура.ДокументКоличество >ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура +"с количеством "+ВыборкаНоменклатура.ДокументКоличество+" недостаточно.На остатке:"+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ВыборкаНоменклатура.ДокументКоличество; Пока ВыборкаДетальныеЗаписи.Следующий() И КоличествоСписать>0 Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Партия = ВыборкаДетальныеЗаписи.Партия; Движение.Период = Дата; Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстаток, КоличествоСписать); Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстаток >КоличествоСписать, КоличествоСписать*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); Себестоимость = Себестоимость + Движение.Стоимость; КоличествоСписать = КоличествоСписать - Движение.Количество; КонецЦикла; КонецЕсли; Движение = Движения.Продажи.Добавить(); Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Период = Дата; Движение.Количество = ВыборкаНоменклатура.ДокументКоличество; Движение.Сумма = ВыборкаНоменклатура.ДокументСумма; Движение.Стоимость = Себестоимость; КонецЦикла; КонецПроцедуры //ДокДополнительныеЗатраты Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокПартий; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Партия", "Партия"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокПартий.Партия КАК Партия, | СУММА(СписокПартий.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ДополнительныеЗатраты.СписокПартий КАК СписокПартий |ГДЕ | СписокПартий.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокПартий.Партия | |ИНДЕКСИРОВАТЬ ПО | Партия |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Партия КАК Партия, | ТЧДок.Сумма КАК ДокументСумма, | ЕСТЬNULL(ОстаткиНоменклатурыОбороты.КоличествоПриход, 0) КАК КоличествоПриход, | ЕСТЬNULL(ОстаткиНоменклатурыОбороты.КоличествоРасход, 0) КАК КоличествоРасход, | ОстаткиНоменклатурыОбороты.Номенклатура, | ОстаткиНоменклатурыОбороты.Период |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Обороты( | , | , | Регистратор, | Партия В | (ВЫБРАТЬ | Т.Партия | ИЗ | ТЧДок КАК Т) | И Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)) КАК ОстаткиНоменклатурыОбороты | ПО ТЧДок.Партия = ОстаткиНоменклатурыОбороты.Партия |ИТОГИ | МАКСИМУМ(ДокументСумма), | СУММА(КоличествоПриход), | СУММА(КоличествоРасход) |ПО | Партия"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаПартия = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаПартия.Следующий() Цикл // Вставить обработку выборки ВыборкаПартия ОбщийПриход = ВыборкаПартия.КоличествоПриход; ВыборкаДетальныеЗаписи = ВыборкаПартия.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если ВыборкаДетальныеЗаписи.КоличествоПриход >0 Тогда Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход(); Движение.Период = ВыборкаДетальныеЗаписи.Период; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Партия = ВыборкаДетальныеЗаписи.Партия; Движение.Стоимость = ВыборкаДетальныеЗаписи.ДокументСумма* ВыборкаДетальныеЗаписи.КоличествоПриход/ОбщийПриход; КонецЕсли; Если ВыборкаДетальныеЗаписи.КоличествоРасход >0 Тогда Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = ВыборкаДетальныеЗаписи.Период; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Партия = ВыборкаДетальныеЗаписи.Партия; Движение.Стоимость = ВыборкаДетальныеЗаписи.ДокументСумма* ВыборкаДетальныеЗаписи.КоличествоРасход/ОбщийПриход; Себестоимость = Движение.Стоимость; Движение = Движения.Продажи.Добавить(); Движение.Период = ВыборкаДетальныеЗаписи.Период; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Стоимость = Себестоимость; КонецЕсли; КонецЦикла; КонецЦикла; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записать(); КонецПроцедуры //1.30 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Закупка товара происходит только в отдел закупок, а непосредственно продажа происходит в торговых точках. //Перемещение товара происходит по трансфертной цене и также отражается документом «Расходная накладная», при этом цена продажи не указывается. //Товар может перемещаться только из отдела закупок в торговую точку. //Трансфертная цена определяется как себестоимость перемещаемого товара, увеличенная на сумму наценки. //Сумма наценки задается в виде шкалы задаваемый для каждой торговой точки и может быть отредактирована пользователем в режиме «1С:Предприятие». //При продаже товара необходимо в первую очередь контролировать хватает ли товара в данной торговой точке. //Если нет – необходимо не создавая документ для перемещения товаров добавить соответствующие движения в регистре для передачи товара по трансфертной цене. //В том случае, когда и в отделе закупок товара не хватает, продажа не производится (документ не проводится). //Себестоимость товаров рассчитывается как средняя по отделу. Необходимо построить отчет по движениям товаров за период по количеству и сумме. // //В шапку расходной добавляем Продажа (булеов), Подразделение (подразделение). //РН ОстаткиНоменклатуры (Номенклатура, Подразделение,Количество,Стоимость). Создаем РС ШкалаНаценок (изм. Подразделение,Мин,Макс, рес. Наценка) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Подразделение = Справочники.Подразделения.ОтделЗакупок; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, Режим) Движения.ОстаткиНоменклатуры.Записать(); Движения.ОстаткиНоменклатуры.Записывать = Истина; Если Продажа Тогда БД = Новый БлокировкаДанных; ЭлементБД = БД.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБД.ИсточникДанных = СписокНоменклатуры; ЭлементБД.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБД.УстановитьЗначение("Подразделние", Справочники.Подразделения.ОтделЗакупок); ЭлементБД = БД.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБД.ИсточникДанных = СписокНоменклатуры; ЭлементБД.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБД.УстановитьЗначение("Подразделние", Подразделение); БД.Заблокировать(); Запрос = Новый Запрос("ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ Список |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.Номенклатура, | Список.Количество, | ЕСТЬNULL(ОстаткиНоменклатурыОстаткиОЗ.КоличествоОстаток, 0) КАК КоличествоРегОЗ, | ЕСТЬNULL(ОстаткиНоменклатурыОстаткиОЗ.СуммаОстаток, 0) КАК СуммаРегОЗ, | ЕСТЬNULL(ШкалаНаценок.Наценка, 0) КАК Наценка, | ЕСТЬNULL(ОстаткиНоменклатурыОстаткиТТ.КоличествоОстаток, 0) КАК КоличествоРегТТ, | ЕСТЬNULL(ОстаткиНоменклатурыОстаткиТТ.СуммаОстаток, 0) КАК СуммаРегТТ |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &Момент, | Номенклатура В | (ВЫБРАТЬ | Список.Номенклатура | ИЗ | Список КАК Список) | И Подразделение = ЗНАЧЕНИЕ(Справочник.Подразделения.ОтделЗакупок)) КАК ОстаткиНоменклатурыОстаткиОЗ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаНаценок КАК ШкалаНаценок | ПО (ВЫБОР | КОГДА ЕСТЬNULL(ОстаткиНоменклатурыОстаткиОЗ.КоличествоОстаток, 0) <> 0 | ТОГДА ОстаткиНоменклатурыОстаткиОЗ.СуммаОстаток / ОстаткиНоменклатурыОстаткиОЗ.КоличествоОстаток | ИНАЧЕ 0 | КОНЕЦ МЕЖДУ ШкалаНаценок.Мин И ШкалаНаценок.Макс - 1) | И (ШкалаНаценок.Подразделение = &Подразделение) | ПО Список.Номенклатура = ОстаткиНоменклатурыОстаткиОЗ.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &Момент, | Номенклатура В | (ВЫБРАТЬ | Список.Номенклатура | ИЗ | Список КАК Список) | И Подразделение = &Подразделение) КАК ОстаткиНоменклатурыОстаткиТТ | ПО Список.Номенклатура = ОстаткиНоменклатурыОстаткиТТ.Номенклатура"); Запрос.УстановитьПараметр("Момент", ?(Режим=РежимПроведенияДокумента.Неоперативный, МоментВремени(), Неопределено)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Подразделение", Подразделение); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Нехватка = Выборка.Количество - (Выборка.КоличествоРегОЗ + Выборка.КоличествоРегТТ); Если Нехватка > 0 Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не достаточно " + Выборка.Номенклатура + " в количестве " + Нехватка; Сообщение.Сообщить(); КонецЕсли; Если Не Отказ Тогда Нехватка = Выборка.Количество - Выборка.КоличествоРегТТ; Если Нехватка <= 0 Тогда Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Подразделение = Подразделение; Движение.Количество = Выборка.Количество; Движение.Сумма = ?(Выборка.Количество = Выборка.КоличествоРегТТ, Выборка.СуммаРегТТ, ?(Выборка.КоличествоРегТТ = 0, 0, Выборка.Количество * Выборка.СуммаРегТТ / Выборка.КоличествоРегТТ)); Иначе СуммаПеремещения = ?(Нехватка = Выборка.КоличествоРегОЗ, Выборка.СуммаРегОЗ, ?(Выборка.КоличествоРегОЗ = 0, 0, Нехватка * Выборка.СуммаРегОЗ / Выборка.КоличествоРегОЗ)); Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Подразделение = Справочники.Подразделения.ОтделЗакупок; Движение.Количество = Нехватка; Движение.Сумма = СуммаПеремещения; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Подразделение = Подразделение; Движение.Количество = Нехватка; Движение.Сумма = (100 + Выборка.Наценка) * СуммаПеремещения / 100; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Подразделение = Подразделение; Движение.Количество = Выборка.Количество; Движение.Сумма = (100 + Выборка.Наценка) * СуммаПеремещения / 100 + ?(Выборка.Количество-Нехватка = Выборка.КоличествоРегТТ, Выборка.СуммаРегТТ, ?(Выборка.КоличествоРегТТ = 0, 0, Выборка.Количество-Нехватка * Выборка.СуммаРегТТ / Выборка.КоличествоРегТТ)); КонецЕсли; КонецЕсли; КонецЦикла; Иначе БД = Новый БлокировкаДанных; ЭлементБД = БД.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБД.ИсточникДанных = СписокНоменклатуры; ЭлементБД.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБД.УстановитьЗначение("Подразделние", Справочники.Подразделения.ОтделЗакупок); БД.Заблокировать(); Запрос = Новый Запрос("ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ Список |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.Номенклатура, | Список.Количество, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоРег, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаРег, | ЕСТЬNULL(ШкалаНаценок.Наценка, 0) КАК Наценка |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &Момент, | Номенклатура В | (ВЫБРАТЬ | Список.Номенклатура | ИЗ | Список КАК Список) | И Подразделение = ЗНАЧЕНИЕ(Справочник.Подразделения.ОтделЗакупок)) КАК ОстаткиНоменклатурыОстатки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаНаценок КАК ШкалаНаценок | ПО (ВЫБОР | КОГДА ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) <> 0 | ТОГДА ОстаткиНоменклатурыОстатки.СуммаОстаток / ОстаткиНоменклатурыОстатки.КоличествоОстаток | ИНАЧЕ 0 | КОНЕЦ МЕЖДУ ШкалаНаценок.Мин И ШкалаНаценок.Макс - 1 | И ШкалаНаценок.Подразделение = &Подразделение) | ПО Список.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура"); Запрос.УстановитьПараметр("Момент", ?(Режим=РежимПроведенияДокумента.Неоперативный, МоментВремени(), Неопределено)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Подразделение", Подразделение); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Нехватка = Выборка.Количество - Выборка.КоличествоРег; Если Нехватка > 0 Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не достаточно " + Выборка.Номенклатура + " в количестве " + Нехватка; Сообщение.Сообщить(); КонецЕсли; Если Не Отказ Тогда Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Подразделение = Справочники.Подразделения.ОтделЗакупок; Движение.Количество = Выборка.Количество; Движение.Сумма = ?(Выборка.Количество = Выборка.КоличествоРег, Выборка.СуммаРег, ?(Выборка.КоличествоРег = 0, 0, Выборка.Количество * Выборка.СуммаРег / Выборка.КоличествоРег)); Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Подразделение = Подразделение; Движение.Количество = Выборка.Количество; Движение.Сумма = (100 + Выборка.Наценка) * ?(Выборка.Количество = Выборка.КоличествоРег, Выборка.СуммаРег, ?(Выборка.КоличествоРег = 0, 0, Выборка.Количество * Выборка.СуммаРег / Выборка.КоличествоРег)) / 100; КонецЕсли; КонецЦикла; КонецЕсли; КонецПроцедуры //ОтчетДвижениеТоваров ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.Подразделение, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход, ОстаткиНоменклатурыОстаткиИОбороты.СуммаНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СуммаКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СуммаПриход, ОстаткиНоменклатурыОстаткиИОбороты.СуммаРасход ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты КАК ОстаткиНоменклатурыОстаткиИОбороты //1.31 В компании используется оборудование, имеющее ограничения к эксплуатации. //Для каждого устройства устанавливается срок годности и срок использования. //Срок годности считается с момента приобретения оборудования и указывается в документе поступления, а срок эксплуатации с момента его ввода в эксплуатацию и указывается непосредственно для оборудования и не меняется. //Поступление оборудования отражается документом «Приходная накладная». //Через некоторое время оборудование вводится в эксплуатацию документом «Ввод в эксплуатацию». //При передаче оборудования в эксплуатацию в первую очередь передается оборудование, у которого минимальный срок годности. //В документе «Ввод в эксплуатацию» указывается перечень и количество передаваемого оборудования. //При проведении должна происходить проверка на наличие оборудования и его срок годности. //В том случае, если срок годности истек или оборудования недостаточно, документ не проводится и выдается соответствующее сообщение. //Раз в месяц формируется регламентный документ «Выбытие оборудования», который при проведении проверяет эксплуатируемое оборудование и, если оно негодно, то списывает его. //При проверке определяется, вышел ли срок эксплуатации устройства с момента его ввода в эксплуатацию. //Если срок эксплуатации истек или истек срок годности, то оборудование должно быть списано. //Кроме того, этот же документ должен списывать еще не введенное в эксплуатацию оборудование, но срок годности, которого уже истек. //Учет оборудования в разрезе складов не ведется. Себестоимость оборудования рассчитывается как средняя. //Необходимо создать отчет о состоянии эксплуатируемого оборудования на выбранную дату. // //ДобВСпрНоменклатуру СрокЭксплуатации (число). В тч Приходной добавляем СрокГодности (дата). Создаем док ВводВЭксплуатацию (рекв. СуммаПоДокументу, тч. СписокНоменклатуры - Номенклатура,Количество,цена,Сумма.). Создаем док ВыбытиеОборудования. //РН Оборудование (Остатки, Номенклатура, СрокГодности,СрокЭксплуатации. рес.Количество). //РН СтоимостьОборудования (остатки, Номенклатура, Количество,Стоимость) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) // регистр Оборудование Приход Движения.Оборудование.Записывать = Истина; Движения.СтоимостьОборудования.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Оборудование.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.СрокГодности = ТекСтрокаСписокНоменклатуры.СрокГодности; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение = Движения.СтоимостьОборудования.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; КонецПроцедуры //ДокВводВЭксплуатацию Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Оборудование.Записывать = Истина; Движения.Оборудование.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Оборудование"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВводВЭксплуатациюСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ВводВЭксплуатациюСписокНоменклатуры.Количество) КАК Количество, | СУММА(ВводВЭксплуатациюСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ВводВЭксплуатацию.СписокНоменклатуры КАК ВводВЭксплуатациюСписокНоменклатуры |ГДЕ | ВводВЭксплуатациюСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ВводВЭксплуатациюСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ЕСТЬNULL(ОборудованиеОстатки.СрокГодности, ДАТАВРЕМЯ(1, 1, 1)) КАК СрокГодности, | ЕСТЬNULL(ОборудованиеОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, ТЧДок.Номенклатура.СрокЭксплуатации) КАК СрокЭксплуатации |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Оборудование.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК ОборудованиеОстатки | ПО ТЧДок.Номенклатура = ОборудованиеОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | СрокГодности |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | СУММА(КоличествоОстаток) |ПО | Номенклатура, | СрокГодности"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Дата", Дата); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.ДокументКоличество > ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" с количеством "+ВыборкаНоменклатура.ДокументКоличество+" недостаточно. На остатке:"+ ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; ВыборкаСрокГодности = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); КоличествоСписать = ВыборкаНоменклатура.ДокументКоличество; Пока ВыборкаСрокГодности.Следующий() и КоличествоСписать>0 Цикл Если Дата >=ВыборкаСрокГодности.СрокГодности Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "По товару "+ВыборкаНоменклатура.Номенклатура+" истек срок годности!"; Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; Движение = Движения.Оборудование.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаСрокГодности.Номенклатура; Движение.СрокГодности = ВыборкаСрокГодности.СрокГодности; Движение.Количество = Мин(ВыборкаСрокГодности.КоличествоОстаток, КоличествоСписать); Движение = Движения.Оборудование.ДобавитьПриход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаСрокГодности.Номенклатура; Движение.СрокГодности = ВыборкаСрокГодности.СрокГодности; Движение.СрокЭксплуатации = ВыборкаСрокГодности.СрокЭксплуатации; Движение.Количество = Мин(ВыборкаСрокГодности.КоличествоОстаток, КоличествоСписать); КоличествоСписать = КоличествоСписать - Движение.Количество; КонецЦикла; КонецЦикла; КонецПроцедуры //ДокВыбытиеОборудования Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.Оборудование.Записывать = Истина; Движения.Оборудование.Записать(); Движения.СтоимостьОборудования.Записывать = Истина; Движения.СтоимостьОборудования.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Оборудование"); ЭлементБлокировки2 = Блокировка.Добавить("РегистрНакопления.СтоимостьОборудования"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОборудованиеОстатки.Номенклатура КАК Номенклатура, | ОборудованиеОстатки.КоличествоОстаток, | ОборудованиеОстатки.СрокГодности, | ОборудованиеОстатки.СрокЭксплуатации |ПОМЕСТИТЬ Остатки |ИЗ | РегистрНакопления.Оборудование.Остатки( | &МоментВремени, | СрокЭксплуатации = ДАТАВРЕМЯ(1, 1, 1) | И СрокГодности <= &Дата | ИЛИ (СрокГодности <= &Дата | ИЛИ СрокЭксплуатации <= &Дата)) КАК ОборудованиеОстатки | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Остатки.Номенклатура КАК Номенклатура, | Остатки.КоличествоОстаток КАК ДокументКоличество, | ЕСТЬNULL(СтоимостьОборудованияОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(СтоимостьОборудованияОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | Остатки.СрокГодности, | Остатки.СрокЭксплуатации |ИЗ | Остатки КАК Остатки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьОборудования.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | Остатки КАК Т)) КАК СтоимостьОборудованияОстатки | ПО Остатки.Номенклатура = СтоимостьОборудованияОстатки.Номенклатура |ИТОГИ | СУММА(ДокументКоличество), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Дата", Дата); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() цикл Движение = Движения.Оборудование.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.СрокГодности = ВыборкаДетальныеЗаписи.СрокГодности; Движение.СрокЭксплуатации = ВыборкаДетальныеЗаписи.СрокЭксплуатации; Движение.Количество = ВыборкаДетальныеЗаписи.ДокументКоличество; КонецЦикла; Движение = Движения.СтоимостьОборудования.ДобавитьРасход(); Движение.Период = Дата; Движение.Количество = ВыборкаНоменклатура.ДокументКоличество; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Стоимость = ?(ВыборкаНоменклатура.КоличествоОстаток> ВыборкаНоменклатура.ДокументКоличество,ВыборкаНоменклатура.ДокументКоличество*ВыборкаНоменклатура.СтоимостьОстаток/ВыборкаНоменклатура.КоличествоОстаток,ВыборкаНоменклатура.СтоимостьОстаток); КонецЦикла; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА КонецПроцедуры //Отчет СостояниеОборудования ВЫБРАТЬ ОборудованиеОстатки.Номенклатура, РАЗНОСТЬДАТ(&Период, ОборудованиеОстатки.СрокГодности, ДЕНЬ) КАК ОставшийсяСрокГодности, ВЫБОР КОГДА ОборудованиеОстатки.СрокЭксплуатации = ДАТАВРЕМЯ(1, 1, 1) ТОГДА 0 ИНАЧЕ РАЗНОСТЬДАТ(&Период, ОборудованиеОстатки.СрокЭксплуатации, ДЕНЬ) КОНЕЦ КАК ОставшийсяСрокЭксплуатации, ОборудованиеОстатки.КоличествоОстаток ПОМЕСТИТЬ Остатки ИЗ РегистрНакопления.Оборудование.Остатки КАК ОборудованиеОстатки ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Остатки.Номенклатура, Остатки.ОставшийсяСрокГодности, Остатки.ОставшийсяСрокЭксплуатации, Остатки.КоличествоОстаток, СтоимостьОборудованияОстатки.СтоимостьОстаток ИЗ Остатки КАК Остатки ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьОборудования.Остатки( , Номенклатура В (ВЫБРАТЬ Т.Номенклатура ИЗ Остатки КАК Т)) КАК СтоимостьОборудованияОстатки ПО Остатки.Номенклатура = СтоимостьОборудованияОстатки.Номенклатура //1.32 Компания занимается торговлей специализированного оборудования. //Принят следующий порядок работы: Поступает заказ покупателя (документ «Заказ покупателя»). //На основании заказов покупателей производится закупка оборудования у поставщика (документ «Приходная накладная»), причем можно приобрести только то оборудование, которое заказано покупателем. //После того, как оборудование поступило, оно может быть отгружено покупателю (документ «Расходная накладная»). //В документе «Приходная накладная» для каждой номенклатурной позиции указывается заказ покупателя, для которого приобретено это оборудование. //Оборудование для одного заказа покупателя может поставляться несколькими документами. Закупать можно только заказанное покупателем оборудование. //Отгрузка оборудования по одному заказу покупателя может происходить несколькими документами «Расходная накладная». //Следует считать, что оборудование по заказу будет отгружено полностью и отгрузка может происходить только на основании заказа. //Себестоимость оборудования рассчитывается как средняя в рамках закупок под заказ покупателя. //Необходимо создать отчет по анализу недоотгруженных заказов покупателей на выбранную дату. Анализ недоотгруженных заказов // //Создаем док ЗаказПокупателя (рекв. СуммаПоДокументу, тч. СписокНоменклатуры Номенклатура, Количество,Цена,Сумма) //В тч приходной добавляем ЗаказПокупателя (док ссылка). В шапку расходной добавляем ЗаказПокупателя. //РН ОстаткиНоменклатуры (изм. Номенклатура, ЗаказПокупателя, рес.Количество,Стоимость). //РН ЗаказыПокупателей (изм. ЗаказПокупателя, Оборудование (номенкл) рес. количество). //Док приходная Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда // Заполнение шапки СуммаПоДокументу = ДанныеЗаполнения.СуммаПоДокументу; Для Каждого ТекСтрокаСписокНоменклатуры Из ДанныеЗаполнения.СписокНоменклатуры Цикл НоваяСтрока = СписокНоменклатуры.Добавить(); НоваяСтрока.Количество = ТекСтрокаСписокНоменклатуры.Количество; НоваяСтрока.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; НоваяСтрока.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; НоваяСтрока.Цена = ТекСтрокаСписокНоменклатуры.Цена; НоваяСтрока.ЗаказПокупателя = ДанныеЗаполнения; КонецЦикла; КонецЕсли; КонецПроцедуры Процедура ОбработкаПроведения(Отказ, Режим) Движения.ЗаказыПокупателей.Записывать = Истина; Движения.ЗаказыПокупателей.БлокироватьДляИзменения = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ЗаказыПокупателей.ДобавитьРасход(); Движение.Период = Дата; Движение.ЗаказПокупателя = ТекСтрокаСписокНоменклатуры.ЗаказПокупателя; Движение.Оборудование = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; Движения.ЗаказыПокупателей.Записать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | ПриходнаяНакладнаяСписокНоменклатуры.ЗаказПокупателя КАК ЗаказПокупателя |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры |ГДЕ | ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура, | ПриходнаяНакладнаяСписокНоменклатуры.ЗаказПокупателя | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | ЗаказПокупателя |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЗаказыПокупателейОстатки.ЗаказПокупателя, | ЗаказыПокупателейОстатки.Оборудование, | ЗаказыПокупателейОстатки.КоличествоОстаток, | ПРЕДСТАВЛЕНИЕ(ЗаказыПокупателейОстатки.Оборудование) КАК ПредставлениеОборудование |ИЗ | РегистрНакопления.ЗаказыПокупателей.Остатки( | &МоментВремени, | (Оборудование,ЗаказПокупателя) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.ЗаказПокупателя | ИЗ | ТЧДок КАК Т)) КАК ЗаказыПокупателейОстатки |ГДЕ | ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0) < 0"; Запрос.УстановитьПараметр("МоментВремени" , Новый Граница(МоментВремени(), ВидГраницы.Включая)); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); Если Не Результат.Пустой() Тогда Отказ = Истина; ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Оборудования "+ ВыборкаДетальныеЗаписи.ПредставлениеОборудование+" недостаточно в заказе покупателя "+ВыборкаДетальныеЗаписи.ЗаказПокупателя; Сообщение.Сообщить(); КонецЦикла; Возврат; КонецЕсли; Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход(); Движение.Период = Дата; Движение.ЗаказПокупателя = ТекСтрокаСписокНоменклатуры.ЗаказПокупателя; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда // Заполнение шапки ЗаказПокупателя = ДанныеЗаполнения.Ссылка; СуммаПоДокументу = ДанныеЗаполнения.СуммаПоДокументу; Для Каждого ТекСтрокаСписокНоменклатуры Из ДанныеЗаполнения.СписокНоменклатуры Цикл НоваяСтрока = СписокНоменклатуры.Добавить(); НоваяСтрока.Количество = ТекСтрокаСписокНоменклатуры.Количество; НоваяСтрока.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; НоваяСтрока.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; НоваяСтрока.Цена = ТекСтрокаСписокНоменклатуры.Цена; КонецЦикла; КонецЕсли; КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.УстановитьЗначение("ЗаказПокупателя", ЗаказПокупателя); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.ЗаказПокупателя КАК ЗаказПокупателя |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.ЗаказПокупателя | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | ЗаказПокупателя |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ТЧДок.ЗаказПокупателя КАК ЗаказПокупателя, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | ПРЕДСТАВЛЕНИЕ(ТЧДок.Номенклатура) КАК НоменклатураПредставление |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, ЗаказПокупателя) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.ЗаказПокупателя | ИЗ | ТЧДок КАК Т)) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура, | ЗаказПокупателя"; Запрос.УстановитьПараметр("МоментВремени" , ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.ДокументКоличество > ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.НоменклатураПредставление+" недостаточно.На остатке: "+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; ВыборкаЗаказПокупателя = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); КоличествоСписать = ВыборкаНоменклатура.ДокументКоличество; Пока ВыборкаЗаказПокупателя.Следующий() и КоличествоСписать>0 Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.ЗаказПокупателя = ВыборкаЗаказПокупателя.ЗаказПокупателя; Движение.Номенклатура = ВыборкаЗаказПокупателя.Номенклатура; Движение.Количество = Мин(ВыборкаЗаказПокупателя.КоличествоОстаток, КоличествоСписать); Движение.Стоимость = ?(ВыборкаЗаказПокупателя.КоличествоОстаток> КоличествоСписать, КоличествоСписать*ВыборкаЗаказПокупателя.СтоимостьОстаток/ВыборкаЗаказПокупателя.КоличествоОстаток,ВыборкаЗаказПокупателя.СтоимостьОстаток); КоличествоСписать = КоличествоСписать - Движение.Количество; КонецЦикла; КонецЦикла; КонецПроцедуры //ДокЗаказПокупателя Процедура ОбработкаПроведения(Отказ, РежимПроведения) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ЗаказыПокупателей Приход Движения.ЗаказыПокупателей.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ЗаказыПокупателей.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.ЗаказПокупателя = Ссылка; Движение.Оборудование = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //Отчет АнализЗаказов ВЫБРАТЬ ЗаказыПокупателейОстатки.ЗаказПокупателя, ЗаказыПокупателейОстатки.Оборудование, ЗаказыПокупателейОстатки.КоличествоОстаток КАК Количество ПОМЕСТИТЬ ПоЗаказу ИЗ РегистрНакопления.ЗаказыПокупателей.Остатки({(&Период)}, ) КАК ЗаказыПокупателейОстатки ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.ЗаказПокупателя, ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество ПОМЕСТИТЬ Закуплено ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки( , ЗаказПокупателя В (ВЫБРАТЬ Т.ЗаказПокупателя ИЗ ПоЗаказу КАК Т)) КАК ОстаткиНоменклатурыОстатки ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ОстаткиНоменклатурыОбороты.Номенклатура, ОстаткиНоменклатурыОбороты.ЗаказПокупателя, ОстаткиНоменклатурыОбороты.КоличествоРасход КАК Количество ПОМЕСТИТЬ Отгружено ИЗ РегистрНакопления.ОстаткиНоменклатуры.Обороты( , {(&Период)}, , ЗаказПокупателя В (ВЫБРАТЬ Т.ЗаказПокупателя ИЗ Закуплено КАК Т)) КАК ОстаткиНоменклатурыОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПоЗаказу.ЗаказПокупателя, ПоЗаказу.Оборудование, ПоЗаказу.Количество КАК ПоЗаказу, 0 КАК Закуплено, 0 КАК Отгружено ИЗ ПоЗаказу КАК ПоЗаказу ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Закуплено.ЗаказПокупателя, Закуплено.Номенклатура, 0, Закуплено.Количество, 0 ИЗ Закуплено КАК Закуплено ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Отгружено.ЗаказПокупателя, Отгружено.Номенклатура, 0, 0, Отгружено.Количество ИЗ Отгружено КАК Отгружено //1.33 Компания занимается оптовой торговлей. Для минимизации складских запасов закупки товаров происходят согласно предполагаемым продажам. //Принят следующий порядок работы: Поступает заказ покупателя (документ «Заказ покупателя»). //На основании существующих заказов покупателей производится закупка оборудования у поставщика (документ «Приходная накладная»). //После того, как оборудование поступило, оно может быть отгружено покупателю (документ «Расходная накладная»). //При проведении документа «Приходная накладная» необходимо производить анализ неотгруженных товаров, заказанных покупателем. //Поступивший товар распределяется по заказам покупателей, исходя из их хронологии (начиная с самого раннего и далее до самого последнего). //В том случае, если товара закуплено больше, чем есть неотгруженных заказов покупателей, то избыток составляет «свободный остаток». //Отгрузка оборудования по одному заказу покупателя может происходить несколькими документами «Расходная накладная». //Следует считать, что оборудование по заказу будет отгружено полностью и отгрузка может происходить только на основании заказа. //Себестоимость оборудования рассчитывается как средняя в рамках закупок под заказ покупателя. //В первуюочередь списывается товар, распределенный на текущий заказ. Если товара не хватает, то можно списать свободный остаток. //Если же не хватает и его, то документ не должен проводиться. //При закупке следует учитывать, что товар по заказу может быть уже отгружен из свободного остатка. //Учет товаров в разрезе складов не ведется. Необходимо создать отчет по анализу недоотгруженных заказов покупателей на выбранную дату. //Создаем док. ЗаказПокупателя (рекв. СуммаПоДокументу, тч СписокНоменклатуры - Номенклатура, количество,Цена,Сумма). //В шапку расходной добавляем рекв. ЗаказПокупателя. ОстаткиНоменклатуры (ЗаказПокупателя,Номенклатура, Количество,Стоимость). //РН ЗаказыПокупателей (ЗаказПокупателя,Номенклатура, Количество) //ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ЗаказыПокупателей"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПриходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЗаказыПокупателейОстатки.ЗаказПокупателя КАК ЗаказПокупателя, | ЗаказыПокупателейОстатки.Номенклатура КАК Номенклатура, | ЗаказыПокупателейОстатки.КоличествоОстаток |ПОМЕСТИТЬ Заказы |ИЗ | РегистрНакопления.ЗаказыПокупателей.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК ЗаказыПокупателейОстатки | |ИНДЕКСИРОВАТЬ ПО | ЗаказПокупателя, | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.ЗаказПокупателя КАК ЗаказПокупателя, | ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура, | ОстаткиНоменклатурыОстатки.КоличествоОстаток, | ОстаткиНоменклатурыОстатки.СтоимостьОстаток |ПОМЕСТИТЬ ОстаткиНоменклатуры |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, ЗаказПокупателя) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.ЗаказПокупателя | ИЗ | Заказы КАК Т)) КАК ОстаткиНоменклатурыОстатки | |ИНДЕКСИРОВАТЬ ПО | ЗаказПокупателя, | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | Заказы.ЗаказПокупателя, | ЕСТЬNULL(Заказы.КоличествоОстаток, 0) - ЕСТЬNULL(ОстаткиНоменклатуры.КоличествоОстаток, 0) КАК КоличествоЗаказ |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ Заказы КАК Заказы | ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиНоменклатуры КАК ОстаткиНоменклатуры | ПО Заказы.Номенклатура = ОстаткиНоменклатуры.Номенклатура | И Заказы.ЗаказПокупателя = ОстаткиНоменклатуры.ЗаказПокупателя | ПО ТЧДок.Номенклатура = Заказы.Номенклатура | |УПОРЯДОЧИТЬ ПО | Заказы.ЗаказПокупателя.МоментВремени |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | СУММА(КоличествоЗаказ) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени" , ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл НеобходимоСписать = ВыборкаНоменклатура.ДокументКоличество; НеобходимоСписатьСумма = ВыборкаНоменклатура.ДокументСумма; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() и НеобходимоСписать >0 Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход(); Движение.Период = Дата; Движение.ЗаказПокупателя = ВыборкаДетальныеЗаписи.ЗаказПокупателя; Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоЗаказ, НеобходимоСписать); Движение.Стоимость = ?(ВыборкаНоменклатура.ДокументКоличество =Движение.Количество, ВыборкаДетальныеЗаписи.ДокументСумма, Движение.Количество *ВыборкаДетальныеЗаписи.ДокументСумма/ВыборкаНоменклатура.ДокументКоличество); Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; НеобходимоСписать = НеобходимоСписать - Движение.Количество; НеобходимоСписатьСумма = НеобходимоСписатьСумма - Движение.Стоимость; КонецЦикла; Если НеобходимоСписать>0 Тогда Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Количество = НеобходимоСписать; Движение.Стоимость = НеобходимоСписатьСумма; КонецЕсли; КонецЦикла; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА КонецПроцедуры //ДокРасходная Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда // Заполнение шапки ЗаказПокупателя = ДанныеЗаполнения.Ссылка; СуммаПоДокументу = ДанныеЗаполнения.СуммаПоДокументу; Для Каждого ТекСтрокаСписокНоменклатуры Из ДанныеЗаполнения.СписокНоменклатуры Цикл НоваяСтрока = СписокНоменклатуры.Добавить(); НоваяСтрока.Количество = ТекСтрокаСписокНоменклатуры.Количество; НоваяСтрока.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; НоваяСтрока.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; НоваяСтрока.Цена = ТекСтрокаСписокНоменклатуры.Цена; КонецЦикла; КонецЕсли; //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.ЗаказыПокупателей.Записывать = Истина; Движения.ЗаказыПокупателей.Записать(); Блокировка= Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ЗаказыПокупателей"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | МАКСИМУМ(СписокНоменклатуры.НомерСтроки) КАК НомерСтроки |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | ВЫБОР | КОГДА ОстаткиНоменклатурыОстатки.ЗаказПокупателя = &Заказ | ТОГДА 0 | ИНАЧЕ 1 | КОНЕЦ КАК ПорядокСортировки, | ПРЕДСТАВЛЕНИЕ(ТЧДок.Номенклатура) КАК ПредставлениеНоменклатуры, | ТЧДок.НомерСтроки КАК НомерСтроки, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.ЗаказПокупателя, ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)) КАК ЗаказПокупателя |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т) | И (ЗаказПокупателя = &Заказ | ИЛИ ЗаказПокупателя = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка))) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ПорядокСортировки |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток), | МАКСИМУМ(НомерСтроки) |ПО | Номенклатура"; Запрос.УстановитьПараметр("Заказ" , ЗаказПокупателя); Запрос.УстановитьПараметр("МоментВремени" , ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка" ,Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.ДокументКоличество > ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.ПредставлениеНоменклатуры + " недостаточно. На остатке:"+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Поле = "СписокНоменклатуры["+(ВыборкаНоменклатура.НомерСтроки-1)+"].Количество"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); КоличествОСписать = ВыборкаНоменклатура.ДокументКоличество; Пока ВыборкаДетальныеЗаписи.Следующий() и КоличествОСписать>0 Цикл //если пришел не пустой заказ - считаем, что нужно закрыть регистр Заказы покупателей Если ВыборкаДетальныеЗаписи.ЗаказПокупателя <> Документы.ЗаказПокупателя.ПустаяСсылка() Тогда Движение = Движения.ЗаказыПокупателей.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.ЗаказПокупателя = ВыборкаДетальныеЗаписи.ЗаказПокупателя; Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстаток, КоличествОСписать); КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.ЗаказПокупателя = ВыборкаДетальныеЗаписи.ЗаказПокупателя; Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстаток, КоличествОСписать); Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстаток > КоличествОСписать, КоличествОСписать*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); КоличествОСписать = КоличествОСписать - Движение.Количество; КонецЦикла; КонецЦикла; КонецПроцедуры //Док ЗаказПокупателя Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ЗаказыПокупателей Приход Движения.ЗаказыПокупателей.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ЗаказыПокупателей.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.ЗаказПокупателя = Ссылка; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //Отчет АнализНедоотгруженныхЗаказов ВЫБРАТЬ ЗаказыПокупателейОстатки.ЗаказПокупателя КАК ЗаказПокупателя, ЗаказыПокупателейОстатки.Номенклатура КАК Номенклатура, ЗаказыПокупателейОстатки.КоличествоОстаток КАК Количество ПОМЕСТИТЬ НедоотгруженныеЗаказы ИЗ РегистрНакопления.ЗаказыПокупателей.Остатки({(&Период)}, ) КАК ЗаказыПокупателейОстатки ИНДЕКСИРОВАТЬ ПО ЗаказПокупателя, Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ОстаткиНоменклатурыОстатки.ЗаказПокупателя КАК ЗаказПокупателя, ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура, ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество ПОМЕСТИТЬ Закуплено ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки( {(&Период)}, (Номенклатура, ЗаказПокупателя) В (ВЫБРАТЬ Т.Номенклатура, Т.ЗаказПокупателя ИЗ НедоотгруженныеЗаказы КАК Т)) КАК ОстаткиНоменклатурыОстатки ИНДЕКСИРОВАТЬ ПО ЗаказПокупателя, Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ОстаткиНоменклатурыОбороты.ЗаказПокупателя, ОстаткиНоменклатурыОбороты.Номенклатура, ОстаткиНоменклатурыОбороты.КоличествоРасход КАК Количество ПОМЕСТИТЬ Отгружено ИЗ РегистрНакопления.ОстаткиНоменклатуры.Обороты( , {(&Период)}, Секунда, (Номенклатура, ЗаказПокупателя) В (ВЫБРАТЬ Т.Номенклатура, Т.ЗаказПокупателя ИЗ НедоотгруженныеЗаказы КАК Т)) КАК ОстаткиНоменклатурыОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ НедоотгруженныеЗаказы.ЗаказПокупателя, НедоотгруженныеЗаказы.Номенклатура КАК Оборудование, НедоотгруженныеЗаказы.Количество КАК ПоЗаказу, 0 КАК Закуплено, 0 КАК Отгружено ИЗ НедоотгруженныеЗаказы КАК НедоотгруженныеЗаказы ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Закуплено.ЗаказПокупателя, Закуплено.Номенклатура, 0, Закуплено.Количество, 0 ИЗ Закуплено КАК Закуплено ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Отгружено.ЗаказПокупателя, Отгружено.Номенклатура, 0, 0, Отгружено.Количество ИЗ Отгружено КАК Отгружено //1.34 ведутся в разрезе проектов. Проекты никак не связаны с контрагентами, т.е. в рамках одного проекта могут осуществляться продажи нескольким контрагентам. //Поступление денежных средств от покупателя отражается документом «Приход денег», отгрузка товаров документом «Расходная накладная». //В документе «Приход денег» указывается контрагент и сумма его оплаты (контрагент и сумма указываются в шапке документа), а в табличной части указаны проекты, по которым должна быть зачтена оплата. //Оплата распределяется по проектам исходя из суммы задолженности. //В первую очередь оплачивается проект с максимальной задолженностью. //В том случае, когда сумма отгрузок по проектам меньше суммы оплаты, оставшаяся часть оплаты должна быть распределена в счет отгрузок остальных проектов этого контрагента, причем в первую очередь должен оплачиваться проект, сумма задолженности по которому максимальная. //Если же сумма оплат превышает сумму всех задолженностей по отгрузке, то сумма превышения должна быть зачтена как аванс покупателя. //Отгрузка товаров расходной накладной происходит только по одному проекту. //При проведении документа «Расходная накладная» необходимо производить проверку авансов. //В том случае, если аванс есть, необходимо его погасить. Оставшаяся сумма должна быть учтена как долг по проекту по отгрузке. //Учет остатков номенклатуры не ведется. Необходимо создать отчеты по состоянию взаиморасчетов на дату ивзаиморасчеты по проектам за период. // //СоздатьСпр Контрагенты, Проекты. Добавляем в шапку расходной Контрагента и проект. //Создать док ПриходДенег (Контрагент,СуммаОплаты. тч. СписокПроектов - проект). //ОстаткиНоменклатуры (Номенклатура,Количество), ВзаиморасчетыСКонтрагентами (Контрагент,Проект,Сумма) //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ВзаиморасчетыСКонтрагентами.Записывать=Истина; Движения.ВзаиморасчетыСКонтрагентами.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСКонтрагентами"); ЭлементБлокировки.УстановитьЗначение("Проект", Проект); ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВзаиморасчетыСКонтрагентамиОстатки.Контрагент, | ВзаиморасчетыСКонтрагентамиОстатки.Проекты, | ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток |ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки( | &МоментВремени, | Контрагент = &Контрагент | И Проекты = ЗНАЧЕНИЕ(Справочник.Проекты.Аванс)) КАК ВзаиморасчетыСКонтрагентамиОстатки"; Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); СуммаСписать = СуммаПоДокументу; Пока ВыборкаДетальныеЗаписи.Следующий() и СуммаСписать>0 Цикл СуммаРаспределить = Мин(ВыборкаДетальныеЗаписи.СуммаОстаток, СуммаСписать); Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Проекты = Справочники.Проекты.Аванс; Движение.Сумма = СуммаРаспределить; СуммаСписать = СуммаСписать - СуммаРаспределить; КонецЦикла; Если СуммаСписать >0 Тогда Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Проекты = Проект; Движение.Сумма = СуммаСписать; КонецЕсли; КонецПроцедуры //ДокПриходДенег Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина; Движения.ВзаиморасчетыСКонтрагентами.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСКонтрагентами"); ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокПроектов; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Проект", "Проект"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокПроектов.Проект КАК Проект |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПриходДенег.СписокПроектов КАК СписокПроектов |ГДЕ | СписокПроектов.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокПроектов.Проект | |ИНДЕКСИРОВАТЬ ПО | Проект |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток КАК СуммаОстаток, | ВзаиморасчетыСКонтрагентамиОстатки.Проекты КАК Проект, | ВзаиморасчетыСКонтрагентамиОстатки.Контрагент КАК Контрагент, | 1 КАК ПорядокСортировки |ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки( | &МоментВремени, | Проекты В | (ВЫБРАТЬ | Т.Проект | ИЗ | ТЧДок КАК Т) | И Проекты <> ЗНАЧЕНИЕ(Справочник.Проекты.Аванс) | И Контрагент = &Контрагент) КАК ВзаиморасчетыСКонтрагентамиОстатки | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток, | ВзаиморасчетыСКонтрагентамиОстатки.Проекты, | ВзаиморасчетыСКонтрагентамиОстатки.Контрагент, | 2 |ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки( | &МоментВремени, | Контрагент = &Контрагент | И (Проекты <> ЗНАЧЕНИЕ(Справочник.Проекты.Аванс) | И НЕ Проекты В | (ВЫБРАТЬ | Т.Проект | ИЗ | ТЧДок КАК Т))) КАК ВзаиморасчетыСКонтрагентамиОстатки | |УПОРЯДОЧИТЬ ПО | ПорядокСортировки, | СуммаОстаток УБЫВ |ИТОГИ | СУММА(СуммаОстаток) |ПО | Контрагент"; Запрос.УстановитьПараметр("МоментВремени" , ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Запрос.УстановитьПараметр("Контрагент" , Контрагент); Результат = Запрос.Выполнить(); ВыборкаКонтрагент = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); СуммаСписать = СуммаОплаты; Пока ВыборкаКонтрагент.Следующий() цикл ВыборкаДетальныеЗаписи = ВыборкаКонтрагент.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() и СуммаСписать>0 Цикл Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Проекты = ВыборкаДетальныеЗаписи.Проект; Движение.Сумма = Мин(ВыборкаДетальныеЗаписи.СуммаОстаток, СуммаСписать); СуммаСписать = СуммаСписать - Движение.Сумма; КонецЦикла; КонецЦикла; Если СуммаСписать >0 Тогда Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход(); Движение.Контрагент = Контрагент; Движение.Период = Дата; Движение.Проекты = Справочники.Проекты.Аванс; Движение.Сумма = СуммаСписать; КонецЕсли; КонецПроцедуры //Отчет СостояниеВзаиморасчетов ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстатки.Контрагент, ВзаиморасчетыСКонтрагентамиОстатки.Проекты, ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток, ВЫБОР КОГДА ВзаиморасчетыСКонтрагентамиОстатки.Проекты <> ЗНАЧЕНИЕ(Справочник.Проекты.Аванс) ТОГДА 0 ИНАЧЕ 1 КОНЕЦ КАК ПорядокСортировки ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК ВзаиморасчетыСКонтрагентамиОстатки УПОРЯДОЧИТЬ ПО ПорядокСортировки Отчет ВзаиморасчетыЗаПериод ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Контрагент, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Проекты, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаНачальныйОстаток, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаКонечныйОстаток, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаОборот, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаПриход КАК Отгрузка, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаРасход КАК Оплата ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты //1.35 Компания занимается оптовой торговлей. Взаиморасчеты с покупателями ведутся в разрезе проектов. //Проекты никак не связаны с контрагентами, т.е. в рамках одного проекта могут осуществляться продажи нескольким контрагентам. //Поступление денежных средств от покупателя отражается документом «Приход денег», отгрузка товаров документом «Расходная накладная». //В документе «Приход денег» в табличной части указаны проекты, по которым должна быть зачтена оплата и соответствующая сумма для каждого проекта. //В том случае, когда сумма отгрузок по проекту меньше суммы оплаты, оставшаяся часть оплаты должна быть распределена в счет отгрузок остальных проектов, причем в первую очередь должен оплачиваться проект, сумма задолженности по которому максимальная. //Если же сумма оплат превышаетсумму всех задолженностей по отгрузке, то сумма превышения должна быть зачтена как аванс покупателя. //Необходимо производить контроль, чтобы пользователь не мог несколько раз указать один и тот же проект. //Отгрузка товаров расходной накладной происходит только по одному проекту. //При проведении документа «Расходная накладная» необходимо производить проверку авансов. //В том случае, если аванс есть, необходимо его погасить. Оставшаяся сумма должна быть учтена как долг по проекту по отгрузке. //Учет остатков номенклатуры не ведется. Необходимо создать отчеты по состоянию взаиморасчетов на дату и взаиморасчеты по проектам за период. // //СоздатьСпр Контрагенты, Проекты. Добавляем в шапку расходной Контрагента и проект. //Создаем док ПриходДенег (рекв. Контрагент, тч СписокПроектов - проект, СуммаПоПРекту). //РН ВзаиморасчетыСКонтрагентами - Контрагент, Проект,Сумма //Форма докПриходДенег &НаКлиенте Процедура СписокПроектовПриИзменении(Элемент) ТекущаяСтрока = Элементы.СписокПроектов.ТекущиеДанные; Проект = ТекущаяСтрока.Проект; НомерСтроки = ТекущаяСтрока.НомерСтроки; Для каждого ЭлементТЧ из Объект.СписокПроектов цикл Если ЭлементТЧ.НомерСтроки <> НомерСтроки и ЭлементТЧ.Проект = Проект Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Найдены дубли строк"; Сообщение.Сообщить(); ТекущаяСтрока.Проект = Неопределено; КонецЕсли; КонецЦикла; КонецПроцедуры //МодульОбъектаПриходДенег Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина; Движения.ВзаиморасчетыСКонтрагентами.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСКонтрагентами"); ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокПроектов; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Проект", "Проект"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходДенегСписокПроектов.Проект КАК Проект, | СУММА(ПриходДенегСписокПроектов.СуммаПоПроекту) КАК СуммаПоПроекту |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПриходДенег.СписокПроектов КАК ПриходДенегСписокПроектов |ГДЕ | ПриходДенегСписокПроектов.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ПриходДенегСписокПроектов.Проект | |ИНДЕКСИРОВАТЬ ПО | Проект |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВзаиморасчетыСКонтрагентамиОстатки.Контрагент КАК Контрагент, | ВзаиморасчетыСКонтрагентамиОстатки.Проект, | ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток, 0) КАК СуммаОстаток, | 1 КАК ПорядокСортировки, | ТЧДок.СуммаПоПроекту |ПОМЕСТИТЬ Взаиморасчеты |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки( | &МоментВремени, | Контрагент = &Контрагент | И (Проект В | (ВЫБРАТЬ | Т.Проект | ИЗ | ТЧДок КАК Т) | И Проект <> ЗНАЧЕНИЕ(Справочник.Проекты.Аванс))) КАК ВзаиморасчетыСКонтрагентамиОстатки | ПО ТЧДок.Проект = ВзаиморасчетыСКонтрагентамиОстатки.Проект | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВзаиморасчетыСКонтрагентамиОстатки.Контрагент, | ВзаиморасчетыСКонтрагентамиОстатки.Проект, | ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток, | 2, | 0 |ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки( | &МоментВремени, | Контрагент = &Контрагент | И (НЕ Проект В | (ВЫБРАТЬ | Т.Проект | ИЗ | ТЧДок КАК Т) | И Проект <> ЗНАЧЕНИЕ(Справочник.Проекты.Аванс))) КАК ВзаиморасчетыСКонтрагентамиОстатки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Взаиморасчеты.Контрагент, | Взаиморасчеты.Проект, | Взаиморасчеты.СуммаОстаток КАК СуммаОстаток, | Взаиморасчеты.ПорядокСортировки КАК ПорядокСортировки, | Взаиморасчеты.СуммаПоПроекту КАК СуммаПоПроекту |ИЗ | Взаиморасчеты КАК Взаиморасчеты | |УПОРЯДОЧИТЬ ПО | ПорядокСортировки, | СуммаОстаток УБЫВ |ИТОГИ | СУММА(СуммаПоПроекту) |ПО | ОБЩИЕ"; Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ВыборкаОбщийИтог.Следующий(); // Общий итог СуммаРаспределить = ВыборкаОбщийИтог.СуммаПоПроекту; // Вставить обработку выборки ВыборкаОбщийИтог ВыборкаДетальныеЗаписи = ВыборкаОбщийИтог.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() и СуммаРаспределить>0 Цикл Если ВыборкаДетальныеЗаписи.СуммаОстаток = 0 Тогда Продолжить; КонецЕсли; Если ВыборкаДетальныеЗаписи.ПорядокСортировки = 1 Тогда Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Проект = ВыборкаДетальныеЗаписи.Проект; Движение.Сумма = ?(ВыборкаДетальныеЗаписи.СуммаОстаток> ВыборкаДетальныеЗаписи.СуммаПоПроекту,МИН(ВыборкаДетальныеЗаписи.СуммаПоПроекту, СуммаРаспределить),ВыборкаДетальныеЗаписи.СуммаОстаток); СуммаРаспределить =СуммаРаспределить - Движение.Сумма; Иначе Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Проект = ВыборкаДетальныеЗаписи.Проект; Движение.Сумма = Мин(ВыборкаДетальныеЗаписи.СуммаОстаток, СуммаРаспределить); СуммаРаспределить =СуммаРаспределить - Движение.Сумма; КонецЕсли; КонецЦикла; Если СуммаРаспределить>0 Тогда Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Проект = Справочники.Проекты.Аванс; Движение.Сумма = СуммаРаспределить; КонецЕсли; КонецПроцедуры Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина; Движения.ВзаиморасчетыСКонтрагентами.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСКонтрагентами"); ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВзаиморасчетыСКонтрагентамиОстатки.Контрагент, | ВзаиморасчетыСКонтрагентамиОстатки.Проект, | ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток КАК СуммаОстаток |ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки( | &МоментВремени, | Контрагент = &Контрагент | И Проект = ЗНАЧЕНИЕ(Справочник.Проекты.Аванс)) КАК ВзаиморасчетыСКонтрагентамиОстатки |ИТОГИ | СУММА(СуммаОстаток) |ПО | ОБЩИЕ"; Запрос.УстановитьПараметр("Контрагент" , Контрагент); Запрос.УстановитьПараметр("МоментВремени" , ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Результат = Запрос.Выполнить(); СуммаСписать = СуммаПоДокументу; ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ВыборкаОбщийИтог.Следующий(); // Общий итог Если ВыборкаОбщийИтог.Количество()>0 и СуммаСписать>0 тогда Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Проект = Справочники.Проекты.Аванс; Движение.Сумма = Мин(ВыборкаОбщийИтог.СуммаОстаток, СуммаСписать); СуммаСписать = СуммаСписать - Движение.Сумма; КонецЕсли; Если СуммаСписать >0 Тогда Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Проект = Проект; Движение.Сумма = СуммаСписать; КонецЕсли; КонецПроцедуры //Очтет СостояниеВзаиморасчетов ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстатки.Контрагент, ВзаиморасчетыСКонтрагентамиОстатки.Проект, ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток КАК Сумма, ВЫБОР КОГДА ВзаиморасчетыСКонтрагентамиОстатки.Проект <> ЗНАЧЕНИЕ(Справочник.Проекты.Аванс) ТОГДА 0 ИНАЧЕ 1 КОНЕЦ КАК ПорядокСортировки ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК ВзаиморасчетыСКонтрагентамиОстатки //Отчет Взиморасчеты ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Контрагент, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Проект, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаНачальныйОстаток, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаКонечныйОстаток, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаОборот, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаПриход, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаРасход ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты //1.36 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Помимо товаров в расходной накладной могут также быть указаны услуги (например, доставка). //И товары и услуги необходимо указывать в одной табличной части. Учет товаров ведется в разрезе складов. //В документах по поступлению и продаже товаров указан только один склад (склад – реквизит шапки). //При продаже себестоимость товара рассчитывается как средняя по всей компании в целом, и проверяется остаток на складе, с которого производится отгрузка. //Например, если купили 1 рулон утеплителя за 1000 рублей и оприходовали его на первый склад, а второй такой же рулон утеплителя купили за 2000 рублей, но оприходовали на второй склад, то при продаже себестоимость этого утеплителя будет рассчитана как средняя, т.е. составит (1000+2000)/2 = 1500 рублей, и продать возможно не более одного рулона с каждого склада. //Необходимо создать документ «Сторно», который для выбранного документа будет формировать все те же движения по всем тем же регистрам, но с противоположным знаком и на дату документа «Сторно». Создать отчет по продажам за период и отчет (с использованием плана видов характеристик) о движении материалов с заданной характеристикой «Производитель». //Отчет должен формироваться за указанный период для выбранного склада по количеству и сумме. // //СоздаемСпр Склады,Производитель. В шапки накладных добавляем Склад. //В спрНоменклатура добавляем ВидНоменклатуры. Создаем док Сторно (тч СписокДокументов - Документ (приходная,расходная)). //Добавляем вид характеристики - производитель в ПВХ. Предопр. Производитель. //Создаем РС ЗначениеХарактеристик (незав, непериод. Изм. Объект - СпрНоменклатура, Рес.Свойство - ПланВидовХарактеристикСсылка.СвойстваОбъектов, Рекв. Реквизит - Характеристика.СвойстваОбъектов) //РН ОстаткиНоменклатуры - Склад,Номенклатура, количество. //РН ОстаткиНоменклатурыСтоимость (Номенклатура, Количество,Стоимость.) //РН Продажи обороты (Номенклтаура, Количество,Сумма,Стоимость.). //ДокПриходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать=Истина; Движения.ОстаткиНоменклатурыСтоимость.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Если ТекСтрокаСписокНоменклатуры.Номенклатура.ВидНоменклатуры <> Перечисления.ВидыНоменклатуры.Товар Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатурыСтоимость.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Склад = Склад; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатурыСтоимость.Записывать = Истина; Движения.Продажи.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.ОстаткиНоменклатурыСтоимость.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.УстановитьЗначение("Склад", Склад); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатурыСтоимость"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.Ссылка.Склад КАК Склад, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Ссылка.Склад, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК ДокКол, | ТЧДок.Сумма КАК ДокСум, | ТЧДок.Склад, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстатокСклад, | ЕСТЬNULL(ОстаткиНоменклатурыСтоимостьОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыСтоимостьОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | ТЧДок.ВидНоменклатуры, | ПРЕДСТАВЛЕНИЕ(ТЧДок.Номенклатура) КАК НоменклатураПредставление |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, Склад) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т)) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатурыСтоимость.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК ОстаткиНоменклатурыСтоимостьОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыСтоимостьОстатки.Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Себестоимость = 0; Если ВыборкаДетальныеЗаписи.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда Если ВыборкаДетальныеЗаписи.ДокКол > ВыборкаДетальныеЗаписи.КоличествоОстатокСклад Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара"+ВыборкаДетальныеЗаписи.НоменклатураПредставление+" на складе "+Склад+" недостаточно. На остатке:"+ВыборкаДетальныеЗаписи.КоличествоОстатокСклад; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Количество = ВыборкаДетальныеЗаписи.ДокКол; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Склад = Склад; Движение = Движения.ОстаткиНоменклатурыСтоимость.ДобавитьРасход(); Движение.Период = Дата; Движение.Количество = ВыборкаДетальныеЗаписи.ДокКол; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстаток >ВыборкаДетальныеЗаписи.ДокКол, ВыборкаДетальныеЗаписи.ДокКол*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); Себестоимость = Себестоимость + Движение.Стоимость; КонецЕсли; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Сумма = ВыборкаДетальныеЗаписи.ДокСум; Движение.Количество = ВыборкаДетальныеЗаписи.ДокКол; Движение.Стоимость = Себестоимость; КонецЦикла; КонецПроцедуры //ДокСТорно Процедура ОбработкаПроведения(Отказ, РежимПроведения) Для каждого ЭлементДок из СписокДокументов цикл Для каждого Регистр из ЭлементДок.Документ.Метаданные().Движения цикл ИмяРегистра = Регистр.Имя; Движения[ИмяРегистра].Записывать = Истина; ЕстьКоличество = Регистр.Ресурсы.Найти("Количество")<>Неопределено; ЕстьСтоимость = Регистр.Ресурсы.Найти("Стоимость")<>Неопределено; ЕстьСумма = Регистр.Ресурсы.Найти("Сумма")<>Неопределено; РегистрОборотный = Строка(Регистр.ВидРегистра) = "Обороты"; ДвижениеДок = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей(); ДвижениеДок.Отбор.Регистратор.Установить(ЭлементДок.Документ); ДвижениеДок.Прочитать(); Для каждого ЭлементСторнирования из ДвижениеДок цикл НоваяСтрока = Движения[ИмяРегистра].Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементСторнирования,,?(РегистрОборотный,"ВидДвижения","")); Если ЕстьКоличество Тогда НоваяСтрока.Количество = -1*ЭлементСторнирования.Количество; КонецЕсли; Если ЕстьСтоимость Тогда НоваяСтрока.Стоимость = -1*ЭлементСторнирования.Стоимость; КонецЕсли; Если ЕстьСумма Тогда НоваяСтрока.Сумма = -1*ЭлементСторнирования.Сумма; КонецЕсли; КонецЦикла; КонецЦикла; КонецЦикла; КонецПроцедуры //Отчет Продажи ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СуммаОборот КАК Продажа, ПродажиОбороты.СтоимостьОборот КАК Себестоимость ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты //Отчет ВедомостьПоСкладу ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.Склад, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход, ВЫБОР КОГДА ЕСТЬNULL(ОстаткиНоменклатурыСтоимостьОстаткиИОбороты.КоличествоНачальныйОстаток, 0) <> 0 ТОГДА ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток * ЕСТЬNULL(ОстаткиНоменклатурыСтоимостьОстаткиИОбороты.СтоимостьНачальныйОстаток, 0) / ЕСТЬNULL(ОстаткиНоменклатурыСтоимостьОстаткиИОбороты.КоличествоНачальныйОстаток, 0) ИНАЧЕ 0 КОНЕЦ КАК СтоимостьНачальныйОстаток, ВЫБОР КОГДА ЕСТЬNULL(ОстаткиНоменклатурыСтоимостьОстаткиИОбороты.КоличествоКонечныйОстаток, 0) <> 0 ТОГДА ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток * ЕСТЬNULL(ОстаткиНоменклатурыСтоимостьОстаткиИОбороты.СтоимостьКонечныйОстаток, 0) / ЕСТЬNULL(ОстаткиНоменклатурыСтоимостьОстаткиИОбороты.КоличествоКонечныйОстаток, 0) ИНАЧЕ 0 КОНЕЦ КАК СтоимостьКонечныйОстаток, ВЫБОР КОГДА ЕСТЬNULL(ОстаткиНоменклатурыСтоимостьОстаткиИОбороты.КоличествоПриход, 0) <> 0 ТОГДА ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход * ЕСТЬNULL(ОстаткиНоменклатурыСтоимостьОстаткиИОбороты.СтоимостьПриход, 0) / ЕСТЬNULL(ОстаткиНоменклатурыСтоимостьОстаткиИОбороты.КоличествоПриход, 0) ИНАЧЕ 0 КОНЕЦ КАК СтоимостьПриход, ВЫБОР КОГДА ЕСТЬNULL(ОстаткиНоменклатурыСтоимостьОстаткиИОбороты.КоличествоРасход, 0) <> 0 ТОГДА ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход * ЕСТЬNULL(ОстаткиНоменклатурыСтоимостьОстаткиИОбороты.СтоимостьРасход, 0) / ЕСТЬNULL(ОстаткиНоменклатурыСтоимостьОстаткиИОбороты.КоличествоРасход, 0) ИНАЧЕ 0 КОНЕЦ КАК СтоимостьРасход, ЗначениеХарактеристик.Реквизит КАК Производитель ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(, , , , {(Склад = &Склад)}) КАК ОстаткиНоменклатурыОстаткиИОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатурыСтоимость.ОстаткиИОбороты КАК ОстаткиНоменклатурыСтоимостьОстаткиИОбороты ПО ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура = ОстаткиНоменклатурыСтоимостьОстаткиИОбороты.Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначениеХарактеристик КАК ЗначениеХарактеристик ПО ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура = ЗначениеХарактеристик.Объект {ХАРАКТЕРИСТИКИ ТИП(Справочник.Номенклатура) ВИДЫХАРАКТЕРИСТИК ПланВидовХарактеристик.СвойстваОбъектов ПОЛЕКЛЮЧА Ссылка ПОЛЕИМЕНИ Наименование ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения ЗНАЧЕНИЯХАРАКТЕРИСТИК РегистрСведений.ЗначениеХарактеристик ПОЛЕОБЪЕКТА Объект ПОЛЕВИДА Свойство ПОЛЕЗНАЧЕНИЯ Реквизит } //1.37 Компания занимается оптовой торговлей. Взаиморасчеты с покупателями ведутся в разрезе счетов. //Покупателю выставляется счет, на основании которого далее происходит отгрузка документами «Расходная накладная», причем накладных по одному счету может быть несколько. //Считается, что товар по счету в конце концов будет отгружен полностью, а накладные могут быть только на основании счета. //В том случае, если товар по счету отгружен полностью, а покупатель оплатил не до конца, ему насчитываются пени. //При поступлении оплаты (документ «Приход денег») пользователь указывает счета, по которым должна быть зачтена оплата. //При проведении документа в том случае, если некоторые счета были отгружены полностью, происходит начисление пеней по ним. //Расчет пени происходит по формуле: «количество дней просрочки» * «% пени» * «оставшаяся сумма задолженности по счету». //Просрочка отсчитывается от даты полной отгрузки, если это первая оплата после полной отгрузки, или с момента последнего начисления пеней. //Процент пеней указывается в каждом счете. В сумму задолженности начисленные пени не включаются. //В первую очередь оплата распределяется на все начисленные пени, а потом уже на счета, начиная с самого раннего недооплаченного. //Следует считать, что сумма оплаты в документе не превосходит задолженности этого контрагента. Складской учет товаров не ведется. //Необходимо построить отчет для анализа состояния счетов на выбранную дату и анализ счета за период. // //Создаем док Счет( рекв. СуммаПоДокументу, ПеняЗаДень) //В шапку расхдной добавляем Счет. Создаем док ПриходДенег (рекв. СуммаПоДокументу, тч СписокСчетов - счет.). //Создаем РС (Подчинен регистратору, по позиции ргистратору. Рег. Расходная, приходДенег. Изм. Счет, рес. ДатаОтгрузки, ДатаОплаты). //РегОстатки Отгрузки (,рег.прих.расх. счет. изм. Счет рес. Отгрузка) РегОстатков (рег. счет. риходденег. изм. Счет, рес. Оплата). //РегОстатков Пеня (рег. приход денег. изм. Счет, рес.Пеня) //ДокРасходная Процедура ОбработкаПроведения(Отказ, Режим) Движения.Отгрузки.Записывать = Истина; Движения.Отгрузки.Записать(); Движения.ДатаОтгрузкиПоСчету.Записывать = Истина; Движения.ДатаОтгрузкиПоСчету.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Отгрузки"); ЭлементБлокировки.УстановитьЗначение("Счет", Счет); Блокировка.Заблокировать(); // регистр Отгрузки Расход Движение = Движения.Отгрузки.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Счет = Счет; Движение.Отгрузка = СуммаПоДокументу; Движения.Отгрузки.Записать(); Запрос=Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | ОтгрузкиОстатки.Счет, | ВЫБОР | КОГДА ОтгрузкиОстатки.ОтгрузкаОстаток < 0 | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ КАК Превышение, | ОтгрузкиОстатки.ОтгрузкаОстаток |ИЗ | РегистрНакопления.Отгрузки.Остатки(&МоментВремени, Счет = &Счет) КАК ОтгрузкиОстатки"; Запрос.УстановитьПараметр("МоментВремени",Новый Граница(МоментВремени(),ВидГраницы.Включая)); Запрос.УстановитьПараметр("Счет",Счет); Результат=Запрос.Выполнить(); Если Результат.Пустой() тогда // регистр ДатаОтгрузкиПоСчету Движение = Движения.ДатаОтгрузкиПоСчету.Добавить(); Движение.Период = Дата; Движение.Счет = Счет; Движение.ДатаОтгрузки = Дата; Иначе ВыборкаПоСчету=Результат.Выбрать(); ВыборкаПоСчету.Следующий(); Если ВыборкаПоСчету.Превышение тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Отгрузка превышает счет на "+ВыборкаПоСчету.ОтгрузкаОстаток; Сообщение.Сообщить(); Отказ=Истина; КонецЕсли; КонецЕсли; КонецПроцедуры //ДокСчет Процедура ОбработкаПроведения(Отказ, Режим) // регистр Отгрузки Приход Движения.Отгрузки.Записывать = Истина; Движение = Движения.Отгрузки.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Счет = Ссылка; Движение.Отгрузка = СуммаПоДокументу; // регистр Оплата Приход Движения.Оплата.Записывать = Истина; Движение = Движения.Оплата.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Счет = Ссылка; Движение.Оплата = СуммаПоДокументу; КонецПроцедуры //ДокПриходДенег Процедура ОбработкаПроведения(Отказ, Режим) Движения.Оплата.Записывать = Истина; Движения.Оплата.Записать(); Движения.Пеня.Записывать = Истина; Движения.Пеня.Записать(); Движения.ДатаОтгрузкиПоСчету.Записывать = Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Оплата"); ЭлементБлокировки.ИсточникДанных = СписокСчетов; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Счет", "Счет"); ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Пеня"); ЭлементБлокировки.ИсточникДанных = СписокСчетов; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Счет", "Счет"); Блокировка.Заблокировать(); Запрос=Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | ПриходДенегСписокСчетов.Счет КАК Счет |ПОМЕСТИТЬ ТабДок |ИЗ | Документ.ПриходДенег.СписокСчетов КАК ПриходДенегСписокСчетов |ГДЕ | ПриходДенегСписокСчетов.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ПриходДенегСписокСчетов.Счет | |ИНДЕКСИРОВАТЬ ПО | Счет |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДатаОтгрузкиПоСчетуСрезПоследних.Счет КАК Счет, | ДатаОтгрузкиПоСчетуСрезПоследних.ДатаОтгрузки |ПОМЕСТИТЬ ТабОтгрузок |ИЗ | РегистрСведений.ДатаОтгрузкиПоСчету.СрезПоследних( | &МоментВремени, | Счет В | (ВЫБРАТЬ | ТабДок.Счет | ИЗ | ТабДок КАК ТабДок)) КАК ДатаОтгрузкиПоСчетуСрезПоследних |ГДЕ | ДатаОтгрузкиПоСчетуСрезПоследних.ДатаОтгрузки <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) | И ДатаОтгрузкиПоСчетуСрезПоследних.ДатаОплаты = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) | И ДатаОтгрузкиПоСчетуСрезПоследних.ДатаОтгрузки < &Дата | |ИНДЕКСИРОВАТЬ ПО | Счет |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВЫБОР | КОГДА ОплатаОстаткиИОбороты.Период < ТабОтгрузок.ДатаОтгрузки | ТОГДА ТабОтгрузок.ДатаОтгрузки | ИНАЧЕ ОплатаОстаткиИОбороты.Период | КОНЕЦ КАК Период, | ОплатаОстаткиИОбороты.Счет, | МИНИМУМ(ОплатаОстаткиИОбороты.ОплатаКонечныйОстаток) КАК ОплатаКонечныйОстаток, | ТабОтгрузок.ДатаОтгрузки |ПОМЕСТИТЬ ТаблицаПродаж |ИЗ | ТабОтгрузок КАК ТабОтгрузок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Оплата.ОстаткиИОбороты( | , | &МоментВремени, | День, | ДвиженияИГраницыПериода, | Счет В | (ВЫБРАТЬ | ТабОтгрузок.Счет | ИЗ | ТабОтгрузок КАК ТабОтгрузок)) КАК ОплатаОстаткиИОбороты | ПО ТабОтгрузок.Счет = ОплатаОстаткиИОбороты.Счет | |СГРУППИРОВАТЬ ПО | ВЫБОР | КОГДА ОплатаОстаткиИОбороты.Период < ТабОтгрузок.ДатаОтгрузки | ТОГДА ТабОтгрузок.ДатаОтгрузки | ИНАЧЕ ОплатаОстаткиИОбороты.Период | КОНЕЦ, | ТабОтгрузок.ДатаОтгрузки, | ОплатаОстаткиИОбороты.Счет |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТаблицаПродаж.Период, | МИНИМУМ(ТаблицаПродаж1.Период) КАК Период1 |ПОМЕСТИТЬ ТабИнтервалов |ИЗ | ТаблицаПродаж КАК ТаблицаПродаж | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаПродаж КАК ТаблицаПродаж1 | ПО ТаблицаПродаж.Период < ТаблицаПродаж1.Период | И ТаблицаПродаж.Счет = ТаблицаПродаж1.Счет | |СГРУППИРОВАТЬ ПО | ТаблицаПродаж.Период |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТаблицаПродаж.Счет, | СУММА(ВЫРАЗИТЬ(ТаблицаПродаж.ОплатаКонечныйОстаток * РАЗНОСТЬДАТ(ТабИнтервалов.Период, ТабИнтервалов.Период1, ДЕНЬ) * ТаблицаПродаж.Счет.ПеняЗаДень / 100 КАК ЧИСЛО(17, 2))) КАК ВсяПеня, | ТаблицаПродаж.ДатаОтгрузки |ПОМЕСТИТЬ ОбщийДолгПоПене |ИЗ | ТаблицаПродаж КАК ТаблицаПродаж | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТабИнтервалов КАК ТабИнтервалов | ПО ТаблицаПродаж.Период = ТабИнтервалов.Период | |СГРУППИРОВАТЬ ПО | ТаблицаПродаж.Счет, | ТаблицаПродаж.ДатаОтгрузки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОбщийДолгПоПене.Счет КАК Счет, | ОбщийДолгПоПене.ДатаОтгрузки, | ОплатаОстатки.ОплатаОстаток КАК ОплатаОстаток, | ЕСТЬNULL(ОбщийДолгПоПене.ВсяПеня, 0) - ЕСТЬNULL(ПеняОбороты.ПеняПриход, 0) КАК НужноНачислитьПеню, | ЕСТЬNULL(ОбщийДолгПоПене.ВсяПеня, 0) - ЕСТЬNULL(ПеняОбороты.ПеняРасход, 0) КАК НужноВыплатитьПеню |ИЗ | РегистрНакопления.Оплата.Остатки( | &МоментВремени, | Счет В | (ВЫБРАТЬ | ТабДок.Счет | ИЗ | ТабДок КАК ТабДок)) КАК ОплатаОстатки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Пеня.Обороты( | , | &МоментВремени, | , | Счет В | (ВЫБРАТЬ | ТабДок.Счет | ИЗ | ТабДок КАК ТабДок)) КАК ПеняОбороты | ПО ОплатаОстатки.Счет = ПеняОбороты.Счет | ЛЕВОЕ СОЕДИНЕНИЕ ОбщийДолгПоПене КАК ОбщийДолгПоПене | ПО ОплатаОстатки.Счет = ОбщийДолгПоПене.Счет | |УПОРЯДОЧИТЬ ПО | ОплатаОстатки.Счет.МоментВремени |ИТОГИ | СУММА(ОплатаОстаток), | СУММА(НужноВыплатитьПеню) |ПО | ОБЩИЕ"; Запрос.УстановитьПараметр("МоментВремени",Дата); Запрос.УстановитьПараметр("Дата",Дата); Запрос.УстановитьПараметр("Ссылка",Ссылка); Результат=Запрос.Выполнить(); ВыборкаПоИтогу=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ВыборкаПоИтогу.Следующий(); Переплата=ВыборкаПоИтогу.ОплатаОстаток+ВыборкаПоИтогу.НужноВыплатитьПеню -СуммаПоДокументу; Если Переплата<0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Сумма оплаты превышате задолженность по всем счетам на "+(-Переплата); Сообщение.Сообщить(); Отказ=Истина КонецЕсли; Если не отказ тогда ВыборкаПоСчету=ВыборкаПоИтогу.Выбрать(); СуммаКРаспределению =СуммаПоДокументу; Пока ВыборкаПоСчету.Следующий() и СуммаКРаспределению>0 цикл Если ВыборкаПоСчету.НужноНачислитьПеню>0 тогда // регистр Пеня Приход Движение = Движения.Пеня.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Счет = ВыборкаПоСчету.Счет; Движение.Пеня =ВыборкаПоСчету.НужноНачислитьПеню; КонецЕсли; Если ВыборкаПоСчету.НужноВыплатитьПеню>0 тогда Движение = Движения.Пеня.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Счет = ВыборкаПоСчету.Счет; Движение.Пеня = Мин(ВыборкаПоСчету.НужноВыплатитьПеню,СуммаКРаспределению); СуммаКРаспределению=СуммаКРаспределению- Движение.Пеня КонецЕсли; КонецЦикла; ВыборкаПоСчету.Сбросить(); Пока ВыборкаПоСчету.Следующий() и СуммаКРаспределению>0 цикл Оплата=0; Если СуммаКРаспределению>0 Тогда // регистр Оплата Расход Оплата= Мин(ВыборкаПоСчету.ОплатаОстаток,СуммаКРаспределению); Движение = Движения.Оплата.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Счет = ВыборкаПоСчету.Счет; Движение.Оплата = Оплата ; СуммаКРаспределению=СуммаКРаспределению-Оплата; КонецЕсли; Если Оплата= ВыборкаПоСчету.ОплатаОстаток тогда // регистр ДатаОтгрузкиПоСчету Движение = Движения.ДатаОтгрузкиПоСчету.Добавить(); Движение.Период = Дата; Движение.Счет = ВыборкаПоСчету.Счет; Движение.ДатаОтгрузки = ВыборкаПоСчету.ДатаОтгрузки; Движение.ДатаОплаты = Дата; КонецЕсли ; КонецЦикла; КонецЕсли; КонецПроцедуры //Отчет АнализСостоянияСчета ВЫБРАТЬ ДатаОтгрузкиПоСчетуСрезПоследних.Счет, ДатаОтгрузкиПоСчетуСрезПоследних.ДатаОтгрузки ПОМЕСТИТЬ ТабОтгрузок ИЗ РегистрСведений.ДатаОтгрузкиПоСчету.СрезПоследних(&КонецПериода, ) КАК ДатаОтгрузкиПоСчетуСрезПоследних ГДЕ ДатаОтгрузкиПоСчетуСрезПоследних.ДатаОтгрузки <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) И ДатаОтгрузкиПоСчетуСрезПоследних.ДатаОплаты = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) И ДатаОтгрузкиПоСчетуСрезПоследних.ДатаОтгрузки < &КонецПериода ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВЫБОР КОГДА ОплатаОстаткиИОбороты.Период < ТабОтгрузок.ДатаОтгрузки ТОГДА ТабОтгрузок.ДатаОтгрузки ИНАЧЕ ОплатаОстаткиИОбороты.Период КОНЕЦ КАК Период, ОплатаОстаткиИОбороты.Счет, МИНИМУМ(ОплатаОстаткиИОбороты.ОплатаКонечныйОстаток) КАК ОплатаКонечныйОстаток, ТабОтгрузок.ДатаОтгрузки ПОМЕСТИТЬ ТабОплат ИЗ ТабОтгрузок КАК ТабОтгрузок ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Оплата.ОстаткиИОбороты( , &КонецПериода, День, ДвиженияИГраницыПериода, Счет В (ВЫБРАТЬ ТабОтгрузок.Счет ИЗ ТабОтгрузок КАК ТабОтгрузок)) КАК ОплатаОстаткиИОбороты ПО ТабОтгрузок.Счет = ОплатаОстаткиИОбороты.Счет СГРУППИРОВАТЬ ПО ТабОтгрузок.ДатаОтгрузки, ОплатаОстаткиИОбороты.Счет, ВЫБОР КОГДА ОплатаОстаткиИОбороты.Период < ТабОтгрузок.ДатаОтгрузки ТОГДА ТабОтгрузок.ДатаОтгрузки ИНАЧЕ ОплатаОстаткиИОбороты.Период КОНЕЦ ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТабОплат.Период, МИНИМУМ(ТабОплат1.Период) КАК Период1 ПОМЕСТИТЬ Интервал ИЗ ТабОплат КАК ТабОплат ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТабОплат КАК ТабОплат1 ПО ТабОплат.Период < ТабОплат1.Период И ТабОплат.Счет = ТабОплат1.Счет СГРУППИРОВАТЬ ПО ТабОплат.Период ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТабОплат.Счет, СУММА(ТабОплат.ОплатаКонечныйОстаток * РАЗНОСТЬДАТ(Интервал.Период, Интервал.Период1, ДЕНЬ) * ТабОплат.Счет.ПеняЗаДень / 100) КАК ВсяПеня, ТабОплат.ДатаОтгрузки ПОМЕСТИТЬ ОбщийДолгПоПене ИЗ ТабОплат КАК ТабОплат ВНУТРЕННЕЕ СОЕДИНЕНИЕ Интервал КАК Интервал ПО ТабОплат.Период = Интервал.Период СГРУППИРОВАТЬ ПО ТабОплат.Счет, ТабОплат.ДатаОтгрузки ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ОплатаОстатки.Счет, ОплатаОстатки.ОплатаОстаток КАК ОплатаОстаток, ДатаОтгрузкиПоСчетуСрезПоследних.ДатаОтгрузки, ВЫБОР КОГДА ЕСТЬNULL(ОбщийДолгПоПене.ВсяПеня, 0) = 0 ТОГДА ЕСТЬNULL(ОбщийДолгПоПене.ВсяПеня, 0) ИНАЧЕ ЕСТЬNULL(ОбщийДолгПоПене.ВсяПеня, 0) - ЕСТЬNULL(ПеняОбороты.ПеняРасход, 0) КОНЕЦ КАК НеВыплаченнаяПеня ИЗ РегистрНакопления.Оплата.Остатки(&КонецПериода, ) КАК ОплатаОстатки ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДатаОтгрузкиПоСчету.СрезПоследних(&КонецПериода, ) КАК ДатаОтгрузкиПоСчетуСрезПоследних ПО ОплатаОстатки.Счет = ДатаОтгрузкиПоСчетуСрезПоследних.Счет ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Пеня.Обороты(, &КонецПериода, , ) КАК ПеняОбороты ПО ОплатаОстатки.Счет = ПеняОбороты.Счет ПОЛНОЕ СОЕДИНЕНИЕ ОбщийДолгПоПене КАК ОбщийДолгПоПене ПО ОплатаОстатки.Счет = ОбщийДолгПоПене.Счет //Отчет АнализСчета ВЫБРАТЬ ОплатаОбороты.Счет, ОплатаОбороты.ОплатаПриход КАК Задолженность, ОплатаОбороты.ОплатаРасход КАК Оплата, ОплатаОбороты.Регистратор ПОМЕСТИТЬ Оплаты ИЗ РегистрНакопления.Оплата.Обороты(, , Регистратор, ) КАК ОплатаОбороты ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПеняОбороты.Счет, ПеняОбороты.ПеняПриход, ПеняОбороты.ПеняРасход, ПеняОбороты.Регистратор ИЗ РегистрНакопления.Пеня.Обороты(, , Регистратор, ) КАК ПеняОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Оплаты.Счет, Оплаты.Регистратор, СУММА(Оплаты.Задолженность) КАК Задолженность, СУММА(Оплаты.Оплата) КАК Оплата ИЗ Оплаты КАК Оплаты СГРУППИРОВАТЬ ПО Оплаты.Счет, Оплаты.Регистратор ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ОтгрузкиОбороты.Счет, ОтгрузкиОбороты.Регистратор, ОтгрузкиОбороты.ОтгрузкаРасход, NULL ИЗ РегистрНакопления.Отгрузки.Обороты(, , Регистратор, ) КАК ОтгрузкиОбороты //1.38 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части. //Также товар может перемещаться между складами документом «Перемещение». //Поступление и продажа товара может быть только по одному складу (склад реквизит шапки). //При проведении расходной накладной необходимо при нехватке товара выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //Списание себестоимости должно быть организовано по партиям, в зависимости от текущего значения принятого на этот год в учетной политикеметода списания себестоимости (FIFO или LIFO). //Еще раз подчеркивается – учетная политика действует год. На следующий год метод списания может смениться. //Учет партий ведется для каждого склада. Перемещение товара происходит с одного склада отправителя на один склад получатель (склады реквизиты шапки). //Списание себестоимости товара со склада происходит так же, как при списании в расходной накладной. //Партией поступления товара на склад получатель считать документ перемещения. При перемещении между складами товар не переоценивается. //Необходимо построить отчет по продажам товаров за период и остаткам товара на указанную дату. // //В СпрНом. добавляем ВидНоменклатуры. Создаем Спр. Склады. В шапки накладных добавляем Склад. Создаем док. //ПеремещениеТоваров (рекв. СуммаПоДокументу, СкладОтправитель, СкладПолучатель). тч СписокНоменклатуры (Номенклатура, Количество). // //Создаем РС УчетнаПолитика (рес. МетодСписания). РН ОстаткиНоменклатуры (Номенклатура,Склад,Партия, Количество,Стоимость) //РН Продажи (Номенклатура, Количество,Сумма,Стоимость.) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Склад = Склад; Движение.Партия = Ссылка; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; МетодСписания = РегистрыСведений.УчетнаПолитика.ПолучитьПоследнее(Дата).МетодСписания; Если МетодСписания.Пустая() Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не найдены настройки учетной политики. По- умолчанию метод списания ФИФО"; Сообщение.Сообщить(); КонецЕсли; Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда ПорядокСортировки = " УБЫВ"; Иначе ПорядокСортировки = ""; КонецЕсли; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.УстановитьЗначение("Склад", Склад); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.Ссылка.Склад КАК Склад, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Ссылка.Склад, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ТЧДок.ВидНоменклатуры КАК ВидНоменклатуры, | ОстаткиНоменклатурыОстатки.Партия, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, Склад) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т | ГДЕ | Т.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга))) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.МоментВремени"+ПорядокСортировки+" |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | МАКСИМУМ(ВидНоменклатуры), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени" , ?(РежимПроведения=РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Себестоимость = 0; Если ВыборкаНоменклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда Если ВыборкаНоменклатура.ДокументКоличество > ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" на складе "+Склад+" недостаточно. На остатке:"+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; КоличествоСписать = ВыборкаНоменклатура.ДокументКоличество; ВыборкаПартия = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаПартия.Следующий() и КоличествоСписать>0 Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаПартия.Номенклатура; Движение.Партия = ВыборкаПартия.Партия; Движение.Склад = Склад; Движение.Количество = Мин(ВыборкаПартия.КоличествоОстаток, КоличествоСписать); Движение.Стоимость = ?(ВыборкаПартия.КоличествоОстаток>КоличествоСписать, КоличествоСписать*ВыборкаПартия.СтоимостьОстаток/ВыборкаПартия.КоличествоОстаток,ВыборкаПартия.СтоимостьОстаток); КоличествоСписать = КоличествоСписать - Движение.Количество; Себестоимость = Себестоимость+Движение.Стоимость; КонецЦикла; КонецЕсли; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Количество = ВыборкаНоменклатура.ДокументКоличество; Движение.Сумма = ВыборкаНоменклатура.ДокументСумма; Движение.Стоимость = Себестоимость; КонецЦикла; КонецПроцедуры //ДокПеремещение Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); МетодСписания = РегистрыСведений.УчетнаПолитика.ПолучитьПоследнее(Дата).МетодСписания; Если МетодСписания.Пустая() Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не найдены настройки учетной политики. По- умолчанию метод списания ФИФО"; Сообщение.Сообщить(); КонецЕсли; Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда ПорядокСортировки = " УБЫВ"; Иначе ПорядокСортировки = ""; КонецЕсли; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.УстановитьЗначение("Склад", СкладОтправитель); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СписокНоменклатуры.Ссылка.СкладОтправитель КАК Склад, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПеремещениеТоваров.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Ссылка.СкладОтправитель, | СписокНоменклатуры.Номенклатура.ВидНоменклатуры | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Склад, | ТЧДок.ВидНоменклатуры КАК ВидНоменклатуры, | ОстаткиНоменклатурыОстатки.Партия, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, Склад) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т | ГДЕ | Т.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар))) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.МоментВремени"+ПорядокСортировки+" |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ВидНоменклатуры), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда Если ВыборкаНоменклатура.ДокументКоличество > ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" на складе "+СкладОтправитель+" недостаточно. На остатке:"+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; КоличествоСписать = ВыборкаНоменклатура.ДокументКоличество; Стоимость = 0; ВыборкаПартия = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаПартия.Следующий() и КоличествоСписать>0 Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаПартия.Номенклатура; Движение.Партия = ВыборкаПартия.Партия; Движение.Склад = СкладОтправитель; Движение.Количество = Мин(ВыборкаПартия.КоличествоОстаток, КоличествоСписать); Движение.Стоимость = ?(ВыборкаПартия.КоличествоОстаток>КоличествоСписать, КоличествоСписать*ВыборкаПартия.СтоимостьОстаток/ВыборкаПартия.КоличествоОстаток,ВыборкаПартия.СтоимостьОстаток); КоличествоСписать = КоличествоСписать - Движение.Количество; Стоимость = Стоимость + Движение.Стоимость; КонецЦикла; Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Партия = Ссылка; Движение.Склад = СкладПолучатель; Движение.Количество = ВыборкаНоменклатура.ДокументКоличество; Движение.Стоимость = Стоимость; КонецЕсли; КонецЦикла; КонецПроцедуры //ОтчетПродажа ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СуммаОборот КАК Продажа, ПродажиОбороты.СтоимостьОборот КАК Себестоимость ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты //ОтчетОстаткиТоваров ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.Партия, ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество, ОстаткиНоменклатурыОстатки.СтоимостьОстаток КАК Стоимость ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки //1.39 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части. //Складской учет товаров не ведется. При проведении расходной накладной необходимо в первую очередь контролировать хватает ли товара вообще. //Если нет – выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //Списание себестоимости товаров должно быть организовано по партиям, в зависимости от текущего значения принятого на этот год в учетной политике метода списания себестоимости (FIFO или LIFO). //Еще раз подчеркивается – учетная политика действует год. На следующий год метод списания может смениться. //С целью поощрения успешных сотрудников ежемесячно им выплачивается премия, причем премия тем больше, чем больше товаров сотрудник продал. //Расчет премии происходит нарастающим итогом с начала календарного года пропорционально следующей шкале: Т.е. если сотрудник с начала года оформил продаж на сумму 250 000, то его премия рассчитывается следующим образом: //Со 100 000 начисляем 5%; поскольку сумма превышает 100 000, но менее 500 000, то с суммы превышения 150 000 начисляем еще 10%. //Из этой общей суммы премии вычитаем сумму уже начисленной премии и, таким образом, получаем сумму текущей премии. //Необходимо создать документ «Расчет премии», в котором предусмотреть автоматический расчет премий сотрудников. //Следует учесть, что шкала может быть изменена пользователем в режиме «1С:Предприятие» //Необходимо построить отчет по продажам сотрудников и начисленным им премиям за период. // //В шапку расходной добавляем сотрудника (физ.л). Создаем док. РасчетПремий. //В спр.Номенклатура добавляем ВидНоменклатуры. Создаем РС. УчетнаяПолитика рес. //СпособСписания. Создаем РС ШкалаПремий (, МинПродаж, МаксПродаж рес. ПремияПроцентом). //ОстаткиНоменклатуры (Номенклатура,Партия,Количество,Стоимость.) РН Продажи (Номенклатура, Сотрудник, Количество,Себестоимость,Продажа). РН Обороты ПРемии (Сотруденик, Премия) //ДокПриходная Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) СуммаПоДокументу=СписокНоменклатуры.Итог("Сумма") КонецПроцедуры Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Партия = Ссылка; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокРасходная Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) СуммаПоДокументу=СписокНоменклатуры.Итог("Сумма") КонецПроцедуры Процедура ОбработкаПроведения(Отказ, Режим) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); МетодСписания=РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).СпособСписания ; СпособСписания=?( МетодСписания=Перечисления.УчетнаяПолитика.ЛИФО ,"Убыв",""); Запрос=Новый запрос; Запрос.Текст= "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Сотрудник |ПОМЕСТИТЬ ТабДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Сотрудник | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТабДок.Номенклатура КАК Номенклатура, | ТабДок.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры, | ТабДок.Количество КАК Количество, | ТабДок.Сумма КАК Сумма, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | ОстаткиНоменклатурыОстатки.Партия, | ТабДок.Сотрудник КАК Сотрудник |ИЗ | ТабДок КАК ТабДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ТабДок.Номенклатура | ИЗ | ТабДок КАК ТабДок)) КАК ОстаткиНоменклатурыОстатки | ПО ТабДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.МоментВремени "+СпособСписания+" |ИТОГИ | МАКСИМУМ(ВидНоменклатуры), | МАКСИМУМ(Количество), | МАКСИМУМ(Сумма), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток), | МАКСИМУМ(Сотрудник) |ПО | Номенклатура" ; Запрос.УстановитьПараметр("Ссылка",Ссылка); Запрос.УстановитьПараметр("МоментВремени", ?(Режим=РежимПроведенияДокумента.Оперативный,Неопределено,МоментВремени())); Результат=Запрос.Выполнить(); ВыборкаПоНоменклатуре=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаПоНоменклатуре.Следующий() цикл Себестоимость=0; Если ВыборкаПоНоменклатуре.ВидНоменклатуры=Перечисления.ВидыНоменклатуры.Товар тогда Нехватка=ВыборкаПоНоменклатуре.КоличествоОстаток-ВыборкаПоНоменклатуре.Количество; Если Нехватка<0 тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаПоНоменклатуре.Номенклатура+" нехватает в количестве"+(-Нехватка); Сообщение.Сообщить(); Отказ=Истина КонецЕсли; Если Отказ тогда Продолжить; КонецЕсли; СписатьКоличество=ВыборкаПоНоменклатуре.Количество; ВыборкаПоПартии=ВыборкаПоНоменклатуре.Выбрать(); Пока ВыборкаПоПартии.Следующий() и СписатьКоличество>0 цикл // регистр ОстаткиНоменклатуры Расход Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаПоПартии.Номенклатура; Движение.Партия = ВыборкаПоПартии.Партия; Движение.Количество = Мин(ВыборкаПоПартии.КоличествоОстаток,СписатьКоличество); Движение.Стоимость = ?(Движение.Количество=ВыборкаПоПартии.КоличествоОстаток,ВыборкаПоПартии.СтоимостьОстаток, Движение.Количество*ВыборкаПоПартии.СтоимостьОстаток/ВыборкаПоПартии.КоличествоОстаток); СписатьКоличество=СписатьКоличество- Движение.Количество; Себестоимость=Себестоимость+ Движение.Стоимость КонецЦикла; КонецЕсли; // регистр Продажи Приход Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаПоНоменклатуре.Номенклатура; Движение.Сотруденик = ВыборкаПоНоменклатуре.Сотрудник; Движение.Количество = ВыборкаПоНоменклатуре.Количество; Движение.Себестоимость = Себестоимость; Движение.Продажа = ВыборкаПоНоменклатуре.Сумма; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокПремии Процедура ОбработкаПроведения(Отказ, Режим) Движения.Премии.Записывать = Истина; Движения.Премии.Записать(); Запрос=Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | ПродажиОбороты.Сотруденик КАК Сотруденик, | ПродажиОбороты.ПродажаОборот КАК ПродажаОборот, | ШкалаПремий.МинПродаж, | ШкалаПремий.МаксПродаж, | ШкалаПремий.ПремияПроцентом, | ЕСТЬNULL(ПремииОбороты.ПремияОборот, 0) КАК ПремияОборот |ИЗ | РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК ПродажиОбороты | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаПремий КАК ШкалаПремий | ПО (ИСТИНА) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Премии.Обороты(&Начало, &Конец, , ) КАК ПремииОбороты | ПО ПродажиОбороты.Сотруденик = ПремииОбороты.Сотруденик | |ДЛЯ ИЗМЕНЕНИЯ | РегистрНакопления.Продажи.Обороты, | РегистрНакопления.Премии.Обороты |ИТОГИ | МАКСИМУМ(ПродажаОборот), | МАКСИМУМ(ПремияОборот) |ПО | Сотруденик"; Запрос.УстановитьПараметр("Начало",НачалоГода(Дата)); Запрос.УстановитьПараметр("Конец",МоментВремени()); Результат=Запрос.Выполнить(); ВыборкаПоСотрудника=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаПоСотрудника.Следующий() цикл ПродажаСотрудника=ВыборкаПоСотрудника.ПродажаОборот; ВыборкаПоШкале=ВыборкаПоСотрудника.Выбрать(); СуммаПреми=-ВыборкаПоСотрудника.ПремияОборот; БазаДляПремии=0; Пока ВыборкаПоШкале.Следующий() и ПродажаСотрудника>0 цикл БазаДляПремии=?(ПродажаСотрудника>= ВыборкаПоШкале.МаксПродаж, ВыборкаПоШкале.МаксПродаж-БазаДляПремии, ПродажаСотрудника); СуммаПреми=СуммаПреми+БазаДляПремии*ВыборкаПоШкале.ПремияПроцентом/100 ; ПродажаСотрудника=ПродажаСотрудника-БазаДляПремии; КонецЦикла; // регистр Премии Если СуммаПреми>0 Тогда Движение = Движения.Премии.Добавить(); Движение.Период = Дата; Движение.Сотруденик = ВыборкаПоСотрудника.Сотруденик; Движение.Премия = СуммаПреми КонецЕсли; КонецЦикла КонецПроцедуры //Отчет ПродажиСотрудников ВЫБРАТЬ ЕСТЬNULL(ПремииОбороты.Сотруденик, ПродажиОбороты.Сотруденик) КАК Сотрудник, ПродажиОбороты.ПродажаОборот КАК Продажа, ПремииОбороты.ПремияОборот КАК Премия ИЗ РегистрНакопления.Премии.Обороты КАК ПремииОбороты ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты ПО ПремииОбороты.Сотруденик = ПродажиОбороты.Сотруденик //1.40 обучения слушателей. Обучение проводится в классах, каждый из которых вмещает свое определенное количество слушателей. //В начале месяца составляется расписание курсов на следующий месяц и вводится документ «Расписание», где указано, в каком классе, в какое время и какой курс будет проводиться. //Далее документом «Заявка» от слушателей принимаются заявки на обучение. //При вводе расписания необходимо контролировать, что в одном классе, в одно и то же время не могут проводиться разные курсы. //Следует считать, что курс длится произвольное количество дней, и занятия по нему длятся полный день, т.е. в один день в одном классе может проводиться не более одного курса. //В зависимости от запланированного расписания занятия по курсу могут проводиться в различных классах. //В заявке слушателя указывается, какой курс и в какой срок слушатель собирается прослушать в учебном центре. //При проведении заявки необходимо контролировать, чтобы на курс не записалось больше слушателей, чем может вместить класс, в котором этот курс проводится. //В заявке слушателя класс не указывается, слушатель автоматически должен быть записан в тот класс, где в этот срок проводится курс. //В том случае, если этот курс читается в эти даты в разных классах, то заполнение классов происходит согласно их вместимости, начиная с самого большого. //Специфика работы учебного центра предполагает неполное заполнение классов, т.е. достаточно частой является ситуация, когда количество слушателей меньше, чем вместимость класса. //Необходимо построить отчеты по анализу простоя учебных классов за выбранный промежуток времени. //Считать, что учебный центр работает по пятидневному графику рабочего времени. // //СоздСпр Классы (рекв. Вместимость). Создаем Расписания (тч ТаблицаРасписаний - Класс, ДатаНачала, ДатаОкончания, Курс (спрСсылкаНоменклатура)). // //форма ДокРасписание &НаКлиенте Процедура ТаблицаРасписанийДатаНачалаПриИзменении(Элемент) Стр=Элементы.ТаблицаРасписаний.ТекущиеДанные; ДатаНачала=КонецДня(НачалоМесяца(Объект.Дата)); ДатаОкончания= КонецДня(КонецМесяца(Объект.Дата)); Если Стр.ДатаНачала< ДатаНачала Или Стр.ДатаНачала>ДатаОкончания тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Дата не может быть меньше текущего месяца"; Сообщение.Сообщить(); Стр.ДатаНачала=ДатаНачала; КонецЕсли; Если Стр.ДатаОкончания>ДатаОкончания Или Стр.ДатаОкончания<ДатаНачала тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Дата не может быть больше текущего месяца"; Стр.ДатаОкончания=ДатаОкончания; КонецЕсли КонецПроцедуры &НаКлиенте Процедура ТаблицаРасписанийДатаОкончанияПриИзменении(Элемент) Стр=Элементы.ТаблицаРасписаний.ТекущиеДанные; ДатаНачала=КонецДня(НачалоМесяца(Объект.Дата)); ДатаОкончания= КонецДня(КонецМесяца(Объект.Дата)); Если Стр.ДатаНачала< ДатаНачала Или Стр.ДатаНачала>ДатаОкончания тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Дата не может быть меньше текущего месяца"; Сообщение.Сообщить(); Стр.ДатаНачала=ДатаНачала; КонецЕсли; Если Стр.ДатаОкончания>ДатаОкончания Или Стр.ДатаОкончания<ДатаНачала тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Дата не может быть больше текущего месяца"; Стр.ДатаОкончания=ДатаОкончания; КонецЕсли КонецПроцедуры //Создаем док ЗаявкаСлушателя (рекв.Курс,ДатаНачала,ДатаОкончания) //ФормаДокЗаявкаСЛушателя &НаКлиенте Процедура ДатаНачалаПриИзменении(Элемент) ДатаНачала=КонецДня(НачалоМесяца(Объект.Дата)); ДатаОкончания= КонецДня(КонецМесяца(Объект.Дата)); Если ДатаНачала< ДатаНачала Или ДатаНачала>ДатаОкончания тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Дата не может быть меньше текущего месяца"; Сообщение.Сообщить(); ДатаНачала=ДатаНачала; КонецЕсли; Если ДатаОкончания>ДатаОкончания Или ДатаОкончания<ДатаНачала тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Дата не может быть больше текущего месяца"; ДатаОкончания=ДатаОкончания; КонецЕсли КонецПроцедуры &НаКлиенте Процедура ДатаОкончанияПриИзменении(Элемент) ДатаНачала=КонецДня(НачалоМесяца(Объект.Дата)); ДатаОкончания= КонецДня(КонецМесяца(Объект.Дата)); Если ДатаНачала< ДатаНачала Или ДатаНачала>ДатаОкончания тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Дата не может быть меньше текущего месяца"; Сообщение.Сообщить(); ДатаНачала=ДатаНачала; КонецЕсли; Если ДатаОкончания>ДатаОкончания Или ДатаОкончания<ДатаНачала тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Дата не может быть больше текущего месяца"; ДатаОкончания=ДатаОкончания; КонецЕсли КонецПроцедуры //Создаем РС ГрафикРаботыКлассов (рег.Расписания. По позиции регистратора. Изм. Дата,Класс, Рес.Курс). //РС ГрафикРаботыГруппы (.Расписания. По позиции регистратора. Изм. Расписания (док.Расп), Класс, ГРуппа (число) //Рес. ДатаНАчала, ДатаОкончания, Курс (Номенкл)). РС УчетРасписанийВМесяц (В пределах дня, рег.Расписание. Рес.Расписание (Булев)). //РегОборотов ЗаявкиНаОбучение (Изм. Расписания (Докрасписание), Класс (спр.Класы), Группа (число) Рес. Количество). //ДокРасписание Процедура ОбработкаПроведения(Отказ, Режим) Движения.УчетРасписанийВМесяц.Записывать=истина; Движения.ГрафикРаботыГруппы.Записывать = Истина; Движения.ГрафикРаботыКлассов.Записывать = Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ЗаявкиНаОбучение"); Блокировка.Заблокировать(); Дата=НачалоДня(НачалоМесяца(Дата)); Движение=Движения.УчетРасписанийВМесяц.Добавить(); Движение.Период=Дата; Движение.Расписание=Истина; Для Каждого ТекСтрокаТаблицаРасписаний Из ТаблицаРасписаний Цикл ДатаОкончания=ТекСтрокаТаблицаРасписаний.ДатаОкончания; ДатаСчетчик=ТекСтрокаТаблицаРасписаний.ДатаНачала; Пока ДатаСчетчик<=ДатаОкончания цикл // регистр ГрафикРаботыКлассов Движение = Движения.ГрафикРаботыКлассов.Добавить(); Движение.Период = Дата; Движение.Дата = ДатаСчетчик; Движение.Класс = ТекСтрокаТаблицаРасписаний.Класс; Движение.Курс = ТекСтрокаТаблицаРасписаний.Курс; ДатаСчетчик=ДатаСчетчик+60*60*24; КонецЦикла; КонецЦикла; Движения.ГрафикРаботыКлассов.Записать(); Запрос=Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | РасписанияТаблицаРасписаний.Класс КАК Класс, | РасписанияТаблицаРасписаний.ДатаНачала КАК ДатаНачала, | РасписанияТаблицаРасписаний.ДатаОкончания, | РасписанияТаблицаРасписаний.Курс |ИЗ | Документ.Расписания.ТаблицаРасписаний КАК РасписанияТаблицаРасписаний |ГДЕ | РасписанияТаблицаРасписаний.Ссылка = &Ссылка | |УПОРЯДОЧИТЬ ПО | Класс, | ДатаНачала |ИТОГИ ПО | Класс"; Запрос.УстановитьПараметр("Ссылка",Ссылка ); Результат=Запрос.Выполнить() ; ВыборкаПоКлассам=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаПоКлассам.Следующий() цикл ВыборкаПоКурсам=ВыборкаПоКлассам.Выбрать(); СчетчикГрупп=0; Пока ВыборкаПоКурсам.Следующий() цикл СчетчикГрупп=СчетчикГрупп+1; // регистр ГрафикРаботыГруппы Движение = Движения.ГрафикРаботыГруппы.Добавить(); Движение.Период = Дата; Движение.Класс = ВыборкаПоКурсам.Класс; Движение.Группа = СчетчикГрупп; Движение.ДатаНачала = ВыборкаПоКурсам.ДатаНачала; Движение.ДатаОкончания = ВыборкаПоКурсам.ДатаОкончания; Движение.Курс = ВыборкаПоКурсам.Курс; Движение.Расписания=Ссылка; КонецЦикла; КонецЦикла; КонецПроцедуры //ДокЗаявкаСлушателя Процедура ОбработкаПроведения(Отказ, Режим) // регистр ЗаявкиНаОбучение Движения.ЗаявкиНаОбучение.Записывать = Истина; Движения.ЗаявкиНаОбучение.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ЗаявкиНаОбучение"); Блокировка.Заблокировать(); Запрос=новый Запрос; Запрос.Текст= "ВЫБРАТЬ | ЗаявкаСлушателя.ДатаНачала, | ЗаявкаСлушателя.ДатаОкончания, | УчетРасписанийВМесяцСрезПоследних.Регистратор КАК Расписание, | ЗаявкаСлушателя.Курс |ПОМЕСТИТЬ ТабДок |ИЗ | Документ.ЗаявкаСлушателя КАК ЗаявкаСлушателя, | РегистрСведений.УчетРасписанийВМесяц.СрезПоследних(&ДатаНачалаКурса, ) КАК УчетРасписанийВМесяцСрезПоследних |ГДЕ | УчетРасписанийВМесяцСрезПоследних.Регистратор.ПометкаУдаления = ЛОЖЬ | И УчетРасписанийВМесяцСрезПоследних.Регистратор.Проведен = ИСТИНА | И ЗаявкаСлушателя.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Расписание |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ГрафикРаботыГруппыСрезПоследних.Расписания КАК Расписания, | ГрафикРаботыГруппыСрезПоследних.Класс КАК Класс, | ГрафикРаботыГруппыСрезПоследних.Группа КАК Группа, | ГрафикРаботыГруппыСрезПоследних.Курс, | ГрафикРаботыГруппыСрезПоследних.Класс.Вместимость |ПОМЕСТИТЬ ТабРасписания |ИЗ | ТабДок КАК ТабДок | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикРаботыГруппы.СрезПоследних( | &ДатаНачалаКурса, | (Расписания, Курс) В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | ТабДок.Расписание, | ТабДок.Курс | ИЗ | ТабДок КАК ТабДок)) КАК ГрафикРаботыГруппыСрезПоследних | ПО ТабДок.ДатаНачала <= ГрафикРаботыГруппыСрезПоследних.ДатаНачала | И ТабДок.ДатаОкончания >= ГрафикРаботыГруппыСрезПоследних.ДатаОкончания | И ТабДок.Курс = ГрафикРаботыГруппыСрезПоследних.Курс | |ИНДЕКСИРОВАТЬ ПО | Расписания, | Класс, | Группа |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ ПЕРВЫЕ 1 | ЕСТЬNULL(ТабРасписания.КлассВместимость, 0) - ЕСТЬNULL(ЗаявкиНаОбучениеОбороты.КоличествоОборот, 0) КАК ОстатокМест, | ТабРасписания.Расписания, | ТабРасписания.Класс, | ТабРасписания.Группа |ИЗ | ТабРасписания КАК ТабРасписания | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаявкиНаОбучение.Обороты( | , | , | , | (Расписания, Класс, Группа) В | (ВЫБРАТЬ | ТабРасписания.Расписания, | ТабРасписания.Класс, | ТабРасписания.Группа | ИЗ | ТабРасписания КАК ТабРасписания)) КАК ЗаявкиНаОбучениеОбороты | ПО ТабРасписания.Расписания = ЗаявкиНаОбучениеОбороты.Расписания | И ТабРасписания.Класс = ЗаявкиНаОбучениеОбороты.Класс | И ТабРасписания.Группа = ЗаявкиНаОбучениеОбороты.Группа | |УПОРЯДОЧИТЬ ПО | ТабРасписания.КлассВместимость УБЫВ" ; Запрос.УстановитьПараметр("ссылка",ссылка); Запрос.УстановитьПараметр("ДатаНачалаКурса", ДатаНачала); Результат=Запрос.Выполнить(); Если Результат.Пустой() тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "В данном периоде "+Курс+" непредусмотренно"; Сообщение.Сообщить(); Иначе Выборка=Результат.Выбрать(); Выборка.Следующий(); Если (Выборка.ОстатокМест-1) <0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "В данном периоде на "+Курс+" мест нет"; Сообщение.Сообщить(); Отказ=истина ; Возврат; КонецЕсли; Движение = Движения.ЗаявкиНаОбучение.Добавить(); Движение.Период = Дата; Движение.Расписания = Выборка.Расписания; Движение.Класс = Выборка.Класс; Движение.Группа = Выборка.Группа; Движение.Количество = 1; КонецЕсли КонецПроцедуры //Отчет АнализПростояКлассов ВЫБРАТЬ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ГрафикиРаботы.Дата) КАК робочихДней ПОМЕСТИТЬ ТабРабДни ИЗ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы ГДЕ ГрафикиРаботы.Значение <> 0 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ГрафикРаботыКлассов.Класс, ГрафикРаботыКлассов.Класс.Вместимость, ВЫРАЗИТЬ(КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ГрафикРаботыКлассов.Дата) / ТабРабДни.робочихДней * 100 КАК ЧИСЛО(10, 2)) КАК ПоПлана ПОМЕСТИТЬ ПоПлану ИЗ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикРаботыКлассов КАК ГрафикРаботыКлассов ПО ГрафикиРаботы.Дата = ГрафикРаботыКлассов.Дата, ТабРабДни КАК ТабРабДни ГДЕ ГрафикиРаботы.Значение <> 0 СГРУППИРОВАТЬ ПО ГрафикРаботыКлассов.Класс, ГрафикРаботыКлассов.Класс.Вместимость, ТабРабДни.робочихДней ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ГрафикРаботыГруппы.Класс, СУММА(ГрафикРаботыГруппы.Группа) КАК Группа, СУММА(РАЗНОСТЬДАТ(ГрафикРаботыГруппы.ДатаНачала, ГрафикРаботыГруппы.ДатаОкончания, ДЕНЬ) * ЕСТЬNULL(ЗаявкиНаОбучениеОбороты.КоличествоОборот, 0)) КАК КоличествоПосещений, СУММА(РАЗНОСТЬДАТ(ГрафикРаботыГруппы.ДатаНачала, ГрафикРаботыГруппы.ДатаОкончания, ДЕНЬ) * ЕСТЬNULL(ГрафикРаботыГруппы.Класс.Вместимость, 0)) КАК ОбщееКоличествоПосещений ПОМЕСТИТЬ ПоПосещению ИЗ РегистрСведений.ГрафикРаботыГруппы КАК ГрафикРаботыГруппы ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаявкиНаОбучение.Обороты КАК ЗаявкиНаОбучениеОбороты ПО ГрафикРаботыГруппы.Расписания = ЗаявкиНаОбучениеОбороты.Расписания И ГрафикРаботыГруппы.Класс = ЗаявкиНаОбучениеОбороты.Класс И ГрафикРаботыГруппы.Группа = ЗаявкиНаОбучениеОбороты.Группа СГРУППИРОВАТЬ ПО ГрафикРаботыГруппы.Класс ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПоПлану.Класс, ПоПлану.КлассВместимость КАК Вместимость, ПоПлану.ПоПлана, ВЫРАЗИТЬ(ПоПосещению.КоличествоПосещений / ПоПосещению.ОбщееКоличествоПосещений * 100 КАК ЧИСЛО(4, 2)) КАК ПоПосещению ИЗ ПоПлану КАК ПоПлану ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПоПосещению КАК ПоПосещению ПО ПоПлану.Класс = ПоПосещению.Класс //1.41 Компания занимается оптовой торговлей с иностранными контрагентами. Закупка и продажа товаров может происходить в любой валюте. //Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Валюта указывается для каждого документа поступления и продажи (валюта реквизит шапки). //При продаже товаров себестоимость рассчитывается как средняя по валюте, причем валюта продажи и валюта себестоимости могут не совпадать. //Например, если купили товар за доллары, то продавать его можно за евро. Порядок списания по валютам остается на усмотрение разработчика. //Учет товаров в разрезе складов не ведется. //Необходимо создать отчет по продажам товаров за период, в котором будет отражаться прибыль для каждого товара в валюте закупки и в рублях. //Например, куплена 1 шт за 100 евро при курсе 35. Продана была за 250 Долларов при курсе 25 за доллар и 36 за евро. //Прибыль рассчитывается как сумма продажи минус себестоимость и составит 250*25 – 100*35 = 2750 руб и 250*25/36-100 = 73,61 евро // //В шапки накладных добавляем Валюту. //ОстаткиНоменклатуры (Номенклатура, Валюта, Количество,Стоимость,СтоимостьРуб). //Продажи (Валюта, Номенклатура, Количество, Прибыль, ПрибыльРуб, Стоимость.) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) Отбор = Новый Структура; Отбор.Вставить("Валюта", Валюта); Курс = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата,Отбор).Курс; // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Валюта = Валюта; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; Движение.СтоимостьРуб = ТекСтрокаСписокНоменклатуры.Сумма*Курс; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); отбор = Новый Структура; Отбор.Вставить("Валюта", Валюта); КурсВалютыПоДокументу = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, Отбор).Курс; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.Ссылка.Валюта КАК Валюта |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Ссылка.Валюта | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Валюта |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ОстаткиНоменклатурыОстатки.Валюта КАК Валюта, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьРубОстаток, 0) КАК СтоимостьОстатокВРуб, | ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) КАК Курс |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК ОстаткиНоменклатурыОстатки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Дата, ) КАК КурсыВалютСрезПоследних | ПО ОстаткиНоменклатурыОстатки.Валюта = КурсыВалютСрезПоследних.Валюта | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | Валюта |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток), | СУММА(СтоимостьОстатокВРуб), | МАКСИМУМ(Курс) |ПО | Номенклатура"; Запрос.УстановитьПараметр("Дата", Дата); Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Себестоимость = 0; СебестоимостьРуб = 0; Если ВыборкаНоменклатура.ДокументКоличество > ВыборкаНоменклатура.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" недостаточно. На остатке: "+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; ВыборкаВалюта = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ВыборкаНоменклатура.ДокументКоличество; Пока ВыборкаВалюта.Следующий() и КоличествоСписать>0 Цикл НеобходимоеКоличество = Мин(ВыборкаВалюта.КоличествоОстаток, КоличествоСписать); пСебестоимость = ?(ВыборкаВалюта.КоличествоОстаток>КоличествоСписать, КоличествоСписать*ВыборкаВалюта.СтоимостьОстаток/ВыборкаВалюта.КоличествоОстаток,ВыборкаВалюта.СтоимостьОстаток); пСебестоимостьРуб = ?(ВыборкаВалюта.КоличествоОстаток>КоличествоСписать, КоличествоСписать*ВыборкаВалюта.СтоимостьОстатокВРуб/ВыборкаВалюта.КоличествоОстаток,ВыборкаВалюта.СтоимостьОстатокВРуб); Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Валюта = ВыборкаВалюта.Валюта; Движение.Период = Дата; Движение.Номенклатура = ВыборкаВалюта.Номенклатура; Движение.Количество = НеобходимоеКоличество; Движение.Стоимость = пСебестоимость; Движение.СтоимостьРуб = пСебестоимостьРуб; СуммаПродажи = НеобходимоеКоличество*ВыборкаНоменклатура.ДОкументСумма/ВыборкаНоменклатура.ДокументКоличество; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Валюта = ВыборкаВалюта.Валюта; Движение.Количество = НеобходимоеКоличество; Движение.Стоимость = пСебестоимость; Движение.Прибыль = СуммаПродажи*КурсВалютыПоДокументу/ВыборкаВалюта.Курс-пСебестоимость; Движение.ПрибыльРуб = СуммаПродажи*КурсВалютыПоДокументу-пСебестоимостьРуб; КоличествоСписать = КоличествоСписать - НеобходимоеКоличество; КонецЦикла; КонецЦикла; КонецПроцедуры //Отчет. Продажи ВЫБРАТЬ ПродажиОбороты.Валюта, ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.ПрибыльОборот КАК ПрибыльВал, ПродажиОбороты.ПрибыльРубОборот КАК ПрибыльРуб, ПродажиОбороты.СтоимостьОборот КАК Себестоимость ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты //1.42 Компания занимается оптовой торговлей с иностранными контрагентами. Закупка и продажа товаров может происходить в любой валюте. //Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Валюта указывается для каждого документа поступления и продажи (валюта реквизит шапки). //При продаже товаров себестоимость рассчитывается как средняя по валюте, причем валюта продажи и валюта себестоимости могут не совпадать. //Например, если купили товар за доллары, то продавать его можно за евро. //В первую очередь должен списываться товар, купленный в той же валюте, в которой происходит продажа. //Порядок списания по остальным валютам остается на усмотрение разработчика. //Учет товаров в разрезе складов не ведется. //Необходимо создать отчет по продажам товаров за период, в котором будет отражаться прибыль для каждого товара в валюте закупки и в рублях. //Например, куплена 1 шт за 100 евро при курсе 35. Продана была за 250 Долларов при курсе 25 за доллар и 36 за евро. //Прибыль рассчитывается как сумма продажи минус себестоимость и составит 250*25 – 100*35 = 2750 руб и 250*25/36-100 = 73,61 евро // //В шапки накладных добавляем валюту. РегОстатки Себестоимость (Номенклатура, Валюта. Рес. Количетво, СуммаВал, СуммаРуб). //РегОбор Продажи (Номенкла, Валюта, рес. Количество, Себестоимость, ПрибыльВал, ПРибыльРуб) //ПРиходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Себестоимость Приход Движения.Себестоимость.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Себестоимость.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Валюта = Валюта; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.СуммаВал = ТекСтрокаСписокНоменклатуры.Сумма; Движение.СуммаРуб = ТекСтрокаСписокНоменклатуры.Сумма*РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата,новый Структура("Валюта",Валюта)).Курс; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //Расходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Себестоимость Расход Движения.Себестоимость.Записывать = Истина; Движения.Себестоимость.Записать(); Движения.Продажи.Записывать = Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Себестоимость"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧ |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧ.Номенклатура КАК Номенклатура, | ТЧ.Количество КАК Количество, | ТЧ.Сумма КАК Сумма, | СебестоимостьОстатки.Валюта КАК Валюта, | ЕСТЬNULL(СебестоимостьОстатки.КоличествоОстаток, 0) КАК КолРег, | ЕСТЬNULL(СебестоимостьОстатки.СуммаВалОстаток, 0) КАК СумВал, | ЕСТЬNULL(СебестоимостьОстатки.СуммаРубОстаток, 0) КАК СумРуб, | ВЫБОР | КОГДА СебестоимостьОстатки.Валюта = &Валюта | ТОГДА 0 | ИНАЧЕ 1 | КОНЕЦ КАК Порядок |ИЗ | ТЧ КАК ТЧ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Себестоимость.Остатки( | &Момент, | Номенклатура В | (ВЫБРАТЬ | тч.Номенклатура | ИЗ | тч)) КАК СебестоимостьОстатки | ПО ТЧ.Номенклатура = СебестоимостьОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | Порядок, | Валюта |ИТОГИ | МАКСИМУМ(Количество), | МАКСИМУМ(Сумма), | СУММА(КолРег) |ПО | Номенклатура"; Запрос.УстановитьПараметр("Валюта", Валюта); Запрос.УстановитьПараметр("Момент", ?(режим=РежимПроведенияДокумента.Неоперативный,МоментВремени(),Неопределено)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл // Вставить обработку выборки ВыборкаНоменклатура Если ВыборкаНоменклатура.Количество>ВыборкаНоменклатура.КолРег Тогда отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "не хватает"; Сообщение.Сообщить(); КонецЕсли; Если отказ Тогда Продолжить; КонецЕсли; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); КолСпис = ВыборкаНоменклатура.Количество; ЦенаПродажи = ВыборкаНоменклатура.Сумма/ВыборкаНоменклатура.Количество; Пока ВыборкаДетальныеЗаписи.Следующий()и КолСпис>0 Цикл КолЗдесь = Мин(ВыборкаДетальныеЗаписи.колрег,КолСпис); СумЗдесь = ?(КолЗдесь=ВыборкаДетальныеЗаписи.колрег, ВыборкаДетальныеЗаписи.СумВал,КолЗдесь*ВыборкаДетальныеЗаписи.СумВал/ВыборкаДетальныеЗаписи.колрег); СумЗдесьРуб = ?(КолЗдесь=ВыборкаДетальныеЗаписи.колрег, ВыборкаДетальныеЗаписи.СумРуб,КолЗдесь*ВыборкаДетальныеЗаписи.СумРуб/ВыборкаДетальныеЗаписи.колрег); Движение = Движения.Себестоимость.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Валюта = ВыборкаДетальныеЗаписи.Валюта; Движение.Количество = КолЗдесь; Движение.СуммаВал = СумЗдесь; Движение.СуммаРуб = СумЗдесьРуб; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Валюта = Валюта; Движение.Количество = КолЗдесь; Движение.Себестоимость = СумЗдесь; Движение.ПрибыльВал =КолЗдесь*ЦенаПродажи*РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата,новый Структура("Валюта",Валюта)).Курс/РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата,новый Структура("Валюта",ВыборкаДетальныеЗаписи.Валюта)).Курс -СумЗдесь; Движение.ПрибыльРуб =КолЗдесь*ЦенаПродажи*РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата,новый Структура("Валюта",Валюта)).Курс -СумЗдесьРуб; КолСпис =КолСпис - КолЗдесь; // Вставить обработку выборки ВыборкаДетальныеЗаписи КонецЦикла; КонецЦикла; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА КонецПроцедуры //Отчет ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.Валюта, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СебестоимостьОборот, ПродажиОбороты.ПрибыльВалОборот, ПродажиОбороты.ПрибыльРубОборот ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты //1.43 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части. //Учет товаров ведется в разрезе складов. Поступление и продажа осуществляются с указанием склада (в шапке документа). //При проведении расходной накладной при нехватке товара необходимо выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //Списание себестоимости должно быть организовано по партиям по методу FIFO. //При списании себестоимости товаров необходимо учитывать толькомомент поступления товара в компанию, вне зависимости от того, на какой склад он пришел. //Оплата покупателя отражается документом «Приход денег». //На каждый платеж заводится новый документ, т.е. плательщик и сумма платежа являютсяреквизитами шапки. //Платеж может быть как авансом, так и по факту поставки, причем в момент поступления денежных средств эта информация недоступной и все денежные средства учитываются общей суммой. //Кроме того, специфика работы компании заключается в том, что документы оплаты могут вводиться задним числом. //При проведении документа «Расходная накладная» необходимо проверятьналичие оплат от контрагента. //Если на момент проведения сумма предшествующих оплат превышает сумму предшествующих отгрузок, то сумма превышения зачитывается как аванс. //Сумма аванса определяется как минимальная между суммой накладной и суммой оставшихся оплат. //Поскольку документы оплат могут вводиться задним числом, то суммы зачтенных авансов будут некорректными. //Необходимо создать обработку, которая будет проверять наличие измененных задним числом оплат и только для таких контрагентов перепроводить документы для восстановления зачтенных сумм авансов. //Следует учесть, что пользователь не владеет информацией о том, были ли изменения оплат и если были, то когда они происходили. //Запуск обработки должен производиться либо вручную пользователем, либо автоматически с использованием регламентного задания. //Необходимо создать отчеты об остатках товаров и зачете авансов. //Создаем общий модуль ВосстановлениеАвансы (Сервачек) Процедура ВосстановитьПоследовательность() Экспорт Обработка = обработки.ВосстановлениеПоследовательности.Создать(); Обработка.ВосстановитьПосл(); КонецПроцедуры //Создаем регл.задание ВосстановитьПоследовательность (ИмяМетода: ВосстановлениеАвансы.ВосстановитьПоследовательность). //В спрНом добавляем ВидНоменклатуры, Добавляем СпрСклады, Контрагенты. Создаем док ПриходДенег (рекв.Контрагент, СуммаОплаты.) //Создаем последовательность Оплаты (Перемещать, Входящие: ПриходДенег, РасходнаяНакладная, Движения: РегистрНакопления.ОплатыКонтрагентов, Измерения -Контрагенты ). //В шапку приходной добавляем Склад, В шапку расходной добавляем Склад и Контрагент. Создаем Обработку ВосстановлениеПоследовательности //Модуль формы обработки &НаСервере Процедура ВыполнитьМетод() РеквизитФормыВЗначение("Объект").ВосстановитьПосл(); КонецПроцедуры &НаКлиенте Процедура ВыполнитьВосстановление(Команда) ВыполнитьМетод(); КонецПроцедуры //МодульОбъектаОбработки Процедура ВосстановитьПосл() Экспорт Последовательности.Оплаты.Восстановить(); Сообщение = новый СообщениеПользователю; Сообщение.Текст ="Последовательность восстановлена фоновыс перепроведением"; Сообщение.Сообщить(); КонецПроцедуры //РН ОстаткиНоменклатуры (Номенклатура,Склад,Количество), РегОСт СтоимостьНоменклатуры (Номенклатура,Партия,Количество,Стоимость) //. РегОСт ОплатыКонтрагентов (Контрагент,СуммаОплат), РегОбор АвансыКонтрагентов (Контрагент,Сумма) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.СтоимостьНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Если ТекСтрокаСписокНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение = Движения.СтоимостьНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Партия = Ссылка; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.СтоимостьНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.СтоимостьНоменклатуры.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.СтоимостьНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад КАК Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ТЧДок.ВидНоменклатуры КАК ВидНоменклатуры, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КолОстСклад, | СтоимостьНоменклатурыОстатки.Партия, | ЕСТЬNULL(СтоимостьНоменклатурыОстатки.КоличествоОстаток, 0) КАК КолОст, | ЕСТЬNULL(СтоимостьНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОст |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, Склад) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т | ГДЕ | Т.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга))) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т | ГДЕ | Т.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга))) КАК СтоимостьНоменклатурыОстатки | ПО ТЧДок.Номенклатура = СтоимостьНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | СтоимостьНоменклатурыОстатки.Партия.МоментВремени |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | МАКСИМУМ(ВидНоменклатуры), | СУММА(КолОстСклад), | СУММА(КолОст), | СУММА(СтоимостьОст) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если ВыборкаНоменклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда Продолжить; КонецЕсли; Если ВыборкаНоменклатура.ДокументКоличество > ВыборкаНоменклатура.КолОстСклад Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" недостаточно. На остатке:"+ВыборкаНоменклатура.КолОстСклад; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ВыборкаНоменклатура.ДокументКоличество; Пока ВыборкаДетальныеЗаписи.Следующий() и КоличествоСписать>0 Цикл НеобходимСписатьКоличество = Мин(ВыборкаДетальныеЗаписи.КолОстСклад, КоличествоСписать); Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Склад = Склад; Движение.Количество = НеобходимСписатьКоличество; Движение = Движения.СтоимостьНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Количество = НеобходимСписатьКоличество; Движение.Партия = ВыборкаДетальныеЗаписи.Партия; Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КолОст>КоличествоСписать, КоличествоСписать*ВыборкаДетальныеЗаписи.СтоимостьОст/ВыборкаДетальныеЗаписи.КолОст,ВыборкаДетальныеЗаписи.СтоимостьОст); КоличествоСписать = КоличествоСписать - НеобходимСписатьКоличество; КонецЦикла; КонецЦикла; Если Отказ Тогда Возврат; КонецЕсли; Движения.ОплатыКонтрагентов.Записывать = Истина; Движения.ОплатыКонтрагентов.Записать(); Движения.АвансыКонтрагентов.Записывать = Истина; Движения.ОплатыКонтрагентов.БлокироватьДляИзменения = Истина; Движение = Движения.ОплатыКонтрагентов.ДобавитьПриход(); Движение.Период = Дата; Движение.Контрагент = Контрагент ; Движение.СуммаОплат = СуммаПоДокументу; Движения.ОплатыКонтрагентов.Записать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОплатыКонтрагентовОстатки.Контрагент, | ОплатыКонтрагентовОстатки.СуммаОплатОстаток |ИЗ | РегистрНакопления.ОплатыКонтрагентов.Остатки(&МоментВремени, Контрагент = &Контрагент) КАК ОплатыКонтрагентовОстатки |ГДЕ | ОплатыКонтрагентовОстатки.СуммаОплатОстаток < 0"; Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени(), ВидГраницы.Включая)); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Движение = Движения.АвансыКонтрагентов.Добавить(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Сумма = Мин(СуммаПоДокументу, -ВыборкаДетальныеЗаписи.СуммаОплатОстаток); КонецЦикла; КонецПроцедуры //ДокПриходДенег Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОплатыКонтрагентов.Записывать = Истина ; Движения.ОплатыКонтрагентов.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОплатыКонтрагентов"); ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОплатыКонтрагентовОстатки.Контрагент, | ОплатыКонтрагентовОстатки.СуммаОплатОстаток |ИЗ | РегистрНакопления.ОплатыКонтрагентов.Остатки( | &МоментВремени, | Контрагент = &Контрагент) КАК ОплатыКонтрагентовОстатки"; Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); СуммаСписать = СуммаОплаты; Пока ВыборкаДетальныеЗаписи.Следующий() и СуммаСписать>0 Цикл Если ВыборкаДетальныеЗаписи.СуммаОплатОстаток<0 Тогда Продолжить; КонецЕсли; Движение = Движения.ОплатыКонтрагентов.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.СуммаОплат = Мин(ВыборкаДетальныеЗаписи.СуммаОплатОстаток, СуммаСписать); СуммаСписать = СуммаСписать - Движение.СуммаОплат; КонецЦикла; Если СуммаСписать >0 Тогда Движение = Движения.ОплатыКонтрагентов.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.СуммаОплат = СуммаСписать; КонецЕсли; КонецПроцедуры //Отчет Остаткитоваров ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество, ЕСТЬNULL(СтоимостьНоменклатурыОстатки.СтоимостьОстаток, 0) КАК Стоимость, СтоимостьНоменклатурыОстатки.Партия ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьНоменклатуры.Остатки КАК СтоимостьНоменклатурыОстатки ПО ОстаткиНоменклатурыОстатки.Номенклатура = СтоимостьНоменклатурыОстатки.Номенклатура //Отчет Оплаты ВЫБРАТЬ ОплатыКонтрагентовОстаткиИОбороты.Контрагент, ОплатыКонтрагентовОстаткиИОбороты.СуммаОплатРасход КАК СуммаОплат, АвансыКонтрагентовОбороты.СуммаОборот КАК Авансы ИЗ РегистрНакопления.ОплатыКонтрагентов.ОстаткиИОбороты КАК ОплатыКонтрагентовОстаткиИОбороты ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.АвансыКонтрагентов.Обороты КАК АвансыКонтрагентовОбороты ПО ОплатыКонтрагентовОстаткиИОбороты.Контрагент = АвансыКонтрагентовОбороты.Контрагент //1.44 Организация занимается торговлей скоропортящимися продуктами. //Для каждого товара указывается норма естественной убыли при транспортировке. //Доставка товара покупателю отражается документом «Расходная накладная», оплата покупателя - документом «Приход денег». //При получении товара покупатель по каждой накладной составляет акт (документ «Акт приема-передачи товаров»), о фактическом поступлении товара, за вычетом испортившегося при транспортировке. //В том случае, когда потери товара не превышают нормы естественной убыли, покупатель оплачивает весь товар. //Если потери товара превышают нормы, то покупатель оплачивает только фактически полученный товар. //Оплата покупателя поступает общей суммой по нескольким накладным (накладные указываются в табличной части, сумма в шапке). //При проведении документа оплаты должны автоматически распределяться по накладным, начиная с самой ранней недооплаченной, причем оплаты должны распределяться с учетом фактической задолженности покупателя. //Следует считать, что переплат и авансовнет. //Учет товаров ведется в разрезе складов. Отгрузка по одной накладнойвозможна только по одному складу (склад реквизит шапки). //Себестоимость товаров рассчитывается как средняя по складу. //Необходимо создать отчеты о состоянии взаиморасчетов с покупателями и отгрузках товаров за период. // //В спрНоменкл добавляем ркв. НормаЕстественнойУбыли (Число 15). Создаем Спр. Склады,Контрагенты. //В шапку приходной добавляем Склад. В шпку расходной добавляем Склад, Контрагент. //Создаем док ПриходДенег (рекв. Контрагент,СуммаОплаты, тч. СписокНакладных - Накладаня (расходная)). //Создаем док АктПриемаПередачиТоваров (рекв. Контрагент, СуммаПоДокументу, ДокументОСнование, тчСписокНоменклатуры - Номенклатура,Количество,Цена,Сумма,КоличествоФакт). //ОстаткиНоменклатуры(Номенклатура, Склад, Количество,Стоимость), РегОст ВзаиморасчетыСКонтрагентами (Контрагент, Накладная,Сумма). //РегОб ОтгрузкиТоваров - Номенклатура, ОтгруженоФактически, ПотериВПределахНормы, ПотериСверхНормы. //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.ОтгрузкиТоваров.Записывать = Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.Ссылка.Склад КАК Склад |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Ссылка.Склад | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ТЧДок.Склад, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КолОст, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОст |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, Склад) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т)) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ДокументКоличество > Выборка.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+Выборка.Номенклатура+" недостаточно. На остатке:"+Выборка.КолОСт; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; КоличествоСписать = Выборка.ДокументКоличество; Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Склад = Склад; Движение.Количество = Мин(Выборка.КолОст, КоличествоСписать); Движение.Стоимость = ?(Выборка.КолОст>КоличествоСписать, КоличествоСписать*Выборка.СтоимостьОст/Выборка.КолОст, Выборка.СтоимостьОст); Движение = Движения.ОтгрузкиТоваров.Добавить(); Движение.Номенклатура = Выборка.Номенклатура; Движение.Период = Дата; Движение.ОтгруженоФактически = Мин(Выборка.КолОст, КоличествоСписать); КонецЦикла; Если Отказ Тогда Возврат; КонецЕсли; Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина; Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Накладная = Ссылка; Движение.Сумма = СуммаПоДокументу; КонецПроцедуры Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры //ДокПриходДенег Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина; Движения.ВзаиморасчетыСКонтрагентами.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСКонтрагентами"); ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНакладных; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Накладная", "Накладная"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходДенегСписокНакладных.Накладная КАК Накладная, | ПриходДенегСписокНакладных.Ссылка.Контрагент КАК Контрагент |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПриходДенег.СписокНакладных КАК ПриходДенегСписокНакладных |ГДЕ | ПриходДенегСписокНакладных.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ПриходДенегСписокНакладных.Накладная, | ПриходДенегСписокНакладных.Ссылка.Контрагент | |ИНДЕКСИРОВАТЬ ПО | Накладная, | Контрагент |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВзаиморасчетыСКонтрагентамиОстатки.Контрагент, | ВзаиморасчетыСКонтрагентамиОстатки.Накладная, | ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток |ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки( | &МоментВремени, | (Контрагент, Накладная) В | (ВЫБРАТЬ | Т.Контрагент, | Т.Накладная | ИЗ | ТЧДок КАК Т)) КАК ВзаиморасчетыСКонтрагентамиОстатки | |УПОРЯДОЧИТЬ ПО | ВзаиморасчетыСКонтрагентамиОстатки.Накладная.МоментВремени"; Запрос.УстановитьПараметр("МоментВремени" , ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); СуммаРаспределить = СуммаОплаты; Пока Выборка.Следующий() и СуммаРаспределить>0 Цикл Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Накладная = Выборка.Накладная; Движение.Сумма = Мин(Выборка.СуммаОстаток, СуммаРаспределить); СуммаРаспределить = СуммаРаспределить - Движение.Сумма КонецЦикла; КонецПроцедуры //ДокАктПриемаПередачи Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.РасходнаяНакладная") Тогда // Заполнение шапки Контрагент = ДанныеЗаполнения.Контрагент; ДокументОснование = ДанныеЗаполнения.Ссылка; СуммаПоДокументу = ДанныеЗаполнения.СуммаПоДокументу; Для Каждого ТекСтрокаСписокНоменклатуры Из ДанныеЗаполнения.СписокНоменклатуры Цикл НоваяСтрока = СписокНоменклатуры.Добавить(); НоваяСтрока.Количество = ТекСтрокаСписокНоменклатуры.Количество; НоваяСтрока.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; НоваяСтрока.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; НоваяСтрока.Цена = ТекСтрокаСписокНоменклатуры.Цена; КонецЦикла; КонецЕсли; КонецПроцедуры Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина; Движения.ВзаиморасчетыСКонтрагентами.Записать(); Движения.ОтгрузкиТоваров.Записывать = Истина; Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВзаиморасчетыСКонтрагентами"); ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | АктПриемаПередачиТоваровСписокНоменклатуры.Номенклатура, | АктПриемаПередачиТоваровСписокНоменклатуры.Количество, | АктПриемаПередачиТоваровСписокНоменклатуры.Сумма, | АктПриемаПередачиТоваровСписокНоменклатуры.КоличествоФакт, | АктПриемаПередачиТоваровСписокНоменклатуры.Количество - АктПриемаПередачиТоваровСписокНоменклатуры.КоличествоФакт КАК ФактическиеПотери, | ВЫРАЗИТЬ(АктПриемаПередачиТоваровСписокНоменклатуры.КоличествоФакт * АктПриемаПередачиТоваровСписокНоменклатуры.Номенклатура.НормаЕстественнойУбыли / 100 + 0.5 КАК ЧИСЛО(15, 0)) КАК ПотериПоНорме |ИЗ | Документ.АктПриемаПередачиТоваров.СписокНоменклатуры КАК АктПриемаПередачиТоваровСписокНоменклатуры"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); СуммаДолга = 0; Пока Выборка.Следующий() Цикл ПотериПоНорме = Выборка.ПотериПоНорме; ПотериВПределахНормы = 0; ПотериСверхнормы = 0; Если Выборка.ФактическиеПотери > 0 Тогда ПотериВПределахНормы = Мин(Выборка.ФактическиеПотери,Выборка.ПотериПоНорме); КонецЕсли; Если Выборка.ФактическиеПотери> Выборка.ПотериПоНорме Тогда СуммаДолга = СуммаДолга+ (Выборка.ФактическиеПотери*Выборка.Сумма/Выборка.Количество); ПотериСверхнормы = Выборка.ФактическиеПотери-Выборка.ПотериПоНорме; КонецЕсли; Движение = движения.ОтгрузкиТоваров.Добавить(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.ПотериВПределахНормы = ПотериВПределахНормы; ДВижение.ПотериСверхНормы = ПотериСверхнормы; КонецЦикла; Если СуммаДолга >0 Тогда Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход(); Движение.Контрагент = Контрагент; Движение.Накладная = ДокументОснование; Движение.Период = Дата; Движение.Сумма = СуммаДолга; КонецЕсли; КонецПроцедуры //ОтчетОтгрузкаТоваров ВЫБРАТЬ ОтгрузкиТоваровОбороты.Номенклатура, ОтгрузкиТоваровОбороты.ОтгруженоФактическиОборот, ОтгрузкиТоваровОбороты.ПотериВПределахНормыОборот, ОтгрузкиТоваровОбороты.ПотериСверхНормыОборот ИЗ РегистрНакопления.ОтгрузкиТоваров.Обороты КАК ОтгрузкиТоваровОбороты //ОтчетВзаиморасчетыСПокупателями ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Контрагент, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Накладная КАК Накладная, 0 КАК СуммаРасход, 0 КАК СуммаНачальныйОстаток, 0 КАК СуммаКонечныйОстаток, -ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаРасход КАК СуммаПриход ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, , ) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты ГДЕ ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Регистратор ССЫЛКА Документ.АктПриемаПередачиТоваров ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Контрагент, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Регистратор, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаРасход, 0, 0, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаПриход ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, , ) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты ГДЕ ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Регистратор ССЫЛКА Документ.РасходнаяНакладная ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Контрагент, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Регистратор, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаРасход, 0, 0, ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаПриход ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, , ) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты ГДЕ ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПриходДенег ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстатки.Контрагент, NULL, 0, ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток, 0, 0 ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&НачалоПериода, ) КАК ВзаиморасчетыСКонтрагентамиОстатки ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстатки.Контрагент, NULL, 0, 0, ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток, 0 ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&КонецПериода, ) КАК ВзаиморасчетыСКонтрагентамиОстатки //1.45 Организация занимается разведением кроликов. //Кролики помещаются в вольеры, где откармливаются на протяжении некоторого времени, после чего происходит их забой. Получение кроликов на откорм отражается документом «Приходная накладная», в которой указывается количество кроликов и вольер, в который они помещаются. //Забой кроликов отражается документом «Списание», в котором в табличной части указываются вольеры, из которых забираются все кролики, находящиеся там в этот момент, и сотрудник, осуществляющий разделку. //В результате забоя кроликов получается мясо и шкурки. Полученное мясо рассчитывается исходя из среднего привеса 20 граммов за день откорма с каждого кролика, а шкурка получается только с крупных кроликов, которые откармливались не менее 2-х месяцев (календарных месяцев, а не 60 дней). //Необходимо создать отчет о наличие кроликов и полученной продукции. // //Создаем Спр Вольеры, Создаем Спр Сотрудники. Док ПриходнаяНакладная тч СписокВольеров - вольер, количество. //док РасходнаяНакладная рекв. СуммаПоДокументу тч СписокНоменклатуры - Вольер, Сотрудник. //Модуль формы расходной &НаКлиенте Процедура СписокНоменклатурыПриИзменении(Элемент) ТекСтрока = Элементы.СписокНоменклатуры.ТекущиеДанные; Сотрудник = ТекСтрока.Сотрудник; НомерСтроки = ТекСтрока.НомерСтроки; Вольер = ТекСтрока.Вольер; Для каждого ЭлементТЧ из ОБъект.СписокНоменклатуры цикл Если ЭлементТЧ.Сотрудник = Сотрудник и ЭлементТЧ.Вольер = Вольер И ЭлементТЧ.НомерСтроки <> НомерСтроки тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Найдены дубли строк"; Сообщение.Сообщить(); ТекСтрока.Вольер = Неопределено; ТекСтрока.Сотрудник = Неопределено; Возврат; КонецЕсли; КонецЦикла; КонецПроцедуры //РН ОстаткиВВольерах (Вольер, ДатаПРихода, Количесвто). РН обор ВыпускПродукции (Сотрудник, рес. ЗабитыеКролики, Мясо, Шкурки ) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ОстаткиВВольерах Приход Движения.ОстаткиВВольерах.Записывать = Истина; Для Каждого ТекСтрокаСписокВольеров Из СписокВольеров Цикл Движение = Движения.ОстаткиВВольерах.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Вольер = ТекСтрокаСписокВольеров.Вольер; Движение.ДатаПрихода = Дата; Движение.Количество = ТекСтрокаСписокВольеров.Количество; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокРАсходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиВВольерах.Записывать = Истина; Движения.ОстаткиВВольерах.Записать(); Движения.ВыпускПродукции.Записывать = Истина; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиВВольерах"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Вольер", "Вольер"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Вольер КАК Вольер, | РасходнаяНакладнаяСписокНоменклатуры.Сотрудник КАК Сотрудник |ПОМЕСТИТЬ ТЧДОк |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Сотрудник, | РасходнаяНакладнаяСписокНоменклатуры.Вольер | |ИНДЕКСИРОВАТЬ ПО | Вольер, | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиВВольерахОстатки.ДатаПрихода КАК ДатаПрихода, | ЕСТЬNULL(ОстаткиВВольерахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | РАЗНОСТЬДАТ(ОстаткиВВольерахОстатки.ДатаПрихода, &Дата, ДЕНЬ) *0.02 * ЕСТЬNULL(ОстаткиВВольерахОстатки.КоличествоОстаток, 0) КАК Мясо, | ВЫБОР | КОГДА ДОБАВИТЬКДАТЕ(ОстаткиВВольерахОстатки.ДатаПрихода, МЕСЯЦ, 2) <= &Дата | ТОГДА ЕСТЬNULL(ОстаткиВВольерахОстатки.КоличествоОстаток, 0) | ИНАЧЕ 0 | КОНЕЦ КАК Шкурки, | ТЧДОк.Сотрудник, | ТЧДОк.Вольер КАК Вольер |ИЗ | РегистрНакопления.ОстаткиВВольерах.Остатки( | &МоментВремени, | Вольер В | (ВЫБРАТЬ | Т.Вольер | ИЗ | ТЧДок КАК Т)) КАК ОстаткиВВольерахОстатки | ЛЕВОЕ СОЕДИНЕНИЕ ТЧДОк КАК ТЧДОк | ПО ОстаткиВВольерахОстатки.Вольер = ТЧДОк.Вольер | |УПОРЯДОЧИТЬ ПО | Вольер, | ДатаПрихода |ИТОГИ | СУММА(КоличествоОстаток), | СУММА(Мясо), | СУММА(Шкурки) |ПО | Вольер"; Запрос.УстановитьПараметр("Дата", Дата); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаВольер = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаВольер.Следующий() Цикл Если ВыборкаВольер.КоличествоОстаток = 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "В вольере :"+ВыборкаВольер.Вольер+" нет остаков"; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Сотрудник = Справочники.Сотрудники.ПустаяСсылка(); ВыборкаДетальныеЗаписи = ВыборкаВольер.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Движение = Движения.ОстаткиВВольерах.ДобавитьРасход(); Движение.Период = Дата; Движение.Вольер = ВыборкаДетальныеЗаписи.Вольер; Движение.ДатаПрихода = ВыборкаДетальныеЗаписи.ДатаПрихода; Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоОСтаток; Сотрудник = ВыборкаДетальныеЗаписи.Сотрудник; КонецЦикла; Движение = Движения.ВыпускПродукции.Добавить(); Движение.Период = Дата; Движение.Сотрудник = Сотрудник; Движение.ЗабитыеКролики = ВыборкаВольер.КоличествоОстаток; Движение.Мясо = ВыборкаВольер.Мясо; Движение.Шкурки = ВыборкаВольер.Шкурки; КонецЦикла; КонецПроцедуры //Отчет ВедомостьПоКроликам ВЫБРАТЬ ОстаткиВВольерахОстаткиИОбороты.Вольер, ОстаткиВВольерахОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиВВольерахОстаткиИОбороты.КоличествоКонечныйОстаток, ОстаткиВВольерахОстаткиИОбороты.КоличествоПриход, ОстаткиВВольерахОстаткиИОбороты.КоличествоРасход ИЗ РегистрНакопления.ОстаткиВВольерах.ОстаткиИОбороты КАК ОстаткиВВольерахОстаткиИОбороты Отчет ВыпускПродукции ВЫБРАТЬ ВыпускПродукцииОбороты.Сотрудник, ВыпускПродукцииОбороты.ЗабитыеКроликиОборот, ВыпускПродукцииОбороты.МясоОборот, ВыпускПродукцииОбороты.ШкуркиОборот ИЗ РегистрНакопления.ВыпускПродукции.Обороты КАК ВыпускПродукцииОбороты //1.46 Организация занимается оптовой торговлей. Для описания товаров существуют различные характеристики, набор которых составляет свойство. //Учет товаров ведется в разрезе свойств этих товаров, причем для каждого товара набор этих свойств может быть произвольный. //Например, «ботинки черные 42 размера», «ботинки коричневые 42 размера» и «ботинки коричневые 44 размера утепленные» это один товар «ботинки», но с разными свойствами. //«Черные 42 размера» будет являться свойством, а цвет «черный» и размер «42» являются характеристиками. //Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //И в документе поступления, и в документе списания для каждого товара указывается его свойство. //Механизм свойств и характеристик товаров должен быть реализован с использованием плана видов характеристик. //Необходимо в форме документа «Приходная накладная» и «Расходная накладная» предоставить пользователю возможность выбора только из тех свойств, которые относятся к данному товару. //Складской учет товаров не ведется. //Списание себестоимости товаров должно быть организовано в разрезе свойств по партиям, в зависимости от текущего значения принятого на этот год в учетной политике метода списания себестоимости (FIFO или LIFO). //Еще раз подчеркивается – учетная политика действует год. На следующий год метод списания может смениться. //Необходимо построить отчет о движениях товаров за период по выбранной характеристике в количественном и суммовом выражении. // //Создаем Спр. СвойстваНоменклатуры, Производитель. в тч накладных добавляем рекв.СвойствоНоменклатуры. //В ПВХ добавляем производителя. Создаем РС ДополнительныеХарактеристики (не не. Изм Объект - спрСсылкаНоменкл. Свойство - ПланВидовХарактеристикСсылка.СвойстваОбъектов, рес. Значение - Характеристика.СвойстваОбъектов). //РС УчетнаяПолитика - рес. МетодСписания. РН ОстаткиНоменклатуры Изм. СвойствоНоменклатуры.Партия, Номенклатура. Рес. Количество,Стоимость. //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.СвойстваНоменклатуры = ТекСтрокаСписокНоменклатуры.СвойстваНоменклатуры; Движение.Партия = Ссылка; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных("СвойстваНоменклатуры", "СвойстваНоменклатуры"); Блокировка.Заблокировать(); МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания; Если НЕ ЗначениеЗаполнено(МетодСписания) Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Заполните учетную политику!!"; Сообщение.Сообщить(); Отказ = Истина; Возврат; КонецЕсли; Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда ПорядокСортировки = " УБЫВ"; Иначе ПорядокСортировки =""; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СписокНоменклатуры.СвойстваНоменклатуры КАК СвойстваНоменклатуры, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.СвойстваНоменклатуры | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | СвойстваНоменклатуры |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.СвойстваНоменклатуры КАК СвойстваНоменклатуры, | ТЧДок.Количество КАК ДокументКоличество, | ТЧДок.Сумма КАК ДокументСумма, | ОстаткиНоменклатурыОстатки.Партия, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, СвойстваНоменклатуры) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.СвойстваНоменклатуры | ИЗ | ТЧДок КАК Т)) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | И ТЧДок.СвойстваНоменклатуры = ОстаткиНоменклатурыОстатки.СвойстваНоменклатуры | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.МоментВремени "+ПорядокСортировки+" |ИТОГИ | МАКСИМУМ(ДокументКоличество), | МАКСИМУМ(ДокументСумма), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | СвойстваНоменклатуры"; Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный,Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаСвойстваНоменклатуры = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСвойстваНоменклатуры.Следующий() Цикл Если ВыборкаСвойстваНоменклатуры.ДокументКоличество > ВыборкаСвойстваНоменклатуры.КоличествоОСтаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаСвойстваНоменклатуры.номенклатура+" недостаточно. На остатке:"+ВыборкаСвойстваНоменклатуры.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; ВыборкаДетальныеЗаписи = ВыборкаСвойстваНоменклатуры.Выбрать(); КоличествоСписать = ВыборкаСвойстваНоменклатуры.ДокументКоличество; Пока ВыборкаДетальныеЗаписи.Следующий() и КоличествоСписать>0 Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Партия = ВыборкаДетальныеЗаписи.Партия; Движение.СвойстваНоменклатуры = ВыборкаДетальныеЗаписи.СвойстваНоменклатуры; Движение.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстаток, КоличествоСписать); Движение.Стоимость = ?(ВыборкаДетальныеЗаписи.КоличествоОстаток>КоличествоСписать, КоличествоСписать*ВыборкаДетальныеЗаписи.СтоимостьОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток,ВыборкаДетальныеЗаписи.СтоимостьОстаток); КоличествоСписать = КоличествоСписать - Движение.Количество; КонецЦикла; КонецЦикла; КонецПроцедуры //ОтчетВедостосьТоваров ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.СвойстваНоменклатуры, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьПриход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьРасход ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты КАК ОстаткиНоменклатурыОстаткиИОбороты {ХАРАКТЕРИСТИКИ ТИП(Справочник.СвойстваНоменклатуры) ВИДЫХАРАКТЕРИСТИК ПланВидовХарактеристик.СвойстваОбъектов ПОЛЕКЛЮЧА Ссылка ПОЛЕИМЕНИ Наименование ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения ЗНАЧЕНИЯХАРАКТЕРИСТИК РегистрСведений.ДополнительныеХарактеристики ПОЛЕОБЪЕКТА Объект ПОЛЕВИДА Свойство ПОЛЕЗНАЧЕНИЯ Значение } //1.47 Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». //Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. //И услуги и товары указываются в одной табличной части. Учет товаров ведется в разрезе складов. //Поступление и продажа осуществляются с указанием склада (в шапке документа). //При проведении расходной накладной необходимо в первую очередь контролировать хватает ли товара на выбранном складе. //Если нет – выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. //Списание себестоимости товаров должно быть организовано по партиям, в зависимости от текущего значения принятого на этот год в учетной политике метода списания себестоимости (FIFO или LIFO). //Еще раз подчеркивается – учетная политика действует год. На следующий год метод списания может смениться. //При списании себестоимости необходимо учитывать только момент поступления товара в компанию, вне зависимости от того, на какой склад он пришел. //В том случае, когда какой-либо товар не устраивает покупателя, покупатель может вернуть этот товар, если с момента продажи прошло не более чем 3 дня. //Возврат товара отражается документом «Приходная накладная» с соответствующим признаком и указанием документа, по которому производится возврат. //В том случае, когда с момента возврата прошло более 3-х дней, товар к возврату не принимается и документ не проводится. //Себестоимость принятого товара считается как средняя списанная себестоимость этого товара из документа «Расходная накладная», по которой происходит возврат. //Необходимо построить отчет по закупкам и продажам товаров за период. //Возвраты должны уменьшать данные о продажах, причем возврат должен отражаться в том периоде, в котором была произведена продажа. //Прибыль рассчитывается как: «Сумма продаж» - «Себестоимость» // //В спр номенкл добавляем ВидНоменклатуры. Добавляем спрСклады. В шапку приходной добавляем ЭтоВозврат (булево), Склад. //В тч добавляем ДокументПродажи (расходная). //Модуль формы прихдной &НаКлиенте Процедура ПриОткрытии(Отказ) УстановитьВидимость(); КонецПроцедуры &НаКлиенте Процедура УстановитьВидимость() Элементы.СписокНоменклатурыСумма.Видимость = Не Объект.ЭтоВозврат; Элементы.СписокНоменклатурыЦена.Видимость = Не Объект.ЭтоВозврат; Элементы.СписокНоменклатурыДокументПродажи.Видимость = Объект.ЭтоВозврат; КонецПроцедуры &НаКлиенте Процедура ВозвратПриИзменении(Элемент) УстановитьВидимость(); КонецПроцедуры //В шапку расходной добавляем Склад. Добавляем РС УчетнаяПолитика и меод списания. //ОстаткиНоменклатуры (Номенклатура, Склад,Партия,Количество.) //РегОст СтоимостьНоменклатуры (Номенклатура,Количество,Стоимость). //РегОбор Продажи (Номенклатура, Накладная (расх), Количество,Стоимость,Сумма). //РегОБ Закупки (Номенклатура,Склад,Количество, Стоимость) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) Если не ЭтоВозврат Тогда // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; // регистр СтоимостьНоменклатуры Приход Движения.СтоимостьНоменклатуры.Записывать = Истина; Движения.Закупки.Записывать = Истина ; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Если ТекСтрокаСписокНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Склад = Склад; Движение.Партия = Ссылка; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение = Движения.СтоимостьНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; Движение = Движения.Закупки.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; Иначе Движения.Продажи.Записывать = Истина; Движения.Продажи.Записать(); Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.СтоимостьНоменклатуры.Записывать = Истина; Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Продажи"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Накладная", "ДокументПродажи"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | ПриходнаяНакладнаяСписокНоменклатуры.ДокументПродажи КАК ДокументПродажи |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры |ГДЕ | ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура, | ПриходнаяНакладнаяСписокНоменклатуры.ДокументПродажи | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | ДокументПродажи |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество, | ТЧДок.ДокументПродажи КАК Накладная, | ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) КАК КолОборот, | ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0) КАК СтоимостьОборот, | ЕСТЬNULL(ПродажиОбороты.СуммаОборот, 0) КАК СуммаОборот, | ВЫБОР | КОГДА ДОБАВИТЬКДАТЕ(ПродажиОбороты.Накладная.Дата, ДЕНЬ, 3) < &Дата | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ КАК ПревышенСрокВозврата |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты( | , | &МоментВремени, | , | (Номенклатура, Накладная) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.ДокументПродажи | ИЗ | ТЧДок КАК Т)) КАК ПродажиОбороты | ПО ТЧДок.Номенклатура = ПродажиОбороты.Номенклатура | И ТЧДок.ДокументПродажи = ПродажиОбороты.Накладная | |УПОРЯДОЧИТЬ ПО | Номенклатура, | Накладная"; Запрос.УстановитьПараметр("Дата", Дата); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ПревышенСрокВозврата Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товар невозможно возвратить, так как прошло больше 3-ех дней"; Сообщение.Сообщить(); Отказ = Истина КонецЕсли; Если Выборка.Количество>Выборка.КолОборот Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Количество возвращаемого товара превышает проданый товар.Товар "+Выборка.Номенклатура;; Сообщение.Сообщить(); Отказ = Истина КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; //увеличим остатки на складах Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Партия = Ссылка; Движение.Склад = Склад; Движение.Количество = Выборка.Количество; //увеличим себестоимость Движение = Движения.СтоимостьНоменклатуры.ДобавитьПриход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Количество = Выборка.Количество; Движение.Стоимость = Выборка.Количество*Выборка.СтоимостьОборот/Выборка.КолОборот; Движение = Движения.Продажи.Добавить(); Движение.Период = Выборка.Накладная.Дата; Движение.Номенклатура = Выборка.номенклатура; Движение.Накладная = Выборка.Накладная; Движение.Количество = -1*Выборка.Количество; Движение.Сумма = -1*Выборка.Количество*Выборка.СуммаОборот/Выборка.КолОборот; Движение.Стоимость = -1*Выборка.Количество*Выборка.СтоимостьОборот/Выборка.КолОборот; КонецЦикла; КонецЕсли; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания; Если не ЗначениеЗаполнено(МетодСписания) ТОгда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не введена учетная политика!!"; Сообщение.Сообщить(); Отказ =Истина; Возврат; КонецЕсли; Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда ПорядокСортировки = " УБЫВ"; Иначе ПорядокСортировки =""; КонецЕсли; Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.СтоимостьНоменклатуры.Записывать = Истина; Движения.Продажи.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.СтоимостьНоменклатуры.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.СтоимостьНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад КАК Склад, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Склад |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК ДокКол, | ТЧДок.Сумма КАК ДокСум, | ТЧДок.Склад, | ТЧДок.ВидНоменклатуры КАК ВидНоменклатуры, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КолОстСклад, | ОстаткиНоменклатурыОстатки.Партия, | ЕСТЬNULL(СтоимостьНоменклатурыОстатки.КоличествоОстаток, 0) КАК КолОст, | ЕСТЬNULL(СтоимостьНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОст, | ПРЕДСТАВЛЕНИЕ(ТЧДок.Номенклатура) |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, Склад) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Склад | ИЗ | ТЧДок КАК Т | ГДЕ | Т.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга))) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т | ГДЕ | Т.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга))) КАК СтоимостьНоменклатурыОстатки | ПО ТЧДок.Номенклатура = СтоимостьНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.МоментВремени"+ПорядокСортировки+" |ИТОГИ | МАКСИМУМ(ДокКол), | МАКСИМУМ(ДокСум), | МАКСИМУМ(ВидНоменклатуры), | СУММА(КолОстСклад), | СУММА(КолОст), | СУММА(СтоимостьОст) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный ,Неопределено, МоментВремени())); Запрос.УстановитьПараметр("Ссылка",Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Себестоимость = 0; Если ВыборкаНоменклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда Если ВыборкаНоменклатура.ДокКол > ВыборкаНоменклатура.КолОстСклад Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.НоменклатураПредставление+" недостаточно. На остатке:"+ВыборкаНоменклатура.КолОстСклад; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; ВыборкаПартия = ВыборкаНоменклатура.Выбрать(); КоличествоСписать = ВыборкаНоменклатура.ДокКол; Пока ВыборкаПартия.Следующий() и КоличествоСписать>0 Цикл НужноСписатьКол = Мин(ВыборкаПартия.КолОст, КоличествоСписать); Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаПартия.Номенклатура; Движение.Партия = ВыборкаПартия.Партия; Движение.Количество = НужноСписатьКол; Движение.Склад = Склад; Движение = Движения.СтоимостьНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаПартия.Номенклатура; Движение.Количество = НужноСписатьКол; Движение.Стоимость = ?(ВыборкаПартия.КолОст>КоличествоСписать, КоличествоСписать*ВыборкаПартия.СтоимостьОст/ВыборкаПартия.КолОст,ВыборкаПартия.СтоимостьОст); Себестоимость = Себестоимость+ Движение.Стоимость; КоличествоСписать = КоличествоСписать - НужноСписатьКол; КонецЦикла; КонецЕсли; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Количество = ВыборкаНоменклатура.ДокКол; Движение.Накладная = Ссылка; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Сумма = ВыборкаНоменклатура.ДокСум; Движение.Стоимость = Себестоимость; КонецЦикла; КонецПроцедуры //Отчет Продажи ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Себестоимость, ПродажиОбороты.СуммаОборот КАК Продажа ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты Отчет Закупки ВЫБРАТЬ ЗакупкиОбороты.Номенклатура, ЗакупкиОбороты.Склад, ЗакупкиОбороты.КоличествоОборот КАК Количество, ЗакупкиОбороты.СтоимостьОборот КАК Стоимость ИЗ РегистрНакопления.Закупки.Обороты КАК ЗакупкиОбороты //1.48 Компания является заведением общественного питания. Возможна продажа как отдельных продуктов, так наборов этих продуктов и готовых блюд. //Набор представляет из себя перечень продуктов, хранящихся на складе. //Например, можно продавать в виде набора пирожное и чай, а можно по отдельности – отдельно чай, отдельно пирожное. //В том случае, если из продуктов изготовлено блюдо, например из овощей сделан салат, то продаваться может только само блюдо, а входящие в его состав продукты проданы быть не могут. //Закупка продуктов отражается документом «Приходная накладная», продажа - «Расходная накладная». //Для отражения приготовления блюд и создания наборов служит документ «Комплектация». //Учет номенклатуры в разрезе складов не ведется. При продаже в одной табличной части указываются продукты, наборы и готовые блюда. //В документе «Комплектация» в табличной части указывается продукты и их количество, а в шапке набор или готовое блюдо и его количество. //В состав набора и готового блюда могут входить как продукты, так и готовые блюда. //В случае приготовления блюда, должно произойти списание необходимого количества продуктов и оприходование готовых блюд в количестве, указанном в шапке документа. //В случае комплектации набора, при продаже необходимо будет списать столько продуктов, сколько их входит в набор. //Со временем (не чаще, чем 1 раз в день) состав набора может изменяться, для чего необходимо создать новую комплектацию этого набора. //Создавать набор или вносить изменения в него можно только документом «Комплектация». //При продаже должен приниматься тот состав набора, который был актуальным на момент продажи. //Себестоимость номенклатуры при списании рассчитывается как средняя. Необходимо создать отчеты о движении складских запасов и о продажах за период. // //Создаем перечислениые ВидыКомплектаций (Набор,Блюдо). //Док Комплектация (Рекв. ВидКомплектации, Номенклатура, Количесвто. тч СписокНоменклатуры - Номенклатура, Количество.) //Создаем РС Наборы (в пределах дня, незави). изм.Набор(ном.), номенклатура (ном.) , Рес. Количество. //РН ОстаткиНоменклатуры (изм. Номенклатура, рес. Количесто,Стоимость.). //РегОб Продажи (Номенлктура, Количество,Сумма,Стоимость) Рег.Об. ПродажиПодробные (Номенклатура, Количество, КоличествоВНаборе.) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Продажи.Записывать = Истина; Движения.ПродажиПодробные.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЕСТЬNULL(НаборыСрезПоследних.Номенклатура, ТЧДок.Номенклатура) КАК Номенклатура, | СУММА(ВЫБОР | КОГДА НаборыСрезПоследних.Номенклатура ЕСТЬ NULL | ТОГДА ТЧДок.Количество | ИНАЧЕ ЕСТЬNULL(НаборыСрезПоследних.Количество, 0) * ТЧДок.Количество | КОНЕЦ) КАК Количество, | СУММА(ТЧДок.Сумма) КАК Сумма, | СУММА(ВЫБОР | КОГДА НаборыСрезПоследних.Номенклатура ЕСТЬ NULL | ТОГДА 0 | ИНАЧЕ ЕСТЬNULL(НаборыСрезПоследних.Количество, 0) * ТЧДок.Количество | КОНЕЦ) КАК КоличествоВСоставеНаборов, | НаборыСрезПоследних.Набор, | СУММА(ТЧДок.Количество) КАК КолПоНабору |ПОМЕСТИТЬ ТЧСНаборами |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Наборы.СрезПоследних( | &МоментВремени, | Набор В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК НаборыСрезПоследних | ПО ТЧДок.Номенклатура = НаборыСрезПоследних.Набор | |СГРУППИРОВАТЬ ПО | ЕСТЬNULL(НаборыСрезПоследних.Номенклатура, ТЧДок.Номенклатура), | НаборыСрезПоследних.Набор | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура, | ОстаткиНоменклатурыОстатки.КоличествоОстаток, | ОстаткиНоменклатурыОстатки.СтоимостьОстаток |ПОМЕСТИТЬ ОстаткиНоменклатуры |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧСНаборами КАК Т)) КАК ОстаткиНоменклатурыОстатки | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧБезНаборов.Номенклатура, | ЕСТЬNULL(ОстаткиНоменклатуры.КоличествоОстаток, 0) КАК КоличествоОстаток |ИЗ | (ВЫБРАТЬ | ТЧСНаборами.Номенклатура КАК Номенклатура, | СУММА(ТЧСНаборами.Количество) КАК Количество, | СУММА(ТЧСНаборами.Сумма) КАК Сумма, | СУММА(ТЧСНаборами.КоличествоВСоставеНаборов) КАК КоличествоВСоставеНаборов | ИЗ | ТЧСНаборами КАК ТЧСНаборами | | СГРУППИРОВАТЬ ПО | ТЧСНаборами.Номенклатура) КАК ТЧБезНаборов | ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиНоменклатуры КАК ОстаткиНоменклатуры | ПО ТЧБезНаборов.Номенклатура = ОстаткиНоменклатуры.Номенклатура |ГДЕ | ВЫБОР | КОГДА ТЧБезНаборов.Количество > ЕСТЬNULL(ОстаткиНоменклатуры.КоличествоОстаток, 0) | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ = ИСТИНА |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧСНаборами.Номенклатура КАК Номенклатура, | ТЧСНаборами.Количество КАК КолДок, | ТЧСНаборами.Сумма КАК СумДок, | ТЧСНаборами.КоличествоВСоставеНаборов, | ТЧСНаборами.Набор КАК Набор, | ЕСТЬNULL(ОстаткиНоменклатуры.КоличествоОстаток, 0) КАК КолОст, | ЕСТЬNULL(ОстаткиНоменклатуры.СтоимостьОстаток, 0) КАК СумОст, | ТЧСНаборами.КолПоНабору КАК КолПоНабору |ИЗ | ТЧСНаборами КАК ТЧСНаборами | ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиНоменклатуры КАК ОстаткиНоменклатуры | ПО ТЧСНаборами.Номенклатура = ОстаткиНоменклатуры.Номенклатура |ИТОГИ | МАКСИМУМ(СумДок), | МАКСИМУМ(КолПоНабору) |ПО | Набор"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.ВыполнитьПакет(); Если Не Результат[3].Пустой() Тогда Отказ = Истина; ВыборкаНоменклатура = Результат[3].Выбрать(); Пока ВыборкаНоменклатура.Следующий() цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаНоменклатура.Номенклатура+" недостаточно. На остатке:"+ВыборкаНоменклатура.КоличествоОстаток; Сообщение.Сообщить(); КонецЦикла; КонецЕсли; Если Отказ Тогда Возврат; КонецЕсли; ВыборкаНабор = Результат[4].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНабор.Следующий() Цикл Выборка = ВыборкаНабор.Выбрать(); Себестоимость = 0; Пока выборка.Следующий() цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Количество = Выборка.КолДок; Движение.Стоимость = ?(Выборка.КолОст > Выборка.КолДок, Выборка.КолДок*Выборка.СумОст/Выборка.КолОст,Выборка.СумОст); Себестоимость = Себестоимость + Движение.Стоимость; Движение = Движения.ПродажиПодробные.Добавить(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Количество = ?(Выборка.Набор = NULL,Выборка.КолДок,0); Движение.КоличествоВНаборе = Выборка.КоличествоВСоставеНаборов; Если ВыборкаНабор.Набор=null Тогда Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = выборка.Номенклатура; Движение.Количество = выборка.КолДок; Движение.Стоимость = Себестоимость; Движение.Сумма = выборка.СумДок; КонецЕсли; КонецЦикла; Если ВыборкаНабор.Набор <>Null Тогда Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНабор.Набор; Движение.Количество = ВыборкаНабор.КолПоНабору; Движение.Стоимость = Себестоимость; Движение.Сумма = ВыборкаНабор.СумДок; КонецЕсли; КонецЦикла; КонецПроцедуры //ДокКомплектацияи Процедура ОбработкаПроведения(Отказ, РежимПроведения) Если ВидКомплектации = Перечисления.ВидыКомплектаций.Набор Тогда Движения.Наборы.Записывать = Истина; Для каждого ЭлементТЧ из СписокНоменклатуры цикл Движение = Движения.Наборы.Добавить(); Движение.Период = Дата; Движение.Набор = Номенклатура; Движение.Номенклатура = ЭлементТЧ.Номенклатура; Движение.Количество = ЭлементТЧ.Количество; КонецЦикла; Иначе Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | КомплектацияСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(КомплектацияСписокНоменклатуры.Количество * КомплектацияСписокНоменклатуры.Ссылка.Количество) КАК Количество |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.Комплектация.СписокНоменклатуры КАК КомплектацияСписокНоменклатуры |ГДЕ | КомплектацияСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | КомплектацияСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура КАК Номенклатура, | ТЧДок.Количество КАК КолДок, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КолОст, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОст |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Себестоимость = 0; Пока Выборка.Следующий() Цикл Если Выборка.КолДок >Выборка.КолОст Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+Выборка.Номенклатура+" в количестве "+Выборка.КолДок+" недостаточно.На остатке:"+Выборка.КолОст; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Количество = Выборка.КолДок; Движение.Стоимость = Выборка.КолДок * Выборка.СтоимостьОст/Выборка.КолОст; Себестоимость = Себестоимость + Движение.Стоимость; КонецЦикла; Если Отказ Тогда Возврат; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход(); Движение.Период = Дата; Движение.Номенклатура = Номенклатура; Движение.Количество = Выборка.КолДок; Движение.Стоимость = Себестоимость; КонецЕсли; КонецПроцедуры //Отчет ПродажиПодробные ВЫБРАТЬ ПродажиПодробныеОбороты.Номенклатура, ПродажиПодробныеОбороты.КоличествоОборот, ПродажиПодробныеОбороты.КоличествоВНабореОборот ИЗ РегистрНакопления.ПродажиПодробные.Обороты КАК ПродажиПодробныеОбороты //ОтчетПРодажи ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Себестоимость, ПродажиОбороты.СуммаОборот КАК Продажа ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты //ОтчетВедомостьПродуктов ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьПриход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьРасход ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты КАК ОстаткиНоменклатурыОстаткиИОбороты //1.49 Компания занимается оптовой торговлей складских стеллажей и их комплектующих. Возможна продажа как отдельных деталей, так и готовых стеллажей. //Закупка комплектующих отражается документом «Приходная накладная», продажа - «Расходная накладная». //Для сборки стеллажей служит документ «Комплектация». Учет номенклатуры в разрезе складов не ведется. //При продаже в одной табличной части указываются и детали и стеллажи. В случае продажи деталей, списываются сами детали, в случае продажи стеллажей, списываются детали, входящие в его состав. //В документе «Комплектация» в табличной части указывается комплектующие и их количество, а в шапке готовый стеллаж и их количество. //В состав готового стеллажа могут входить как детали, так и готовые стеллажи, например, в готовый стеллаж можно добавить дополнительную полку. //Со временем (не чаще, чем 1 раз в день) состав стеллажа может зменяться, для чего необходимо создать новую комплектацию этого стеллажа. //При продаже должен приниматься тот состав стеллажа, который был актуальным на момент продажи. //Себестоимость номенклатуры при списании рассчитывается как средняя. //Необходимо создать отчеты о движении складских запасов и о продажах за период //В отчете отражаются детали, которые были проданы как самостоятельно, так и в составе стеллажей. //Сами стеллажи в данном отчете не отражаются. В отчете отражаются те номенклатурные позиции, которые реально были проданы – сами стеллажи и детали, которые были проданы дополнительно к //целым стеллажам. // //Создаем док КомплектацияНоменклатуры (рекв. Стеллаж(ном), тч СписокНоменклатуры - Номенклатура,Количесвто.) //РС Стеллажи (В пределах дня, Ре.Комплектация ном.) Изм Стеллаж, Деталь, рес.Количество. //ОстаткиНоменклатуры (Номенклатура,Количесвто,Стоимоть). //РН Продажи (Номенклатура, Количесвто,Стоимость,Сумма) РН ПродажиПодробные (Номенклатура, Количество, КоличествоВСтреллаже) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ДокРАсходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записывать = Истина; Движения.ПродажиПодробные.Записывать = Истина; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени())); Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЕСТЬNULL(СтеллажиСрезПоследних.Деталь, ТЧДок.Номенклатура) КАК Номенклатура, | ВЫБОР | КОГДА СтеллажиСрезПоследних.Деталь ЕСТЬ NULL | ТОГДА ТЧДок.Количество | ИНАЧЕ ТЧДок.Количество * ЕСТЬNULL(СтеллажиСрезПоследних.Количество, 0) | КОНЕЦ КАК Количество, | ТЧДок.Количество КАК КоличествоСтеллажей, | ТЧДок.Сумма, | СтеллажиСрезПоследних.Стеллаж КАК Стеллаж, | ВЫБОР | КОГДА СтеллажиСрезПоследних.Деталь ЕСТЬ NULL | ТОГДА 0 | ИНАЧЕ ТЧДок.Количество * ЕСТЬNULL(СтеллажиСрезПоследних.Количество, 0) | КОНЕЦ КАК КоличествоВСоставеНаборов |ПОМЕСТИТЬ ТЧДокССтелажами |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Стеллажи.СрезПоследних КАК СтеллажиСрезПоследних | ПО ТЧДок.Номенклатура = СтеллажиСрезПоследних.Стеллаж | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | Стеллаж"; Результат = Запрос.Выполнить(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = Результат; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос.Текст = "ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура, | ОстаткиНоменклатурыОстатки.КоличествоОстаток, | ОстаткиНоменклатурыОстатки.СтоимостьОстаток |ПОМЕСТИТЬ Остатки |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДокССтелажами КАК Т)) КАК ОстаткиНоменклатурыОстатки | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВложенныйЗапрос.Номенклатура, | ВложенныйЗапрос.Количество, | ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК КоличествоОСтаток |ИЗ | (ВЫБРАТЬ | ТЧДокССтелажами.Номенклатура КАК Номенклатура, | СУММА(ТЧДокССтелажами.Количество) КАК Количество | ИЗ | ТЧДокССтелажами КАК ТЧДокССтелажами | | СГРУППИРОВАТЬ ПО | ТЧДокССтелажами.Номенклатура) КАК ВложенныйЗапрос | ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки | ПО ВложенныйЗапрос.Номенклатура = Остатки.Номенклатура |ГДЕ | ВЫБОР | КОГДА ВложенныйЗапрос.Количество > ЕСТЬNULL(Остатки.КоличествоОстаток, 0) | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ = ИСТИНА |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДокССтелажами.Номенклатура, | ТЧДокССтелажами.Стеллаж КАК Стеллаж, | ТЧДокССтелажами.Количество, | ТЧДокССтелажами.КоличествоСтеллажей КАК КоличествоСтеллажей, | ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(Остатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | ТЧДокССтелажами.Сумма КАК Сумма, | ТЧДокССтелажами.КоличествоВСоставеНаборов |ИЗ | ТЧДокССтелажами КАК ТЧДокССтелажами | ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки | ПО ТЧДокССтелажами.Номенклатура = Остатки.Номенклатура |ИТОГИ | МАКСИМУМ(КоличествоСтеллажей), | МАКСИМУМ(Сумма) |ПО | Стеллаж"; Результат = Запрос.ВыполнитьПакет(); Если Не Результат[1].Пустой() Тогда Отказ =Истина; ВыборкаОстатки = Результат[1].Выбрать(); Пока ВыборкаОстатки.Следующий() Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+ВыборкаОстатки.Номенклатура +" недостаточно. На остатке:"+ВыборкаОстатки.КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; КонецЦикла; КонецЕсли; Если Отказ Тогда Возврат; КонецЕсли; ВыборкаСтеллаж = Результат[2].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСтеллаж.Следующий() цикл Себестоимость = 0; Выборка = ВыборкаСтеллаж.Выбрать(); Пока Выборка.Следующий() цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Количество = Мин(Выборка.Количество, Выборка.КоличествоОстаток); Движение.Стоимость = ?(Выборка.КоличествоОстаток> Выборка.Количество , Выборка.Количество*Выборка.СтоимостьОстаток/выборка.КоличествоОстаток,Выборка.СтоимостьОстаток); Себестоимость = Себестоимость + Движение.Стоимость; Движение = Движения.ПродажиПодробные.Добавить(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Количество = Выборка.Количество; Движение.КоличествоВСтеллаже = Выборка.КоличествоВСоставеНаборов; Если Выборка.стеллаж = Null Тогда Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Количество = Выборка.Количество; Движение.Стоимость = Себестоимость; Движение.Сумма = Выборка.Сумма; КонецЕсли; КонецЦикла; Если ВыборкаСтеллаж.стеллаж <> Null ТОгда Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаСтеллаж.Стеллаж; Движение.Количество = ВыборкаСтеллаж.КоличествоСтеллажей; Движение.Стоимость = Себестоимость; Движение.Сумма = ВыборкаСтеллаж.Сумма; КонецЕсли; КонецЦикла; КонецПроцедуры //ДокКомплектация Процедура ОбработкаПроведения(Отказ, Режим) Движения.Стеллажи.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | КомплектацияНоменклатурыСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(КомплектацияНоменклатурыСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.КомплектацияНоменклатуры.СписокНоменклатуры КАК КомплектацияНоменклатурыСписокНоменклатуры |ГДЕ | КомплектацияНоменклатурыСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | КомплектацияНоменклатурыСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЕСТЬNULL(СтеллажиСрезПоследних.Деталь, ТЧДок.Номенклатура) КАК Деталь, | СУММА(ВЫБОР | КОГДА СтеллажиСрезПоследних.Деталь ЕСТЬ NULL | ТОГДА ТЧДок.Количество | ИНАЧЕ ТЧДок.Количество * ЕСТЬNULL(СтеллажиСрезПоследних.Количество, 0) | КОНЕЦ) КАК Количество |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Стеллажи.СрезПоследних( | &МоментВремени, | Стеллаж В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ТЧДок КАК Т)) КАК СтеллажиСрезПоследних | ПО ТЧДок.Номенклатура = СтеллажиСрезПоследних.Стеллаж | |СГРУППИРОВАТЬ ПО | ЕСТЬNULL(СтеллажиСрезПоследних.Деталь, ТЧДок.Номенклатура)"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.Стеллажи.Добавить(); Движение.Период = Дата; Движение.Стеллаж = Стеллаж; Движение.Деталь = Выборка.Деталь; Движение.Количество = Выборка.Количество; КонецЦикла; КонецПроцедуры //Отчет ПродажиПодробные ВЫБРАТЬ ПродажиПодробныеОбороты.Номенклатура, ПродажиПодробныеОбороты.КоличествоОборот КАК Количество, ПродажиПодробныеОбороты.КоличествоВСтеллажеОборот КАК КоличествоВСтеллаже ИЗ РегистрНакопления.ПродажиПодробные.Обороты КАК ПродажиПодробныеОбороты //Отчеты Продажи ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СуммаОборот КАК Продажа, ПродажиОбороты.СтоимостьОборот КАК Себестоимость ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты //Отчет ВедомостьПоТоварам ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьПриход, ОстаткиНоменклатурыОстаткиИОбороты.СтоимостьРасход ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты КАК ОстаткиНоменклатурыОстаткиИОбороты //1.50 Компания занимается комиссионной торговлей. При приеме товара с комиссионером заключается договор с указанием способа расчета вознаграждения. //В конце месяца формируются документы для оплаты комиссионеру за проданный товар. //Поступление товаров отражается документом «Приходная накладная». //В каждой накладной указывается договор комиссии (договор-реквизит шапки), по которому поступил данный товар и суммы по каждому товару, ниже которой он не может быть продан. //Продажа отражается документом «Расходная накладная». //Для каждого товара в документе указывается договор комиссии, по которому этот товар к нам поступил. //В том случае, если товара по этому договору нет, документ проводиться не должен. //Кроме того, должен происходить контроль суммы продажи, которая должна быть не ниже той, которая указанна для данного товара по данному договору. //В том случае, если одинаковый товар поступал по одному договору с указанием разных сумм, то при продаже сумма рассчитывается как средняя по товару. //Выплата комиссионеру происходит документом «Расход денег», в котором указано какой товар, по какому договору, в каком количестве и на какую сумму был продан, а также сумма нашего вознаграждения. //При проведении документа необходимо проверять, что мы не пытаемся рассчитаться с комиссионером за большее количество товаров, чем он нам отдал и чем мы уже отчитались перед ним. //Документ делается на одного комиссионера, но включает информацию по нескольким договорам. //Формирование документов «Расход денег» должно происходить автоматически обработкой «Отчет комиссионерам». //В этой обработке необходимо указывать период, за который мы собираемся рассчитаться, после чего должны сформироваться документы «Расход денег». //Следует учесть, что пользователь может изменить существующие документы или сам создать новый документ «Расход денег», не используя обработку. //Запуск обработки «Отчет комиссионерам» должен происходить либо автоматически с использованием регламентного задания, либо вручную пользователем. //Вознаграждение рассчитывается исходя из условий договора, как процент от суммы продажи и принимается в момент оплаты комиссионеру. //Процент устанавливается в каждом договоре и не меняется. Необходимо создать отчеты о продажах за период и о наличии товаров // //Создать общий модуль обработкаДокументов (сервер, вызов сервера) Процедура ОтсчитатьсяПередКомиссионером(ДатаНач = Неопределено , ДатаКон = Неопределено) Экспорт Если ДатаНач = Неопределено ТОгда ДатаНач = НачалоНедели(ТекущаяДата()); КонецЕсли; Если ДатаКон = Неопределено Тогда ДатаКон = КонецНедели(ТекущаяДата()); КонецЕсли; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = новый МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | ПродажиОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента, | ПродажиОбороты.Номенклатура КАК Номенклатура, | ПродажиОбороты.КоличествоОборот КАК Количество, | ПродажиОбороты.СуммаПродажиОборот КАК Сумма |ПОМЕСТИТЬ ОборотыЗаПериод |ИЗ | РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПродажиОбороты | |ИНДЕКСИРОВАТЬ ПО | ДоговорКонтрагента, | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОборотыЗаПериод.ДоговорКонтрагента, | ОборотыЗаПериод.Номенклатура, | ОборотыЗаПериод.Количество, | ОборотыЗаПериод.Сумма |ИЗ | ОборотыЗаПериод КАК ОборотыЗаПериод"; Запрос.УстановитьПараметр("КонецПериода", Новый Граница(КонецДня(ДатаКон), ВидГраницы.Включая)); Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаНач)); Результат = Запрос.Выполнить(); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатурыДляКомиссионера"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = Результат; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ДоговорКонтрагента", "ДоговорКонтрагента"); Блокировка.Заблокировать(); Запрос.Текст = "ВЫБРАТЬ | ОстаткиНоменклатурыДляКомиссионераОстатки.Номенклатура, | ОстаткиНоменклатурыДляКомиссионераОстатки.ДоговорКонтрагента КАК Договор, | ВЫБОР | КОГДА Обороты.Количество <> 0 | ТОГДА ОстаткиНоменклатурыДляКомиссионераОстатки.КоличествоОстаток * Обороты.Сумма / Обороты.Количество | ИНАЧЕ 0 | КОНЕЦ КАК Сумма, | ВЫБОР | КОГДА ОстаткиНоменклатурыДляКомиссионераОстатки.КоличествоОстаток > Обороты.Количество | ТОГДА Обороты.Количество - ОстаткиНоменклатурыДляКомиссионераОстатки.КоличествоОстаток | ИНАЧЕ ОстаткиНоменклатурыДляКомиссионераОстатки.КоличествоОстаток | КОНЕЦ КАК Количество, | ВЫБОР | КОГДА Обороты.Количество <> 0 | ТОГДА ОстаткиНоменклатурыДляКомиссионераОстатки.КоличествоОстаток * Обороты.Сумма / Обороты.Количество | ИНАЧЕ 0 | КОНЕЦ * (ОстаткиНоменклатурыДляКомиссионераОстатки.ДоговорКонтрагента.ПроцентВознаграждения / 100) КАК Вознаграждение |ИЗ | РегистрНакопления.ОстаткиНоменклатурыДляКомиссионера.Остатки( | &КонецПериода, | (Номенклатура, ДоговорКонтрагента) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.ДоговорКонтрагента | ИЗ | ОборотыЗаПериод КАК Т)) КАК ОстаткиНоменклатурыДляКомиссионераОстатки | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОборотыЗаПериод КАК Обороты | ПО ОстаткиНоменклатурыДляКомиссионераОстатки.Номенклатура = Обороты.Номенклатура | И ОстаткиНоменклатурыДляКомиссионераОстатки.ДоговорКонтрагента = Обороты.ДоговорКонтрагента"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() цикл ДокументОбъект = Документы.РасходДенег.СоздатьДокумент(); ДокументОбъект.Дата = КонецДня(ДатаКон); НоваяСтрока = ДокументОбъект.СписокДоговоров.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка); попытка ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); Исключение КонецПопытки; КонецЦикла; КонецПроцедуры //Создаем общий модуль ОбработчикОжидания (глобальный, клиентУправляемое приложение) Процедура ВключитьОбработчик() Экспорт ПодключитьОбработчикОжидания("ОбработкаРегл",30); КонецПроцедуры Процедура ОбработкаРегл() Экспорт ВыполнитьОбработкуЗаданий(); КонецПроцедуры //Создаем регл задание ОтсчитатьсяПередКомиссионером ( имя метода обработкаДокументов.ОтсчитатьсяПередКомиссионером) //Создаем Справочник Контрагенты и подчин. ДоговорыКонтрагентов (рекв. ПроцентВознаграждения). //В шапку приходной добавляем Контрагент, договорКонтрагента (связи параметров выбора Отбор.Владелец(Контрагент)). //В шапку расходной добавляем контрагента. В тч добавляем договор контрагента (связи параметров выбора Отбор.Владелец(Контрагент)). //Создаем док РасходДенег ( тч СписокДоговоров - Договор, Количество, Сумма, Вознаграждение, Номенклатура). //Создаем Обр. ОтчетКомиссионерам, рекв. ДатаНач, ДатаКон. ФормаОбр &НаКлиенте Процедура ВыполнитьКнопка(Команда) ОбработкаДокументов.ОтсчитатьсяПередКомиссионером(Объект.ДатаНач, Объект.ДатаКон); КонецПроцедуры &НаКлиенте Процедура ВключитьВыполнениеРегламентногоЗадания(Команда) ВключитьОбработчик(); КонецПроцедуры //ОстаткиНоменклатуры (Номенклатура, ДоговорКонтрагента, Количесвто,Стоимость). //РН обор. Продажи Изм. ДоговорКонтрагента, Номнклатура, Количество,СуммаПродажи,Вознаграждение. //РегОст ОстаткиНоменклатурыДляКомиссионера (Номенклатура, ДоговорКонтрагента, Количество) //ДокПриходная Процедура ОбработкаПроведения(Отказ, Режим) // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; // регистр ОстаткиНоменклатурыДляКомиссионера Приход Движения.ОстаткиНоменклатурыДляКомиссионера.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.ДоговорКонтрагента = ДоговорКонтрагента; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; Движение = Движения.ОстаткиНоменклатурыДляКомиссионера.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.ДоговорКонтрагента = ДоговорКонтрагента; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; КонецПроцедуры //ДокРасходная Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Продажи.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ДоговорКонтрагента", "ДоговорКонтрагента"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(СписокНоменклатуры.Количество) КАК Количество, | СУММА(СписокНоменклатуры.Сумма) КАК Сумма, | СписокНоменклатуры.ДоговорКонтрагента КАК ДоговорКонтрагента |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК СписокНоменклатуры |ГДЕ | СписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.ДоговорКонтрагента | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | ДоговорКонтрагента |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Номенклатура, | ТЧДок.Количество КАК КолДок, | ТЧДок.Сумма КАК СумДок, | ТЧДок.ДоговорКонтрагента, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КолОст, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОст, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 1) / ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 1) КАК ПродажаМин |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | (Номенклатура, ДоговорКонтрагента) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.ДоговорКонтрагента | ИЗ | ТЧДок КАК Т)) КАК ОстаткиНоменклатурыОстатки | ПО ТЧДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | И ТЧДок.ДоговорКонтрагента = ОстаткиНоменклатурыОстатки.ДоговорКонтрагента"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл КоличествоДокумент = Выборка.КолДок; КоличествоОстаток = Выборка.КолОст; СтоимостьОстаток = Выборка.СтоимостьОст; Если КоличествоДокумент>КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+выборка.Номенклатура+" по договору "+Выборка.ДоговорКонтрагента+" недостаточно. На остатке:"+КоличествоОстаток; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Выборка.СумДок<Выборка.ПродажаМин*КоличествоДокумент Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "По товару "+выборка.Номенклатура+" по договору "+Выборка.ДоговорКонтрагента+" сумма меньше минимальной. "; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.ДоговорКонтрагента = Выборка.ДоговорКонтрагента; Движение.Количество = КоличествоДокумент; Движение.Стоимость = ?(КоличествоОстаток>КоличествоДокумент, КоличествоДокумент*СтоимостьОстаток/КоличествоОстаток,СтоимостьОстаток); Движение = Движения.Продажи.Добавить(); ДВижение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.ДоговорКонтрагента = Выборка.ДоговорКонтрагента; Движение.СуммаПродажи = Выборка.СумДок; Движение.Количество = КоличествоДокумент; КонецЦикла; КонецПроцедуры //ДокРАсходДенег Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатурыДляКомиссионера.Записывать = Истина; Движения.ОстаткиНоменклатурыДляКомиссионера.БлокироватьДляИзменения = Истина; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = новый МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени(),ВидГраницы.Включая)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.Текст = "ВЫБРАТЬ | РасходДенегСписокДоговоров.Договор КАК Договор, | РасходДенегСписокДоговоров.Номенклатура КАК Номенклатура, | СУММА(РасходДенегСписокДоговоров.Количество) КАК Количество |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.РасходДенег.СписокДоговоров КАК РасходДенегСписокДоговоров |ГДЕ | РасходДенегСписокДоговоров.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходДенегСписокДоговоров.Договор, | РасходДенегСписокДоговоров.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Договор, | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Договор, | ТЧДок.Номенклатура, | ТЧДок.Количество |ИЗ | ТЧДок КАК ТЧДок"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() цикл Движение = Движения.ОстаткиНоменклатурыДляКомиссионера.ДобавитьРасход(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.Период = Дата; Движение.ДоговорКонтрагента = Выборка.Договор; КонецЦикла; Движения.ОстаткиНоменклатурыДляКомиссионера.Записать(); Запрос.Текст = "ВЫБРАТЬ | ОстаткиНоменклатурыДляКомиссионераОстатки.Номенклатура, | ОстаткиНоменклатурыДляКомиссионераОстатки.ДоговорКонтрагента, | ОстаткиНоменклатурыДляКомиссионераОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ОстаткиНоменклатурыДляКомиссионера.Остатки( | &МоментВремени, | (Номенклатура, ДоговорКонтрагента) В | (ВЫБРАТЬ | Т.Номенклатура, | Т.Договор | ИЗ | ТЧДок КАК Т)) КАК ОстаткиНоменклатурыДляКомиссионераОстатки |ГДЕ | ОстаткиНоменклатурыДляКомиссионераОстатки.КоличествоОстаток < 0"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Если НЕ Результат.Пустой() Тогда Отказ = истина; Пока Выборка.Следующий() цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Товара "+Выборка.Номенклатура+" недостаточно"; Сообщение.Сообщить(); КонецЦикла; КонецЕсли; Если Отказ Тогда Возврат; КонецЕсли; Движения.Продажи.Записывать = Истина; Для каждого ЭлементТЧ из СписокДоговоров цикл Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ЭлементТЧ.Номенклатура; Движение.ДоговорКонтрагента =ЭлементТЧ.Договор; Движение.Вознаграждение = ЭлементТЧ.Вознаграждение; КонецЦикла; КонецПроцедуры //Отчет Продажи ВЫБРАТЬ ОстаткиНоменклатурыДляКомиссионераОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыДляКомиссионераОстаткиИОбороты.ДоговорКонтрагента, ОстаткиНоменклатурыДляКомиссионераОстаткиИОбороты.КоличествоРасход КАК Отчитались, ОстаткиНоменклатурыДляКомиссионераОстаткиИОбороты.КоличествоКонечныйОстаток КАК Неотчитались, 0 КАК Продано, 0 КАК Вознаграждение ИЗ РегистрНакопления.ОстаткиНоменклатурыДляКомиссионера.ОстаткиИОбороты КАК ОстаткиНоменклатурыДляКомиссионераОстаткиИОбороты ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.ДоговорКонтрагента, 0, 0, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.ВознаграждениеОборот ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты //ОтчетВедомостьПоТоварав ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.ДоговорКонтрагента, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты КАК ОстаткиНоменклатурыОстаткиИОбороты //БП //Создаем подсистему БизнесПроцессы //Создаем роль Администратор, чтобы можно было завести пользователей в систему, установить все права и флаг права для новых объектов. //Добавляем пользователей, штук 5-6. Открываем Список пользователей, и копируем в него из Предопределенных данных спр.ФизЛица. Делается это очень быстро. //Добавляем новый параметр сеанса – ТекущийПользователь. В модуле сеанса определяем пользователя: ищем его в спр.ФизЛица, если не нашли - создаем его в спр. ФизЛица. Таким образом однозначно будет известно кто зашел в программу. Процедура УстановкаПараметровСеанса(ТребуемыеПараметры) ТекПользователь = Справочники.ФизическиеЛица.НайтиПоКоду(ИмяПользователя()); Если ТекПользователь.Пустая() Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Для пользователя не найдено соответствия в справочнике физ лиц"; Сообщение.Сообщить(); Иначе ПараметрыСеанса.ТекущийПользователь = ТекПользователь; КонецЕсли; КонецПроцедуры //В Задаче нужен регистр сведений РегистрАдресации, добавляем в него нужные реквизиты в зависимости от условий задачи! //То есть какие реквизиты есть в регистре такие же будут и в задаче не больше, таблица одинаковая для всех задач! //При необходимости добавляем нужный справочник (например Должности) и предопределенные элементы справочника (если нужны). //Изменения Исполнитель,Должность,Подразделение. //Создаем новый бизнес-процесс и задачу. Важно связать свойство адресация с регистром адресации //У бизнес-процесса, рисуем карту маршрута на последней закладке. //На карте определяете как будут формироваться задача на конкретном этапе: по исполнителю (например Петров), //либо по конкретной должности (например для любого менеджера), либо по подразделению //(например для любого сотрудника отдела продаж), групповая она будет (создается несколько задач) или нет. //Флаг групповая ставится в св-вах Точки действия (если не видите - отключите кнопку Показывать только важные). // //ФормаБП // &НаСервере Процедура ОбновитьСхему() БизнесПроцесс = РеквизитФормыВЗначение("Объект"); КартаМаршрута = БизнесПроцесс.ПолучитьКартуМаршрута(); КонецПроцедуры // ОбновитьСхему() &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ОбновитьСхему(); КонецПроцедуры &НаКлиенте Процедура Команда1(Команда) ОбновитьСхему(); КонецПроцедуры //Заполнить регистр адресации. При этом можно какого-нибудь пользователя задвоить, сделать и кассиром и менеджером. //Если указана конкретная фамилия - Петров - заполняете ее в точке действия в карте маршрута, а в регистре адресации //добавляете Петров без должности, без подразделения и т.д. //Если сказано любой менеджер - в точке действия ставите Менеджер, а в регистре адресации вводите нескольких менеджеров //с фамилиями, подразделение не ставите. //Если сказано для всех сотрудников подразделения отдел продаж - ставите в точке флаг Групповая, подразделение - //Отдел продаж, а в регистре адресации вводите нескольких сотрудников с этим подразделением, но без указания должностей. //5.1 Для контроля правильности формирования движений по документу «Расходная накладная», необходимо создать управляемые основные форму документа и форму списка, чтобы пользователь мог иметь возможность просмотра движений этого документа по всем регистрам, в которые документ делает записи. Доступ к данным регистров должен осуществляться в форме документа из панели навигации, а в форме списка из командной панели формы // //Решение: Форма документа: Командный интерфейс -поставить Видимость //Форма списка: добавить группу Подменю, добавить в группу кнопки командной панели, выбрав имя команды из глобальных команд //(элементы —список —команда Остатки номенклатуры, Продажи...) // Процедура а1() КонецПроцедуры //5.2 В целях ведения кадрового учета необходимо предоставить пользователю возможность для каждого сотрудника хранить его фотографию. Выбор и //просмотр фотографии необходимо осуществлять из формы соответствующего элемента справочника «Сотрудники». Сама фотография должна храниться либо в //информационной базе, либо в виде отдельного файла, в зависимости от желания пользователя. Запись картинки в базу должна происходить только при записи //самого элемента справочника, а отображение на форме сразу же после выбора, то есть, до записи. // //Решение: Добавить реквизит справочника Картинка (тип ХранилищеЗначения) //Добавить реквизит формы СсылкаНаКартинку (тип Строка), поместить его на форму с заголовком Фото и видом Поле картинки //Создать команду формы ЗагрузитьФото с обработчиком: // &НаКлиенте Процедура ЗагрузитьФото(Команда) АдресВХранилище = ""; Если ПоместитьФайл(АдресВХранилище, , , , УникальныйИдентификатор) Тогда СсылкаНаКартинку = АдресВХранилище; Модифицированность = Истина; КонецЕсли; КонецПроцедуры //Поместить команду ЗагрузитьФото в командную панель формы //Создать обработчики событий: // &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Если ЭтоАдресВременногоХранилища(СсылкаНаКартинку) Тогда ТекущийОбъект.Картинка = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(СсылкаНаКартинку)); КонецЕсли; КонецПроцедуры &НаСервере Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Если ЭтоАдресВременногоХранилища(СсылкаНаКартинку) Тогда УдалитьИзВременногоХранилища(СсылкаНаКартинку); СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка,"Картинка"); КонецЕсли; КонецПроцедуры &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Картинка"); КонецПроцедуры //5.3 В справочнике «Контрагенты» необходимо создать управляемую основную форму элемента, в которой пользователь сможет увидеть все движения с участием //этого контрагента по регистру бухгалтерии. Доступ к этой информации должен осуществляться из панели навигации. // Решение: Создать команду справочника Контрагенты с модулем: // &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) Отбор = Новый Структура("Субконто1",ПараметрКоманды); ПараметрыФормы = Новый Структура("Отбор",Отбор); ОткрытьФорму("РегистрБухгалтерии.Управленческий.ФормаСписка", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); КонецПроцедуры //В свойствах команды указать группу Панель навигации формы.Перейти, тип параметра -СправочникСсылка.Контрагенты //5.4 Организовать хранение продажных цен деталей в разрезе типов цен (оптовые, розничные и т.д.). В документе «Расходная накладная» необходимо //иметь возможность указывать тип цен, по которым осуществляется отпуск товара. В форме выбора деталей, для каждой детали, дополнительно необходимо //отображать ее цену (согласно указанному в документе типу цен), а также текущий остаток на складе. Склад, как и тип цен, указывается в шапке документа //«Расходная накладная». При выборе детали в документ должна добавляться не только сама деталь, но и соответствующая цена. //Решение: //1. Создать справочники Склады, ТипыЦен. //2. В шапку документа РасходнаяНакладная добавить Склад и ТипЦен. //3. Создать регистр сведений ЦеныНоменклатуры с измерениями Номенклатура иТипЦен, ресурс —Цена. //4. В регистр накопления ОстаткиНоменклатуры добавить измерение Склад. //5. Создать неосновную форму выбора справочника Номенклатура. //В свойствах реквизита формы Список описать произвольный запрос: //ВЫБРАТЬ //СпрНоменклатура.Ссылка, //СпрНоменклатура.Наименование, //ЦеныНоменклатурыСрезПоследних.Цена, //ОстаткиНоменклатурыОстатки.КоличествоОстаток //ИЗ //Справочник.Номенклатура КАК СпрНоменклатура //ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних //ПО СпрНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура //ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(&Период, Склад = &Склад) КАК ОстаткиНоменклатурыОстатки //ПО СпрНоменклатура.Ссылка = ОстаткиНоменклатурыОстатки.Номенклатура //ГДЕ //Не СпрНоменклатура.ЭтоГруппа // //Из элементов формы Список удалить реквизит Код, добавить Цена и КоличествоОстаток из списка реквизитов. // //В свойствах элемента формы Список Отображение выбрать Список. //В модуле формы выбора определить 2 процедуры: // &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.УстановитьЗначениеПараметра("Период", Параметры.Период); Список.Параметры.УстановитьЗначениеПараметра("Склад", Параметры.Склад); Список.Параметры.УстановитьЗначениеПараметра("ТипЦен", Параметры.ТипЦен); КонецПроцедуры &НаКлиенте Процедура СписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; СтруктураЗначений = Новый Структура("Номенклатура, Цена", Значение, Элемент.ТекущиеДанные.Цена); ОповеститьОВыборе(СтруктураЗначений); КонецПроцедуры //6. Создать основную форму документа РасходнаяНакладная. В свойствах элемента формы СписокНоменклатурыНоменклатура Форма выбора указать созданную форму выбора справочника Номенклатура. В реквизит Связи параметров выбора занести параметры для запроса: //Период Объект.Дата Очищать //Склад Объект.Склад Очищать //ТипЦен Объект.ТипЦен Очищать //В модуле формы документа определить процедуру: // &НаКлиенте Процедура СписокНоменклатурыНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Если Не ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Номенклатура") Тогда СтандартнаяОбработка = Ложь; Таблица = Элемент.Родитель; Таблица.ТекущиеДанные.Номенклатура = ВыбранноеЗначение.Номенклатура; Таблица.ТекущиеДанные.Цена = ВыбранноеЗначение.Цена; КонецЕсли; КонецПроцедуры //5.5 При работе с документом «Расходная накладная» необходимо реализовать возможность подбора в него сразу нескольких номенклатурных позиций. //В специальной форме подбора, открываемой из формы документа, для каждой номенклатурной позиции должно отражаться количество в отделе закупок и количество //в отделе, из которого происходит продажа или перемещение товара текущим документом. В дальнейшем, в форме подбора пользователь должен иметь возможность //выбрать произвольное количество номенклатурных позиций, которые в //результате отображаются в дополнительной таблице «Отобранные товары», //с указанием самого товара и его количества. Дополнительно должна поддерживаться возможность перетаскивания //мышкой выбранного товара из списка товаров в таблицу «Отобранные товары». После окончания подбора в табличной части документа //должны появиться строки со всеми выбранными товарами в указанном количестве. Примерный вид формы подбора: //Решение: Создать справочник Склады, завести в нем предопределенный элемент ОтделЗакупок. //В шапку документа РасходнаяНакладная добавить Склад. //В регистр накопления ОстаткиНоменклатуры добавить измерение Склад. //Создать неосновную форму выбора справочника Номенклатура -ФормаПодбора. //В свойствах реквизита формы Список описать произвольный запрос: //ВЫБРАТЬ //СправочникНоменклатура.Ссылка, //СправочникНоменклатура.Наименование, //ЕСТЬNULL(ОстаткиОтделаЗакупок.КоличествоОстаток, 0) КАК ОтделЗакупок, //ЕСТЬNULL(ОстаткиОтделаПродаж.КоличествоОстаток, 0) КАК Склад //ИЗ //Справочник.Номенклатура КАК СправочникНоменклатура //ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(&Период, Склад = &Склад) КАК ОстаткиОтделаПродаж //ПО (ОстаткиОтделаПродаж.Номенклатура = СправочникНоменклатура.Ссылка) //ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(&Период, Склад = &ОтделЗакупок) КАК ОстаткиОтделаЗакупок //ПО (ОстаткиОтделаПродаж.Номенклатура = СправочникНоменклатура.Ссылка) // //Из элементов формы Список удалить Код, добавить ОтделЗакупок и Склад из колонок реквизита Список. //Добавить в реквизиты формы таблицу значений ОтобранныеТовары с колонками Номенклатура и Количество. //Добавить в элементы формы реквизит ОтобранныеТовары с колонками. //В модуле формы выбора (ФормаПодбора) определить процедуры: &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.УстановитьЗначениеПараметра("Период", Параметры.Период); Список.Параметры.УстановитьЗначениеПараметра("ОтделЗакупок", Справочники.Склады.ОтделЗакупок); Список.Параметры.УстановитьЗначениеПараметра("Склад", Параметры.Склад); КонецПроцедуры &НаКлиенте Процедура ОтобранныеТоварыПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) Для каждого ВыбранныйЭлемент из ПараметрыПеретаскивания.Значение Цикл Строка = ОтобранныеТовары.Добавить(); Строка.Номенклатура = ВыбранныйЭлемент; Строка.Количество = 1; КонецЦикла; КонецПроцедуры &НаКлиенте Процедура СписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка) СтандартнаяОбработка =Ложь; Строка = ОтобранныеТовары.Добавить(); Строка.Номенклатура = Значение; Строка.Количество = 1; КонецПроцедуры //Описать команду ОК и подключить её в командную панель ОтобранныеТовары. Обработчик команды: // &НаКлиенте Процедура ОК(Команда) ОповеститьОВыборе(ОтобранныеТовары); КонецПроцедуры //Создать основную форму документа РасходнаяНакладная. //Описать команду Подбор и подключить её в командную панель СписокНоменклатуры. Обработчик команды: &НаКлиенте Процедура Подбор(Команда) ПараметрыФормы = Новый Структура("ЗакрыватьПриВыборе, Период, Склад",Истина, Объект.Дата,Объект.Склад); ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаПодбора", ПараметрыФормы,ЭтаФорма); КонецПроцедуры //В модуле формы документа определить процедуру: // &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) Для каждого Товар Из ВыбранноеЗначение Цикл НоваяСтрока = Объект.СписокНоменклатуры.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока,Товар); КонецЦикла; КонецПроцедуры //5.6 В компании продажами занимаются обычные менеджеры и старшие менеджеры. С целью дополнительного контроля при продаже в документах //«Приход денег» и «Расходная накладная» может быть указан ответственный старший менеджер, контролирующий данную операцию. Указывать эту //информацию может не каждый пользователь, а только обладающий соответствующими привилегиями. В том случае, если у пользователя отсутствуют //необходимые полномочия, информация об ответственном менеджере должна быть для него не видима. Управление видимостью должно быть реализовано с //помощью механизма функциональных опций. Следует учитывать, что права на просмотр и внесение данных об ответственном сотруднике могут меняться не //чаще, чем 1 раз в день. Информация в документе должна отображаться только в том случае, если на дату документа пользователь имел соответствующие права. //Решение: //Добавить роль ПолныеПрава. //Завести пользователей (Бельдыев, Васина) //Добавить параметр сеанса Пользователь //В модуле сеанса определить процедуру: Процедура УстановкаПараметровСеанса(ТребуемыеПараметры) Пользователь = Справочники.ФизическиеЛица.НайтиПоНаименованию(ИмяПользователя()); Если ЗначениеЗаполнено(Пользователь) Тогда ПараметрыСеанса.Пользователь = Пользователь; Иначе Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Пользователь отсутствует в справочнике ФизическиеЛица"; Сообщение.Сообщить(); КонецЕсли; КонецПроцедуры //Завести регистр сведений ПолномочияПользователей, //независимый, периодичность —в пределах дня, Измерение —Пользователь (Физлицо), ресурс —МожетУказыватьМенеджера (булево) //В документы ПриходДенег, РасходнаяНакладная добавить реквизит шапки Менеджер (Физлицо) //Добавить функциональную опцию МожетУказыватьМенеджера, хранение РегистрСведений.ПолномочияПользователей.Ресурс.МожетУказыватьМенеджера, //состав —реквизит Менеджер документов ПриходДенег, РасходнаяНакладная. //Добавить параметр функциональных опций ПараметрМожетУказыватьМенеджера, Использование —РегистрСведений.ПолномочияПользователей.Измерение.Пользователь //Создать основные формы документов ПриходДенег, РасходнаяНакладная и в модулях форм определить процедуру: &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) УстановитьПараметрыФункциональныхОпцийФормы(Новый Структура("ПараметрМожетУказыватьМенеджера,Период", ПараметрыСеанса.Пользователь,Объект.Дата)); КонецПроцедуры //5.7 Необходимо создать основную форму списка документа «Начисление зарплаты», в которой пользователь сможет видеть движения этого документа по //регистрам расчета, в отдельной таблице для каждого регистра. Основная форма документа должна быть обычной, а не управляемой. //Решение: //Создать управляемую основную форму списка документа. //Добавить реквизиты типа Динамический список с основными таблицами ОсновныеНачисления и ДополнительныеНачисления с произвольными запросами: //ВЫБРАТЬ //РегистрРасчетаОсновныеНачисления.НомерСтроки, //РегистрРасчетаОсновныеНачисления.ВидРасчета, //РегистрРасчетаОсновныеНачисления.ПериодДействияНачало, //РегистрРасчетаОсновныеНачисления.ПериодДействияКонец, //РегистрРасчетаОсновныеНачисления.БазовыйПериодНачало, //РегистрРасчетаОсновныеНачисления.БазовыйПериодКонец, //РегистрРасчетаОсновныеНачисления.Активность, //РегистрРасчетаОсновныеНачисления.Сторно, //РегистрРасчетаОсновныеНачисления.Сотрудник,РегистрРасчетаОсновныеНачисления.Результат, //РегистрРасчетаОсновныеНачисления.Размер //ИЗ //РегистрРасчета.ОсновныеНачисленияКАК РегистрРасчетаОсновныеНачисления //ГДЕ //РегистрРасчетаОсновныеНачисления.Регистратор = &Регистратор // //и //ВЫБРАТЬ //РегистрРасчетаДополнительныеНачисления.НомерСтроки, //РегистрРасчетаДополнительныеНачисления.ВидРасчета, //РегистрРасчетаДополнительныеНачисления.БазовыйПериодНачало, //РегистрРасчетаДополнительныеНачисления.БазовыйПериодКонец, //РегистрРасчетаДополнительныеНачисления.Активность, //РегистрРасчетаДополнительныеНачисления.Сторно, //РегистрРасчетаДополнительныеНачисления.Сотрудник, //РегистрРасчетаДополнительныеНачисления.Результат, //РегистрРасчетаДополнительныеНачисления.Размер //ИЗ //РегистрРасчета.ДополнительныеНачисления КАК РегистрРасчетаДополнительныеНачисления //ГДЕ //РегистрРасчетаДополнительныеНачисления.Регистратор = &Регистратор // //Создать обычную группу в элементах формы Движения //(группировка —горизонтальная) и включить в неё реквизиты формы ОсновныеНачисления и ДополнительныеНачисления. //Определить процедуры в модуле формы списка: &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) УстановитьРегистратор(); КонецПроцедуры &НаСервере Процедура УстановитьРегистратор() ОсновныеНачисления.Параметры.УстановитьЗначениеПараметра("Регистратор", Элементы.Список.ТекущаяСтрока); ДополнительныеНачисления.Параметры.УстановитьЗначениеПараметра("Регистратор", Элементы.Список.ТекущаяСтрока); КонецПроцедуры &НаКлиенте Процедура СписокПриАктивизацииСтроки(Элемент) УстановитьРегистратор(); КонецПроцедуры //5.8 В форме списка документа «Расходная накладная» для каждого пользователя //предоставить возможность сохранения его индивидуальных настроек формы таких как: группировка, сортировка, отбор. //Решение: //Создать основную форму списка. В свойствах формы установить: //АвтоматическоеСохранениеДанныхВ Настройках —Использовать //СохранениеДанныхВНастройках —Использовать список. //Определить процедуры модуля формы: &НаСервере Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки) СтруктураНастройки= Новый Структура; СтруктураНастройки.Вставить("Отбор", Список.Отбор); СтруктураНастройки.Вставить("Порядок", Список.Порядок); СтруктураНастройки.Вставить("Группировка", Список.Группировка); Настройки.Вставить("Настройка", СтруктураНастройки); КонецПроцедуры &НаСервере Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) СтруктураНастройки = Настройки.Получить("Настройка"); Список.Отбор.Элементы.Очистить(); Попытка Для каждого ЭлементСтруктуры Из СтруктураНастройки.Отбор.Элементы Цикл Эл = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЗаполнитьЗначенияСвойств(Эл, ЭлементСтруктуры); КонецЦикла; Исключение КонецПопытки; Список.Порядок.Элементы.Очистить(); Попытка Для каждого ЭлементСтруктуры Из СтруктураНастройки.Порядок.Элементы Цикл Эл = Список.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); ЗаполнитьЗначенияСвойств(Эл, ЭлементСтруктуры); КонецЦикла; Исключение КонецПопытки; Список.Группировка.Элементы.Очистить(); Попытка Для каждого ЭлементСтруктуры Из СтруктураНастройки.Группировка.Элементы Цикл Эл = Список.Группировка.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ЗаполнитьЗначенияСвойств(Эл, ЭлементСтруктуры); КонецЦикла; Исключение КонецПопытки; КонецПроцедуры //5.9 В форме списка справочника «Номенклатура» необходимо предусмотреть возможность прямого вызова раздела «Справочники» из встроенной справки. //Решение: //Справочник Номенклатура, закладка Прочее, нажать кнопку Справочная информация. //Набрать слово Справочники и для него определить ссылку (Элементы, Ссылка) —выбор ссылки: //Предприятие/Работа пользователя/Работа с объектами конфигурации/Справочники. Процедура а2() КонецПроцедуры //5.10 В форме документа «Приходная накладная» необходимо предоставить пользователю возможность вводить произвольный текстовый комментарий. Текст //комментария может содержать навигационную ссылку (не более одной) на документ оплаты. Переход по навигационной ссылке должен осуществляться при //нажатии кнопки открытия, созданной у данного элемента управления формы. Примерный вид пояснения приведен на следующем рисунке. //Решение: //Добавить в документ ПриходнаяНакладная реквизит Пояснение (длина 100), //расположить в форме его элемент за списком номенклатуры, в свойствах указать Кнопка открытия —Да. //Определить процедуру в модуле формы: &НаКлиенте Процедура ПояснениеОткрытие(Элемент, СтандартнаяОбработка) СтандартнаяОбработка=Ложь; ПозицияСсылки = Найти(Объект.Пояснение,"e1cib/"); Если ПозицияСсылки >0 Тогда ПерейтиПоНавигационнойСсылке(Сред(Объект.Пояснение,ПозицияСсылки)); КонецЕсли; КонецПроцедуры //5.11 Необходимо создать управляемую основную форму документа «Расходная накладная», в которой пользователь сможет осуществлять выбор товаров с //помощью специальной формы подбора. Выбор товаров должен осуществляться посредством перетаскивания мышкой нужного элемента из формы подбора в //форму документа. //Решение: //В основную форму документа РасходнаяНакладная добавить команду Подбор и включить её в командную панель списка номенклатуры с обработчиком: &НаКлиенте Процедура Подбор(Команда) ОткрытьФорму("Справочник.Номенклатура.ФормаСписка"); КонецПроцедуры //Добавить в модуль формы документа процедуру: // &НаКлиенте Процедура СписокНоменклатурыПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) СтандартнаяОбработка = Ложь; Для каждого ЭлементПеретаскивания Из ПараметрыПеретаскивания.Значение Цикл Строка= Объект.СписокНоменклатуры.Добавить(); Строка.Номенклатура= ЭлементПеретаскивания; КонецЦикла; КонецПроцедуры //5.12 Организовать учет товаров в разрезе сроков годности. В документе «Расходная накладная» необходимо создать управляемую основную форму //документа, в которой пользователь должен иметь возможность при выборе товара сразу же выбирать и срок годности. Сроки годности для выбора должны быть //доступны только те, которые еще не списаны по данному товару. Сам выбор срока должен осуществляться следующим образом: //1. При выборе товара открывается окно, в котором пользователь //выбирает товар; //2. После выбора товара, для пользователя сразу же (без возвращения к //редактированию документа) должна открыться новая форма, в //которой будут отображены остатки в разрезе сроков годности по //выбранному товару; //3. После выбора срока годности, в документ должен подставиться сам //товар, срок годности и количество, равное остатку. //Решение: //[Добавить реквизит СрокГодности (Дата) в табличные части документов ПриходнаяНакладная и РасходнаяНакладная и измерение СрокГодности в регистр накопления ОстаткиНоменклатуры. Ввести и провести документы] //Создать форму ОстаткиПоСрокамГодности с динамическим списком Остатки, произвольный запрос: //ВЫБРАТЬ //ОстаткиНоменклатурыОстатки.Номенклатура, //ОстаткиНоменклатурыОстатки.СрокГодности, //ОстаткиНоменклатурыОстатки.КоличествоОстаток //ИЗ //РегистрНакопления.ОстаткиНоменклатуры.Остатки(&Период, Номенклатура = &Номенклатура) КАК ОстаткиНоменклатурыОстатки //Определить процедуры модуля формы: // &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Остатки.Параметры.УстановитьЗначениеПараметра("Период", Параметры.Период); Остатки.Параметры.УстановитьЗначениеПараметра("Номенклатура", Параметры.Номенклатура); КонецПроцедуры &НаКлиенте Процедура ОстаткиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) ВладелецФормы.Элементы.СписокНоменклатуры.ТекущиеДанные.Номенклатура = Элемент.ТекущиеДанные.Номенклатура; ВладелецФормы.Элементы.СписокНоменклатуры.ТекущиеДанные.СрокГодности = Элемент.ТекущиеДанные.СрокГодности; ВладелецФормы.Элементы.СписокНоменклатуры.ТекущиеДанные.Количество = Элемент.ТекущиеДанные.КоличествоОстаток; Закрыть(); КонецПроцедуры //Создать основную форму документа, определить в её модуле процедуру: // &НаКлиенте Процедура СписокНоменклатурыНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ПараметрыФормы = Новый Структура("Период,Номенклатура",Объект.Дата, ВыбранноеЗначение); ОткрытьФорму("Документ.РасходнаяНакладная.Форма.ОстаткиПоСрокамГодности", ПараметрыФормы, ЭтаФорма); КонецПроцедуры //5.13 Организовать учет товаров в разрезе сроков годности. В документе «Расходная накладная» необходимо создать управляемую основную форму //документа, в которой пользователь должен иметь возможность выбирать товар, его срок годности и количество. Сроки годности для выбора должны быть //доступны только те, которые еще не списаны по данному товару. Сам выбор срока должен осуществляться следующим образом: //1. После выбора товара, при выборе срока годности должна открыться //форма, в которой будут отображены остатки в разрезе сроков //годности по выбранному товару; //Решение: //[Добавить реквизит СрокГодности (Дата) в табличные части документов ПриходнаяНакладная и РасходнаяНакладная и измерение СрокГодности в регистр накопления ОстаткиНоменклатуры.Ввести и провести документы] //Создать форму ОстаткиПоСрокамГодности с динамическим списком Остатки, произвольный запрос: //ВЫБРАТЬ //ОстаткиНоменклатурыОстатки.Номенклатура, //ОстаткиНоменклатурыОстатки.СрокГодности, //ОстаткиНоменклатурыОстатки.КоличествоОстаток //ИЗ //РегистрНакопления.ОстаткиНоменклатуры.Остатки(&Период, Номенклатура = &Номенклатура) КАК ОстаткиНоменклатурыОстатки //Определить процедуры модуля формы: &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Остатки.Параметры.УстановитьЗначениеПараметра("Период", Параметры.Период); Остатки.Параметры.УстановитьЗначениеПараметра("Номенклатура", Параметры.Номенклатура); КонецПроцедуры &НаКлиенте Процедура ОстаткиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) ВладелецФормы.Элементы.СписокНоменклатуры.ТекущиеДанные.Номенклатура = Элемент.ТекущиеДанные.Номенклатура; ВладелецФормы.Элементы.СписокНоменклатуры.ТекущиеДанные.СрокГодности = Элемент.ТекущиеДанные.СрокГодности; ВладелецФормы.Элементы.СписокНоменклатуры.ТекущиеДанные.Количество = Элемент.ТекущиеДанные.КоличествоОстаток; Закрыть(); КонецПроцедуры //Создать основную форму документа, определить в её модуле процедуру: // &НаКлиенте Процедура СписокНоменклатурыСрокГодностиНачалоВыбора(Элемент,ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ПараметрыФормы = Новый Структура("Период,Номенклатура", Объект.Дата, Элементы.СписокНоменклатуры.ТекущиеДанные.Номенклатура); ОткрытьФорму("Документ.РасходнаяНакладная.Форма.ОстаткиПоСрокамГодности", ПараметрыФормы, ЭтаФорма); КонецПроцедуры //5.14 Необходимо организовать учет взаиморасчетов с покупателями в разрезе договоров. В форме документа «Приход денег» в табличной части необходимо //указывать договор и сумму оплаты. При проведении документа, в том случае, когда сумма оплат по договору превышает сумму отгрузок, должно //формироваться окно сообщения для каждого такого договора, с указанием соответствующей суммы отгрузки (см. рисунок). // //После формирования движений в конце процедуры обработки проведения выполнить: //Движения.ВзаиморасчетыСКонтрагентами.Записать(); Движения.ВзаиморасчетыСКонтрагентами.БлокироватьДляИзменения = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ // | ПриходДенегСписокДоговоров.Договор, //| ПриходДенегСписокДоговоров.Сумма, // | ВзаиморасчетыСКонтрагентамиОстатки.СуммаОс таток, // | ПриходДенегСписокДоговоров.НомерСтроки // |ИЗ //| Документ.ПриходДенег.СписокДоговоров КАК ПриходДенегСписокДоговоров //| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК ВзаиморасчетыСКонтрагентамиОстатки // | ПО ПриходДенегСписокДоговоров.Договор = ВзаиморасчетыСКонтрагентамиОстатки.Договор //|ГДЕ // | ПриходДенегСписокДоговоров.Ссылка = &Ссылка // | И ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток < 0"; Запрос.УстановитьПараметр("Ссылка",Ссылка); //Результат = Запрос.Выполнить(); //ВыборкаДетальныеЗаписи = Результат.Выбрать(); //Пока ВыборкаДетальныеЗаписи.Следующий() Цикл //Сообщение = Новый СообщениеПользователю; //Сообщение.Текст = "По договору "+ВыборкаДетальныеЗаписи.Договор +" сумма оплаченного товара больше проданного на "+(-ВыборкаДетальныеЗаписи.СуммаОстаток); Сообщение.Поле = "СписокДоговоров[" + (ВыборкаДетальныеЗаписи.НомерСтроки -1)+"].Сумма"; Сообщение.УстановитьДанные(ЭтотОбъект); //Сообщение.Сообщить(); //Отказ = Истина; //КонецЦикла; // Процедура а3() КонецПроцедуры //5.15 В форме бизнес-процесса необходимо отображать карту маршрута и список подчиненных этому бизнес-процессу задач. При выполнении задачи, //вызванной из этой формы, необходимо отобразить соответствующие изменения на карте маршрута (см. рисунок). // //Решение: Создать бизнес-процесс ПродажаТоваров в соответствии с задачей (задача Задача1, дополнить //регистр адресации нужными измерениями, создать справочник Должности, дополнить дополнить нужные предопределенные элементы). //Создать форму задачи, определить в её модуле процедуру: &НаКлиенте Процедура ПриЗакрытии() Оповестить("ОбновитьКарту",Объект.БизнесПроцесс); КонецПроцедуры //Создать форму бизнес-процесса, добавить в неё графическую схему и динамический список Задачи с запросом: //ВЫБРАТЬ //ЗадачаЗадача1.Ссылка, //ЗадачаЗадача1.Номер, //ЗадачаЗадача1.Дата, //ЗадачаЗадача1.БизнесПроцесс, //ЗадачаЗадача1.ТочкаМаршрута, //ЗадачаЗадача1.Наименование, //ЗадачаЗадача1.Выполнена, //ЗадачаЗадача1.Исполнитель //ИЗ //Задача.Задача1 КАК ЗадачаЗадача1 //ГДЕ //ЗадачаЗадача1.БизнесПроцесс = &БизнесПроцесс //Определить её модуле процедуры: &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Задачи.Параметры.УстановитьЗначениеПараметра("БизнесПроцесс",Объект.Ссылка); УстановитьКарту(); КонецПроцедуры &НаСервере Процедура УстановитьКарту() ЭтаФорма.Прочитать(); БП = РеквизитФормыВЗначение("Объект"); КартаМаршрута = БП.ПолучитьКартуМаршрута(); КонецПроцедуры &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ИмяСобытия = "ОбновитьКарту" И Параметр = Объект.Ссылка Тогда УстановитьКарту(); КонецЕсли; КонецПроцедуры //5.16 В основной форме контрагента необходимо иметь возможность вводить информацию о менеджере, который работает с данным контрагентом. //Каждый менеджер должен иметь возможность вводить в информационную базу собственные дополнительные сведения для своих контрагентов. Перечень //используемых дополнительных сведений указывается у каждого сотрудника и должен быть реализован с использованием Плана видов характеристик //(см. рис.2). //Создать неосновную форму выбора справочника Номенклатура -ФормаПодбора. //В свойствах реквизита формы Список описать произвольный запрос: //В элементе формы Список взять только Наименование и Остаток из колонок реквизита Список. //Добавить в реквизиты формы таблицу значений ОтобранныеТовары с колонками Номенклатура и Количество. //Добавить в элементы формы реквизит ОтобранныеТовары с колонками. //В модуле формы выбора (ФормаПодбора) определить процедуры: &НаКлиенте Процедура СписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; Строки = ОтобранныеТовары.НайтиСтроки(Новый Структура("Номенклатура",Значение)); Если Строки.Количество() > 0 Тогда Строки[0].Количество = Строки[0].Количество + 1; Иначе СтрокаТовара = ОтобранныеТовары.Добавить(); СтрокаТовара.Номенклатура = Значение; СтрокаТовара.Количество = 1; КонецЕсли; КонецПроцедуры &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.УстановитьЗначениеПараметра("Дата",Параметры.Дата); КонецПроцедуры &НаКлиенте Процедура ОК(Команда) ОповеститьОВыборе(ОтобранныеТовары); КонецПроцедуры //Создать основную форму документа РасходнаяНакладная. //Описать команду Подбор и подключить её в командную панель СписокНоменклатуры. Обработчик команды: &НаКлиенте Процедура Подбор(Команда) ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаПодбора", Новый Структура("Дата", Объект.Дата), ЭтаФорма); КонецПроцедуры //В модуле формы документа определить процедуры: // &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) ОбработатьПодборНаСервере(ВыбранноеЗначение); КонецПроцедуры &НаСервере Процедура ОбработатьПодборНаСервере(ОтобранныеТовары) ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Номенклатура"); ТЗ.Колонки.Добавить("СрокГодности"); ТЗ.Колонки.Добавить("Количество"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ |ТЗ.Номенклатура, |ТЗ.Количество |ПОМЕСТИТЬ ОтобранныеТовары |ИЗ |&ТЗ КАК ТЗ |; |ВЫБРАТЬ |ОтобранныеТовары.Номенклатура КАК Номенклатура, |ОтобранныеТовары.Количество КАК Количество, |ОстаткиНоменклатурыОстатки.СрокГодности, |ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток |ИЗ |ОтобранныеТовары КАК ОтобранныеТовары |ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( |&Дата, |Номенклатура В |(ВЫБРАТЬ |ОтобранныеТовары.Номенклатура |ИЗ |ОтобранныеТовары КАК ОтобранныеТовары)) КАК ОстаткиНоменклатурыОстатки |ПО ОтобранныеТовары.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура |ИТОГИ |МАКСИМУМ(Количество) |ПО |Номенклатура"; Запрос.УстановитьПараметр("Дата", Объект.Дата); Запрос.УстановитьПараметр("ТЗ", ОтобранныеТовары.Выгрузить()); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Распределить = ВыборкаНоменклатура.Количество; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() и Распределить > 0 Цикл СтрокаТЗ = ТЗ.Добавить(); СтрокаТЗ.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; СтрокаТЗ.СрокГодности = ВыборкаДетальныеЗаписи.СрокГодности; СтрокаТЗ.Количество = Мин(Распределить, ВыборкаДетальныеЗаписи.КоличествоОстаток); Распределить = Распределить-СтрокаТЗ.Количество; КонецЦикла; КонецЦикла; Объект.СписокНоменклатуры.Загрузить(ТЗ); КонецПроцедуры ////////////////////////////СПР//////////////////////////////////////////////// //Разбить строку по месяцам текДата = Выборка.ПериодДействияНачало; Пока НачалоМесяца(текДата) <= НачалоМесяца(Выборка.ПериодДействияКонец) Цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Подразделение = Выборка.Подразделение; Движение.ГрафикРаботы = Справочники.ГрафикиРаботы.Шестидневка; Движение.Сотрудник = Выборка.Сотрудник; Движение.ВидРасчета = Выборка.ВидРасчета; Движение.ПериодРегистрации = ПериодРегистрации; Движение.ПериодДействияНачало = Макс(ТекДата,Выборка.ПериодДействияНачало); Движение.ПериодДействияКонец = Мин(КонецМесяца(ТекДата),Выборка.ПериодДействияКонец); Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Движение.ПериодДействияНачало),-3); Движение.БазовыйПериодКонец = НачалоМесяца(Движение.ПериодДействияНачало)-1; ТекДата = КонецМесяца(ТекДата) +1; КонецЦикла; //ДиаграммаГанта //Создаем реквизит формы тип ДиаграммаГанта &НаСервере Процедура СформироватьНаСервере(ДиаграммаГанта, интервал) ДиаграммаГанта.Обновление = Ложь; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияФактическийПериодДействия.Сотрудник, | ОсновныеНачисленияФактическийПериодДействия.Подразделение, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало КАК Начало, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец КАК Конец, | ОсновныеНачисленияФактическийПериодДействия.ВидРасчета |ИЗ | РегистрРасчета.ОсновныеНачисления.ФактическийПериодДействия( | ВидРасчета.АлгоритмРасчета = ЗНАЧЕНИЕ(Перечисление.АлгоритмыРасчета.Отпуск) | И (ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода)) КАК ОсновныеНачисленияФактическийПериодДействия"; Запрос.УстановитьПараметр("КонецПериода", Интервал.ДатаОкончания); Запрос.УстановитьПараметр("НачалоПериода", Интервал.ДатаНачала); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Точка = ДиаграммаГанта.УстановитьТочку(Выборка.Сотрудник); Серия = ДиаграммаГанта.УстановитьСерию(Выборка.ВидРасчета); Значение = ДиаграммаГанта.ПолучитьЗначение(Точка, Серия); НовыйИнтервал = Значение.Добавить(); НовыйИнтервал.Начало = Выборка.Начало; НовыйИнтервал.Конец = Выборка.Конец; КонецЦикла; ДиаграммаГанта.Обновление = Истина; КонецПроцедуры // СформироватьНаСервере(ДиаграммаГанта, Интервал)() //3.1 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в часах. //Часовая ставка рассчитывается как начальное значение оклада, деленное на количество рабочих часов в том же периоде, что и фактически отработанные часы. //Первоначальное значение оклада может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода. //Дополнительно, сотрудникам компании может быть начислена премия процентом от начисленного в том же расчетном периоде оклада. //Процент премии в течение периода начисления не меняется и задается в документе «Начисление зарплаты». //По мере необходимости любой сотрудник может быть отправлен в командировку. //В этом случае начисление по окладу и премии не происходит. //Часы, проведенные в командировке, определяются по пятидневному графику работы. //Часовая ставка для расчета командировки определяется как сумма всех начислений за два предыдущих месяца, деленная на количество рабочих часов в двух предыдущих месяцах. //Следует учесть, что данные о командировке не могут водиться в систему задним числом. //ОН (Оклад, Командировка), ДН (Премия). //ДокНачислениеЗарплаты Процедура ОбработкаПроведения(Отказ, Режим) Движения.ОсновныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Записывать = Истина; Запрос = новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.НомерСтроки, | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала, | НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СведенияОСотрудникахСрезПоследних.Сотрудник КАК Сотрудник, | СведенияОСотрудникахСрезПоследних.Подразделение КАК Подразделение, | СведенияОСотрудникахСрезПоследних.Оклад |ПОМЕСТИТЬ СведенияОклад |ИЗ | РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &Дата, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.НомерСтроки, | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.ДатаНачала, | ТЧДок.ДатаОкончания, | ТЧДок.Размер, | ТЧДок.ГрафикРаботы, | ЕСТЬNULL(СведенияОклад.Оклад, 0) КАК Оклад |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ СведенияОклад КАК СведенияОклад | ПО ТЧДок.Сотрудник = СведенияОклад.Сотрудник | И ТЧДок.Подразделение = СведенияОклад.Подразделение"; Запрос.УстановитьПараметр("Ссылка" , Ссылка); Запрос.УстановитьПараметр("Дата" , Дата); ТекСтрокаОсновныеНачисления = Запрос.Выполнить().Выбрать(); Пока ТекСтрокаОсновныеНачисления.Следующий() Цикл ЭтоОсновныеНачисления = ТипЗнч(ТекСтрокаОсновныеНачисления.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") ; Если ЭтоОсновныеНачисления Тогда Движение = Движения.ОсновныеНачисления.Добавить(); Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); КонецЕсли; Движение.ПериодРегистрации = Дата; Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета; Движение.ПериодРегистрации = Дата; Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник; Движение.Подразделение = ТекСтрокаОсновныеНачисления.Подразделение; Если ЭтоОсновныеНачисления Тогда Движение.ПериодДействияНачало = ТекСтрокаОсновныеНачисления.ДатаНачала; Движение.ПериодДействияКонец = ?(ЗначениеЗаполнено(ТекСтрокаОсновныеНачисления.ДатаОкончания),КонецДня(ТекСтрокаОсновныеНачисления.ДатаОкончания),ТекСтрокаОсновныеНачисления.ДатаОкончания); Если ТекСтрокаОсновныеНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Командировка тогда Движение.ГрафикРаботы = Справочники.ГрафикРаботы.Пятидневка; Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(ТекСтрокаОсновныеНачисления.ДатаНачала),-2); //командировка за предыдущие два месяца Движение.БазовыйПериодКонец = НачалоМесяца(ТекСтрокаОсновныеНачисления.ДатаОкончания)-1; Иначе Движение.ГрафикРаботы = ТекСтрокаОсновныеНачисления.ГрафикРаботы; Движение.Размер = ТекСтрокаОсновныеНачисления.Оклад; КонецЕсли; Иначе Движение.БазовыйПериодНачало = ТекСтрокаОсновныеНачисления.ДатаНачала; Движение.БазовыйПериодКонец = КонецДня(ТекСтрокаОсновныеНачисления.ДатаОкончания); Движение.Размер = ТекСтрокаОсновныеНачисления.Размер; КонецЕсли; КонецЦикла; Движения.Записать(); РассчитатьОсновныеНачисления(); РассчитатьДополнительныеНачисления(); КонецПроцедуры Процедура РассчитатьОсновныеНачисления() Запрос = новый Запрос; Запрос.Текст ="ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки, ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ПОМЕСТИТЬ База |ИЗ | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета В (&СписокВидовРасчета)) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета В (&СписокВидовРасчета)) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.Сотрудник, | ОсновныеНачисленияДанныеГрафика.Подразделение, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК ЧасовПлан, | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК ЧасовФакт, | ЕСТЬNULL(База.РезультатБаза, 0) КАК РезультатБаза, | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод КАК ЧасовБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета В (&СписокВидовРасчета)) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ База КАК База | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = База.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); СписокВидовРасчета = новый СписокЗначений; СписокВидовРасчета.Добавить(ПланыВидовРасчета.ОсновныеНачисления.Оклад); СписокВидовРасчета.Добавить(ПланыВидовРасчета.ОсновныеНачисления.Командировка); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Запрос.УстановитьПараметр("Измерение" , Измерение); Запрос.УстановитьПараметр("СписокВидовРасчета" , СписокВидовРасчета); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого ЗаписьСтр Из Движения.ОсновныеНачисления Цикл Поиск.НомерСтроки = ЗаписьСтр.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) Цикл Если ЗаписьСтр.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда ЗаписьСтр.Результат = ?(Выборка.ЧасовПлан=0,0,ЗаписьСтр.Размер/Выборка.ЧасовПлан*Выборка.ЧасовФакт); Иначе ЗаписьСтр.Результат = ?(Выборка.ЧасовБаза = 0,0,Выборка.РезультатБаза * Выборка.ЧасовФакт/Выборка.ЧасовБаза); КонецЕсли; КонецЦикла; КонецЦикла; Движения.ОсновныеНачисления.Записать(,Истина); КонецПроцедуры // РассчитатьОсновныеНачисления() Процедура РассчитатьДополнительныеНачисления() Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза КАК Результат, | ДополнительныеНачисленияБазаОсновныеНачисления.Размер / 100 КАК Процент |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = &ВидРасчетаПремия) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Запрос.УстановитьПараметр("ВидРасчетаПремия", ПланыВидовРасчета.ДополнительныеНачисления.Премия); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого ЗаписьСтр Из Движения.ДополнительныеНачисления Цикл Поиск.НомерСтроки = ЗаписьСтр.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) Цикл ЗаписьСтр.Результат = Выборка.Результат*Выборка.Процент; КонецЦикла; КонецЦикла; Движения.ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры //Отчет НачислениеЗарплаты ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.Результат, ОсновныеНачисления.ПериодРегистрации КАК Период, ОсновныеНачисления.ВидРасчета ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.Результат, ДополнительныеНачисления.ПериодРегистрации, ДополнительныеНачисления.ВидРасчета ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода //3.2 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в часах. //Часовая ставка рассчитывается как начальное значение оклада, деленное на количество рабочих часов в том же периоде, что и фактически отработанные часы. //В течение расчетного периода первоначальное значение оклада может быть один раз изменено. //Расчет должен производиться исходя из действующего на рассчитываемую дату начального значения оклада. //Например, если начальное значение оклада изменилось 10 августа, то до 10 августа при расчете берется старое значение, а начиная с 10 августа – новое. //Дополнительно, сотрудникам компании может быть начислена премия процентом от начисленного в том же расчетном периоде оклада. //Процент премии в течение периода начисления может изменяться не чаще, чем один раз в день, но берется на начало текущего расчетного периода. //В информационной базе необходимо хранить историю изменения процента премии. //По мере необходимости любой сотрудник может быть отправлен в командировку. В этом случае начисление по окладу и премии не происходит. //Часы, проведенные в командировке, определяются по пятидневному графику работы. //Часовая ставка для расчета командировки определяется как сумма всех начислений за два предыдущих месяца, деленная на количество отработанных часов в двух предыдущих месяцах. //Следует учесть, что данные о командировке могут вводиться в систему задним числом. //РС СведенияОСотрудниках (Подразделение,Сотрудник,Оклад,ПроцентПремии). ОН(Оклад,Командировка). ДН (Премия). //ДокНачислениеЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОсновныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.НомерСтроки, | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала, | НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, | НачислениеЗарплатыОсновныеНачисления.Размер |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | &НачалоПериода КАК Период, | СведенияОСотрудникахСрезПоследних.Сотрудник КАК Сотрудник, | СведенияОСотрудникахСрезПоследних.Подразделение КАК Подразделение, | СведенияОСотрудникахСрезПоследних.Оклад КАК Оклад, | СведенияОСотрудникахСрезПоследних.ПроцентПремии |ПОМЕСТИТЬ ИнформацияПоСотрудникамСрез |ИЗ | РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоПериода, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДОк КАК Т)) КАК СведенияОСотрудникахСрезПоследних |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.НомерСтроки, | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ГрафикРаботы, | ТЧДок.ВидРасчета, | ТЧДок.ДатаНачала, | ТЧДок.ДатаОкончания, | ТЧДок.Размер, | ЕСТЬNULL(ИнформацияПоСотрудникамСрез.Оклад, 0) КАК Оклад, | ЕСТЬNULL(ИнформацияПоСотрудникамСрез.ПроцентПремии, 0) КАК ПроцентПремии |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ИнформацияПоСотрудникамСрез КАК ИнформацияПоСотрудникамСрез | ПО ТЧДок.Сотрудник = ИнформацияПоСотрудникамСрез.Сотрудник | И ТЧДок.Подразделение = ИнформацияПоСотрудникамСрез.Подразделение"; Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Дата)); Запрос.УстановитьПараметр("Оклад",ПланыВидовРасчета.ОсновныеНачисления.Оклад); Запрос.УстановитьПараметр("ссылка",Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл ЭтоОсновныеНачисления = ТипЗнч(Выборка.ВидРасчета)= Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления"); Если ЭтоОсновныеНачисления Тогда Движение = Движения.ОсновныеНачисления.Добавить(); Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); КонецЕсли; Движение.ПериодРегистрации = Дата; Движение.Сотрудник = Выборка.Сотрудник; Движение.Подразделение = Выборка.Подразделение; Движение.ВидРасчета = выборка.ВидРасчета; Движение.ПериодДействияНачало = Выборка.ДатаНачала; Движение.ПериодДействияКонец = КонецДня(Выборка.ДатаОкончания); Если ЭтоОсновныеНачисления Тогда Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Командировка Тогда Движение.ГрафикРаботы = Справочники.ГрафикРаботы.Пятидневка; Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(выборка.ДатаНачала),-2); Движение.БазовыйПериодКонец = НачалоМесяца(выборка.ДатаНачала)-1; Иначе Движение.Размер = Выборка.Оклад; Движение.ГрафикРаботы = Выборка.ГрафикРаботы; КонецЕсли; Иначе Движение.БазовыйПериодНачало = выборка.ДатаНачала; Движение.БазовыйПериодКонец = КонецДня(выборка.ДатаОкончания); Движение.Размер = выборка.ПроцентПремии; КонецЕсли; КонецЦикла; НаборЗаписейСторно = Движения.ОсновныеНачисления.ПолучитьДополнение(); Для каждого СтрокаНабора Из НаборЗаписейСторно Цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,СтрокаНабора); Движение.ПериодРегистрации = СтрокаНабора.ПериодРегистрацииСторно; Движение.ПериодДействияНачало = СтрокаНабора.ПериодДействияНачалоСторно; Движение.ПериодДействияКонец = СтрокаНАбора.периодДействияКонецСторно; Движение.Сторно = Истина; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РассчитатьОсновныеНачисления(); РассчитатьДополнительныеНачисления(); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // Процедура РассчитатьОсновныеНачисления() //оклад //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.Сотрудник, | ОсновныеНачисленияДанныеГрафика.Подразделение, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК ПланЧасов, | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК ФактЧасов, | ОсновныеНачисленияДанныеГрафика.НомерСтроки |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета = &Оклад) КАК ОсновныеНачисленияДанныеГрафика |ГДЕ | ОсновныеНачисленияДанныеГрафика.ВидРасчета = &Оклад"; Запрос.УстановитьПараметр("Оклад", ПланыВидовРасчета.ОсновныеНачисления.Оклад); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Для каждого СтрокаНабора Из Движения.ОсновныеНачисления Цикл Поиск = СтрокаНабора.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) Цикл Сторно = ?(СтрокаНабора.Сторно,-1,1); СтрокаНабора.Результат = ?(Выборка.ПланЧасов=0,0,СтрокаНабора.Размер/Выборка.ПланЧасов*Выборка.ФактЧасов*Сторно); СтрокаНабора.ОтработаноЧасов = Выборка.ФактЧасов*Сторно; КонецЦикла; КонецЦикла; Движения.ОсновныеНачисления.Записать(,Истина); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.ОтработаноЧасовБаза, 0) КАК ОтработаноЧасовБаза |ПОМЕСТИТЬ ВТБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета В (&СписокВидовРасчета)) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета В (&СписокВидовРасчета)) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки | |ИНДЕКСИРОВАТЬ ПО | НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.Сотрудник, | ОсновныеНачисленияДанныеГрафика.Подразделение, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК ПланЧасов, | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК ФактЧасов, | ЕСТЬNULL(ВТБаза.РезультатБаза, 0) КАК РезультатБаза, | ОсновныеНачисленияДанныеГрафика.ВидРасчета, | ЕСТЬNULL(ВТБаза.ОтработаноЧасовБаза, 0) КАК ЧасовБаза, | ОсновныеНачисленияДанныеГрафика.НомерСтроки |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета В (&СписокВидовРасчета)) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ ВТБаза КАК ВТБаза | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ВТБаза.НомерСтроки"; СписокВидовРасчета = Новый СписокЗначений; СписокВидовРасчета.Добавить(ПланыВидовРасчета.ОсновныеНачисления.Командировка); Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("СписокВидовРасчета", СписокВидовРасчета); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Измерение",Измерение); Результат = Запрос.Выполнить(); выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаНабора Из Движения.ОсновныеНачисления Цикл Поиск = СтрокаНабора.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) Цикл Сторно = ?(СтрокаНабора.Сторно,-1,1); СтрокаНабора.Результат = ?(Выборка.ЧасовБаза=0,0,Выборка.РезультатБаза*Выборка.ФактЧасов/Выборка.ЧасовБаза*Сторно); КонецЦикла; КонецЦикла; Движения.ОсновныеНачисления.Записать(,Истина); КонецПроцедуры // РассчитатьОсновныеНачисления() // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // Процедура РассчитатьДополнительныеНачисления() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, | ДополнительныеНачисленияБазаОсновныеНачисления.Сотрудник, | ДополнительныеНачисленияБазаОсновныеНачисления.Подразделение, | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = &Премия) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Премия", ПланыВидовРасчета.ДополнительныеНачисления.Премия); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаНабора Из Движения.ДополнительныеНачисления Цикл Поиск.НомерСтроки = СтрокаНабора.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) Цикл Сторно = ?(СтрокаНабора.Сторно,-1,1); СтрокаНабора.Результат = СтрокаНабора.Размер/100*Выборка.РезультатБаза*Сторно; КонецЦикла; КонецЦикла; Движения.ДополнительныеНачисления.Записать(,ИСтина); КонецПроцедуры // РассчитатьДополнительныеНачисления() //ОтчетАнализПремии ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.Размер КАК ПроцентПремии, ДополнительныеНачисления.Результат КАК СуммаПремии ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода //3.3 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в днях. //Дневная ставка рассчитывается как начальное значение оклада, деленное на количество рабочих дней в том же периоде, что и фактически отработанные дни. //Первоначальное значение оклада может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода. //Дополнительно, сотрудникам компании может быть начислена премия процентом от начисленного за тот же период оклада. //Процент премии зависит от стажа работы сотрудника на данном предприятии. //При решении задачи необходимо учитывать, что на момент начала ведения учета в информационной базе у сотрудника уже может быть стаж отличный от нуля. командировку. //В этом случае начисление по окладу и премии не происходит. //Начисление командировочных происходит фиксированной суммой за все время, в течение которого сотрудник находился в командировке. //Следует учесть, что данные о командировке не могут вводиться в систему задним числом. //Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». Считать, что все данные вводятся только в пределах одного месяца, например, //можно указать начисление оклада с 10.01 по 31.01, а запись оклад с 10.01 по 03.02 вводить нельзя. //ОН (Оклад, Командировка), ДН(Премия). РС ТарифыРасчетаПремии (Изм От, До, Рес. ПроцентПремии). //РР ОН (Изм. Сотрудник, Подразделение, рес. результат, Рекв. Размер, ГрафикРаботы, Должность). //РР ДН (Изм. Сотрудник, Подразделение, рес. результат, Рекв. Размер, Должность) //ДокНачЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОсновныеНачисления.Записывать = Истина; Движения.ОсновныеНачисления.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.Должность, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала, | НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, | НачислениеЗарплатыОсновныеНачисления.Размер, | ВЫБОР | КОГДА НачислениеЗарплатыОсновныеНачисления.Сотрудник.ДатаПриемаНаРаботу = ДАТАВРЕМЯ(1, 1, 1) | ТОГДА НачислениеЗарплатыОсновныеНачисления.Сотрудник.Стаж | ИНАЧЕ РАЗНОСТЬДАТ(НачислениеЗарплатыОсновныеНачисления.Сотрудник.ДатаПриемаНаРаботу, &Дата, ГОД) | КОНЕЦ КАК Стаж |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ГрафикРаботы, | ТЧДок.Должность, | ТЧДок.ВидРасчета, | ТЧДок.ДатаНачала, | ТЧДок.ДатаОкончания, | ТЧДок.Размер, | ТЧДок.Стаж, | СведенияОСотрудникахСрезПоследних.Оклад, | ТарифыРасчетаПремии.ПроцентПремии |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &Дата, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДОк КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение | И (ТЧДок.ВидРасчета = &Оклад) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТарифыРасчетаПремии КАК ТарифыРасчетаПремии | ПО ТЧДок.Стаж >= ТарифыРасчетаПремии.От | И ТЧДок.Стаж < ТарифыРасчетаПремии.До | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия))"; Запрос.УстановитьПараметр("Дата", Дата); Запрос.УстановитьПараметр("Оклад", ПланыВидовРасчета.ОсновныеНачисления.Оклад); Запрос.УстановитьПараметр("Ссылка",Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл ЭтоОсновныеНачисления = ТипЗнч(Выборка.ВидРасчета)=Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления"); Если ЭтоОсновныеНачисления Тогда Движение = Движения.ОсновныеНачисления.Добавить(); Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); КонецЕсли; Движение.ПериодРегистрации = Дата; Движение.ПериодДействияНачало = Выборка.ДатаНачала; Движение.ВидРасчета = Выборка.ВидРасчета; Движение.Сотрудник = Выборка.СОтрудник; Движение.Подразделение = Выборка.Подразделение; Движение.должность = Выборка.Должность; //это основные начисления Движение.ПериодДействияКонец = КонецДня(Выборка.ДатаОкончания); Если ЭтоОсновныеНачисления тогда Движение.ГрафикРаботы = Выборка.ГрафикРаботы; Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Командировка Тогда Движение.Результат = Выборка.Размер; Иначе Движение.Размер = Выборка.Оклад; КонецЕсли; //это дополнительные начисления Иначе Движение.Размер = Выборка.ПроцентПремии; Движение.БазовыйПериодНачало = Выборка.ДатаНАчала; Движение.БазовыйПериодКонец = КонецДня(Выборка.ДатаОкончания); КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РассчитатьОсновныеНачисления(); РассчитатьДполнительныеНачисления(); КонецПроцедуры Процедура РассчитатьОсновныеНачисления() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.Сотрудник, | ОсновныеНачисленияДанныеГрафика.Подразделение, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК ПланДней, | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК ФактДней, | ОсновныеНачисленияДанныеГрафика.НомерСтроки |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОСновныеНачисления.Оклад)) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); Для каждого СтрокаДвижения Из Движения.ОсновныеНачисления Цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) Цикл СтрокаДвижения.Результат = ?(Выборка.ПланДней=0,0,СтрокаДвижения.Размер/Выборка.ПланДней*Выборка.ФАктДней); КонецЦикла; КонецЦикла; Движения.ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДполнительныеНачисления() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.Сотрудник, | ДополнительныеНачисленияБазаОсновныеНачисления.Подразделение, | ДополнительныеНачисленияБазаОсновныеНачисления.Размер, | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРАсчета.ДополнительныеНачисления.Премия)) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения Из Движения.ДополнительныеНачисления Цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) Цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер/100*Выборка.РезультатБаза; КонецЦикла; КонецЦикла; Движения.ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры //Отчет АнализНачислений ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.Результат, ОсновныеНачисления.Должность, ОсновныеНачисления.ВидРасчета ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.Результат, ДополнительныеНачисления.должность, ДополнительныеНачисления.ВидРасчета ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода //3.4 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в днях. //Дневная ставка рассчитывается как начальное значение оклада, деленное на количество рабочих дней в том же периоде, что и фактически отработанные дни. //В течение расчетного периода первоначальное значение оклада может быть один раз изменено. //Расчет должен производиться исходя из действующего на рассчитываемую дату начального значения оклада. //Например, если начальное значение оклада изменилось 10 августа, то до 10 августа при расчете берется старое значение, а начиная с 10 августа – новое. //Несколько дней в течение расчетного периода сотрудники могут выполнять работы вахтовым методом. //За работу на вахте каждый сотрудник получает надбавку процентом от начисленного за этот же период оклада. //Сумма оклада всегда берется только за период начисления надбавки. Процент надбавки должен быть определен отдельно для каждого сотрудника. //В информационной базе необходимо хранить историю изменения этого процента. //По мере необходимости любой сотрудник может быть отправлен в командировку. //В этом случае начисление по окладу и надбавке не происходит. //Дни, проведенные в командировке, определяются по пятидневному графику работы. //Дневная ставка для расчета командировки определяется как сумма всех начислений за предыдущий месяц, деленная на количество рабочих дней в этом месяце. //Если сумма начисленных командировочных, оказывается меньше, чем сумма оклада, который мог бы быть начислен за дни командировки, тогда сотруднику начисляется доплата до оклада. //Следует учесть, что данные о командировке не могут вводиться в систему задним числом. //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление оклада с 10.01 по 31.01, а запись: оклад с 10.01 по 03.02 вводить нельзя. //РС СведенияОСотрудниках Изм.Сотрудник,Подразделение. Рес. Оклад,ПроцентНадбавки. ОН (Оклад, Командировка), ДН(Премия). //Док НачЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОсновныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала, | НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, | НачислениеЗарплатыОсновныеНачисления.Размер |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СведенияОСотрудникахСрезПоследних.Сотрудник КАК Сотрудник, | СведенияОСотрудникахСрезПоследних.Подразделение КАК Подразделение, | СведенияОСотрудникахСрезПоследних.Оклад, | СведенияОСотрудникахСрезПоследних.ПроцентНадбавки |ПОМЕСТИТЬ ИнформацияПоСотрудникуСрез |ИЗ | РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ДатаНачала КАК НачалоВИстории, | ЕСТЬNULL(ИнформацияПоСотрудникуСрез.Оклад, 0) КАК Оклад |ПОМЕСТИТЬ ИнформацияПоОкладу |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ИнформацияПоСотрудникуСрез КАК ИнформацияПоСотрудникуСрез | ПО ТЧДок.Сотрудник = ИнформацияПоСотрудникуСрез.Сотрудник | И ТЧДок.Подразделение = ИнформацияПоСотрудникуСрез.Подразделение |ГДЕ | ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад) | |СГРУППИРОВАТЬ ПО | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ДатаНачала, | ЕСТЬNULL(ИнформацияПоСотрудникуСрез.Оклад, 0) | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | СведенияОСотрудниках.Сотрудник, | СведенияОСотрудниках.Подразделение, | СведенияОСотрудниках.Период, | СведенияОСотрудниках.Оклад |ИЗ | РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках |ГДЕ | СведенияОСотрудниках.Период МЕЖДУ &НачалоМесяца И &КонецМесяца |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник КАК Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ГрафикРаботы, | ТЧДок.ВидРасчета, | ТЧДок.ДатаНачала КАК НачалоВДокументе, | ТЧДок.ДатаОкончания, | ИнформацияПоОкладу.НачалоВИстории, | ЕСТЬNULL(ИнформацияПоОкладу.Оклад, 0) КАК Оклад |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ИнформацияПоОкладу КАК ИнформацияПоОкладу | ПО ТЧДок.Сотрудник = ИнформацияПоОкладу.Сотрудник | И ТЧДок.Подразделение = ИнформацияПоОкладу.Подразделение | И ТЧДок.ДатаОкончания >= ИнформацияПоОкладу.НачалоВИстории |ГДЕ | ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад) |ИТОГИ ПО | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ГрафикРаботы, | ТЧДок.ВидРасчета, | ТЧДок.ДатаНачала, | ТЧДок.ДатаОкончания, | ТЧДок.Размер, | ЕСТЬNULL(ИнформацияПоСотрудникуСрез.ПроцентНадбавки, 0) КАК ПроцентНадбавки |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ИнформацияПоСотрудникуСрез КАК ИнформацияПоСотрудникуСрез | ПО ТЧДок.Сотрудник = ИнформацияПоСотрудникуСрез.Сотрудник | И ТЧДок.Подразделение = ИнформацияПоСотрудникуСрез.Подразделение |ГДЕ | ТЧДок.ВидРасчета <> ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)"; Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Дата)); Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); РезультатЗапроса = Запрос.ВыполнитьПакет(); ВыборкаСотрудник = РезультатЗапроса[3].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСотрудник.Следующий() цикл ЭтоСледующаяЗаписьПоСотруднику = Ложь; ВыборкаОклад = ВыборкаСотрудник.Выбрать(); Пока ВыборкаОклад.Следующий() цикл Если ВыборкаОклад.Оклад = 0 Тогда Продолжить; КонецЕсли; Если Ложь Тогда НоваяЗапись = Неопределено; КонецЕсли; Если ЭтоСледующаяЗаписьПоСотруднику Тогда НоваяЗапись.ПериодДействияКонец = Макс(ВыборкаОклад.НачалоВИстории,ВыборкаОклад.НачалоВДокументе)-1; КонецЕсли; НоваяЗапись = Движения.ОсновныеНачисления.Добавить(); новаяЗапись.Сотрудник = ВыборкаОклад.Сотрудник; НоваяЗапись.ВидРасчета = ВыборкаОклад.ВидРасчета; НоваяЗапись.Размер = выборкаОклад.Оклад; НоваяЗапись.Подразделение = ВыборкаОклад.Подразделение; НоваяЗапись.График = ВыборкаОклад.ГрафикРаботы; новаяЗапись.ПериодРегистрации = Дата; НоваяЗапись.ПериодДействияНачало = Макс(ВыборкаОклад.НачалоВДокументе, ВыборкаОклад.НачалоВИстории); новаяЗапись.ПериодДействияКонец = КонецДня(ВыборкаОклад.ДатаОкончания); КонецЦикла; КонецЦикла; Выборка = РезультатЗапроса[4].Выбрать(); Пока Выборка.Следующий() Цикл ЭтоОсновныеНачисления = ТипЗнч(Выборка.ВидРасчета)= Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления"); Если ЭтоОсновныеНачисления Тогда Движение = Движения.ОсновныеНачисления.Добавить(); Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); КонецЕсли; Движение.ПериодРегистрации = Дата; Движение.Сотрудник = Выборка.Сотрудник; Движение.Подразделение = Выборка.Подразделение; Движение.ВидРасчета = Выборка.ВидРасчета; Движение.ПериодДействияНачало = Выборка.ДатаНачала; Движение.ПериодДействияКонец = КонецДня(Выборка.ДатаОкончания); Если ЭтоОсновныеНачисления Тогда Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Командировка Тогда Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Дата),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Дата)-1; КонецЕсли; Иначе Движение.БазовыйПериодНачало = Выборка.ДатаНачала; Движение.БазовыйПериодКонец = КонецДня(Выборка.ДатаОкончания); Движение.Размер = Выборка.ПроцентНадбавки; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РассчитатьОсновныеНачисления(); РассчитатьДополнительныеНачисления(); КонецПроцедуры Процедура РассчитатьОсновныеНачисления() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ПОМЕСТИТЬ ВТБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета В (&ВидРасчета)) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета В (&ВидРасчета)) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК ПланДней, | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК ФактДней, | ВТБаза.РезультатБаза, | ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод КАК ДнейБаза, | ОсновныеНачисленияДанныеГрафика.ВидРасчета |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета В (&ВидРасчета)) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ ВТБаза КАК ВТБаза | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ВТБаза.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); ВидРасчета = Новый СписокЗначений; ВидРасчета.Добавить(ПланыВидовРасчета.ОсновныеНачисления.Оклад); ВидРасчета.Добавить(ПланыВидовРасчета.ОсновныеНачисления.Командировка); Запрос.УстановитьПараметр("ВидРасчета", ВидРасчета); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки") ; Для каждого ЗаписьДвижения из Движения.ОсновныеНачисления цикл Поиск.НомерСтроки = ЗаписьДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) Цикл Если выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда ЗаписьДвижения.Результат = ?(Выборка.ПланДней=0,0,ЗаписьДвижения.Размер/Выборка.ПланДней*Выборка.ФактДней); ИначеЕсли Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Командировка Тогда ЗаписьДвижения.Результат = ?(Выборка.ДнейБаза=0,0,Выборка.РезультатБаза/Выборка.ДнейБаза*Выборка.ФактДней); //необходимо учитывать оклад и для командировки КонецЕсли; КонецЦикла; КонецЦикла; Движения.ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДополнительныеНачисления() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, | ДополнительныеНачисленияБазаОсновныеНачисления.Размер |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия)) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого ЗаписьСтр из Движения.ДополнительныеНачисления цикл Поиск.НомерСтроки = ЗаписьСтр.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) Цикл ЗаписьСтр.Результат = Выборка.Размер/100*Выборка.РезультатБаза; КонецЦикла; КонецЦикла; Движения.ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры //Отчет АнализНачислений ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.Результат, ОсновныеНачисления.ПериодРегистрации ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.Результат, ДополнительныеНачисления.ПериодРегистрации ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода //3.5 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в днях. //Сумма начисления по окладу определяется как начальное значение оклада, деленное на количество рабочих дней в том же периоде, что и фактически отработанные дни. //Начальное значение оклада одинаково для всех сотрудников конкретного подразделения и должно быть определено по специальной шкале в зависимости от отработанного времени. //Дополнительно, сотрудникам предприятия выплачивается надбавка, рассчитываемая как общая сумма продаж товаров за предыдущий месяц по подразделению, в котором работает сотрудник, умноженная на определенный процент. //Значение процента для надбавки может быть задано в документе «Начисление зарплаты». //По мере необходимости любой сотрудник может быть отправлен в командировку. //В этом случае начисление по окладу не происходит. Дни, проведенные в командировке, определяются по пятидневному графику работы. //Дневная ставка для расчета командировки определяется как сумма всех начислений за предыдущий месяц, деленная на количество отработанных дней в этом месяце. //Следует учесть, что данные о командировке могут вводиться в систему задним числом. //Создать отчет «Перерасчет зарплаты», в котором пользователь должен увидеть записи регистра расчета, которые возможно требуется пересчитать. //Саму процедуру перерасчета записей в рамках данной задачи реализовывать не требуется. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление оклада с 10.01 по 31.01, а запись оклад: с 10.01 по 03.02 вводить нельзя. //Создаем РС ШкалаФактическиОтработанныхДней(Незав, непериод), изм Подразделение, ПериодОт,ПериодДо, рес. Оклад); //РР ОН Изме. Подразделение,Сотрудник, рес.Результат, ОтработаноДней, Рекв.ГрафикРаботы. //РР ДН Изме. Подразделение,Сотрудник, рес.Результат, Перерасчет - Перерасчет. Изм.Подразделение, Сотрудник. //ДокНачЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОсновныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Записывать = Истина; Для каждого СтрокаТЧ из ОсновныеНачисления цикл ЭтоОсновныеНачисления = ТипЗнч(СтрокаТЧ.ВидРасчета) =Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления"); Если ЭтоОсновныеНачисления тогда Движение = Движения.ОсновныеНачисления.Добавить(); Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); КонецЕсли; Движение.ПериодРегистрации = Дата; Движение.ПериодДействияНачало = СтрокаТЧ.ДатаНачала; Движение.ПериодДействияКонец = КонецДня(СтрокаТЧ.ДатаОкончания); Движение.ВидРасчета = СтрокаТЧ.ВидРасчета; Движение.Сотрудник = СтрокаТЧ.Сотрудник; Движение.Подразделение = СтрокаТЧ.Подразделение; Если ЭтоОсновныеНачисления Тогда Если СтрокаТЧ.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Командировка Тогда Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Дата),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Дата)-1; Движение.ГрафикРаботы = Справочники.ГрафикРаботы.Пятидневка; КонецЕсли; Движение.ГрафикРаботы = СтрокаТЧ.ГрафикРаботы; ИНаче Движение.Размер = СтрокаТЧ.Размер; КонецЕсли; КонецЦикла; СтрокаНабораСторно = Движения.ОсновныеНачисления.ПолучитьДополнение(); Для каждого СтрокаНабора из СтрокаНабораСторно цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, СтрокаНабора); СтрокаНабора.ПериодРегистрации = СтрокаНабора.ПериодРегистрацииСторно; СтрокаНабора.ПериодДействияНачало = СтрокаНабора.ПериодДействияНачалоСторно; СтрокаНабора.ПериодДействияКонец = СтрокаНабора.ПериодДействияКонецСторно; СтрокаНабора.Сторно = Истина; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РассчитатьОсновныеНачисления(); РассчитатьДополнительныеНачисления(); КонецПроцедуры Процедура РассчитатьОсновныеНачисления() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.Результат, 0) КАК РезультатБаза, | ОсновныеНачисленияБазаОсновныеНачисления.ОтработаноДнейБаза |ПОМЕСТИТЬ ВТБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРасчета.ОСновныеНачисления.Оклад), ЗНАЧЕНИЕ(ПланВидовРасчета.ОСновныеНачисления.Командировка))) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРасчета.ОСновныеНачисления.Оклад), ЗНАЧЕНИЕ(ПланВидовРасчета.ОСновныеНачисления.Командировка))) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки | |ИНДЕКСИРОВАТЬ ПО | НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЕСТЬNULL(ВТБаза.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ВТБаза.ОтработаноДнейБаза, 0) КАК ОтработаноДнейБаза, | ОсновныеНачисленияДанныеГрафика.ВидРасчета, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия / 8 КАК ДнейПлан, | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия / 8 КАК ДнейФакт, | ЕСТЬNULL(ШкалаФактическиОтработанныхДней.Оклад, 0) КАК Оклад, | ОсновныеНачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРасчета.ОСновныеНачисления.Оклад), ЗНАЧЕНИЕ(ПланВидовРасчета.ОСновныеНачисления.Командировка))) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ ВТБаза КАК ВТБаза | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ВТБаза.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаФактическиОтработанныхДней КАК ШкалаФактическиОтработанныхДней | ПО ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия >= ШкалаФактическиОтработанныхДней.ПериодОТ | И ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия < ШкалаФактическиОтработанныхДней.ПериодДо"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение",Измерение); Запрос.УстановитьПараметр("ПериодРегистрации", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из Движения.ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Сторно = ?(СтрокаДвижения.Сторно,-1,1); СтрокаДвижения.Результат =?(Выборка.ДнейПлан = 0,0,Выборка.Оклад/Выборка.ДнейПлан*Выборка.ДнейФакт*Сторно); СтрокаДвижения.ОтработаноДней = Выборка.ДнейФакт*Сторно; Иначе Сторно = ?(СтрокаДвижения.Сторно,-1,1); СтрокаДвижения.Результат = ?(Выборка.ОтработаноДнейБаза=0,0,Выборка.РезультатБаза/Выборка.ОтработаноДнейБаза*Выборка.ДнейФакт*Сторно); КонецЕсли; КонецЦикла; КонецЦикла; Движения.ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДополнительныеНачисления() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.Сотрудник, | ДополнительныеНачисленияБазаОсновныеНачисления.Подразделение, | ДополнительныеНачисленияБазаОсновныеНачисления.Размер, | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки |ПОМЕСТИТЬ ВТДопНачисления |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Надбавка)) КАК ДополнительныеНачисленияБазаОсновныеНачисления |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.НомерСтроки, | ЕСТЬNULL(ПродажиОбороты.СуммаОборот, 0) КАК СуммаПродаж |ИЗ | ВТДопНачисления КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты( | &НачалоПериода, | &КонецПериода, | Месяц, | Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ВТДопНачисления КАК Т)) КАК ПродажиОбороты | ПО ТЧДок.Подразделение = ПродажиОбороты.Подразделение"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение",Измерение); Запрос.УстановитьПараметр("КонецПериода", НачалоМесяца(Дата)-1); Запрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Дата),-1)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого ЗаписьРег из Движения.ДополнительныеНачисления цикл Поиск.НомерСтроки = ЗаписьРег.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл ЗаписьРег.Результат = ЗаписьРег.Размер/100*Выборка.СуммаПродажа; КонецЦикла; КонецЦикла; Движения.ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры //3.6 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по шестидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в часах. //Сумма начисления по окладу определяется как начальное значение оклада, деленное на количество рабочих часов в том же периоде, что и фактически отработанные часы. //Начальное значение оклада одинаково для всех сотрудников конкретного подразделения и должно быть определено по специальной шкале в зависимости от отработанного времени. //Дополнительно, сотрудникам компании может быть начислена премия процентом от начисленного в том же расчетном периоде оклада. //Процент премии в течение периода начисления не меняется и задается в документе «Начисление зарплаты». //По мере необходимости любой сотрудник может быть отправлен в командировку. //В этом случае начисление по окладу и премии не происходит. Часы, проведенные в командировке, определяются по шестидневному графику работы. //Часовая ставка для расчета командировки определяется как сумма всех начислений за предыдущий месяц, деленная на количество рабочих часов в предыдущем месяце. //Следует учесть, что данные о командировке могут вводиться в систему задним числом. Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что данные о начислении по окладу вводятся только в пределах одного месяца, а командировка может переходить из одного месяца в другой. //Например, можно указать начисление оклада с 10.01 по 31.01, а командировки - с 25.01 по 05.03., при этом, каждое начисление в документе вводится одной строкой с указанием полного периода. //С помощью диаграммы Ганта показать фактический период действия записей с разбивкой по сотрудникам, и для каждого сотрудника – по видам расчета. //Отчет может быть построен за любой расчетный период. //Создаем РС ШкалаОтработанногоВремени (Непериод, Незав. Изм. Подразделение, От, До, Рес. Оклад) РРОН (Изм. Подразделение, Сотрудник, Рес. Результат, Рекв.ГрафикРаботы). РРДН(Изм.Подразделение,Сотрудник,Рес.Результат.Рекв.Размер) //ДокНачЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОсновныеНачисления.Записывать=Истина; Движения.ДополнительныеНачисления.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка"; ЗАпрос.УстановитьПараметр("Ссылка",Ссылка); Результат = Запрос.Выполнить(); СтрокаТЧ = Результат.Выбрать(); Пока СтрокаТЧ.Следующий() цикл Если ТипЗнч(СтрокаТЧ.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") ТОгда Если СтрокаТЧ.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Командировка Тогда ТекДата = НачалоМесяца(СтрокаТЧ.ПериодДействияНачало); Пока ТекДата<=НачалоМесяца(СтрокаТЧ.ПериодДействияКонец) цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,СтрокаТЧ); Движение.ПериодДействияНачало = Макс(СтрокаТЧ.ПериодДействияНачало, ТекДата); Движение.ПериодДействияКонец = Мин(СтрокаТЧ.ПериодДействияКонец, КонецМесяца(ТекДата)); Движение.БазовыйПериодНачало = ДобавитьМесяц(Движение.ПериодДействия,-1); Движение.БазовыйПериодКонец = Движение.ПериодДействия-1; Движение.ГрафикРаботы = Справочники.ГрафикРаботы.Шестидневка; ТекДата = КонецМесяца(ТекДата)+1; КонецЦикла; Иначе Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,СтрокаТЧ); КонецЕсли; Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, СТрокаТЧ); Движение.БазовыйПериодНачало = СтрокаТЧ.ПериодДействияНачало; Движение.БазовыйПериодКонец = СтрокаТЧ.ПериодДействияКонец; КонецЕсли; КонецЦикла; СтрокаНабора = Движения.ОсновныеНачисления.ПолучитьДополнение(); Для каждого СтрокаНаб из СтрокаНабора цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, СтрокаНаб); Движение.ПериодРегистрации = СтрокаНаб.ПериодРегистрацииСторно; Движение.ПериодДействияНачало = СтрокаНаб.ПериодДействияНачалоСторно; Движение.ПериодДействияКонец = СтрокаНаб.ПериодДействияКонецСторно; Движение.Сторно = Истина; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РассчитатьОсновныеНачисления(); РассчитатьДополнительныеНачисления(); КонецПроцедуры Процедура РассчитатьОсновныеНачисления() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.Результат, 0) КАК РезультатБаза |ПОМЕСТИТЬ ВТБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРАсчета.ОсновныеНачисления.Оклад), ЗНАЧЕНИЕ(ПланВидовРАсчета.ОсновныеНачисления.Командировка))) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРАсчета.ОсновныеНачисления.Оклад), ЗНАЧЕНИЕ(ПланВидовРАсчета.ОсновныеНачисления.Командировка))) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК ПланЧасов, | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК ФактЧасов, | ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод КАК ЧасовБаза, | ЕСТЬNULL(ВТБаза.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ШкалаОтработанногоВремени.Оклад, 0) КАК Оклад |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРАсчета.ОсновныеНачисления.Оклад), ЗНАЧЕНИЕ(ПланВидовРАсчета.ОсновныеНачисления.Командировка))) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ ВТБаза КАК ВТБаза | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ВТБаза.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаОтработанногоВремени КАК ШкалаОтработанногоВремени | ПО ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия >= ШкалаОтработанногоВремени.От | И ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия < ШкалаОтработанногоВремени.До | И (ОсновныеНачисленияДанныеГрафика.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад))"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДв из Движения.ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДв.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Сторно = ?(СтрокаДв.Сторно,-1,1); Если СтрокаДв.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда СтрокаДв.Результат = ?(Выборка.ПланЧасов = 0,0, Выборка.Оклад/Выборка.ПланЧасов* Выборка.ФактЧасов*Сторно); Иначе СтрокаДв.Результат =?(Выборка.ЧасовБаза = 0,0, Выборка.РезультатБаза/Выборка.ЧасовБаза* Выборка.ФактЧасов*Сторно); КонецЕсли; КонецЦикла; КонецЦикла; Движения.ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДополнительныеНачисления() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ДополнительныеНачисленияБазаОсновныеНачисления.Размер, | ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия)) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Поиск = новый Структура("НомерСтроки"); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Для каждого СтрокаДв из Движения.ДополнительныеНачисления цикл Поиск.Номерстроки = СтрокаДв.НомерСтроки; Выборка.Сбросить(); Пока выборка.НайтиСледующий(Поиск) цикл СтрокаДв.Результат = Выборка.Размер/100*Выборка.РезультатБаза; КонецЦикла; КонецЦикла; Движения.ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры ДиаграммаГанта Добавляем на форму элементы: ДиаграммаГанта (диаграммаГанта), Период (СтандартныйПериод). &НаКлиенте Процедура СформироватьОтчет(Команда) СформироватьОтчетНаСервере(); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // &НаСервере Процедура СформироватьОтчетНаСервере() ДиаграммаГанта.Обновление = Истина; //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияФактическийПериодДействия.Сотрудник, | ОсновныеНачисленияФактическийПериодДействия.ВидРасчета, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало КАК Начало, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец КАК Конец |ИЗ | РегистрРасчета.ОсновныеНачисления.ФактическийПериодДействия КАК ОсновныеНачисленияФактическийПериодДействия |ГДЕ | ОсновныеНачисленияФактическийПериодДействия.ПериодДействия МЕЖДУ &ДатаНАч И &ДатаКОн"; Запрос.УстановитьПараметр("ДатаКОн", Период.ДатаОкончания); Запрос.УстановитьПараметр("ДатаНАч", Период.ДатаНачала); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Точка = ДиаграммаГанта.УстановитьТочку(ВыборкаДетальныеЗаписи.Сотрудник); Серия = ДиаграммаГанта.УстановитьСерию(ВыборкаДетальныеЗаписи.ВидРасчета); Значение = ДиаграммаГанта.ПолучитьЗначение(Точка, Серия); Интервал = Значение.Добавить(); Интервал.Начало = ВыборкаДетальныеЗаписи.Начало; Интервал.Конец = ВыборкаДетальныеЗаписи.Конец; КонецЦикла; ДиаграммаГанта.Обновление = Истина; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА КонецПроцедуры // СформироватьОтчетНаСервере() //3.7 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по часовому тарифу. //Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных часов. //Тарифная ставка в расчетном периоде не меняется и задается в документе «Начисление зарплаты». //Дополнительно, сотрудникам компании может быть начислена премия процентом от начисленного в том же расчетном периоде оклада. //Процент премии в течение периода начисления не меняется и также задается в документе «Начисление зарплаты». //Сотруднику предприятия выплачивается надбавка, рассчитываемая как общая сумма продаж товаров за предыдущий квартал по подразделению, в котором работает сотрудник, умноженная на определенный процент. //Значение процента для надбавки определяется по специальной шкале в зависимости от суммы продаж. //Первого числа каждого месяца шкала может быть изменена, но хранить историю изменения шкалы не требуется. увидеть записи регистра расчета, которые возможно требуется пересчитать. //Обратите внимание, в отчете должна отражаться также информация о необходимости перерасчета надбавки при исправлении суммы продаж. реализовывать не требуется. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по тарифу с 10.01 по 31.01, а запись: тариф с 10.01 по 03.02 вводить нельзя. //Необходимо предоставить пользователю возможность самостоятельно создавать новые виды расчетов и привязывать их к существующим алгоритмам расчета. //Доб в РН Измерение Подразделение. ОН (ОкладПоЧасам) ДН (Надбавка, Премия (база ОкладПоЧасам)). Созд. РС ШкалаПродажи (в пределах месяца, незав), Изм Подразделение, От, До, рес. Процент. РРОН (Изм. Подразделение, Сотрудник, рес. Результат, Рекв.Размер,ГрафикРаботы). РРДН (Изм. Подразделение, Сотрудник, рес. Результат, Рекв.Размер,Перерасчеты - ТаблицаПересчетов Изм: Сотурдник, Подразделение. ДокНачЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОсновныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала, | НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПродажиОбороты.Подразделение КАК Подразделение, | ПродажиОбороты.СуммаОборот КАК СуммаПродажи |ПОМЕСТИТЬ ВТПродажи |ИЗ | РегистрНакопления.Продажи.Обороты( | &НачалоПериода, | &КонецПериода, | , | Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК ПродажиОбороты | |ИНДЕКСИРОВАТЬ ПО | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ГрафикРаботы, | ТЧДок.ВидРасчета, | ТЧДок.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(ТЧДок.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | ТЧДок.Размер, | ЕСТЬNULL(ВТПродажи.СуммаПродажи, 0) КАК СуммаПродаж, | ЕСТЬNULL(ШкалаПродажиСрезПоследних.Процент, 0) КАК ПроцентДляПродаж, | ТЧДок.ПериодРегистрации |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ВТПродажи КАК ВТПродажи | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаПродажи.СрезПоследних( | &ДатаНач, | Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧдок КАК Т)) КАК ШкалаПродажиСрезПоследних | ПО ВТПродажи.СуммаПродажи > ШкалаПродажиСрезПоследних.От | И ВТПродажи.СуммаПродажи <= ШкалаПродажиСрезПоследних.До | ПО ТЧДок.Подразделение = ВТПродажи.Подразделение"; Запрос.УстановитьПараметр("ДатаНач", Дата); Запрос.УстановитьПараметр("КонецПериода", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Дата),-3)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если ТипЗнч(Выборка.ВидРасчета) = ТИп("ПланВидовРасчетаСсылка.ОсновныеНачисления") Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.Надбавка Тогда Движение.Результат = Выборка.СуммаПродаж*Выборка.ПроцентДляПродаж/100; ИначеЕсли Выборка.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.Премия Тогда Движение.БазовыйПериодНачало = Выборка.ПериодДействияНачало; Движение.БазовыйПериодКонец = Выборка.ПериодДействияКОнец; КонецЕсли; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РассчитатьОсновныеНачисления(); РассчитатьДополнительныеНачисления(); КонецПроцедуры Процедура РассчитатьОсновныеНачисления() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК ПланЧасов, | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК ФактЧасов |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижений Из Движения.ОсновныеНачисления Цикл Поиск.НомерСтроки = СтрокаДвижений.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) Цикл СтрокаДвижений.Результат = СтрокаДвижений.Размер * Выборка.ФактЧасов; КонецЦикла; КонецЦикла; Движения.ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДополнительныеНачисления() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия)) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения Из Движения.ДополнительныеНачисления Цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер/100*Выборка.РезультатБаза; КонецЦикла; КонецЦикла; Движения.ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры Отчет АнализНеобходимыхПерерасчетов ВЫБРАТЬ ТаблицаПересчетов.ОбъектПерерасчета, ТаблицаПересчетов.ВидРасчета, ТаблицаПересчетов.Сотрудник, ТаблицаПересчетов.Подразделение ИЗ РегистрРасчета.ДополнительныеНачисления.ТаблицаПересчетов КАК ТаблицаПересчетов //3.8 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по часовому тарифу. Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных часов. //В течение расчетного периода тарифная ставка может быть один раз изменена. //Расчет должен производиться исходя из действующей на рассчитываемую дату тарифной ставки. //Например, если эта ставка изменилась 10 августа, то до 10 августа при расчете берется старое значение, а начиная с 10 августа – новое. //За произвольный период отработанного времени (должен указываться в документе и может быть меньше периода ведения расчетов, например, всего несколько дней) сотрудникам компании начисляется премия процентом от начисленного в том же расчетном периоде начисления по тарифу. //Процент премии в течение периода начисления не меняется и должен храниться в информационной базе отдельно для каждого сотрудника. //Если часть времени сотрудники простаивают по вине предприятия, то за период простоя они ни оклад, ни премию не получают. //В этом случае начисляется компенсация в размере 2/3 от часовой тарифной ставки. //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по тарифу с 10.01 по 31.01, а запись: тариф с 10.01 по 03.02 вводить нельзя. //Добавляем в тчНачЗарп. рекв. Размер. ОН (Оклад, Простой). ДН (Премия). Создать РС ПроцентыПремии (Непериод, Независ. Изм. Сотрудник, Рес. ПроцентПремии) //ДокНачислЗп Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОсновныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала, | НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, | НачислениеЗарплатыОсновныеНачисления.Размер |ПОМЕСТИТЬ ТЧдок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧдок.Сотрудник, | ТЧдок.Подразделение, | ТЧдок.ДатаНачала КАК НачалоВИстории, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Оклад, 0) КАК Оклад |ПОМЕСТИТЬ ВТОкладыСотрудников |ИЗ | ТЧдок КАК ТЧдок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧдок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧдок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | СведенияОСотрудниках.Сотрудник, | СведенияОСотрудниках.Подразделение, | СведенияОСотрудниках.Период, | СведенияОСотрудниках.Оклад |ИЗ | РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках |ГДЕ | СведенияОСотрудниках.Период > &ДатаНач | И СведенияОСотрудниках.Период <= &ДатаКон | И СведенияОСотрудниках.Сотрудник В | (ВЫБРАТЬ | Т.Сотрудник | ИЗ | ТЧдок КАК Т) | И СведенияОСотрудниках.Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧдок КАК Т) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧдок.Сотрудник КАК Сотрудник, | ТЧдок.Подразделение, | ТЧдок.ГрафикРаботы, | ТЧдок.ВидРасчета КАК ВидРасчета, | ТЧдок.Размер, | ТЧдок.ДатаОкончания, | ВТОкладыСотрудников.НачалоВИстории КАК НачалоВИстории, | ТЧдок.ДатаНачала, | ЕСТЬNULL(ВТОкладыСотрудников.Оклад, 0) КАК Оклад |ИЗ | ТЧдок КАК ТЧдок | ЛЕВОЕ СОЕДИНЕНИЕ ВТОкладыСотрудников КАК ВТОкладыСотрудников | ПО ТЧдок.Сотрудник = ВТОкладыСотрудников.Сотрудник | И ТЧдок.Подразделение = ВТОкладыСотрудников.Подразделение | И ТЧдок.ДатаОкончания >= ВТОкладыСотрудников.НачалоВИстории |ГДЕ | ТЧдок.ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад), ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Простой)) | |СГРУППИРОВАТЬ ПО | ТЧдок.Сотрудник, | ТЧдок.ВидРасчета, | ТЧдок.Подразделение, | ТЧдок.ГрафикРаботы, | ТЧдок.ДатаОкончания, | ВТОкладыСотрудников.НачалоВИстории, | ТЧдок.ДатаНачала, | ТЧдок.Размер, | ЕСТЬNULL(ВТОкладыСотрудников.Оклад, 0) | |УПОРЯДОЧИТЬ ПО | ВидРасчета, | НачалоВИстории |ИТОГИ ПО | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧдок.Сотрудник, | ТЧдок.Подразделение, | ТЧдок.ГрафикРаботы, | ТЧдок.ВидРасчета, | ТЧдок.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(ТЧдок.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | ТЧдок.Размер, | ЕСТЬNULL(ПроцентыПремии.ПроцентПремии, 0) КАК ПроцентПремии |ИЗ | ТЧдок КАК ТЧдок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПроцентыПремии КАК ПроцентыПремии | ПО ТЧдок.Сотрудник = ПроцентыПремии.Сотрудник |ГДЕ | НЕ ТЧдок.ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад), ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Простой))"; Запрос.УстановитьПараметр("Ссылка",Ссылка); Запрос.УстановитьПараметр("НачалоМесяца",НачалоМесяца(Дата)); Запрос.УстановитьПараметр("ДатаНач", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("ДатаКон",КонецМесяца(Дата)); Результат = Запрос.ВыполнитьПакет(); ВыборкаОклад = Результат[2].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаОклад.Следующий() цикл ПерваяСтрока = Истина; СтарыйВидРасчета = Неопределено; Выборка = ВыборкаОклад.Выбрать(); Пока Выборка.Следующий() цикл Если СтарыйВидРасчета = Неопределено или СтарыйВидРасчета <> Выборка.ВидРасчета Тогда ПерваяСтрока = Истина; КонецЕсли; Если Выборка.Оклад = 0 Тогда Продолжить; КонецЕсли; Если Ложь ТОгда Запись = Неопределено; КонецЕсли; Если Не ПерваяСтрока Тогда Запись.ПериодДействияКонец = МАКС(Выборка.НачалоВИстории, Выборка.ДатаНачала)-1; КонецЕсли; Запись = Движения.ОсновныеНачисления.Добавить(); Запись.ПериодРегистрации = Дата; Запись.ПериодДействияНачало = МАКС(Выборка.ДатаНачала, Выборка.НачалоВИстории); Запись.ПериодДействияКонец = КонецДня(Выборка.ДатаОкончания); Запись.Сотрудник = Выборка.Сотрудник; Запись.Подразделение = Выборка.Подразделение; Запись.Размер = Выборка.Оклад; Запись.ВидРасчета = Выборка.ВидРасчета; Запись.ГрафикРаботы = Выборка.ГрафикРаботы; ПерваяСтрока= ЛОжь; СтарыйВидРасчета = Выборка.ВидРасчета; КонецЦикла; КонецЦикла; Выборка = Результат[3].Выбрать(); //осталось обработать только дополнительные начисления Пока Выборка.Следующий() цикл Если ТипЗнч(Выборка.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") Тогда Движение = Движения.ОсновныеНачисления.Добавить(); Движение.ПериодРегистрации = Дата; ЗаполнитьЗначенияСвойств(Движение, Выборка); Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.ПериодРегистрации = Дата; Движение.БазовыйПериодНачало = Выборка.ПериодДействияНачало; Движение.БазовыйПериодКонец = Выборка.ПериодДействияКонец; Движение.Размер = Выборка.ПроцентПремии; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОсновныеНачисления(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДополнительныеНачисления(Ссылка, Движения.ДополнительныеНачисления); КонецПроцедуры Создаем ОбщийМодуль РасчетЗаработнойПлаты (Сервер, Привелиг) Процедура РассчитатьОсновныеНачисления(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ОсновныеНачисленияДанныеГрафика.Размер, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК ПланЧасов, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасов, | ОсновныеНачисленияДанныеГрафика.ВидРасчета |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад), ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Простой))) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ФактЧасов; ИначеЕсли Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Простой Тогда СтрокаДвижения.Результат = (СтрокаДвижения.Размер*2/3)*Выборка.ФактЧасов; КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДополнительныеНачисления(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРАсчета.ДополнительныеНАчисления.Премия)) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = новый Массив; измерение.Добавить("Сотрудник"); измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = (СтрокаДвижения.Размер/100)*Выборка.РезультатБаза; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры Отчет АнализРасчетов ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.Результат, ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.ПериодРегистрации ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодРегистрации МЕЖДУ &ДатаНач И &ДатаКон ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.Результат, ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.ПериодРегистрации ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &ДатаНач И &ДатаКон //3.9 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по дневному тарифу. Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных дней. //Тарифная ставка в расчетном периоде не меняется. Ежемесячно, сотрудникам компании может выплачиваться фиксированная сумма денег. //Размер суммы в течение расчетного периода не меняется и задается в документе «Начисление зарплаты». //Дополнительно, сотрудникам компании выплачивается надбавка, рассчитываемая как общая сумма продаж товаров за предыдущий месяц по подразделению, в котором работает сотрудник, умноженная на определенный процент. //Значение процента для надбавки может быть изменено только один раз в течение расчетного периода. //В этом случае, расчет начисления должен производиться исходя из действующего на рассчитываемый период процента. //Например, если процент изменился 10 августа, то до 10.10 при расчете берется старый процент, а после 10.10 (включительно) уже новый //Помимо надбавки, руководителям подразделений выплачивается премия в виде процента от суммы надбавок за предыдущий месяц сотрудников их подразделения. //С надбавки самого руководителя премия не начисляется. //Создать отчет «Перерасчет зарплаты», в котором пользователь должен увидеть записи регистра расчета, которые возможно требуется пересчитать. //Обратите внимание, в отчете должна отражаться также информация о необходимости перерасчета надбавки при исправлении суммы продаж. //Саму процедуру перерасчета записей в рамках данной задачи реализовывать не требуется. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по тарифу с 10.01 по 31.01, а запись: тариф с 10.01 по 03.02 вводить нельзя. //Создаем ОбщийМодуль РасчетЗаработнойПлаты (Сервер, Привел.). Процедура РассчитатьОсновныеНачисления(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактДней |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Результат = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ФактДней; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДополнительныеНачисления(Ссылка, ДополнительныеНачисления) Экспорт //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | СУММА(ВЫБОР | КОГДА ДополнительныеНачисленияБазаОсновныеНачисления.СотрудникРазрез.Должность = ЗНАЧЕНИЕ(Справочник.Должности.Руководитель) | ТОГДА 0 | ИНАЧЕ ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза | КОНЕЦ) КАК РезультатБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | &Разрез, | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия)) КАК ДополнительныеНачисленияБазаОсновныеНачисления | |СГРУППИРОВАТЬ ПО | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки"; Измерение = новый Массив; Измерение.Добавить("Подразделение"); Разрез = Новый Массив; Разрез.Добавить("Сотрудник"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Разрез", Разрез); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер/100*Выборка.РезультатБаза; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры Создаем Спр.Должности, В РС СведенияОСотрудниках Изм. Подразделение, Сотрудник, Рес. ПроцентНадбавки. ПВОН (Надбавка, Оклад), ПВДН (Премия, ФиксированнаяСумма) В РРОН Создаем Перерасчет ТаблицаПересчетов (Подразделение, Сотрудник) ДокНачЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОсновныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала, | НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ДатаНачала КАК НачалоВИстории, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.ПроцентНадбавки, 0) КАК ПроцентНадбавки |ПОМЕСТИТЬ ИнформацияПоНадбавкам |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | СведенияОСотрудниках.Сотрудник, | СведенияОСотрудниках.Подразделение, | СведенияОСотрудниках.Период, | СведенияОСотрудниках.ПроцентНадбавки |ИЗ | РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках |ГДЕ | СведенияОСотрудниках.Период > &ДатаНач | И СведенияОСотрудниках.Период <= &ДатаКон | И СведенияОСотрудниках.Сотрудник В | (ВЫБРАТЬ | Т.Сотрудник | ИЗ | ТЧДок КАК Т) | И СведенияОСотрудниках.Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧДОк КАК Т) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник КАК Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.ГрафикРаботы, | ТЧДок.ДатаНачала, | КОНЕЦПЕРИОДА(ТЧДок.ДатаОкончания, ДЕНЬ) КАК ДатаОкончания, | ТЧДок.Размер, | ИнформацияПоНадбавкам.НачалоВИстории КАК НачалоВИстории, | ЕСТЬNULL(ИнформацияПоНадбавкам.ПроцентНадбавки, 0) КАК ПроцентНадбавки, | ЕСТЬNULL(ПродажиОбороты.СуммаПродажиОборот, 0) КАК СуммаПродажи |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ИнформацияПоНадбавкам КАК ИнформацияПоНадбавкам | ПО ТЧДок.Сотрудник = ИнформацияПоНадбавкам.Сотрудник | И ТЧДок.Подразделение = ИнформацияПоНадбавкам.Подразделение | И ТЧДок.ДатаОкончания >= ИнформацияПоНадбавкам.НачалоВИстории | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Надбавка)) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты( | &НачПрошлыйМесяц, | &КонеПрошлыйМесяц, | , | Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧдок КАК Т)) КАК ПродажиОбороты | ПО ТЧДок.Подразделение = ПродажиОбороты.Подразделение |ГДЕ | ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Надбавка) | |УПОРЯДОЧИТЬ ПО | НачалоВИстории |ИТОГИ ПО | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.ГрафикРаботы, | ТЧДок.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(ТЧДок.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | ТЧДок.Размер, | ТЧДок.ПериодРегистрации |ИЗ | ТЧДок КАК ТЧДок |ГДЕ | ТЧДок.ВидРасчета <> ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Надбавка)"; Запрос.УстановитьПараметр("ДатаКон", КонецМесяца(Дата)); Запрос.УстановитьПараметр("ДатаНач", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("НачПрошлыйМесяц", ДобавитьМесяц(НАчалоМесяца(Дата),-1)); ЗАпрос.УстановитьПараметр("КонеПрошлыйМесяц", НачалоМесяца(Дата)-1); Запрос.УстановитьПараметр("Ссылка",Ссылка); Результат = Запрос.ВыполнитьПакет(); //разобъем по периодам надбавку ВыборкаСотрудник = Результат[2].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСотрудник.Следующий() цикл ПерваяСтрока = Истина; Выборка = ВыборкаСотрудник.Выбрать(); Пока Выборка.Следующий() цикл Если Выборка.ПроцентНадбавки = 0 Тогда Продолжить; КонецЕсли; Если Ложь Тогда Запись = Неопределено; КонецЕсли; Если не ПерваяСтрока Тогда Запись.ПериодДействияКонец = Макс(Выборка.ДатаНачала,Выборка.НачалоВИстории)-1; КонецЕсли; Запись = Движения.ОсновныеНачисления.Добавить(); Запись.ПериодРегистрации = Дата; Запись.ВидРасчета = Выборка.ВидРасчета; Запись.Сотрудник = Выборка.Сотрудник; Запись.Подразделение = Выборка.Подразделение; Запись.ГрафикРаботы = Выборка.ГрафикРаботы; Запись.ПериодДействияНачало = Макс(Выборка.ДатаНачала, Выборка.НачалоВИстории); Запись.ПериодДействияКонец = КонецДня(Выборка.ДатаОкончания); Запись.Размер = Выборка.ПроцентНадбавки; Запись.Результат = Выборка.ПроцентНадбавки/100*Выборка.СуммаПродажи; ПерваяСтрока = Ложь; КонецЦикла; КонецЦикла; //проведем операции с остальными видами расчетов Выборка = Результат[3].Выбрать(); Пока Выборка.Следующий() цикл Если ТипЗнч(Выборка.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.ФиксированнаяСумма ТОгда Движение.Результат = Выборка.Размер; Иначе Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Дата),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Дата)-1; КонецЕсли; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОсновныеНачисления(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДополнительныеНачисления(Ссылка, Движения.ДополнительныеНачисления); КонецПроцедуры ОтчетАнализРасчетов ВЫБРАТЬ ТаблицаПересчетов.ОбъектПерерасчета, ТаблицаПересчетов.ВидРасчета, ТаблицаПересчетов.Сотрудник, ТаблицаПересчетов.Подразделение ИЗ РегистрРасчета.ОсновныеНачисления.ТаблицаПересчетов КАК ТаблицаПересчетов //3.10 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по часовому тарифу. //Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных часов. //Тарифная ставка должна быть определена отдельно для каждого подразделения по специальной шкале в зависимости от отработанного времени. //Например: денег. //Размер суммы задается в документе «Начисление зарплаты» и в последствии может быть изменен. //Сотрудникам предоставляется оплачиваемый отпуск, размер которого определяется как количество дней отпуска умноженное на среднюю дневную ставку. //Дни отпуска рассчитываются по шестидневному графику. //Средняя дневная ставка определяется как сумма всех начислений за три предыдущих месяца, поделенная на количество отработанных дней в трех предыдущих месяцах. //Следует учесть, что данные об отпуске не могут вводиться в систему задним числом. //Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по тарифу с 10.01 по 31.01, а запись: тариф с 10.01 по 03.02 вводить нельзя. //Необходимо предоставить пользователю возможность исправлять результат расчета в форме документа, а также самостоятельно создавать новые виды расчетов и привязывать их к существующим алгоритмам расчета. //Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида: //Добавляем перечисление АлгоритмРасчета (Оклад, ФиксированнаяСумма, Отпуск) Добавляем его в ПВР. //Добавляем РС (Незав, Непериод) ШкалаТарифныеСтавки (Изм Подразделение, От,До, Рес ТарифнаяСтавка) //РРОН (Изм Сотрудник, Подразделение, Рес. Результат, ОтработаноДней, Рекв. Размер, графикРаботы) //РРДН (Изм Сотрудник, Подразделение, Рес. Результат, ОтработаноДней,) //Создаем ОбщийМодуль РасчетЗаработнойПлаты (Сервер, Привел) Процедура РассчитатьОсновныеНачисления(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.ОтработаноДнейБаза, 0) КАК ОтработаноДнейБаза |ПОМЕСТИТЬ ВТБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки | |ИНДЕКСИРОВАТЬ ПО | НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК ПланЧасов, | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК ФактЧасов, | ЕСТЬNULL(ВТБаза.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ВТБаза.ОтработаноДнейБаза, 0) КАК ОтработаноДнейБаза, | ЕСТЬNULL(ШкалаТарифныеСтавки.ТарифнаяСтавка, 0) КАК ТарифнаяСтавка |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ ВТБаза КАК ВТБаза | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ВТБаза.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаТарифныеСтавки КАК ШкалаТарифныеСтавки | ПО ОсновныеНачисленияДанныеГрафика.Подразделение = ШкалаТарифныеСтавки.Подразделение | И (ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия МЕЖДУ ШкалаТарифныеСтавки.От И ШкалаТарифныеСтавки.До)"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл АлгоритмРасчета = СтрокаДвижения.ВидРасчета.АлгоритмРасчета; Если АлгоритмРасчета = Перечисления.АлгоритмРасчета.Оклад Тогда СтрокаДвижения.Результат = ?(СтрокаДвижения.Размер = 0 ,Выборка.ТарифнаяСтавка * Выборка.ФактЧасов,СтрокаДвижения.Размер); СтрокаДвижения.ОтработаноДней = Выборка.ФактЧасов/8; ИначеЕсли АлгоритмРасчета = Перечисления.АлгоритмРасчета.Отпуск Тогда Если СтрокаДвижения.Размер = 0 Тогда СтрокаДвижения.Результат = ?(Выборка.ОтработаноДнейБаза=0,0,Выборка.РезультатБаза/Выборка.ОтработаноДнейБаза); Иначе СтрокаДвижения.Результат = СтрокаДвижения.Размер; КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры В тч док нач зп Делаем различные тч для основных и доп начислений. В каждую тч добавляем реквизит Результат. На форме добавляем команду Рассчитать &НаКлиенте Процедура Рассчитать(Команда) ВыполнитьНаСервере(); КонецПроцедуры &НаСервере Процедура ВыполнитьНаСервере() ДокументОбъект = РеквизитФормыВЗначение("Объект"); ДокументОбъект.РассчитатьНачисления(); ЗначениеВРеквизитФормы(ДокументОбъект,"Объект"); КонецПроцедуры В модуле объектка Процедура РассчитатьНачисления(РасчетВФормеДокумента = Истина) Экспорт Если РасчетВФормеДокумента Тогда ЭтотОбъект.Записать(); НачатьТранзакцию(); КонецЕсли; Движения.ОсновныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета.АлгоритмРасчета КАК АлгоритмРасчета, | НачислениеЗарплатыОсновныеНачисления.Размер, | 0 КАК Результат |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ГрафикРаботы, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.ДатаНачала, | НачислениеЗарплатыДополнительныеНачисления.ДатаОкончания, | НачислениеЗарплатыДополнительныеНачисления.Ссылка.Дата, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета.АлгоритмРасчета, | 0, | НачислениеЗарплатыДополнительныеНачисления.Результат |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() цикл Если ТипЗнч(Выборка.ВидРасчета)= ТИп("ПланВидовРасчетаСсылка.ОсновныеНачисления") Тогда Движение = Движения.ОсновныеНачисления.Добавить(); Если Выборка.АлгоритмРасчета = Перечисления.АлгоритмРасчета.Оклад Тогда ЗаполнитьЗначенияСвойств(Движение, Выборка); Иначе ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Дата),-3); Движение.БазовыйПериодКонец = НачалоМесяца(Дата)-1; Движение.ГрафикРаботы = Справочники.ГрафикРаботы.Шестидневка; КонецЕсли; Если РасчетВФормеДокумента тогда Движение.Размер = 0; КонецЕсли; Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОсновныеНачисления(Ссылка, Движения.ОсновныеНачисления); Если РасчетВФормеДокумента Тогда ЗагрузитьИнформациюВДокумент(); Движения.ОсновныеНачисления.Очистить(); Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Очистить(); Движения.ДополнительныеНачисления.Записать(); ОтменитьТранзакцию(); КонецЕсли; КонецПроцедуры Процедура ЗагрузитьИнформациюВДокумент() Запрос = новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисления.Сотрудник, | ОсновныеНачисления.Подразделение, | ОсновныеНачисления.ВидРасчета, | ОсновныеНачисления.ГрафикРаботы, | ОсновныеНачисления.ПериодДействияНачало КАК ДатаНачала, | ОсновныеНачисления.ПериодДействияКонец КАК ДатаОкончания, | ОсновныеНачисления.Результат КАК Размер, | ОсновныеНачисления.ОтработаноДней |ИЗ | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления |ГДЕ | ОсновныеНачисления.Регистратор = &Регистратор"; Запрос.УстановитьПараметр("Регистратор", Ссылка); ОсновныеНачисления.Загрузить(Запрос.Выполнить().Выгрузить()); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) РассчитатьНачисления(Ложь); КонецПроцедуры Отчет АнализНачислений ВЫБРАТЬ ОсновныеНачисления.Подразделение, ОсновныеНачисления.Сотрудник, ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.ПериодРегистрации, ОсновныеНачисления.Результат ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.ПериодРегистрации, ДополнительныеНачисления.Результат ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода //3.11 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждого подразделения отдельно. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в часах. //Часовая ставка рассчитывается как начальное значение оклада, деленное на количество рабочих часов в том же периоде, что и фактически отработанные часы. //Первоначальное значение оклада может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода. //В случае болезни сотрудник получает пособие, размер которого определяется как количество часов болезни умноженное на среднюю часовую ставку. //Часы болезни рассчитываются по пятидневному графику. Средняя часовая ставка определяется как сумма начисленного за предыдущий месяц оклада, поделенная на количество рабочих часов в предыдущем месяце. //В случае получения сотрудником пособия начисление по окладу не производится. //Сотрудникам предприятия ежемесячно начисляется фиксированная сумма денег в качестве компенсации транспортных расходов. //Размер суммы в течение расчетного периода не меняется. //Дополнительно, сотрудникам компании может быть начислена премия процентом от всех начислений, сделанных в том же расчетном периоде. //Процент премии в течение периода начисления не меняется и задается в документе «Начисление зарплаты». //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление оклада с 10.01 по 31.01, а запись: оклад с 10.01 по 03.02 вводить нельзя. //Необходимо предоставить пользователю возможность исправлять результат расчета в форме документа, а также самостоятельно создавать новые виды расчетов и привязывать их к существующим алгоритмам расчета. //Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида: Создаем общий модуль расчеты (сервер) Процедура Расчет(Ссылка) Экспорт Набор = РегистрыРасчета.ОсновныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК ВремяФакт, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК ВремяПлан, | ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод КАК ВремяБаза, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Оклад, 0) КАК Оклад |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерения, | &Измерения, | , | Регистратор = &Ссылка | И (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &ДатаНачала, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК СведенияОСотрудникахСрезПоследних | ПО ОсновныеНачисленияДанныеГрафика.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение | И ОсновныеНачисленияДанныеГрафика.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник"); Измерения = Новый Массив; Измерения.Добавить("Сотрудник"); ИЗмерения.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерения", Измерения); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", Ссылка.ПериодРегистрации); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Если Выборка.НайтиСледующий(Отбор) Тогда Если Движение.ВидРасчета.Алгоритм = Перечисления.Алгоритмы.Оклад Тогда Движение.Результат = ?(Выборка.ВремяПлан=0,0,Выборка.Оклад * Выборка.ВремяФакт / Выборка.ВремяПлан); Иначе Движение.Результат = ?(Выборка.ВремяБаза=0,0,Выборка.ВремяФакт * Выборка.РезультатБаза / Выборка.ВремяБаза); КонецЕсли; КонецЕсли; Выборка.Сбросить(); КонецЦикла; Набор.Записать(, Истина); Набор = РегистрыРасчета.ДополнительныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ | НачислениеЗарплатыДополнительныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение КАК Подразделение |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Т.НомерСтроки, | СУММА(ЕСТЬNULL(Т.РезультатБаза, 0)) КАК РезультатБаза |ИЗ | (ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза КАК РезультатБаза, | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки КАК НомерСтроки | ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерения, | &Измерения, | , | Регистратор = &Ссылка | И (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК ДополнительныеНачисленияБазаОсновныеНачисления | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, | ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки | ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления( | &Измерения, | &Измерения, | , | Регистратор = &Ссылка | И (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК ДополнительныеНачисленияБазаДополнительныеНачисления) КАК Т | |СГРУППИРОВАТЬ ПО | Т.НомерСтроки"); Измерения = Новый Массив; Измерения.Добавить("Сотрудник"); ИЗмерения.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерения", Измерения); Запрос.УстановитьПараметр("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Если Выборка.НайтиСледующий(Отбор) Тогда Если Движение.ВидРасчета.Алгоритм = Перечисления.Алгоритмы.ПремияПроцентом Тогда Движение.Результат = Движение.Параметр * Выборка.РезультатБаза / 100; КонецЕсли; КонецЕсли; Выборка.Сбросить(); КонецЦикла; Набор.Записать(, Истина); КонецПроцедуры Созд Спр Графики, Перечисл Алгоритмы( Оклад,пособие,ФиксированнаяСумма,ПремияПроцентом) ПВР ОН (Оклад, Пособие). ДН (ПремияПроцентом,ФиксированнаяСумма). РР ОН Изм.Сотрудник,Подразделение, рес.Результат. Рекв. График. ДН Изм, Сотрудник,Подразделение. рес.Результат. Рекв. Параметр. В док нач зап добавляем рекв. ПериодРегистрации. Разбивоем ОН и ДН по разным тч. выводим реквизит результат. Модуль формы &НаКлиенте Процедура Рассчитать(Команда) РассчитатьНаСервере(); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // &НаСервере Процедура РассчитатьНаСервере() ДокОбъект = РеквизитФормыВЗначение("Объект"); ДокОбъект.Рассчитать(); ЗначениеВРеквизитФормы(ДокОбъект, "Объект"); КонецПроцедуры // РассчитатьНаСервере() Модуль объекта Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) ПериодРегистрации=НачалоМесяца(ПериодРегистрации); КонецПроцедуры Процедура Рассчитать() Экспорт НачатьТранзакцию(); ЭтотОбъект.Записать(РежимЗаписиДокумента.Запись); СформироватьДвижения(); Расчеты.Расчет(Ссылка); ПередатьВДокумент(); ЗафиксироватьТранзакцию(); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) СформироватьДвижения(); КонецПроцедуры Процедура СформироватьДвижения() Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Результат |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Движение.ВидРасчета.Алгоритм = Перечисления.Алгоритмы.Пособие Тогда Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации,-1); Движение.БазовыйПериодКонец = ПериодРегистрации-1; Движение.График = Справочники.Графики.Пятидневка; Иначе Движение.График = Движение.Подразделение; КонецЕсли; КонецЦикла; Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыДополнительныеНачисления.Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.Размер, | НачислениеЗарплатыДополнительныеНачисления.Результат |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Движение.ВидРасчета.Алгоритм = Перечисления.Алгоритмы.ПремияПроцентом Тогда Движение.БазовыйПериодНачало = ПериодРегистрации; Движение.БазовыйПериодКонец = КонецМесяца(ПериодРегистрации); Движение.Параметр = Выборка.Размер; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); КонецПроцедуры Процедура ПередатьВДокумент() Запрос = Новый Запрос("ВЫБРАТЬ | ОсновныеНачисления.ВидРасчета, | ОсновныеНачисления.ПериодДействияНачало КАК ДатаНачала, | ОсновныеНачисления.ПериодДействияКонец КАК ДатаОкончания, | ОсновныеНачисления.Сотрудник, | ОсновныеНачисления.Подразделение, | ОсновныеНачисления.Результат, | ОсновныеНачисления.График |ИЗ | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления |ГДЕ | ОсновныеНачисления.Регистратор = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); ОсновныеНачисления.Загрузить(Запрос.Выполнить().Выгрузить()); Запрос = Новый Запрос("ВЫБРАТЬ | ДополнительныеНачисления.ВидРасчета, | ДополнительныеНачисления.Сотрудник, | ДополнительныеНачисления.Подразделение, | ДополнительныеНачисления.Результат, | ДополнительныеНачисления.Параметр КАК Размер |ИЗ | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления |ГДЕ | ДополнительныеНачисления.Регистратор = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); ДополнительныеНачисления.Загрузить(Запрос.Выполнить().Выгрузить()); Движения.ОсновныеНачисления.Очистить(); Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Очистить(); Движения.ДополнительныеНачисления.Записать(); КонецПроцедуры Отчет ВедомостьНачислений ВЫБРАТЬ Т.ПериодРегистрации, Т.ВидРасчета, Т.Сотрудник, Т.Подразделение, СУММА(ЕСТЬNULL(Т.Результат, 0)) КАК Сумма ИЗ (ВЫБРАТЬ ОсновныеНачисления.ПериодРегистрации КАК ПериодРегистрации, ОсновныеНачисления.ВидРасчета КАК ВидРасчета, ОсновныеНачисления.Сотрудник КАК Сотрудник, ОсновныеНачисления.Подразделение КАК Подразделение, ОсновныеНачисления.Результат КАК Результат ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодРегистрации МЕЖДУ &ДатаНачала И &ДатаОкончания ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.ПериодРегистрации, ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.Результат ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &ДатаНачала И &ДатаОкончания) КАК Т СГРУППИРОВАТЬ ПО Т.ВидРасчета, Т.ПериодРегистрации, Т.Сотрудник, Т.Подразделение //3.12 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждого подразделения отдельно. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в часах. //Часовая ставка рассчитывается как начальное значение оклада, деленное на количество рабочих часов в том же периоде, что и фактически отработанные часы. //В течение расчетного периода первоначальное значение оклада может быть один раз изменено. //Расчет должен производиться исходя из действующего на рассчитываемую дату начального значения оклада. //Например, если начальное значение оклада изменилось 10 августа, то до 10 августа при расчете берется старое значение, а начиная с 10 августа – новое. //В случае болезни сотрудник получает пособие, размер которого определяется как количество дней болезни умноженное на среднюю дневную ставку. //Дни болезни рассчитываются по шестидневному графику. //Средняя дневная ставка определяется как сумма начисленного за предыдущий месяц оклада, поделенная на количество рабочих дней в предыдущем месяце. //В случае получения сотрудником пособия начисление по окладу не производится. //Сотрудникам предприятия ежемесячно начисляется фиксированная сумма денег в качестве компенсации затрат на разговоры по мобильному телефону. //Размер суммы в течение расчетного периода не меняется. //Дополнительно, сотрудникам компании может быть начислена премия процентом от всех начислений, сделанных в том же расчетном периоде. //Процент премии в течение периода начисления может изменяться не чаще, чем один раз в день, но берется на начало текущего расчетного периода. //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что данные о начислении по окладу вводятся только в пределах одного месяца, а пособие по болезни может переходить из одного месяца в другой. //Например, можно указать начисление оклада с 10.01 по 31.01, а пособие - с 25.01 по 05.03., при этом, каждое начисление в документе вводится одной строкой с указанием полного периода. //С помощью диаграммы Ганта показать фактический период действия записей с разбивкой по сотрудникам, и для каждого сотрудника – по видам расчета. //Отчет может быть построен за любой расчетный период. Создаем ОбщМОд РасчетЗаработнойПлаты (серв) Процедура РассчитатьОсновныеНачисления(Ссылка, ОсновныеНачисления) Экспорт //рассичитаем оклад Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК ПланЧасов, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасов |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока выборка.НайтиСледующий(Поиск) Цикл СтрокаДвижения.Результат =?(выборка.ПланЧасов=0,0,СтрокаДвижения.Размер/выборка.планЧасов*Выборка.ФактЧасов); КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); //рассчитаем пособие Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ОсновныеНачисленияДанныеГрафика.ЗначениеДниБазовыйПериод КАК ДниБаза, | ОсновныеНачисленияДанныеГрафика.ЗначениеШестидневкаДниФактическийПериодДействия КАК ШестидневкаДни |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(планВидовРасчета.ОсновныеНачисления.Пособие)) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока выборка.НайтиСледующий(Поиск) Цикл СредняяДневнаяСтавка = ?(Выборка.ДниБаза =0,0, выборка.РезультатБаза/Выборка.ДниБаза); СтрокаДвижения.Результат =СредняяДневнаяСтавка*Выборка.ШестидневкаДни; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДополнительныеНачисления(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия)) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока выборка.НайтиСледующий(Поиск) Цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер/100*Выборка.РезультатБаза; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры ДокНачЗП Отдельные тч. МодульДокумента Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОсновныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Размер |ПОМЕСТИТЬ ТЧДОк |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СведенияОСотрудникахСрезПоследних.Сотрудник КАК Сотрудник, | СведенияОСотрудникахСрезПоследних.Подразделение КАК Подразделение, | СведенияОСотрудникахСрезПоследних.Оклад, | СведенияОСотрудникахСрезПоследних.ПроцентПремии, | &НачалоМесяца |ПОМЕСТИТЬ ВТСрезСотрудник |ИЗ | РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДОк.Сотрудник КАК Сотрудник, | ТЧДОк.Подразделение КАК Подразделение, | &НачалоМесяца КАК НачалоВИстории, | ЕСТЬNULL(ВТСрезСотрудник.Оклад, 0) КАК Оклад |ПОМЕСТИТЬ ВТОклады |ИЗ | ТЧДОк КАК ТЧДОк | ЛЕВОЕ СОЕДИНЕНИЕ ВТСрезСотрудник КАК ВТСрезСотрудник | ПО ТЧДОк.Сотрудник = ВТСрезСотрудник.Сотрудник | И ТЧДОк.Подразделение = ВТСрезСотрудник.Подразделение | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | СведенияОСотрудниках.Сотрудник, | СведенияОСотрудниках.Подразделение, | НАЧАЛОПЕРИОДА(СведенияОСотрудниках.Период, ДЕНЬ), | СведенияОСотрудниках.Оклад |ИЗ | РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках |ГДЕ | СведенияОСотрудниках.Период > &НачалоПериода | И СведенияОСотрудниках.Период <= &КонецПериода | И СведенияОСотрудниках.Сотрудник В | (ВЫБРАТЬ | Т.Сотрудник | ИЗ | ТЧДок КАК Т) | И СведенияОСотрудниках.Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧДок КАК Т) | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник КАК Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета КАК ВидРасчета, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ТЧДок.Размер, | ВТОклады.НачалоВИстории КАК НачалоВИстории, | ЕСТЬNULL(ВТОклады.Оклад, 0) КАК Оклад |ИЗ | ТЧДОк КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ВТОклады КАК ВТОклады | ПО ТЧДок.Сотрудник = ВТОклады.Сотрудник | И ТЧДок.Подразделение = ВТОклады.Подразделение | И ТЧДок.ПериодДействияКонец >= ВТОклады.НачалоВИстории | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)) | |СГРУППИРОВАТЬ ПО | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ВТОклады.НачалоВИстории, | ТЧДок.Размер, | ЕСТЬNULL(ВТОклады.Оклад, 0) | |УПОРЯДОЧИТЬ ПО | ВидРасчета, | НачалоВИстории |ИТОГИ ПО | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.ДатаНачала КАК БазовыйПериодНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыДополнительныеНачисления.ДатаОкончания, ДЕНЬ) КАК БазовыйПериодКонец, | НачислениеЗарплатыДополнительныеНачисления.Размер, | ЕСТЬNULL(ВТСрезСотрудник.ПроцентПремии, 0) КАК ПроцентПремии, | НачислениеЗарплатыДополнительныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления | ЛЕВОЕ СОЕДИНЕНИЕ ВТСрезСотрудник КАК ВТСрезСотрудник | ПО НачислениеЗарплатыДополнительныеНачисления.Сотрудник = ВТСрезСотрудник.Сотрудник | И НачислениеЗарплатыДополнительныеНачисления.Подразделение = ВТСрезСотрудник.Подразделение |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка",Ссылка); Запрос.УстановитьПараметр("НачалоМесяца",НачалоМесяца(Дата)); Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Дата)); Результат = Запрос.ВыполнитьПакет(); ВыборкаСотрудник = Результат[3].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСотрудник.Следующий() цикл СледующаяСтрока = Ложь; СтарыйВидРасчета = Неопределено; Выборка = ВыборкаСотрудник.Выбрать(); Пока Выборка.Следующий() цикл Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Если Ложь Тогда Движение = Неопределено; КонецЕсли; Если СледующаяСтрока тогда Движение.ПериодДействияКонец = МАКС(Выборка.ПериодДействияНачало, Выборка.НачалоВИстории)-1; КонецЕсли; Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сотрудник = Выборка.Сотрудник; Движение.Подразделение = Выборка.Подразделение; Движение.ПериодДействияНачало = МАКС(Выборка.ПериодДействияНачало, Выборка.НачалоВИстории); Движение.ПериодДействияКонец = Выборка.ПериодДействияКонец; Движение.ВидРасчета = Выборка.ВидРасчета; Движение.ПериодРегистрации = Дата; Движение.Размер = Выборка.Оклад; СледующаяСтрока = Истина; Иначе ТекПериод = НачалоМесяца(Выборка.ПериоддействияНачало); Пока ТекПериод<= НачалоМесяца(Выборка.ПериодДействияКонец) цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сотрудник = Выборка.Сотрудник; Движение.Подразделение = Выборка.Подразделение; Движение.ПериодДействияНачало = Макс(Выборка.ПериодДействияНачало, ТекПериод); Движение.ПериодДействияКонец = Мин(КонецМесяца(ТекПериод),Выборка.ПериодДействияКонец); Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Движение.ПериодДействияНачало),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Движение.ПериодДействияНачало)-1; Движение.ВидРасчета = Выборка.ВидРасчета; Движение.ПериодРегистрации = Дата; ТекПериод = ДобавитьМесяц(ТекПериод,1); КонецЦикла; КонецЕсли; КонецЦикла; КонецЦикла; Выборка = Результат[4].выбрать(); Пока Выборка.Следующий() цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.ФиксированнаяСумма Тогда Движение.Результат = Выборка.Размер; Иначе Движение.Размер = выборка.ПроцентПремии; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОсновныеНачисления(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДополнительныеНачисления(Ссылка, Движения.ДополнительныеНачисления); КонецПроцедуры ПВР ОН Оклад,Пособие. ДН Премия, ФиксированнаяСумма //3.13 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждого подразделения отдельно. Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в днях. //Дневная ставка рассчитывается как начальное значение оклада, деленное на количество рабочих дней в том же периоде, что и фактически отработанные дни. //Первоначальное значение оклада может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода. //В случае болезни сотрудник получает пособие, размер которого определяется как количество часов болезни умноженное на среднюю часовую ставку. //Часы болезни рассчитываются по шестидневному графику. //Средняя часовая ставка определяется как сумма начисленного в том же месяце оклада, поделенная на количество рабочих часов в этом месяце. //В случае получения сотрудником пособия начисление по окладу не производится. Сотрудникам предприятия ежемесячно начисляется фиксированная сумма денег в качестве компенсации затрат на обеды. //Размер суммы в течение расчетного периода не меняется. //Дополнительно, сотрудникам компании может быть начислена премия процентом от всех начислений, сделанных в том же расчетном периоде. //Процент премии зависит от стажа работы сотрудника на данном предприятии. //При решении задачи необходимо учитывать, что на момент начала ведения учета в информационной базе у сотрудника уже может быть стаж отличный от нуля. //Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление оклада с 10.01 по 31.01, а запись оклад с 10.01 по 03.02 вводить нельзя. //Для анализа полученных сотрудниками предприятия премий в конфигурации необходимо предусмотреть отчет следующего вида: Создаем общий модуль РасчетЗаработнойПлаты (ривел, сервер) Процедура РассчитатьОсновныеНачисления(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.ЗначениеБаза, 0) КАК РезультатБаза, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК ПланДней, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактДней, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеЧасыШестидневкаФактическийПериодДействия, 0) КАК ФактЧасыШестидневка, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеЧасыБазовыйПериод, 0) КАК ФактЧасыБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда СтрокаДвижения.Значение = ?(Выборка.ПланДней=0,0, СтрокаДвижения.Размер/Выборка.ПланДней*Выборка.ФактДней); Иначе СредняяЧасоваяСтавка = ?(Выборка.ФактЧасыБаза=0, 0,Выборка.РезультатБаза/Выборка.ФактЧасыБаза); СтрокаДвижения.Значение = Выборка.ФактЧасыШестидневка * СредняяЧасоваяСтавка; КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДополнительныеНачисления(Ссылка , ДополнительныеНачисления)Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ДополнительныеНачисленияБазаОсновныеНачисления.ЗначениеБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия)) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Значение = СтрокаДвижения.Размер/100*Выборка.ЗначениеБаза; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры В спр ФизическиеЛица (ДатаПриемаНаРаботу, НачальныйСтаж (число)). ПВР ОН (Оклад,Пособие) ДН (КомпенсацияЗаОбеды,Премия) РС ШкалаПремии (ИнтервалОт, ИнтервалДо, ПроцентПремии) РР ОсновныеНачисления (Подразделение,Сотрудник... Значение... Размер) РР ДН (Подразделение, Сотрудник... Значение.... Размер,Стаж) . ДокНачЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОсновныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации, | ВЫБОР | КОГДА НачислениеЗарплатыОсновныеНачисления.Сотрудник.ДатаПриемаНаРаботу = ДАТАВРЕМЯ(1, 1, 1) | ТОГДА 0 | ИНАЧЕ РАЗНОСТЬДАТ(НачислениеЗарплатыОсновныеНачисления.Сотрудник.ДатаПриемаНаРаботу, &НачалоМесяца, ГОД) | КОНЕЦ + НачислениеЗарплатыОсновныеНачисления.Сотрудник.НачальныйСтаж КАК НачальныйСтаж |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СведенияОСотрудникахСрезПоследних.Сотрудник КАК Сотрудник, | СведенияОСотрудникахСрезПоследних.Подразделение КАК Подразделение, | СведенияОСотрудникахСрезПоследних.Оклад |ПОМЕСТИТЬ ИнформацияОклад |ИЗ | РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ТЧДок.Размер, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(ИнформацияОклад.Оклад, 0) КАК Оклад, | ЕСТЬNULL(ШкалаПремии.ПроцентПремии, 0) КАК ПроцентПремии, | ТЧДок.НачальныйСтаж |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ИнформацияОклад КАК ИнформацияОклад | ПО ТЧДок.Сотрудник = ИнформацияОклад.Сотрудник | И ТЧДок.Подразделение = ИнформацияОклад.Подразделение | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаПремии КАК ШкалаПремии | ПО ТЧДок.НачальныйСтаж >= ШкалаПремии.ИнтервалОт | И ТЧДок.НачальныйСтаж < ШкалаПремии.ИнтервалДо | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия))"; Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка",Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если ТипЗнч(Выборка.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Пособие Тогда Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Дата),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Дата)-1; Иначе Движение.Размер = выборка.Оклад; КонецЕсли; Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Движение.БазовыйПериодНачало = Выборка.ПериодДействияНачало; Движение.БазовыйПериодКонец = Выборка.ПериодДействияКонец; Если выборка.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.Премия Тогда Движение.Размер = Выборка.ПроцентПремии; Движение.Стаж = выборка.НачальныйСтаж; Иначе Движение.Значение = Выборка.Размер; КонецЕсли; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОсновныеНачисления(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДополнительныеНачисления(Ссылка, Движения.ДополнительныеНачисления); КонецПроцедуры //3.14 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждого подразделения отдельно. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в днях. //Дневная ставка рассчитывается как начальное значение оклада, деленное на количество рабочих дней в том же периоде, что и фактически отработанные дни. //В течение расчетного периода первоначальное значение оклада может быть один раз изменено. //Расчет должен производиться исходя из действующего на рассчитываемую дату начального значения оклада. //Например, если начальное значение оклада изменилось 10 августа, то до 10 августа при расчете берется старое значение, а начиная с 10 августа – новое. //В случае болезни сотрудник получает пособие, размер которого определяется как количество часов болезни умноженное на среднюю часовую ставку. //Часы болезни рассчитываются по пятидневному графику. //Средняя часовая ставка определяется как сумма начисленного оклада за два предыдущих месяца оклада, поделенная на количество отработанных часов в двух предыдущих месяцах. //В случае получения сотрудником пособия начисление по окладу не производится. //За каждый день болезни сотрудникам предприятия дополнительно начисляется фиксированная сумма денег в качестве компенсации затрат на лекарства. //Размер начисленной суммы не может превышать определенного значения, зафиксированного для каждого сотрудника отдельно в информационной базе. //За произвольный период отработанного времени (должен указываться в документе и может быть меньше периода ведения расчетов, например, всего несколько дней) сотрудникам компании начисляется премия процентом от всех начислений, сделанных в предыдущем же расчетном периоде. //Процент премии в течение периода начисления не меняется. Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление оклада с 10.01 по 31.01, а запись: оклад с 10.01 по 03.02 вводить нельзя. //Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида: //Создаем Общий М РасчетЗаработнойПлаты Процедура РассчитатьОС(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПятидневкаЧасыФактическийПериодДействия, 0) КАК ФактЧасыПятидневка, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактДни, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК ПланДни, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.ОтработаноЧасовБаза, 0) КАК ОтработаноЧасовБАза, | ОсновныеНачисленияДанныеГрафика.ЗначениеЧасыФактическийПериодДействия КАК ФактЧасов |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) Цикл Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда СтрокаДвижения.Результат = ?(Выборка.ПланДни = 0,0,СтрокаДвижения.Размер/Выборка.ПланДни*Выборка.ФактДни); СтрокаДвижения.ОтработаноЧасов = Выборка.ФактЧасов; Иначе СредняяЧасоваяСтавка = ?(Выборка.ОтработаноЧасовБаза=0,0, Выборка.РезультатБаза/Выборка.ОтработаноЧасовБаза); СтрокаДвижения.Результат = СредняяЧасоваяСтавка*Выборка.ФактЧасыПятидневка; КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДС(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРАсчета.ДополнительныеНачисления.Премия)) КАК ДополнительныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРАсчета.ДополнительныеНачисления.Премия)) КАК ДополнительныеНачисленияБазаДополнительныеНачисления | ПО ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) Цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер/100*Выборка.РезультатБаза; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры ОН и ДН разны ТЧ ДокНачЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОсновныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник КАК Сотрудник, | ТЧДок.Подразделение КАК Подразделение, | &НачалоМесяца КАК НачалоВИстории, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Оклад, 0) КАК Оклад |ПОМЕСТИТЬ ВТОклады |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | СведенияОСотрудниках.Сотрудник, | СведенияОСотрудниках.Подразделение, | НАЧАЛОПЕРИОДА(СведенияОСотрудниках.Период, ДЕНЬ), | СведенияОСотрудниках.Оклад |ИЗ | РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках |ГДЕ | СведенияОСотрудниках.Период МЕЖДУ &НачалоПериода И &КонецПериода | И СведенияОСотрудниках.Сотрудник В | (ВЫБРАТЬ | Т.Сотрудник | ИЗ | ТЧДок КАК Т) | И СведенияОСотрудниках.Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧДок КАК Т) | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник КАК Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета КАК ВидРасчета, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ТЧДок.Размер, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(ВТОклады.Оклад, 0) КАК Оклад, | ВТОклады.НачалоВИстории КАК НачалоВИстории |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ВТОклады КАК ВТОклады | ПО ТЧДок.Сотрудник = ВТОклады.Сотрудник | И ТЧДок.Подразделение = ВТОклады.Подразделение | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНАчисления.Оклад)) | |УПОРЯДОЧИТЬ ПО | ВидРасчета, | НачалоВИстории |ИТОГИ ПО | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыДополнительныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыДополнительныеНачисления.Размер, | НачислениеЗарплатыДополнительныеНачисления.Ссылка.Дата КАК ПериодРегистрации, | НачислениеЗарплатыДополнительныеНачисления.Сотрудник.Компенсация КАК Компенсация |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("НачалоМесяца",НачалоМесяца(Дата)); ЗАпрос.УстановитьПараметр("НачалоПериода",НачалоМесяца(Дата)); Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Дата)); Результат = Запрос.ВыполнитьПакет(); ВыборкаСотрудник = Результат[2].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСотрудник.Следующий() цикл СледующаяСтрокаПоСотруднику = Ложь; Выборка = ВыборкаСотрудник.Выбрать(); Пока Выборка.Следующий() цикл Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Если Ложь Тогда Движение = Неопределено; КонецЕсли; Если СледующаяСтрокаПоСотруднику Тогда Движение.ПериодДействияКонец = Макс(Выборка.ПериодДействияНачало, Выборка.НачалоВИстории)-1; КонецЕсли; Движение = Движения.ОсновныеНачисления.Добавить(); Движение.ПериодРегистрации = Дата; Движение.ПериодДействияНачало = Макс(Выборка.ПериодДействияНачало, Выборка.НачалоВИстории); Движение.ПериодДействияКонец = Выборка.ПериодДействияКонец; Движение.Сотрудник = Выборка.Сотрудник; Движение.Подразделение = Выборка.Подразделение; Движение.ВидРасчета = Выборка.ВидРасчета; Движение.Размер = Выборка.Оклад; СледующаяСтрокаПоСотруднику = Истина; Иначе Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Дата),-2); Движение.БазовыйПериодКонец = НачалоМесяца(Дата)-1; КонецЕсли; КонецЦикла; КонецЦикла; Выборка = Результат[3].Выбрать(); Пока Выборка.Следующий() цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.БазовыйПериодНачало = Выборка.ПериодДействияНачало; Движение.БазовыйПериодКонец = Выборка.ПериодДействияКонец; Если Выборка.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.ФиксированнаяСумма ТОгда Если Выборка.Размер > Выборка.Компенсация Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Фиксированная сумма превышает допустимую норму!!!Норма:"+Выборка.Компенсация; Сообщение.Сообщить(); ОТказ = Истина; КонецЕсли; Движение.Результат = Выборка.Размер; КонецЕсли; КонецЦикла; Если Отказ Тогда Возврат; КонецЕсли; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОС(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДС(Ссылка, Движения.ДополнительныеНачисления); КонецПроцедуры //ПВР ОН (пособие, Оклад), ДН (Премия,ФиксированнаяСумма). //РР ОН Сотрудник,Подразделение... Результат, ОтработаноЧасов...Размер. //РР ДН (Сотрудник.Подразделение..Результат... Размер.). //График (Дата, Подразделение(подразд)... Значение, ЗначениеЧасы, ЗначениеПятидневкаЧасы ). Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни,Подразделение) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Прочитать(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Запись.ЗначениеЧасы = 0; Запись.ЗначениеПятидневкаЧасы = 0; Иначе Запись.Значение = 1; Запись.ЗначениеЧасы = 8; Запись.ЗначениеПятидневкаЧасы = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; НоваяЗапись.Подразделение = Подразделение; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; НоваяЗапись.ЗначениеЧасы = 0; НоваяЗапись.ЗначениеПятидневкаЧасы = 0; Иначе НоваяЗапись.Значение = 1; НоваяЗапись.ЗначениеЧасы = 8; НоваяЗапись.ЗначениеПятидневкаЧасы = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Запись.ЗначениеЧасы = 0; Запись.ЗначениеПятидневкаЧасы = 0; Иначе Запись.Значение = 1; Запись.ЗначениеЧасы = 8; Запись.ЗначениеПятидневкаЧасы = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.Подразделение = Подразделение; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Запись.ЗначениеЧасы = 0; Запись.ЗначениеПятидневкаЧасы = 0; Иначе Запись.Значение = 1; Запись.ЗначениеЧасы = 8; Запись.ЗначениеПятидневкаЧасы = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры ОтчетАнализСделанныхНачислений ВЫБРАТЬ ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.ПериодРегистрации, ОсновныеНачисления.Результат ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.ПериодРегистрации, ДополнительныеНачисления.Результат ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода //3.15 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием с использованием метода отклонений. //В решении необходимо предусмотреть возможность работы по нескольким различным графикам. Сотрудники предприятия получают оплату по часовому тарифу. //Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных часов. //Тарифная ставка в расчетном периоде не меняется. Сотрудники работают по пятидневному графику, 40 часовая рабочая неделя. //Три дня в неделю (понедельник, среда, пятница) по два часа работы приходится на вечерние часы. //За каждый час работы в вечернее время сотрудники получают доплату, равную половине их часовой тарифной ставки. //В случае болезни сотрудник получает пособие, размер которого определяется как количество дней болезни умноженное на среднюю дневную ставку. //Дни болезни рассчитываются по пятидневному графику. //Средняя дневная ставка определяется как 50% от суммы начисленного за предыдущий месяц оклада, поделенная на количество рабочих дней в предыдущем месяце. //В случае получения сотрудником пособия начисление по окладу не производится. //Следуетучесть, что данные о болезни могут вводиться в систему задним числом. //За каждый день болезни сотрудникам предприятия дополнительно начисляется фиксированная сумма денег в качестве компенсации затрат на лекарства. //Размер суммы в течение расчетного периода не меняется. //Дополнительно, сотрудникам компании может быть начислена премия процентом от всех начислений, сделанных в предыдущем же расчетном периоде. //Процент премии в течение периода начисления может изменяться не чаще, чем один раз в день, но берется на начало текущего расчетного периода. //В информационной базе необходимо хранить историю изменения процента премии. //Создать отчет «Перерасчет зарплаты», в котором пользователь должен увидеть записи регистра расчета, которые возможно требуется пересчитать. //Саму процедуру перерасчета записей в рамках данной задачи реализовывать не требуется. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по тарифу с 10.01 по 31.01, а запись: тариф с 10.01 по 03.02 вводить нельзя. //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОсновныеНачисления(Ссылка, ОсновныеНачисления) Экспорт //рассчитаем оклад и дополату Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК ПланЧасов, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасов, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ВечерниеЧасыПериодДействия, 0) КАК ВечерниеПланЧасов, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ВечерниеЧасыФактическийПериодДействия, 0) КАК ВечерниеФактЧасов |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета В (&СписокВидовРасчета)) КАК ОсновныеНачисленияДанныеГрафика"; СписокВидовРасчета = Новый СписокЗначений; СписокВидовРасчета.Добавить(ПланыВидовРасчета.ОсновныеНачисления.Оклад); СписокВидовРасчета.Добавить(ПланыВидовРасчета.ОсновныеНачисления.ВечерниеЧасы); Запрос.УстановитьПараметр("СписокВидовРасчета", СписокВидовРасчета); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.номерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Сторно = ?(СтрокаДвижения.Сторно,-1,1); Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ФактЧасов*Сторно; Иначе СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ВечерниеФактЧасов*Сторно; КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); //рассчитываем пособие Запрос = новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниФактическийПериодДействия, 0) КАК ДниФакт, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ОсновныеНачисленияДанныеГрафика.ЗначениеДниБазовыйПериод КАК ДниБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(планВидовРасчета.ОсновныеНачисления.Пособие)) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(планВидовРасчета.ОсновныеНачисления.Пособие)) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Ссылка",Ссылка); Запрос.УстановитьПараметр("Измерение", Измерение); Выборка = Запрос.Выполнить().Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.номерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Сторно = ?(СтрокаДвижения.Сторно,-1,1); СредняяСтавка = ?(Выборка.ДниБаза=0,0,Выборка.РезультатБаза*0.5/выборка.ДниБаза); СтрокаДвижения.Результат = Выборка.ДниФакт* СредняяСтавка*Сторно; СтрокаДвижения.ДниБольничный = Выборка.ДниФакт; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДополнительныеНачисления(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ДополнительныеНачисленияБазаОсновныеНачисления.ДниБольничныйБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(планВидовРасчета.ДополнительныеНачисления.КомпенсацияЗаЛекарства)) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.номерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Сторно = ?(СтрокаДвижения.Сторно,-1,1); СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ДниБольничныйБаза*Сторно; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия)) КАК ДополнительныеНачисленияБазаОсновныеНачисления | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия)) КАК ДополнительныеНачисленияБазаДополнительныеНачисления | ПО ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки"; Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.номерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Сторно = ?(СтрокаДвижения.Сторно,-1,1); СтрокаДвижения.Результат = СтрокаДвижения.Размер/100*Выборка.РезультатБаза*Сторно; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры СпрГрафикРаботы ДокНачЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ТЧДок.Размер, | ТЧДок.ГрафикРаботы, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.ПроцентПремии, 0) КАК ПроцентПремии |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия))"; Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() цикл Если ТипЗнч(Выборка.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Пособие Тогда Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Выборка.ПериодДействияНачало),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Выборка.ПериодДействияНачало)-1; КонецЕсли; Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.Премия Тогда Движение.Размер = Выборка.ПроцентПремии; Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Выборка.ПериодДействияНачало),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Выборка.ПериодДействияНачало)-1; Иначе Движение.БазовыйПериодНачало = Выборка.ПериодДействияНачало; Движение.БазовыйПериодКонец = Выборка.ПериодДействияКонец; КонецЕсли; КонецЕсли; КонецЦикла; НаборЗаписей = Движения.ОсновныеНачисления.ПолучитьДополнение(); Для каждого СтрокаНабора из НаборЗаписей цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,СтрокаНабора); Движение.ПериодДействияНачало = СтрокаНабора.ПериодДействияНачалоСторно; Движение.ПериодДействияКонец = СтрокаНабора.ПериодДействияКонецСторно; Движение.ПериодРегистрации = СтрокаНабора.ПериодРегистрацииСторно; Движение.Сторно = Истина; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОсновныеНачисления(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДополнительныеНачисления(Ссылка, Движения.ДополнительныеНачисления); КонецПроцедуры ПВР ОН (ВечерниеЧасы,Оклад,Пособие) ДН (КомпенсацияЗаЛекарства,Премия). СведенияОСотрудниках (Подразделение,Сотрудник,Оклад,ПроцентПремии). РСГрафикРаботы (Дата,ГрафикРаботы,Значение,ЗначениеДни,ЗначениеВечерниеЧасы) РР ОН (Сотрудник, Подраздление... Результат, ДниБольничный... Размер, ГрафикРаботы) Перерасчеты Основное (Сотрудник,Подразделение) ДН (Сотрудник,Подразделение... Результат,...Размер) Перерасчет Дополнительный (Сотрудник,Подразделение) ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, ГрафикРаботы) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Прочитать(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.ГрафикРаботы = ГрафикРаботы; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Запись.ЗначениеДни = 0; Запись.ВечерниеЧасы = 0; Иначе Запись.Значение = 8; Запись.ЗначениеДни = 1; Запись.ВечерниеЧасы = 0; КонецЕсли; ДеньНеделиДат = ДеньНедели(Дат); Если ДеньНеделиДат = 1 или ДеньНеделиДат = 3 или ДеньНеделиДат =5 Тогда Запись.ВечерниеЧасы = 2; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры Отчет ПересчетЗарплаты ВЫБРАТЬ Основной.ОбъектПерерасчета, Основной.ВидРасчета, Основной.Сотрудник, Основной.Подразделение ИЗ РегистрРасчета.ОсновныеНачисления.Основной КАК Основной ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Дополнительный.ОбъектПерерасчета, Дополнительный.ВидРасчета, Дополнительный.Сотрудник, Дополнительный.Подразделение ИЗ РегистрРасчета.ДополнительныеНачисления.Дополнительный КАК Дополнительный //3.16 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в часах. //Часовая ставка рассчитывается как начальное значение оклада, деленное на количество рабочих часов в том же периоде, что и фактически отработанные часы. //Первоначальное значение оклада может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода. //В целях управленческого учета, дополнительно, необходимо хранить информацию о начисленном окладе, исходя из отработанного времени в днях. //Ставка за один день рассчитывается аналогично ставке за один час. //Таким образом, если сотрудник отработал полдня, то в часах сумма оклада будет меньше, чем в днях. //Сотруднику предприятия выплачивается надбавка, рассчитываемая как общая сумма продаж товаров за предыдущий месяц по подразделению, в котором работает сотрудник, умноженная на определенный процент. //Значение процента для надбавки может быть изменено только один раз в течение расчетного периода. //В этом случае, расчет начисления должен производиться исходя из действующего на рассчитываемый период процента. //Например, если процент изменился 10 августа, то до 10.10 при расчете берется старый процент, а после 10.10 (включительно) уже новый. //За каждый день невыхода сотрудника на работу без уважительной причины сотруднику начисляется штраф в размере 200 рублей. //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление оклада с 10.01 по 31.01, а запись: оклад с 10.01 по 03.02 вводить нельзя. //Для целей управленческого учета сформировать таблицу, отражающую информацию по суммам начисленного оклада. //Таблица должна быть построена за произвольный расчетный период. ОМ Расчеты Процедура Расчет(Ссылка) Экспорт Набор = РегистрыРасчета.ОсновныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Запрос = Новый Запрос("ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ОсновныеНачисленияДанныеГрафика.ДнейПериодДействия КАК ДнейПлан, | ОсновныеНачисленияДанныеГрафика.ДнейФактическийПериодДействия КАК ДнейФакт, | ОсновныеНачисленияДанныеГрафика.ЧасовПериодДействия КАК ЧасовПлан, | ОсновныеНачисленияДанныеГрафика.ЧасовФактическийПериодДействия КАК ЧасовФакт, | ЕСТЬNULL(ПродажиОбороты.СуммаОборот, 0) КАК СуммаПродаж |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты( | &ДатаНачала, | &ДатаОкончания, | , | Подразделение В | (ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Подразделение | ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления | ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка)) КАК ПродажиОбороты | ПО ОсновныеНачисленияДанныеГрафика.Подразделение = ПродажиОбороты.Подразделение"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", ДобавитьМесяц(Ссылка.ПериодРегистрации,-1)); Запрос.УстановитьПараметр("ДатаОкончания", Ссылка.ПериодРегистрации-1); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Если Выборка.НайтиСледующий(Отбор) Тогда Если Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Движение.РезультатЗаДни = ?(Выборка.ДнейПлан=0,0,Движение.Параметр * Выборка.ДнейФакт / Выборка.ДнейПлан); Движение.РезультатЗаЧасы = ?(Выборка.ЧасовПлан=0,0,Движение.Параметр * Выборка.ЧасовФакт / Выборка.ЧасовПлан); ИначеЕсли Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Невыход Тогда Движение.РезультатЗаЧасы = -Движение.Параметр * Выборка.ДнейФакт; Иначе Движение.РезультатЗаЧасы = ?(Выборка.ДнейПлан=0,0,Движение.Параметр * Выборка.СуммаПродаж * Выборка.ДнейФакт / Выборка.ДнейПлан / 100); КонецЕсли; КонецЕсли; Выборка.Сбросить(); КонецЦикла; Набор.Записать(, Истина); КонецПроцедуры В докНАчЗП ПериодРегистрации Модуль Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) ПериодРегистрации=НачалоДня(ПериодРегистрации); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала, | НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, | НачислениеЗарплатыОсновныеНачисления.График |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.ПериодРегистрации, | Список.Сотрудник, | Список.Подразделение, | Список.ВидРасчета, | Список.ДатаНачала КАК ПериодДействияНачало, | Список.ДатаОкончания КАК ПериодДействияКонец, | Список.График, | ЕСТЬNULL(СведенияОСотрудникахНачало.Оклад, 0) КАК Оклад, | ЕСТЬNULL(СведенияОСотрудникахНачало.ПроцентНадбавки, 0) КАК ПроцентНадбавкиНачало, | ЕСТЬNULL(СведенияОСотрудникахКонец.ПроцентНадбавки, 0) КАК ПроцентНадбавкиКонец, | СведенияОСотрудникахКонец.Период КАК ДатаИзменения |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &ДатаНачала, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК СведенияОСотрудникахНачало | ПО Список.Сотрудник = СведенияОСотрудникахНачало.Сотрудник | И Список.Подразделение = СведенияОСотрудникахНачало.Подразделение | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &ДатаОкончания, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК СведенияОСотрудникахКонец | ПО Список.Сотрудник = СведенияОСотрудникахКонец.Сотрудник | И Список.Подразделение = СведенияОСотрудникахКонец.Подразделение"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", ПериодРегистрации); Запрос.УстановитьПараметр("ДатаОкончания", КонецМесяца(ПериодРегистрации)); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Движение.Параметр = Выборка.Оклад; ИначеЕсли Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Невыход Тогда Движение.Параметр = 200; Иначе Если Выборка.ПроцентНадбавкиНачало = Выборка.ПроцентНадбавкиКонец Тогда Движение.Параметр = Выборка.ПроцентНадбавкиНачало; ИначеЕсли Выборка.ДатаИзменения > Выборка.ПериодДействияНачало И Выборка.ДатаИзменения <= Выборка.ПериодДействияКонец Тогда Движение.Параметр = Выборка.ПроцентНадбавкиНачало; Движение.ПериодДействияКонец = Выборка.ДатаИзменения-1; Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.Параметр = Выборка.ПроцентНадбавкиКонец; Движение.ПериодДействияНачало = Выборка.ДатаИзменения; КонецЕсли; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Расчеты.Расчет(Ссылка); КонецПроцедуры ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, График, Дней, Часов) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Прочитать(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дней = 0; Запись.Часов = 0; Иначе Запись.Дней = Дней; Запись.Часов = Часов; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.График = График; НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дней = 0; Запись.Часов = 0; Иначе Запись.Дней = Дней; Запись.Часов = Часов; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дней = 0; Запись.Часов = 0; Иначе Запись.Дней = Дней; Запись.Часов = Часов; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.График = График; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дней = 0; Запись.Часов = 0; Иначе Запись.Дней = Дней; Запись.Часов = Часов; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры ПВР ОН (Надбавка, Невыход, Оклад) ДН (Премия). РС ГрафикиРаботы (Дата,График,Дней,Часов). РС СведенияОСотрудниках СОтрудник, Подразделение, Оклад,ПроцентНадбавки. РегОбор Продажи ИзмПодразделение,РесСумма. РР ОН (Сотрудник,Подразделение... РезультатЗаЧасы, РезультатЗаЧасы.... Параметр, График) Отчеты НачисленныйОклад ВЫБРАТЬ ОсновныеНачисления.ПериодРегистрации, ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.РезультатЗаДни, ОсновныеНачисления.РезультатЗаЧасы ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ВидРасчета = &ВидРасчета И ОсновныеНачисления.ПериодРегистрации МЕЖДУ &ДатаНачала И &ДатаОкончания Отчет ВедомостьНачислений ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.ПериодРегистрации, ОсновныеНачисления.РезультатЗаЧасы ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодРегистрации МЕЖДУ &ДатаНачала И &ДатаОкончания //3.17 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в днях. //Сумма начисления по окладу определяется как дневная ставка, умноженная на количество фактически отработанных дней. //Дневная ставка оклада одинакова для всех сотрудников и должна быть определена по специальной шкале в зависимости от общего трудового стажа работы сотрудника. //При решении задачи необходимо иметь в виду, что на момент начала ведения учета у сотрудника может быть трудовой стаж отличный от нуля. //Сотруднику предприятия выплачивается надбавка, рассчитываемая как общая сумма продаж товаров за два предыдущих месяца по подразделению, в котором работает сотрудник, умноженная на определенный процент. //Значение процента для надбавки может быть задано в документе. //Сумма надбавки не может быть меньше некоторой гарантированной суммы, задаваемой отдельно для каждого подразделения и зафиксированной в информационной базе. //За каждый день невыхода сотрудника на работу без уважительной причины сотруднику начисляется штраф в размере 10% от дневной ставки по окладу. //Создать обработку «Перерасчет зарплаты», в котором пользователь должен не только увидеть записи регистра расчета, которые возможно требуется пересчитать, но и выполнить саму процедуру перерасчета. //Ввод всех начислений происходит документом «Начисление зарплаты». Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление оклада с 10.01 по 31.01, а запись: оклад с 10.01 по 03.02 вводить нельзя. //Необходимо предоставить пользователю возможность самостоятельно создавать новые виды расчетов и привязывать их к существующим алгоритмам расчета. //ОМ Расчеты Процедура РасчетОН(Ссылка, ПериодРегистрации) Экспорт Набор = РегистрыРасчета.ОсновныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Запрос = Новый Запрос("ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК ВремяФакт |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ПериодРегистрации = &ПериодРегистрации) КАК ОсновныеНачисленияДанныеГрафика"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ПериодРегистрации", ПериодРегистрации); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Если Выборка.НайтиСледующий(Отбор) Тогда Движение.Результат = Движение.Параметр * Выборка.ВремяФакт; Если Движение.ВидРасчета.Алгоритм = Перечисления.Алгоритмы.Штраф Тогда Движение.Результат = -0.1 * Движение.Результат; КонецЕсли; КОнецЕсли; Выборка.Сбросить(); КонецЦикла; Набор.Записать(, Истина); КонецПроцедуры Процедура РасчетДН(Ссылка, ПериодРегистрации) Экспорт Набор = РегистрыРасчета.ДополнительныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ | НачислениеЗарплатыДополнительныеНачисления.Подразделение КАК Подразделение |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДополнительныеНачисления.НомерСтроки, | ЕСТЬNULL(ПродажиОбороты.СуммаОборот, 0) КАК СуммаПродаж, | ЕСТЬNULL(НадбавкиГарантированные.Сумма, 0) КАК НадбавкаГарантированная |ИЗ | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты( | &ДатаНачала, | &ДатаОкончания, | , | Подразделение В | (ВЫБРАТЬ | Список.Подразделение | ИЗ | Список КАК Список)) КАК ПродажиОбороты | ПО ДополнительныеНачисления.Подразделение = ПродажиОбороты.Подразделение | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НадбавкиГарантированные КАК НадбавкиГарантированные | ПО ДополнительныеНачисления.Подразделение = НадбавкиГарантированные.Подразделение |ГДЕ | ДополнительныеНачисления.Регистратор = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", ДобавитьМесяц(ПериодРегистрации, -2)); Запрос.УстановитьПараметр("ДатаОкончания", ПериодРегистрации-1); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Если Выборка.НайтиСледующий(Отбор) Тогда Если Движение.ВидРасчета.Алгоритм = Перечисления.Алгоритмы.Надбавка Тогда Движение.Результат = Макс(Движение.Параметр * Выборка.СуммаПродаж / 100, Выборка.НадбавкаГарантированная); КонецЕсли; КОнецЕсли; Выборка.Сбросить(); КонецЦикла; Набор.Записать(, Истина); КонецПроцедуры //ДОкНачЗП ПериодРегистрации разные ТЧ Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) ПериодРегистрации = НачалоМесяца(ПериодРегистрации); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала, | НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, | НачислениеЗарплатыОсновныеНачисления.График |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.ПериодРегистрации, | Список.Сотрудник, | Список.Подразделение, | Список.ВидРасчета, | Список.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(Список.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | Список.График, | ЕСТЬNULL(СтавкиОкладовОтСтажа.Ставка, 0) КАК Параметр |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСтаже.СрезПоследних( | &ДатаНачала, | Сотрудник В | (ВЫБРАТЬ | Список.Сотрудник | ИЗ | Список КАК Список)) КАК СведенияОСтажеСрезПоследних | ПО Список.Сотрудник = СведенияОСтажеСрезПоследних.Сотрудник | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтавкиОкладовОтСтажа КАК СтавкиОкладовОтСтажа | ПО (ЕСТЬNULL(СведенияОСтажеСрезПоследних.Стаж, 0) МЕЖДУ СтавкиОкладовОтСтажа.Мин И СтавкиОкладовОтСтажа.Макс) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыДополнительныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.Размер КАК Параметр |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", ПериодРегистрации); Результат = Запрос.ВыполнитьПакет(); Если НЕ Результат[1].Пустой() Тогда Движения.ОсновныеНачисления.Загрузить(Результат[1].Выгрузить()); КонецЕсли; Если НЕ Результат[2].Пустой() Тогда Движения.ДополнительныеНачисления.Загрузить(Результат[2].Выгрузить()); КонецЕсли; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); Расчеты.РасчетОН(Ссылка, ПериодРегистрации); Расчеты.РасчетДН(Ссылка, ПериодРегистрации); КонецПроцедуры Перечисления Алгоритмы (Оклад, Штраф, Надбавка) Обработка Перерасчеты Модуль формы &НаКлиенте Процедура Заполнить(Команда) ЗаполнитьНаСервере(); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // &НаСервере Процедура ЗаполнитьНаСервере() Запрос = Новый Запрос("ВЫБРАТЬ | Перерасчет1.ОбъектПерерасчета, | Перерасчет1.ВидРасчета, | Перерасчет1.Сотрудник, | Перерасчет1.Подразделение, | Перерасчет1.ОбъектПерерасчета.ПериодРегистрации КАК ПериодРегистрации |ИЗ | РегистрРасчета.ДополнительныеНачисления.Перерасчет1 КАК Перерасчет1"); Результат = Запрос.Выполнить().Выгрузить(); Перерасчеты.Загрузить(Результат); КонецПроцедуры // ЗаполнитьНаСервере() &НаКлиенте Процедура Пересчитать(Команда) ПересчитатьНаСервере(); ЗаполнитьНаСервере(); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // &НаСервере Процедура ПересчитатьНаСервере() Запрос = Новый Запрос("ВЫБРАТЬ | Перерасчет1.ОбъектПерерасчета, | Перерасчет1.ОбъектПерерасчета.ПериодРегистрации КАК ПериодРегистрации |ИЗ | РегистрРасчета.ДополнительныеНачисления.Перерасчет1 КАК Перерасчет1"); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Расчеты.РасчетДН(Выборка.ОбъектПерерасчета, Выборка.ПериодРегистрации); Набор = РегистрыРасчета.ДополнительныеНачисления.Перерасчеты.Перерасчет1.СоздатьНаборЗаписей(); Набор.Отбор.ОбъектПерерасчета.Установить(Выборка.ОбъектПерерасчета); Набор.Записать(); КонецЦикла; КонецПроцедуры // ПересчитатьНаСервере() В ПВР Добавляем алгоритм ОН (Оклад,Штраф) ДН (Надбавка) РС СтавкиОкладовОтСтажа (Изм. Мин, Макс рес. Ставка). РС НадбавкиГарантированные ИзмПОдразделерние,Рес.Сумма РС СведенияОСтаже в пределах дня (Сотрудник, Стаж) РР ОН (Подразделение,СОтрудник,... Результат,...График,Параметр) Перерасчет1 (Сотрудник,Подразделеие) РР ДН Подразделение,СОтрудник,... Результат,... Параметр) Перерасчет1 (Сотрудник,Подразделеие) //3.18 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по часовому тарифу. //Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных часов. //Тарифная ставка в расчетном периоде может меняться не чаще, чем один раз в день. //Сотрудники работают по сменному графику «Сутки через двое». Для организации непрерывного рабочего цикла на предприятии работает три бригады: 1 бригада в первый день работает, во второй и третий отдыхает, 2 бригада работает во второй день, в первый и третий отдыхает, и 3 бригада в третий день работает, в первый и второй отдыхает. //Сотруднику предприятия выплачивается надбавка, рассчитываемая как общая сумма продаж товаров за предыдущий квартал по бригаде, в которой работает сотрудник, умноженная на определенный процент. //Значение процента для надбавки определяется по специальной шкале в зависимости от суммы продаж. //Первого числа каждого квартала шкала может быть изменена. В информационной базе необходимо хранить историю изменения шкалы. //Помимо надбавки, начальникам бригад выплачивается премия в виде процента от надбавки сотрудника своей бригады, получившего максимальную сумму надбавки. //Ввод премии начальнику бригады осуществляется документом«Начисление зарплаты». //Информация о должностях сотрудников должна быть взята из информационной базы. //Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по тарифу с 10.01 по 31.01, а запись: тариф с 10.01 по 03.02 вводить нельзя. //Для анализа полученных сотрудниками предприятия надбавок в конфигурации необходимо предусмотреть отчет следующего вида: ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ЧасовФакт |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНАчисления.Оклад)) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Пока Выборка.НайтиСледующий(Поиск) Цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ЧасовФакт; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки, | ДополнительныеНачисленияБазаДополнительныеНачисления.СотрудникРазрез, | ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза КАК Результат |ПОМЕСТИТЬ ВТ |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления( | &Измерение, | &Измерение, | &Разрез, | Регистратор = &Ссылка | И ВидРАсчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия)) КАК ДополнительныеНачисленияБазаДополнительныеНачисления |ГДЕ | ДополнительныеНачисленияБазаДополнительныеНачисления.СотрудникРазрез.Должность <> ЗНАЧЕНИЕ(Справочник.Должности.Руководитель) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ.НомерСтроки, | МАКСИМУМ(ВТ.Результат) КАК Результат |ИЗ | ВТ КАК ВТ | |СГРУППИРОВАТЬ ПО | ВТ.НомерСтроки"; Измерение = новый Массив; Измерение.Добавить("Подразделение"); Разрез = Новый Массив; Разрез.Добавить("Сотрудник"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Разрез", Разрез); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Пока Выборка.НайтиСледующий(Поиск) Цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер/100*Выборка.Результат; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры СоздСпр ГрафикиРаботы,Должности ДокНачЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник КАК Сотрудник, | ТЧДок.Подразделение КАК Подразделение, | &НачалоМесяца КАК НачалоВИстории, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Оклад, 0) КАК Оклад |ПОМЕСТИТЬ ВТОклады |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | СведенияОСотрудниках.Сотрудник, | СведенияОСотрудниках.Подразделение, | СведенияОСотрудниках.Период, | СведенияОСотрудниках.Оклад |ИЗ | РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках |ГДЕ | СведенияОСотрудниках.Период > &НачалоМесяца | И СведенияОСотрудниках.Период <= &КонецМесяца | И СведенияОСотрудниках.Сотрудник В | (ВЫБРАТЬ | Т.Сотрудник | ИЗ | ТЧДок КАК Т) | И СведенияОСотрудниках.Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧДок КАК Т) | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПродажиОбороты.Подразделение КАК Подразделение, | ПродажиОбороты.СуммаПродажОборот |ПОМЕСТИТЬ ВТПродажи |ИЗ | РегистрНакопления.Продажи.Обороты( | &НачалоКвартала, | &КонецКвартала, | , | Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК ПродажиОбороты | |ИНДЕКСИРОВАТЬ ПО | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник КАК Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета КАК ВидРасчета, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ТЧДок.Размер, | ТЧДок.ГрафикРаботы, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(ВТОклады.Оклад, 0) КАК Оклад, | ВТОклады.НачалоВИстории КАК НачалоВИстории, | ЕСТЬNULL(ВТПродажи.СуммаПродажОборот, 0) КАК СуммаПродаж, | ЕСТЬNULL(ШкалаПродажСрезПоследних.Процент, 0) КАК ПроцентПродажи |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ВТОклады КАК ВТОклады | ПО ТЧДок.Сотрудник = ВТОклады.Сотрудник | И ТЧДок.Подразделение = ВТОклады.Подразделение | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)) | ЛЕВОЕ СОЕДИНЕНИЕ ВТПродажи КАК ВТПродажи | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаПродаж.СрезПоследних( | &КонецМесяца, | Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК ШкалаПродажСрезПоследних | ПО ВТПродажи.Подразделение = ШкалаПродажСрезПоследних.Подразделение | И ВТПродажи.СуммаПродажОборот > ШкалаПродажСрезПоследних.От | И ВТПродажи.СуммаПродажОборот <= ШкалаПродажСрезПоследних.До | ПО ТЧДок.Подразделение = ВТПродажи.Подразделение | И (ТЧДок.ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Надбавка), ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия))) | |СГРУППИРОВАТЬ ПО | ТЧДок.Подразделение, | ТЧДок.Сотрудник, | ТЧДок.ПериодДействияКонец, | ВТОклады.НачалоВИстории, | ТЧДок.ПериодРегистрации, | ТЧДок.ПериодДействияНачало, | ТЧДок.ВидРасчета, | ТЧДок.ГрафикРаботы, | ЕСТЬNULL(ВТОклады.Оклад, 0), | ЕСТЬNULL(ВТПродажи.СуммаПродажОборот, 0), | ЕСТЬNULL(ШкалаПродажСрезПоследних.Процент, 0), | ТЧДок.Размер | |УПОРЯДОЧИТЬ ПО | ВидРасчета, | НачалоВИстории |ИТОГИ ПО | Сотрудник"; Запрос.УстановитьПараметр("Ссылка",Ссылка); Запрос.УстановитьПараметр("НачалоМесяца",НачалоМесяца(Дата)); Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Дата)); Запрос.УстановитьПараметр("НачалоКвартала", ДобавитьМесяц(НачалоМесяца(Дата),-3)); Запрос.УстановитьПараметр("КонецКвартала", НачалоМесяца(Дата)-1); Результат = Запрос.Выполнить(); ВыборкаСотрудник = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСотрудник.Следующий() Цикл Выборка = ВыборкаСотрудник.Выбрать(); СледующаяСтрока = Ложь; Пока Выборка.Следующий() цикл Если ТипЗнч(Выборка.ВидРАсчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") Тогда Если Ложь Тогда Движение= Неопределено; КонецЕсли; Если СледующаяСтрока Тогда Движение.ПериодДействияКонец = Макс(Выборка.ПериодДействияНачало, Выборка.НачалоВИстории)-1 ; КонецЕсли; Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Движение.ПериодДействияНачало = Макс(Выборка.ПериодДействияНачало, Выборка.НачалоВИстории); Движение.Размер = Выборка.Оклад; СледующаяСтрока = Истина; Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Движение.БазовыйПериодНачало = Выборка.ПериодДействияНачало; Движение.БазовыйПериодКонец = Выборка.ПериодДействияКонец; Если Выборка.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.Надбавка Тогда Движение.Результат = Выборка.СуммаПродаж*Выборка.ПроцентПродажи; Движение.СуммаПродаж = Выборка.СуммаПродаж; Движение.Размер = Выборка.ПроцентПродажи/100; КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка,Движения.ДополнительныеНачисления); КонецПроцедуры ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, ГрафикРаботы) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.ГрафикРаботы.Установить(ГрафикРаботы); Набор.Прочитать(); //Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Счетчик = 0; Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.ГрафикРаботы = ГрафикРаботы; Если ГрафикРаботы = Справочники.ГрафикиРаботы.Бригада1 Или ГрафикРаботы = Справочники.ГрафикиРаботы.Бригада2 Или ГрафикРаботы = Справочники.ГрафикиРаботы.Бригада3 Тогда Счетчик = Счетчик+1; Если Счетчик%3 = 0 Тогда Запись.Значение = 8; Иначе Запись.Значение= 0 ; КонецЕсли; ИНаче Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры ПВР ОН (Оклад), ДН (Надбавка,Премия) РС ШкалаПродаж (Изм. Подразделение,От,До рес. Процент) РН Продажи (Подраздление, СуммаПродаж) РР ОН (Сотрудник,Подразделение, Резульата, ГрафикРАботы, Размер) ДН (Сотрудник,Подразделение,Результат,Размер,СуммаПродаж) Отчет АнализНадбавок ВЫБРАТЬ ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.СуммаПродаж, ДополнительныеНачисления.Размер КАК ПроцентНадбавки, ДополнительныеНачисления.Результат КАК СуммаПремии ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода И ДополнительныеНачисления.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Надбавка) //3.19 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по часовому тарифу. Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных часов. //Тарифная ставка в расчетном периоде не меняется. //Сотрудники работают по сменному графику «Сутки через двое». //Сотруднику предприятия выплачивается надбавка, рассчитываемая как общая сумма продаж товаров за предыдущие три месяца по подразделению, в котором работает сотрудник, умноженная на определенный процент. //Значение процента для надбавки определяется по специальной шкале в зависимости от суммы продаж. //Первого числа каждого месяца шкала может быть изменена, но хранить историю изменения шкалы не требуется. //Помимо надбавки, руководителям подразделений выплачивается премия в виде процента от суммы надбавок за предыдущий месяц сотрудников их подразделения. //С надбавки самого руководителя премия не начисляется. //Ввод надбавки руководителю подразделения осуществляется документом «Начисление зарплаты». //Информацию о должностях сотрудников в информационной базе хранить не надо. //Создать отчет «Перерасчет зарплаты», в котором пользователь должен увидеть записи регистра расчета, которые возможно требуется пересчитать. //Обратите внимание, в отчете должна отражаться также информация о необходимости перерасчета надбавки при исправлении суммы продаж. //Саму процедуру перерасчета записей в рамках данной задачи реализовывать не требуется. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по тарифу с 10.01 по 31.01, а запись: тариф с 10.01 по 03.02 вводить нельзя. //Для анализа полученных сотрудниками предприятия надбавок в конфигурации необходимо предусмотреть отчет следующего вида: ОМ РасчетЗаработнойПлаты Процедура РассчитатьОсновныеНачисления(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасов |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ФактЧасов; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДополнительныеНачисления(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ДополнительныеНачисленияБазаДополнительныеНачисления.СотрудникРазрез |ПОМЕСТИТЬ ВТБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерение, &Измерение, &Разрез, Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаДополнительныеНачисления |ГДЕ | НЕ ДополнительныеНачисленияБазаДополнительныеНачисления.СотрудникРазрез.Руководитель |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТБаза.НомерСтроки, | СУММА(ВТБаза.РезультатБаза) КАК РезультатБаза |ИЗ | ВТБаза КАК ВТБаза | |СГРУППИРОВАТЬ ПО | ВТБаза.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Подразделение"); Разрез = Новый Массив; Разрез.Добавить("Сотрудник"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Разрез", Разрез); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер/100*Выборка.РезультатБаза; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры ДОкНачЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПродажиОбороты.Подразделение КАК Подразделение, | ПродажиОбороты.СуммаОборот КАК СуммаПродажи |ПОМЕСТИТЬ ВТПродажи |ИЗ | РегистрНакопления.Продажи.Обороты( | &НачалоПериода, | &КонецПериода, | , | Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК ПродажиОбороты | |ИНДЕКСИРОВАТЬ ПО | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.ГрафикРаботы, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ТЧДок.Размер, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(ВТПродажи.СуммаПродажи, 0) КАК СуммаПродажи, | ЕСТЬNULL(ШкалаПродажСрезПоследних.Процент, 0) КАК ПроцентПремии |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ВТПродажи КАК ВТПродажи | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаПродаж.СрезПоследних( | &КонецМесяца, | Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК ШкалаПродажСрезПоследних | ПО ВТПродажи.СуммаПродажи > ШкалаПродажСрезПоследних.От | И ВТПродажи.СуммаПродажи <= ШкалаПродажСрезПоследних.До | ПО ТЧДок.Подразделение = ВТПродажи.Подразделение | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(планВидовРасчета.ДополнительныеНачисления.Надбавка))"; Запрос.УстановитьПараметр("КонецМесяца" , КонецМесяца(Дата)); Запрос.УстановитьПараметр("КонецПериода" , НачалоМесяца(Дата)-1); Запрос.УстановитьПараметр("НачалоПериода" , ДобавитьМесяц(НачалоМесяца(Дата),-3)); Запрос.УстановитьПараметр("Ссылка" , Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если ТипЗнч(Выборка.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.Надбавка Тогда Движение.Размер = Выборка.ПроцентПремии; Движение.СуммаПродаж = Выборка.СуммаПродажи; Движение.Результат = Выборка.СуммаПродажи*Выборка.ПроцентПремии/100; Иначе Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Дата),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Дата)-1; КонецЕсли; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОсновныеНачисления(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДополнительныеНачисления(Ссылка, Движения.ДополнительныеНачисления); КонецПроцедуры ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, ГрафикРаботы) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.ГрафикРаботы.Установить(ГрафикРаботы); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Счетчик = 0; Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.ГрафикРаботы = ГрафикРаботы; Если ГрафикРаботы = Справочники.ГрафикРаботы.СуткиЧерезДвое Тогда Счетчик = Счетчик+1; Если Счетчик%3=0 Тогда Запись.Значение = 24; Иначе Запись.Значение = 0; КонецЕсли; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры ПВР ОН (Оклад), ДН (Надбавка, Премия) РС ШкалаПродаж (Подразделение, От, До, Процент). РН Продажи (Подразделение,Сумма). РР ОН (Сотрудник, Подразделение, Результат, Размер, ГрафикРаботы). ДН (Сотрудник, Подразделение, Резльтат, Размер,СуммаПродаж). Перерасчет Дополнительно (Сотрудник, ПОдразделение) . Отчет ПересчетЗаработнойПлаты ВЫБРАТЬ Дополнительно.ОбъектПерерасчета, Дополнительно.ВидРасчета, Дополнительно.Сотрудник, Дополнительно.Подразделение ИЗ РегистрРасчета.ДополнительныеНачисления.Дополнительно КАК Дополнительно Отчет АнализНадбавок ВЫБРАТЬ ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Результат КАК СуммаПремии, ДополнительныеНачисления.Размер КАК ПроцентНадбавки, ДополнительныеНачисления.СуммаПродаж ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода И ДополнительныеНачисления.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Надбавка) //3.20 ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по часовому тарифу. //Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных часов, причем для каждого подразделения компании ведется свой график. //Тарифная ставка должна быть определена отдельно для каждого подразделения по специальной шкале в зависимости от отработанного времени. //Например: За каждый день работы сотрудникам предприятия начисляется определенная сумма денег в качестве компенсации затрат на обеды. //Компенсация за один обед рассчитывается как 5% от суммы начисления по тарифу в текущем расчетном периоде, деленная на количество рабочих дней в том же периоде. //Невыход сотрудника на работу без уважительной причины должен бытьзафиксирован в информационной базе, но не оплачивается. //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по тарифу с 10.01 по 31.01, а запись: тариф с 10.01 по 03.02 вводить нельзя. //Необходимо предоставить пользователю возможность исправлять результат расчета в форме документа. //Для анализа начисленных сотрудникам предприятия компенсаций за обеды в конфигурации необходимо предусмотреть отчет следующего вида: //Ом РасчетЗаработнойПлаты Процедура РассчитатьОС(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасов, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниФактическийПериодДействия, 0) КАК ФактДней, | ЕСТЬNULL(ШкалаПроцента.Тариф, 0) КАК Тариф, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниПериодДействия, 0) КАК ПланДни |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаПроцента КАК ШкалаПроцента | ПО ОсновныеНачисленияДанныеГрафика.Подразделение = ШкалаПроцента.Подразделение | И ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия >= ШкалаПроцента.От | И ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия < ШкалаПроцента.До"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.Результат =0 тогда СтрокаДвижения.Результат = Выборка.Тариф * Выборка.ФактЧасов; КонецЕсли; СтрокаДвижения.ОтработаноДни = Выборка.ФактДней; СтрокаДвижения.ОтработаноРабочиеДни = Выборка.ПланДни; СтрокаДвижения.ФактОтработаноЧасов = Выборка.фактЧасов; СтрокаДвижения.Размер = Выборка.Тариф; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.ОтработаноДниБаза, 0) КАК ОтработаноДниБаза, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.ОтработаноРабочиеДниБаза, 0) КАК ОтработаноРабочиеДни |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.КомпенсацияЗаОбеды)) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.ДнейКомпенсации = Выборка.ОтработаноДниБаза; Если СтрокаДвижения.Результат =0 тогда СтрокаДвижения.Результат = Выборка.ОтработаноДниБаза*Выборка.РезультатБаза*0.05/Выборка.ОтработаноРабочиеДни; КонецЕсли; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры //В тч зп начисл доабавляеи резалт //модуль формы &НаКлиенте Процедура КомандаЗаполнить(Команда) ЗаполнитьНаСервере(); КонецПроцедуры &НаСервере Процедура ЗаполнитьНаСервере() ДокументОбъект = РеквизитФормыВЗначение("Объект"); ДокументОбъект.ОБщийРасчет(Истина); ЗначениеВРеквизитФормы(ДокументОбъект,"Объект"); КонецПроцедуры // ЗаполнитьНаСервере() //Модуль обджекта Процедура ОбработкаПроведения(Отказ, РежимПроведения) ОБщийРасчет(); КонецПроцедуры Процедура ОБщийРасчет(ЗапускИзФормыДокумента = Ложь) Экспорт Если ЗапускИзФормыДокумента Тогда Если ЭтоНовый() Тогда ЭтотОбъект.Записать(); КонецЕсли; НачатьТранзакцию(); КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Результат, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если ТипЗнч(Выборка.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если ЗапускИзФормыДокумента Тогда Движение.Результат = 0; Продолжить; КонецЕсли; Если Выборка.Результат <>0 Тогда Движение.Результат = Выборка.Результат; КонецЕсли; Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.БазовыйПериодНачало = Выборка.ПериодДействияНачало; Движение.БазовыйПериодКонец = Выборка.ПериодДействияКонец; Если ЗапускИзФормыДокумента Тогда Движение.Результат = 0; Продолжить; КонецЕсли; Если Выборка.Результат <>0 Тогда Движение.Результат = Выборка.Результат; КонецЕсли; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОС(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления); Если ЗапускИзФормыДокумента Тогда ПеренестиДанныеВДокумент(); ОтменитьТранзакцию(); КонецЕсли; КонецПроцедуры Процедура ПеренестиДанныеВДокумент() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисления.Подразделение, | ОсновныеНачисления.Сотрудник, | ОсновныеНачисления.Результат, | ОсновныеНачисления.ГрафикРаботы, | ОсновныеНачисления.ПериодДействияНачало КАК ДатаНачала, | ОсновныеНачисления.ПериодДействияКонец КАК ДатаОкончания, | ОсновныеНачисления.ВидРасчета |ИЗ | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления |ГДЕ | ОсновныеНачисления.Регистратор = &Регистратор | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ДополнительныеНачисления.Подразделение, | ДополнительныеНачисления.Сотрудник, | ДополнительныеНачисления.Результат, | NULL, | ДополнительныеНачисления.БазовыйПериодНачало, | ДополнительныеНачисления.БазовыйПериодКонец, | ДополнительныеНачисления.ВидРасчета |ИЗ | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления |ГДЕ | ДополнительныеНачисления.Регистратор = &Регистратор"; Запрос.УстановитьПараметр("Регистратор", Ссылка); Результат = Запрос.Выполнить(); ОсновныеНачисления.Загрузить(Результат.Выгрузить()); КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, ГрафикРаботы) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.ГрафикРАботы.Установить(ГрафикРаботы); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.ГрафикРаботы = ГрафикРаботы; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Запись.ЗначениеДни = 0; Иначе Запись.Значение = 8; Запись.ЗначениеДни =1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Оклад, Невыходы), ДН (КомпенсацияЗаОбеды). //РС ШкалаПроцента (Подразделение, От,До, Тариф) //РС ГРафикРаботы (ГрафикРаботы,Дата, Значение, ЗначениеДни). //РР ОН (Подразделение,Сотрудник, Результат, ОтработаноДни, ОтработаноРабочиеДни, ФактОтработаноЧасов, Размер,ГрафикРаботы). //РР ДН (Подразделение,Сотрудник, Результат, ОтработаноДни, ДнейКомпенсации) //Отчет АнализНачислений ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.Результат КАК СуммаКомпенсации, ДополнительныеНачисления.ДнейКомпенсации, ЕСТЬNULL(ОсновныеНачисления.ФактОтработаноЧасов, 0) КАК ФактическиОтработанныеЧасы, ЕСТЬNULL(ОсновныеНачисления.Размер, 0) КАК РазмерСтавки ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ПО ДополнительныеНачисления.Регистратор = ОсновныеНачисления.Регистратор ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода И ОсновныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода //3.21 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждого подразделения отдельно. //Не зависимо от отработанного времени сотрудникам предприятия ежемесячно выплачивается фиксированная сумма денег. //Размер суммы одинаков для всех сотрудников и не меняется в течение расчетного периода. //В любой момент времени сотрудникам предоставляется оплачиваемый отпуск, размер которого определяется как количество дней отпуска умноженное на среднюю дневную ставку. //Дни отпуска рассчитываются по шестидневному графику. //Средняя дневная ставка определяется как сумма начисленного за три предыдущих месяца гарантированного оклада, поделенная на количество рабочих дней в трех предыдущих месяцах. //Количество предоставляемых в год рабочих дней отпуска не должно превышать 24. //Ежемесячно с сотрудников организации удерживается 1% от суммы всех начислений за период в качестве профсоюзных взносов. //Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что данные о начислении по отпуску могут переходить из одного месяца в другой (например, с 25.01 по 05.02.), при этом, данное начисление в документе вводится одной строкой с указанием полного периода. //Необходимо предоставить пользователю возможность самостоятельно создавать новые виды расчетов и привязывать их к существующим алгоритмам расчета. //С помощью диаграммы Ганта отобразить график отпусков сотрудников. Отчет может быть построен за любой расчетный период. //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОС(Ссылка, ОсновныеНачисления, Отказ) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.Сотрудник, | ОсновныеНачисленияДанныеГрафика.Подразделение, | СУММА(ОсновныеНачисленияДанныеГрафика.ЗначениеШестидневкаДниФактическийПериодДействия) КАК ФактДни, | ОсновныеНачисленияДанныеГрафика.ПериодДействия, | МАКСИМУМ(&НачалоПериод) КАК НачалоПериод |ПОМЕСТИТЬ ДниОтпуск |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | ПериодДействия >= &НачалоПериод | И ПериодДействия < &КонецПериода | И ВидРасчета.АлгоритмРасчета = ЗНАЧЕНИЕ(Перечисление.АлгоритмыРасчета.Отпуск)) КАК ОсновныеНачисленияДанныеГрафика | |СГРУППИРОВАТЬ ПО | ОсновныеНачисленияДанныеГрафика.Сотрудник, | ОсновныеНачисленияДанныеГрафика.Подразделение, | ОсновныеНачисленияДанныеГрафика.ПериодДействия |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеШестидневкаДниФактическийПериодДействия, 0) КАК ДнейОтпуска, | ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод, 0) КАК РабочихДней |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета.АлгоритмРасчета = ЗНАЧЕНИЕ(Перечисление.АлгоритмыРасчета.Отпуск)) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета.АлгоритмРасчета = ЗНАЧЕНИЕ(Перечисление.АлгоритмыРасчета.Отпуск)) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.Сотрудник КАК Сотрудник, | ОсновныеНачисленияДанныеГрафика.Подразделение, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеШестидневкаДниФактическийПериодДействия, 0) + ЕСТЬNULL(ДниОтпуск.ФактДни, 0) КАК ВсегоДнейОтпуска |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета.АлгоритмРасчета = ЗНАЧЕНИЕ(Перечисление.АлгоритмыРасчета.Отпуск)) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ ДниОтпуск КАК ДниОтпуск | ПО ОсновныеНачисленияДанныеГрафика.Сотрудник = ДниОтпуск.Сотрудник | И ОсновныеНачисленияДанныеГрафика.Подразделение = ДниОтпуск.Подразделение | И (ВЫБОР | КОГДА ОсновныеНачисленияДанныеГрафика.ПериодДействия = ДниОтпуск.НачалоПериод | ТОГДА ЛОЖЬ | ИНАЧЕ ОсновныеНачисленияДанныеГрафика.ПериодДействия = ДниОтпуск.ПериодДействия | КОНЕЦ) |ИТОГИ | СУММА(ВсегоДнейОтпуска) |ПО | Сотрудник"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); ЗАпрос.УстановитьПараметр("НачалоПериод", НачалоГода(Ссылка.Дата)); Запрос.УстановитьПараметр("КонецПериода",КонецДня(Ссылка.Дата)); Результат = Запрос.ВыполнитьПакет(); Выборка = Результат[1].Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) Цикл СредняяДневнаяСтавка = ?(Выборка.РабочихДней=0,0, Выборка.РезультатБаза/Выборка.РабочихДней); СтрокаДвижения.Результат = Выборка.ДнейОтпуска*СредняяДневнаяСтавка; КонецЦикла; КонецЦикла; Выборка = Результат[2].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока Выборка.Следующий() цикл Если Выборка.ВсегоДнейОтпуска>24 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "По сотруднику "+Выборка.Сотрудник+" превышен срок отпуска.Указанный срок "+Выборка.ВсегоДнейОтпуска; Сообщение.Сообщить(); ОТказ = ИСтина; КонецЕсли; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьУдержания(Ссылка, Удержания, Отказ ) Экспорт Если Отказ Тогда Возврат; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(УдержанияБазаОсновныеНачисления.НомерСтроки, УдержанияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(УдержанияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(УдержанияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.Удержания.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК УдержанияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.Удержания.БазаДополнительныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК УдержанияБазаДополнительныеНачисления | ПО УдержанияБазаОсновныеНачисления.НомерСтроки = УдержанияБазаДополнительныеНачисления.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из Удержания цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = Выборка.РезультатБаза*0.01; КонецЦикла; КонецЦикла; Удержания.Записать(,Истина ); КонецПроцедуры //МодульДокНачЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета.АлгоритмРасчета КАК АлгоритмРасчета |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.АлгоритмРасчета = Перечисления.АлгоритмыРасчета.ФиксированнаяСумма Тогда Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Движение.Результат = Выборка.Размер; ИначеЕсли Выборка.АлгоритмРасчета = Перечисления.АлгоритмыРасчета.Отпуск Тогда ТекДата = Выборка.ПериодДействияНачало; Пока НачалоМесяца(ТекДата)<= НачалоМесяца(Выборка.ПериодДействияКонец) цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Подразделение = Выборка.Подразделение; Движение.Сотрудник = Выборка.Сотрудник; Движение.ВидРасчета = Выборка.ВидРасчета; Движение.ПериодРегистрации = Дата; Движение.ПериодДействияНачало = Макс(ТекДата,Выборка.ПериодДействияНачало); Движение.ПериодДействияКонец = Мин(КонецМесяца(ТекДата), Выборка.ПериодДействияКонец); Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Движение.ПериодДействияНачало),-3); Движение.БазовыйПериодКонец = НачалоМесяца(Движение.ПериодДействияНачало)-1; ТекДата = КонецМесяца(ТекДата)+1; КонецЦикла; ИначеЕсли Выборка.АлгоритмРасчета = Перечисления.АлгоритмыРасчета.Взносы Тогда Движение = Движения.Удержания.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.БазовыйПериодНачало = Выборка.ПериодДействияНачало; Движение.БазовыйПериодКонец = Выборка.ПериодДействияКонец; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); Движения.Удержания.Записать(); РасчетЗаработнойПлаты.РассчитатьОС(Ссылка, Движения.ОсновныеНачисления, Отказ); РасчетЗаработнойПлаты.РассчитатьУдержания(Ссылка, Движения.Удержания, Отказ); КонецПроцедуры //Переч АлгоритмыРасчета (ФиксированнаяСумма, Отпуск, Взносы). //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, Подразделение) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.Подразделение.Установить(Подразделение); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.Подразделение = Подразделение; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 1; КонецЕсли; пДеньНедели = ДеньНедели(Дат); Если пДеньНедели = 7 Тогда Запись.ЗначениеШестидневкаДни = 0; Иначе Запись.ЗначениеШестидневкаДни = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Отпуск), ДН (ФиксированнаяСумма), //РС ГрафикиРаботы (Дата, Подразделение, Значение, ЗначениеШестидневкаДни) //РР ОН (Сотрудник,Подразделение,Результат,Размер) //РР ДН (Сотрудник,Подразделение,Результат) //РР У (Сотрудник,Подразделение,Результат) //Отчет ДиаграммаГанта //Рекв формы ДиаграммаГанта (ДиаграммаГанта), Интервал (СтандартныйПериод) &НаКлиенте Процедура КомандаСформировать(Команда) СформироватьНаСервере(ДиаграммаГанта, интервал); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // &НаСервере Процедура СформироватьНаСервере(ДиаграммаГанта, интервал) ДиаграммаГанта.Обновление = Ложь; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияФактическийПериодДействия.Сотрудник, | ОсновныеНачисленияФактическийПериодДействия.Подразделение, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало КАК Начало, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец КАК Конец, | ОсновныеНачисленияФактическийПериодДействия.ВидРасчета |ИЗ | РегистрРасчета.ОсновныеНачисления.ФактическийПериодДействия( | ВидРасчета.АлгоритмРасчета = ЗНАЧЕНИЕ(Перечисление.АлгоритмыРасчета.Отпуск) | И (ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода)) КАК ОсновныеНачисленияФактическийПериодДействия"; Запрос.УстановитьПараметр("КонецПериода", Интервал.ДатаОкончания); Запрос.УстановитьПараметр("НачалоПериода", Интервал.ДатаНачала); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Точка = ДиаграммаГанта.УстановитьТочку(Выборка.Сотрудник); Серия = ДиаграммаГанта.УстановитьСерию(Выборка.ВидРасчета); Значение = ДиаграммаГанта.ПолучитьЗначение(Точка, Серия); НовыйИнтервал = Значение.Добавить(); НовыйИнтервал.Начало = Выборка.Начало; НовыйИнтервал.Конец = Выборка.Конец; КонецЦикла; ДиаграммаГанта.Обновление = Истина; КонецПроцедуры // СформироватьНаСервере(ДиаграммаГанта, Интервал)() //3.22 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждого подразделения отдельно. //Не зависимо от отработанного времени сотрудникам предприятия ежемесячно выплачивается фиксированная сумма денег. //Размер суммы одинаков для всех сотрудников. После проведения расчетов, в том же расчетном периоде размер суммы может быть признан ошибочным и подлежит исправлению. //Сотрудники могут работать сверхурочно. //За каждый час сверхурочно отработанного времени начисляется надбавка в размере 50% от среднего заработка за предыдущий месяц. //Средний заработок рассчитывается как сумма всех начислений в прошлом месяце, поделенная на количество рабочих часов в этом месяце. //Дополнительно, сотрудникам компании может быть начислена премия процентом от всех начислений, сделанных в предыдущем же расчетном периоде. //Процент премии в течение периода начисления может изменяться не чаще, чем один раз в день, но берется на начало текущего расчетного периода. //В информационной базе необходимо хранить историю изменения процента премии. //Ежемесячно с сотрудников организации удерживается 1% от суммы всех начислений за период в качестве профсоюзных взносов. //Создать обработку «Перерасчет зарплаты», в котором пользователь должен не только увидеть записи регистра расчета, которые возможно требуется пересчитать, но и выполнить саму процедуру перерасчета. //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления,ЭтоПересчет = Ложь) Экспорт Запрос = Новый Запрос; УсловиеПересчета = ""; Если ЭтоПересчет Тогда Запрос.Текст = "ВЫБРАТЬ | Основной.ОбъектПерерасчета, | Основной.ВидРасчета, | Основной.Сотрудник, | Основной.Подразделение |ПОМЕСТИТЬ ВТСверхУрочные |ИЗ | РегистрРасчета.ОсновныеНачисления.Основной КАК Основной |ГДЕ | Основной.ОбъектПерерасчета = &Ссылка | И Основной.ВидРасчета = &СверхУрочные |///////////////////////////////////////// |;"; УсловиеПересчета = "(Сотрудник,Подразделение) В (Выбрать Т.Сотрудник,Т.Подразделение из ВТСверхУрочные как Т) "; КонецЕсли; Запрос.Текст = Запрос.Текст + "ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ПОМЕСТИТЬ ВТБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка"+?(ЭтоПересчет," И "+УсловиеПересчета,"")+") КАК ОсновныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка"+?(ЭтоПересчет," И "+УсловиеПересчета,"")+") КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК ПланЧасов, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасов, | ЕСТЬNULL(ВТБаза.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Сверхурочно) "+?(ЭтоПересчет," И "+УсловиеПересчета,"")+") КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ ВТБаза КАК ВТБаза | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ВТБаза.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("СверхУрочные",ПланыВидовРасчета.ОсновныеНачисления.СверхУрочно); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.Результат <>0 Тогда Продолжить; КонецЕсли; СредняяСтавка = ?(Выборка.ПланЧасов=0,0, Выборка.РезультатБаза*0.5/Выборка.ПланЧасов); СтрокаДвижения.Результат = Выборка.ФактЧасов*СредняяСтавка; КонецЦикла; КонецЦикла; ТолькоЗапись = ?(ЭтоПересчет,Ложь,Истина); ОсновныеНачисления.Записать(,ТолькоЗапись); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления,ЭтоПересчет = Ложь) Экспорт Запрос = Новый Запрос; УсловиеПересчета = ""; Если ЭтоПересчет Тогда Запрос.Текст = "ВЫБРАТЬ | Дополнительно.ОбъектПерерасчета, | Дополнительно.ВидРасчета, | Дополнительно.Сотрудник, | Дополнительно.Подразделение |ПОМЕСТИТЬ ВТДопНачисления |ИЗ | РегистрРасчета.ДополнительныеНачисления.Дополнительно КАК Дополнительно |ГДЕ | Дополнительно.ОбъектПерерасчета = &Ссылка | И Дополнительно.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия) |///////////////////// |;"; УсловиеПересчета = " И (Сотрудник,Подразделение) В (Выбрать Т.Сотрудник,Т.Подразделение из ВТДопНачисления как Т)"; КонецЕсли; Запрос.Текст = Запрос.Текст+ "ВЫБРАТЬ | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка"+?(ЭтоПересчет,УсловиеПересчета,"")+") КАК ДополнительныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка"+?(ЭтоПересчет,УсловиеПересчета,"")+") КАК ДополнительныеНачисленияБазаДополнительныеНачисления | ПО ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.Результат <>0 Тогда Продолжить; КонецЕсли; СтрокаДвижения.Результат = СтрокаДвижения.Размер/100*Выборка.РезультатБаза; КонецЦикла; КонецЦикла; ТолькоЗапись = ?(ЭтоПересчет,Ложь,Истина); ДополнительныеНачисления.Записать(,ТолькоЗапись); КонецПроцедуры Процедура РассчитатьУД(Ссылка, Удержания,ЭтоПересчет = Ложь) Экспорт Запрос = Новый Запрос; Условие = ""; Если ЭтоПересчет Тогда Запрос.Текст = "ВЫБРАТЬ | Удержано.ОбъектПерерасчета, | Удержано.ВидРасчета, | Удержано.Сотрудник, | Удержано.Подразделение |ПОМЕСТИТЬ ВТУдержания |ИЗ | РегистрРасчета.Удержания.Удержано КАК Удержано |ГДЕ | Удержано.ОбъектПерерасчета = &Ссылка | И Удержано.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.Удержания.Профвзносы) |/////////////////// |;"; Условие = " И (Сотрудник,Подразделение) В (Выбрать Т.Сотрудник,Т.Подразделение из ВТУдержания как Т)"; КонецЕсли; Запрос.Текст = Запрос.Текст+ "ВЫБРАТЬ | ЕСТЬNULL(УдержанияБазаДополнительныеНачисления.НомерСтроки, УдержанияБазаОсновныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(УдержанияБазаДополнительныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(УдержанияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.Удержания.БазаДополнительныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка"+?(ЭтоПересчет,Условие,"")+") КАК УдержанияБазаДополнительныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.Удержания.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка"+?(ЭтоПересчет,Условие,"")+") КАК УдержанияБазаОсновныеНачисления | ПО УдержанияБазаДополнительныеНачисления.НомерСтроки = УдержанияБазаОсновныеНачисления.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из Удержания цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.Результат <>0 Тогда Продолжить; КонецЕсли; СтрокаДвижения.Результат = 0.01*Выборка.РезультатБаза; КонецЦикла; КонецЦикла; ТолькоЗапись = ?(ЭтоПересчет,Ложь,Истина); Удержания.Записать(,ТолькоЗапись); КонецПроцедуры //В тч док нач доб результат //Форма док &НаКлиенте Процедура ЗаполнитьРезультат(Команда) РассчитатьРезультатНаСервере(); Модифицированность = Истина; КонецПроцедуры &НаСервере Процедура РассчитатьРезультатНаСервере() ДокументОбъект = РеквизитФормыВЗначение("Объект"); ДокументОбъект.ОбщийРасчет(Истина); ЗначениеВРеквизитФормы(ДокументОбъект,"Объект"); КонецПроцедуры // РассчитатьРезультатНаСервере() //Модуль об Процедура ОбработкаПроведения(Отказ, РежимПроведения) ОбщийРасчет(); КонецПроцедуры Процедура ОбщийРасчет(РасчетИзФормыДокумента = Ложь) Экспорт Если РасчетИзФормыДокумента Тогда Если ЭтоНовый() Тогда ЭтотОбъект.Записать(); КонецЕсли; НачатьТранзакцию(); КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Результат, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления, | РегистрСведений.СведенияОСотрудниках.СрезПоследних КАК СведенияОСотрудникахСрезПоследних |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ТЧДок.Результат, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.ПроцентПремии, 0) КАК ПроцентПремии |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоПериода, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРАсчета.ДополнительныеНачисления.Премия))"; Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если ТипЗнч(Выборка.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Дата),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Дата)-1; Если РасчетИзФормыДокумента Тогда Движение.Результат = 0; КонецЕсли; ИначеЕсли ТипЗнч(Выборка.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ДополнительныеНачисления") Тогда Движение= Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.ФиксированнаяСумма Тогда Движение.Результат = Выборка.Результат; Движение.БазовыйПериодНачало = НачалоМесяца(Выборка.ПериодРегистрации); Движение.БазовыйПериодКонец = КонецМесяца(Выборка.ПериодРегистрации); Иначе Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Выборка.ПериодРегистрации),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Выборка.ПериодРегистрации)-1; Движение.Размер = Выборка.ПроцентПремии; Если РасчетИзФормыДокумента Тогда Движение.Результат = 0; КонецЕсли; КонецЕсли; ИначеЕсли ТипЗнч(Выборка.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.Удержания") Тогда Движение = Движения.Удержания.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Движение.БазовыйПериодНачало = НачалоМесяца(Выборка.ПериодРегистрации); Движение.БазовыйПериодКонец = КонецМесяца(Выборка.ПериодРегистрации); Если РасчетИзФормыДокумента Тогда Движение.Результат = 0; КонецЕсли; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); Движения.Удержания.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления); РасчетЗаработнойПлаты.РассчитатьУД(Ссылка, Движения.Удержания); Если РасчетИзФормыДокумента Тогда ПеренестиДанныеВДокумент(); ОтменитьТранзакцию(); КонецЕсли; КонецПроцедуры Процедура ПеренестиДанныеВДокумент() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисления.ПериодДействияНачало КАК ДатаНачала, | ОсновныеНачисления.ПериодДействияКонец КАК ДатаОкончания, | ОсновныеНачисления.Сотрудник, | ОсновныеНачисления.Подразделение, | ОсновныеНачисления.Результат, | ОсновныеНачисления.ВидРасчета |ИЗ | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления |ГДЕ | ОсновныеНачисления.Регистратор = &Регистратор | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | NULL, | NULL, | ДополнительныеНачисления.Сотрудник, | ДополнительныеНачисления.Подразделение, | ДополнительныеНачисления.Результат, | ДополнительныеНачисления.ВидРасчета |ИЗ | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления |ГДЕ | ДополнительныеНачисления.Регистратор = &Регистратор | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | NULL, | NULL, | Удержания.Сотрудник, | Удержания.Подразделение, | Удержания.Результат, | Удержания.ВидРасчета |ИЗ | РегистрРасчета.Удержания КАК Удержания |ГДЕ | Удержания.Регистратор = &Регистратор"; Запрос.УстановитьПараметр("Регистратор", Ссылка); Результат = Запрос.Выполнить(); ОсновныеНачисления.Загрузить(Результат.Выгрузить()); КонецПроцедуры Процедура Перерасчитать() Экспорт НачатьТранзакцию(); Движения.ОсновныеНачисления.Прочитать(); Движения.ДополнительныеНачисления.Прочитать(); Движения.Удержания.Прочитать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка,Движения.ОсновныеНачисления, Истина); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления, Истина); РасчетЗаработнойПлаты.РассчитатьУД(Ссылка, Движения.Удержания, Истина); Попытка Записать(РежимЗаписиДокумента.Запись); Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ОписаниеОшибки(); Сообщение.Сообщить(); ОтменитьТранзакцию(); Возврат; КонецПопытки; НаборПересчет = РегистрыРасчета.ОсновныеНачисления.Перерасчеты.Основной.СоздатьНаборЗаписей(); НаборПересчет.Отбор.ОБъектПерерасчета.Установить(Ссылка); НаборПересчет.Записать(); НаборПересчет = РегистрыРасчета.ДополнительныеНачисления.Перерасчеты.Дополнительно.СоздатьНаборЗаписей(); НаборПересчет.Отбор.ОбъектПерерасчета.Установить(Ссылка); НаборПересчет.Записать(); НаборПересчет = РегистрыРасчета.Удержания.Перерасчеты.Удержано.СоздатьНаборЗаписей(); НаборПересчет.Отбор.ОбъектПерерасчета.Установить(Ссылка); НаборПересчет.Записать(); ЗафиксироватьТранзакцию(); КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, Подразделение) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.Подразделение.Установить(Подразделение); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.Подразделение = Подразделение; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //Обработка ПересчетЗаработнойПлаты тч ОбъектыПерерасчета (ОбъектПерерасчета (докначзп, Сотрудник,Подразделение,ВидРАсчета)) //ФормаОбр &НаКлиенте Процедура Заполнить(Команда) ЗагрузитьНаСервере(); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // &НаСервере Процедура ЗагрузитьНаСервере() ДокументОбъект = РеквизитФормыВЗначение("Объект"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Основной.ОбъектПерерасчета, | Основной.ВидРасчета, | Основной.Сотрудник, | Основной.Подразделение |ИЗ | РегистрРасчета.ОсновныеНачисления.Основной КАК Основной | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | Дополнительно.ОбъектПерерасчета, | Дополнительно.ВидРасчета, | Дополнительно.Сотрудник, | Дополнительно.Подразделение |ИЗ | РегистрРасчета.ДополнительныеНачисления.Дополнительно КАК Дополнительно | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | Удержано.ОбъектПерерасчета, | Удержано.ВидРасчета, | Удержано.Сотрудник, | Удержано.Подразделение |ИЗ | РегистрРасчета.Удержания.Удержано КАК Удержано"; Результат = Запрос.Выполнить(); ДокументОбъект.ОбъектыПерерасчета.Загрузить(Результат.Выгрузить()); ЗначениеВРеквизитФормы(ДокументОбъект,"Объект"); КонецПроцедуры // ЗагрузитьНаСервере() &НаКлиенте Процедура Перерасчитать(Команда) Пересчет(); ОБъект.ОбъектыПерерасчета.Очистить(); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // &НаСервере Процедура Пересчет() Для каждого СтрокаТЧ из Объект.ОбъектыПерерасчета цикл ДокументОбъект = СтрокаТЧ.ОбъектПерерасчета.ПолучитьОбъект(); ДокументОбъект.Перерасчитать(); КонецЦикла; КонецПроцедуры // Пересчет() //ПВР ОН (Сверхурочно), ДН (Премия,ФиксированнаяСумма), У(профвзносы). //РР ОН (Подразделение,Сотрудник,Результат) Перерасчет - Основной (Сотрудник,Подразделение). //РР ДН (Подразделение,Сотрудник,Результат, Размер) Перерасчет Дополнительно(Сотрудник,Подразделение). //РР ДН (Подразделение,Сотрудник,Результат) Перерасчет Удержано (Сотрудник,Подразделение). //3.23 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждого подразделения отдельно. //Не зависимо от отработанного времени сотрудникам предприятия ежемесячно выплачивается фиксированная сумма денег. //Размер суммы указывается в момент начисления, может быть своим для каждого сотрудника и не меняется в течение расчетного периода. //В случае болезни сотрудник дополнительно получает пособие, размер которого определяется как количество часов болезни умноженное на среднюю часовую ставку. //Часы болезни рассчитываются по пятидневному графику. //Средняя часовая ставка определяется как сумма начисленного в прошлом месяце гарантированного оклада, поделенная на количество рабочих часов в том же месяце. //За каждый день болезни сотрудникам предприятия дополнительно начисляется фиксированная сумма денег в качестве компенсации затрат на лекарства. //Размер суммы в течение расчетного периода не меняется. Некоторым сотрудникам предприятия начисляются удержания по исполнительным листам. //Размер удержания рассчитывается как 25% от всех начислений, сделанных в периоде начисления удержания. //Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что данные о начислении по пособию могут переходить из одного месяца в другой (например, с 25.01 по 05.03.), при этом, данное начисление в документе вводится одной строкой с указанием полного периода. //Кроме механизма расчетов необходимо создать отчет «Расчетный листок» для вывода результатов по начислениям и удержаниям. //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеЧасыПятидневкаФактическийПериодДействия, 0) КАК ЧасыБолезни, | ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеЧасыПятидневкаБазовыйПериод, 0) КАК ЧасовБаза, | ОсновныеНачисленияДанныеГрафика.ЗначениеДниПятидневкаФактическийПериодДействия КАК ДниБолезни |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Пособие)) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Пособие)) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СредняяДневнаяСтавка = ?(Выборка.ЧасовБаза=0,0,Выборка.РезультатБаза/Выборка.ЧасовБаза); СтрокаДвижения.Результат = СредняяДневнаяСтавка*Выборка.ЧасыБолезни; СтрокаДвижения.ДнейБолезни = Выборка.ДниБолезни; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьУД(Ссылка, Удержания) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(УдержанияБазаОсновныеНачисления.НомерСтроки, УдержанияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(УдержанияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(УдержанияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.Удержания.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК УдержанияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.Удержания.БазаДополнительныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК УдержанияБазаДополнительныеНачисления | ПО УдержанияБазаОсновныеНачисления.НомерСтроки = УдержанияБазаДополнительныеНачисления.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из Удержания цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = Выборка.РезультатБаза*0.25; КонецЦикла; КонецЦикла; Удержания.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.ДнейБолезниБаза, 0) КАК ДниБолезни |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.КомпенсацияНаЛекарства)) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ДниБолезни; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры //ДокНачЗП три тч Процедура ОбработкаПроведения(Отказ, РежимПроведения) Для каждого СтрокаДвижения из ОсновныеНачисления цикл ТекДата = НачалоМесяца(СтрокаДвижения.ДатаНачала); Пока ТекДата<=НачалоМесяца(СтрокаДвижения.ДатаОкончания) цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.ПериодДействияНачало = Макс(ТекДата, СтрокаДвижения.ДатаНачала); Движение.ПериодДействияКонец = Мин(КонецДня(СтрокаДвижения.ДатаОкончания),КонецМесяца(ТекДата)); Движение.ПериодРегистрации = Дата; Движение.ВидРасчета = СтрокаДвижения.ВидРасчета; Движение.Сотрудник = СтрокаДвижения.Сотрудник; Движение.Подразделение = СтрокаДвижения.Подразделение; Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Движение.ПериодДействия),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Движение.ПериодДействия)-1; ТекДата = КонецМесяца(ТекДата)+1; КонецЦикла; КонецЦикла; Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, СтрокаДвижения); Движение.ПериодРегистрации = Дата; Движение.БазовыйПериодНачало = НачалоМесяца(Дата); Движение.БазовыйПериодКонец = КонецМесяца(Дата); Движение.Результат = СтрокаДвижения.Размер; КонецЦикла; Для каждого СтрокаДвижения из Удержания цикл Движение = Движения.Удержания.Добавить(); ЗаполнитьЗначенияСвойств(Движение,СтрокаДвижения); Движение.БазовыйПериодНачало = НачалоМесяца(Дата); Движение.БазовыйПериодКонец = КонецМесяца(Дата); Движение.Результат = СтрокаДвижения.Размер; Движение.ПериодРегистрации = Дата; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); Движения.Удержания.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления); РасчетЗаработнойПлаты.РассчитатьУД(Ссылка, Движения.Удержания); КонецПроцедуры //ПВР ОН (Пособие), ДН (КомпенсацияНаЛекарства, ФиксированнаяСумма), У(Штраф). //РР ОН (Сотрудник,Подразделение,Результат, ДнейБолезни) //ДН (Сотрудник,Подразделение,Результат,Размер) //У (Сотрудник,Подразделение,Результат) //РС (Дата,Подразделение,Значение,ЗначениеЧасыПятидневка, ЗначениеДниПятидневка) //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, Подразделение) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.Подразделение.Установить(Подразделение); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.Подразделение = Подразделение; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 1; КонецЕсли; пДеньНедели = ДеньНедели(Дат); Если пДеньНедели = 6 или пДеньНедели = 7 ТОгда Запись.ЗначениеЧасыПятидневка = 0; запись.ЗначениеДниПятидневка =0; Иначе Запись.ЗначениеЧасыПятидневка = 8; запись.ЗначениеДниПятидневка =1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //Отчет РасчетныйЛисток ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.Результат КАК Начислено ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.Результат ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Удержания.Сотрудник, Удержания.ВидРасчета, -Удержания.Результат ИЗ РегистрРасчета.Удержания КАК Удержания ГДЕ Удержания.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода //3.24 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждого подразделения отдельно. //Не зависимо от отработанного времени сотрудникам предприятия ежемесячно выплачивается фиксированная сумма денег. //Размер суммы указывается в момент начисления и может быть своим для каждого сотрудника. //После проведения расчетов, в том же расчетном периоде размер суммы может быть признан ошибочным и подлежит исправлению. //В любой момент времени сотрудникам предоставляется оплачиваемый отпуск, размер которого определяется как количество дней отпуска умноженное на среднюю дневную ставку. //Дни отпуска рассчитываются по шестидневному графику. //Средняя дневная ставка определяется как сумма начисленного за три предыдущих месяца гарантированного оклада, поделенная на количество рабочих дней в трех предыдущих месяцах. //Количество предоставляемых в год рабочих дней отпуска не должно превышать 24. //Если сотрудник опоздал на работу, то за каждые целые 15 минут опоздания начисляется штраф в размере 50 рублей. //Ежемесячно с сотрудников организации удерживается 1% от суммы всех начислений за период в качестве профсоюзных взносов. //Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление отпуска с 10.01 по 31.01, а запись: отпуск с 10.01 по 03.02 вводить нельзя. //Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ Расчеты Процедура Расчет(Ссылка, ПериодРегистрации, ИзлишнеНачисленныеОтпуска) Экспорт Набор = РегистрыРасчета.ОсновныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Если Набор.Количество() > 0 Тогда Запрос = Новый Запрос("ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ДнейФактическийПериодДействия, 0)) КАК ДнейФакт, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0)) КАК РезультатБаза, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ДнейБазовыйПериод, 0)) КАК ДнейБаза, | СУММА(ЕСТЬNULL(ОсновныеНачисленияДанныеГрафикаОтпуска.ДнейФактическийПериодДействия, 0)) КАК ДнейОтпуска |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ПериодРегистрации = &ПериодРегистрации | И ВидРасчета = &Отпуск) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления( | &Измерения, | &Измерения, | , | Регистратор = &Ссылка | И ПериодРегистрации = &ПериодРегистрации) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | ПериодРегистрации = &ПериодРегистрации | И ВидРасчета = &Отпуск | И (ПериодДействия МЕЖДУ &НачалоГода И &КонецТекущегоМесяца)) КАК ОсновныеНачисленияДанныеГрафикаОтпуска | ПО ОсновныеНачисленияДанныеГрафика.Сотрудник = ОсновныеНачисленияДанныеГрафикаОтпуска.Сотрудник | И ОсновныеНачисленияДанныеГрафика.Подразделение = ОсновныеНачисленияДанныеГрафикаОтпуска.Подразделение | |СГРУППИРОВАТЬ ПО | ОсновныеНачисленияДанныеГрафика.НомерСтроки"); Измерения = Новый Массив; Измерения.Добавить("Сотрудник"); Измерения.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерения", Измерения); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ПериодРегистрации", ПериодРегистрации); Запрос.УстановитьПараметр("Отпуск", ПланыВидовРасчета.ОсновныеНачисления.Отпуск); Запрос.УстановитьПараметр("НачалоГода", НачалоГода(ПериодРегистрации)); Запрос.УстановитьПараметр("КонецТекущегоМесяца", КонецМесяца(ПериодРегистрации)); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Если Выборка.НайтиСледующий(Отбор) Тогда Если Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда Движение.Результат = ?(Выборка.ДнейБаза=0,0,Выборка.ДнейФакт * Выборка.РезультатБаза / Выборка.ДнейБаза); Если Выборка.ДнейОтпуска > 24 Тогда ИзлишнеНачисленныеОтпуска.Вставить(Движение.Сотрудник, Выборка.ДнейОтпуска); КонецЕсли; КонецЕсли; КонецЕсли; Выборка.Сбросить(); КонецЦикла; Набор.Записать(, Истина); КонецЕсли; Набор = РегистрыРасчета.Удержания.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Если Набор.Количество() > 0 Тогда Запрос = Новый Запрос("ВЫБРАТЬ | Т.НомерСтроки, | СУММА(ЕСТЬNULL(Т.РезультатБаза, 0)) КАК РезультатБаза, | СУММА(ЕСТЬNULL(Т.МинутБаза, 0)) КАК МинутБаза |ИЗ | (ВЫБРАТЬ | УдержанияБазаОсновныеНачисления.НомерСтроки КАК НомерСтроки, | ЕСТЬNULL(УдержанияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(УдержанияБазаОсновныеНачисления.МинутБаза, 0) КАК МинутБаза | ИЗ | РегистрРасчета.Удержания.БазаОсновныеНачисления( | &Измерения, | &Измерения, | , | Регистратор = &Ссылка | И ПериодРегистрации = &ПериодРегистрации) КАК УдержанияБазаОсновныеНачисления | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | УдержанияБазаДополнительныеНачисления.НомерСтроки, | ЕСТЬNULL(УдержанияБазаДополнительныеНачисления.РезультатБаза, 0), | NULL | ИЗ | РегистрРасчета.Удержания.БазаДополнительныеНачисления( | &Измерения, | &Измерения, | , | Регистратор = &Ссылка | И ПериодРегистрации = &ПериодРегистрации) КАК УдержанияБазаДополнительныеНачисления) КАК Т | |СГРУППИРОВАТЬ ПО | Т.НомерСтроки"); Измерения = Новый Массив; Измерения.Добавить("Сотрудник"); Измерения.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерения", Измерения); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ПериодРегистрации", ПериодРегистрации); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Если Выборка.НайтиСледующий(Отбор) Тогда Если Движение.ВидРасчета = ПланыВидовРасчета.Удержания.ПрофсоюзныйВзнос Тогда Движение.Результат = Выборка.РезультатБаза * Движение.Параметр / 100; Иначе Движение.Результат = Цел(Выборка.МинутБаза / 15) * Движение.Параметр; КонецЕсли; КонецЕсли; Выборка.Сбросить(); КонецЦикла; Набор.Записать(, Истина); КонецЕсли; КонецПроцедуры В док нач зап добавляем периодрегистрации, В тч допнач добавляем результат и корр (булево), Модуль формы &НаКлиенте Процедура Исправить(Команда) Если Объект.Проведен Тогда НовыйРезультат = 0; Если ВвестиЧисло(НовыйРезультат, "Введите верный результат", 10,2) Тогда ДанныеСтроки = Элементы.ДополнительныеНачисления.ТекущиеДанные; ИсправитьНаСервере(ДанныеСтроки.НомерСтроки, ДанныеСтроки.Сотрудник, ДанныеСтроки.Подразделение, ДанныеСтроки.Размер, НовыйРезультат); КонецЕсли; КонецЕсли; КонецПроцедуры &НаСервере Процедура ИсправитьНаСервере(НомерСтрокиДокумента, Сотрудник, Подразделение, Размер, Сумма) НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); Набор = РегистрыРасчета.ДополнительныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Объект.Ссылка); Набор.Прочитать(); Запрос = Новый Запрос("ВЫБРАТЬ | ДополнительныеНачисления.НомерСтроки |ИЗ | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления |ГДЕ | ДополнительныеНачисления.Регистратор = &Ссылка | И ДополнительныеНачисления.Сотрудник = &Сотрудник | И ДополнительныеНачисления.Подразделение = &Подразделение | И ДополнительныеНачисления.Параметр = &Параметр"); Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); Запрос.УстановитьПараметр("Сотрудник", Сотрудник); Запрос.УстановитьПараметр("Подразделение", Подразделение); Запрос.УстановитьПараметр("Параметр", Размер); Результат = Запрос.Выполнить(); Если Не Результат.Пустой() Тогда Выборка = Результат.Выбрать(); Выборка.Следующий(); НомерСтроки = Выборка.НомерСтроки; Набор[НомерСтроки-1].Результат = Сумма; КонецЕсли; Набор.Записать(, Истина); ДокОбъект = РеквизитФормыВЗначение("Объект"); ДокОбъект.ДополнительныеНачисления[НомерСтрокиДокумента-1].Корр = Истина; ДокОбъект.ДополнительныеНачисления[НомерСтрокиДокумента-1].Результат = Сумма; ДокОбъект.ДополнительныеСвойства.Вставить("РежимКорректировки", Истина); ДокОбъект.Записать(РежимЗаписиДокумента.Запись); ЗначениеВРеквизитФормы(ДокОбъект, "Объект"); ЗафиксироватьТранзакцию(); КонецПроцедуры //МодульОбхекта Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) ПериодРегистрации = НачалоМесяца(ПериодРегистрации); Если НЕ ЭтотОбъект.ДополнительныеСвойства.Свойство("РежимКорректировки") Тогда Для Каждого Строка Из ДополнительныеНачисления Цикл Строка.Результат = Строка.Размер; Строка.Корр = Ложь; КонецЦикла; КонецЕсли; КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | НачислениеЗарплатыОсновныеНачисления.ДатаОкончания КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.График |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда ДВижение.ПериодДействияНачало = НачалоДня(Движение.ПериодДействияНачало); ДВижение.ПериодДействияКонец = КонецДня(Движение.ПериодДействияКонец); Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации, -3); Движение.БазовыйПериодКонец = ПериодРегистрации-1; Движение.График = Справочники.Графики.Шестидневка; Иначе Движение.Минут = (Движение.ПериодДействияКонец - Движение.ПериодДействияНачало) / 60; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыДополнительныеНачисления.Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.Размер КАК Параметр, | НачислениеЗарплатыДополнительныеНачисления.Размер КАК Результат |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Движения.ДополнительныеНачисления.Загрузить(Запрос.Выполнить().Выгрузить()); Движения.ДополнительныеНачисления.Записать(); Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыУдержания.Ссылка.ПериодРегистрации, | НачислениеЗарплатыУдержания.Сотрудник, | НачислениеЗарплатыУдержания.Подразделение, | НачислениеЗарплатыУдержания.ВидРасчета, | НачислениеЗарплатыУдержания.Размер КАК Параметр, | НачислениеЗарплатыУдержания.Ссылка.ПериодРегистрации КАК БазовыйПериодНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыУдержания.Ссылка.ПериодРегистрации, МЕСЯЦ) КАК БазовыйПериодКонец |ИЗ | Документ.НачислениеЗарплаты.Удержания КАК НачислениеЗарплатыУдержания |ГДЕ | НачислениеЗарплатыУдержания.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Движения.Удержания.Загрузить(Запрос.Выполнить().Выгрузить()); ДВижения.Удержания.Записать(); ИзлишнеНачисленныеОтпуска = Новый Соответствие; Расчеты.Расчет(Ссылка, ПериодРегистрации, ИзлишнеНачисленныеОтпуска); Если ИзлишнеНачисленныеОтпуска.Количество() > 0 Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Документ не будет проведен. Попытка начислить отпускных больше, чем 24 дня:"; Сообщение.Сообщить(); Для Каждого Строка Из ИзлишнеНачисленныеОтпуска Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = " " + Строка.Ключ + " начислено за " + Строка.Значение + " дней"; Сообщение.Сообщить(); КонецЦикла; КонецЕсли; КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, Подразделение, График, МинутВДень) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.График.Установить(График); Набор.Отбор.Подразделение.Установить(Подразделение); Набор.Прочитать(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дней = 0; Запись.Минут = 0; Иначе Запись.Дней = 1; Запись.Минут = МинутВДень; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; НоваяЗапись.Подразделение = Подразделение; НоваяЗапись.График = График; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дней = 0; Запись.Минут = 0; Иначе Запись.Дней = 1; Запись.Минут = МинутВДень; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дней = 0; Запись.Минут = 0; Иначе Запись.Дней = 1; Запись.Минут = МинутВДень; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.Подразделение = Подразделение; Запись.График = График; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дней = 0; Запись.Минут = 0; Иначе Запись.Дней = 1; Запись.Минут = МинутВДень; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Опоздание,Отпуск), ДН (Оклад), У(ПрофсоюзныйВзнос,Штраф). //РС ГрафикиРаботы (Дата,Подразделение,График, Дней, Минут) //РР ОН (Сотрудник,Подразделение,Результат,Минут.. График) //ДН (Сотрудник,Подразделение,Результат..Параметр) //У(Сотрудник,Подразделение,Результат..Параметр) //3.25 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //В решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Не зависимо от отработанного времени сотрудникам предприятия ежемесячно выплачивается фиксированная сумма денег. //Размер суммы для каждого сотрудника может быть изменен один раз в квартал. //История изменения размера должна храниться в информационной базе. Сотрудники могут работать сверхурочно. //За каждый час сверхурочно отработанного времени начисляется надбавка в размере 100% от среднего часового заработка за предыдущий месяц. //Средний часовой заработок рассчитывается как сумма всех начислений в прошлом месяце, поделенная на количество рабочих часов в этом месяце. //Если сотрудник не вышел на работу по неуважительной причине, то за каждый день прогула начисляется штраф в размере 100 рублей. //Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца. //Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ПОМЕСТИТЬ ВТБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.СверхУрочно)) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.СверхУрочно)) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ВТБаза.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниФактическийПериодДействия, 0) КАК ФактДни, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеЧасыФактическийПериодДействия, 0) КАК ФактЧасы, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК ПланЧасов |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.СверхУрочно), ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Невыход))) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ ВТБаза КАК ВТБаза | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ВТБаза.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.СверхУрочно Тогда СреднеДневнаяСтавка = ?(Выборка.ПланЧасов=0,0, выборка.РезультатБаза/Выборка.ПланЧасов); СтрокаДвижения.Результат = СреднеДневнаяСтавка*Выборка.ФактЧасы*2; Иначе СтрокаДвижения.ДниНевыхода = Выборка.фактДни; КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьУдержания(Ссылка, Удержания) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УдержанияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(УдержанияБазаОсновныеНачисления.ДниНевыходаБаза, 0) КАК ДниНевыходаБаза |ИЗ | РегистрРасчета.Удержания.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК УдержанияБазаОсновныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из Удержания цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = Выборка.ДниНевыходаБаза*100; КонецЦикла; КонецЦикла; Удержания.Записать(,Истина); КонецПроцедуры //три тч для докначзп Процедура ОбработкаПроведения(Отказ, РежимПроведения) Для каждого СтрокаТЧ из ОсновныеНачисления цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,СтрокаТЧ); Движение.ПериодРегистрации = Дата; Если СтрокаТЧ.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.СверхУрочно Тогда Движение.ПериодДействияНачало = СтрокаТЧ.ДатаНачала; Движение.ПериодДействияКонец = СтрокаТЧ.ДатаОкончания; Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Движение.ПериодДействия),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Движение.ПериодДействия)-1; Иначе Движение.ПериодДействияНачало = СтрокаТЧ.ДатаНачала; Движение.ПериодДействияКонец = КонецДня(СтрокаТЧ.ДатаОкончания); Движение.БазовыйПериодНачало = Движение.ПериодДействияНачало; ДВижение.БазовыйПериодКонец = Движение.ПериодДействияКонец; КонецЕсли; КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Сумма, 0) КАК Результат |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &КонецМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Дата)); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Движение.БазовыйПериодНачало = НачалоМесяца(Дата); Движение.БазовыйПериодКонец = КонецМесяца(Дата); КонецЦикла; Для каждого СтрокаТЧ из Удержания цикл Движение = Движения.Удержания.Добавить(); ЗаполнитьЗначенияСвойств(Движение,СтрокаТЧ); Движение.ПериодРегистрации = Дата; Движение.БазовыйПериодНачало = НачалоМесяца(Дата); Движение.БазовыйПериодКонец = КонецМесяца(Дата); КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); Движения.Удержания.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьУдержания(Ссылка, Движения.Удержания); КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни,ГрафикРаботы) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.ГрафикРаботы.Установить(ГрафикРаботы); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 3600; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); СтарыйДень = Неопределено; Пока Дат <= ДатаОкончания Цикл пНовыйДень = ДеньНедели(Дат)= СтарыйДень; Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.ГрафикРаботы = ГрафикРаботы; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Если Не пНовыйДень Тогда Запись.Значение = 0; Запись.ЗначениеДни = 0; Иначе Запись.ЗначениеЧасы = 0; КонецЕсли; Иначе Если НЕ пНовыйДень тогда Запись.Значение = 8; Запись.ЗначениеДни = 1; Иначе Запись.ЗначениеЧасы = 1; КонецЕсли; КонецЕсли; СтарыйДень = ДеньНедели(Дат); Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (невыход,Сверхурочно) //ДН (ФиксированнаяСумма) //У(Штраф) //РС ГрафикиРаботы (Дата,ГрафикРаботы, Значение,ЗначениеДни,ЗначениеЧасы ) //РР ОН (Сотрудник,Подразделение,Результат,ДниНевыхода,ГрафикРаботы) //ДН (Сотрудник,Подразделение,Результат) //У (Сотрудник,Подразделение,Результа,Размер) Отчет АнализНачислений ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.Результат, ОсновныеНачисления.ПериодДействия ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.Результат, ДополнительныеНачисления.ПериодРегистрации ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Удержания.Сотрудник, Удержания.Подразделение, Удержания.ВидРасчета, -Удержания.Результат, Удержания.ПериодРегистрации ИЗ РегистрРасчета.Удержания КАК Удержания ГДЕ Удержания.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода //3.26 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Не зависимо от отработанного времени всем сотрудникам одного подразделения ежемесячно выплачивается фиксированная сумма денег. //Размер суммы в каждом подразделении может быть изменен один раз в месяц. История изменения размера должна храниться в информационной базе. //По мере необходимости любой сотрудник может быть отправлен в командировку. В этом случае начисление по окладу и премии не происходит. //Часы, проведенные в командировке, определяются по пятидневному графику работы. //Часовая ставка для расчета командировки определяется как сумма всех начислений за два предыдущих месяца, деленная на количество рабочих часов в двух предыдущих месяцах. //Следует учесть, что данные о командировке не могут вводиться в систему задним числом. //В любой момент времени сотрудникам предоставляется оплачиваемый отпуск, размер которого определяется как количество дней отпуска умноженное на среднюю дневную ставку. //Дни отпуска рассчитываются по шестидневному графику. //Средняя дневная ставка определяется как сумма всех начислений (без учета отпуска) за три предыдущих месяца гарантированного оклада и командировки, поделенная на количество отработанных дней в трех предыдущих месяцах. //Количество предоставляемых в год рабочих дней отпуска не должно превышать 28. Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что данные о начислении по отпуску вводятся только в пределах одного месяца, а командировка может переходить из одного месяца в другой. //Например, можно указать отпуск с 10.01 по 31.01, а командировка - с 25.01 по 05.03., при этом, каждое начисление в документе вводится одной строкой с указанием полного периода. //Необходимо предоставить пользователю возможность самостоятельно создавать новые виды расчетов и привязывать их к существующим алгоритмам расчета. //С помощью диаграммы Ганта отобразить график отпусков сотрудников. Отчет может быть построен за любой расчетный период. //Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ Расчеты Процедура Расчет(Ссылка, ПериодРегистрации, ДниОтпусков) Экспорт Набор = РегистрыРасчета.ОсновныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Запрос = Новый Запрос("ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ДнейФактическийПериодДействия, 0)) КАК ДнейФакт, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЧасовФактическийПериодДействия, 0)) КАК ЧасовФакт, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0)) КАК РезультатБаза, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.ДнейБаза, 0)) КАК ДнейБаза, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЧасовБазовыйПериод, 0)) КАК ЧасовБаза, | СУММА(ЕСТЬNULL(ОсновныеНачисленияДанныеГрафикаОтпуска.ДнейФактическийПериодДействия, 0)) КАК ДнейОтпусков |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ПериодРегистрации = &ПериодРегистрации) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерения, | &Измерения, | , | Регистратор = &Ссылка | И ПериодРегистрации = &ПериодРегистрации) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | ПериодДействия МЕЖДУ &НачалоГода И &КонецТекущегоМесяца | И ВидРасчета.Алгоритм = &Алгоритм) КАК ОсновныеНачисленияДанныеГрафикаОтпуска | ПО ОсновныеНачисленияДанныеГрафика.Сотрудник = ОсновныеНачисленияДанныеГрафикаОтпуска.Сотрудник | И ОсновныеНачисленияДанныеГрафика.Подразделение = ОсновныеНачисленияДанныеГрафикаОтпуска.Подразделение | |СГРУППИРОВАТЬ ПО | ОсновныеНачисленияДанныеГрафика.НомерСтроки"); Измерения = Новый Массив; Измерения.Добавить("Сотрудник"); Измерения.Добавить("Подразделение"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ПериодРегистрации", ПериодРегистрации); Запрос.УстановитьПараметр("Измерения", Измерения); Запрос.УстановитьПараметр("НачалоГода", НачалоГода(ПериодРегистрации)); Запрос.УстановитьПараметр("КонецТекущегоМесяца", КонецМесяца(ПериодРегистрации)); Запрос.УстановитьПараметр("Алгоритм", Перечисления.Алгоритмы.Отпуск); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Если Выборка.НайтиСледующий(Отбор) Тогда Если Движение.ВидРасчета.Алгоритм = Перечисления.Алгоритмы.Командировка Тогда Движение.Результат = ?(Выборка.ЧасовБаза=0,0,Выборка.ЧасовФакт * Выборка.РезультатБаза / Выборка.ЧасовБаза); ИначеЕсли Движение.ВидРасчета.Алгоритм = Перечисления.Алгоритмы.Отпуск Тогда Движение.Результат = ?(Выборка.ДнейБаза=0,0,Выборка.ДнейФакт * Выборка.РезультатБаза / Выборка.ДнейБаза); Если Выборка.ДнейОтпусков > 28 Тогда ДниОтпусков.Вставить(Движение.Сотрудник, Выборка.ДнейОтпусков); КонецЕсли; Иначе Движение.Дней = Выборка.ДнейФакт; КонецЕсли; КонецЕсли; Выборка.Сбросить(); КонецЦикла; Набор.Записать(, Истина); КонецПроцедуры //В док нач зп ПериодРегистрации Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) ПериодРегистрации = НачалоМесяца(ПериодРегистрации); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала, | НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.График |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.ПериодРегистрации, | Список.Сотрудник, | Список.Подразделение, | Список.ВидРасчета, | Список.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(Список.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | Список.Размер, | Список.График, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Оклад, 0) КАК Оклад |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &ДатаНачала, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК СведенияОСотрудникахСрезПоследних | ПО Список.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И Список.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", ПериодРегистрации); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ВидРасчета.Алгоритм = Перечисления.Алгоритмы.Оклад Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.Результат = Выборка.Оклад; ИначеЕсли Выборка.ВидРасчета.Алгоритм = Перечисления.Алгоритмы.Командировка Тогда ТекПериод = НачалоМесяца(Выборка.ПериодДействияНачало); Пока ТекПериод <= НачалоМесяца(Выборка.ПериодДействияКонец) Цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации, -2); Движение.БазовыйПериодКонец = ПериодРегистрации - 1; Движение.ПериодДействияНачало = Макс(Выборка.ПериодДействияНачало, ТекПериод); Движение.ПериодДействияКонец = Мин(Выборка.ПериодДействияКонец, КонецМесяца(ТекПериод)); Движение.График = Справочники.Графики.Пятидневка; ТекПериод = КонецМесяца(ТекПериод) + 1; КонецЦикла; ИначеЕсли Выборка.ВидРасчета.Алгоритм = Перечисления.Алгоритмы.Отпуск Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации, -3); Движение.БазовыйПериодКонец = ПериодРегистрации - 1; Движение.График = Справочники.Графики.Шестидневка; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); ДниОтпусков = Новый Соответствие; Расчеты.Расчет(Ссылка, ПериодРегистрации, ДниОтпусков); Если ДниОтпусков.Количество() > 0 Тогда Отказ = Истина; Для Каждого Строка Из ДниОтпусков Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "По " + Строка.Ключ + " начислено отпусков " + Строка.Значение + " дней"; Сообщение.Сообщить(); КонецЦикла; КонецЕсли; КонецПроцедуры //Переч Алгоритмы (Оклад,Командировка,отпуск) //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, График) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.График.Установить(График); Набор.Прочитать(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дней = 0; Запись.Часов = 0; Иначе Запись.Дней = 1; Запись.Часов = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.График = График; НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дней = 0; Запись.Часов = 0; Иначе Запись.Дней = 1; Запись.Часов = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дней = 0; Запись.Часов = 0; Иначе Запись.Дней = 1; Запись.Часов = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.График = График; Запись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дней = 0; Запись.Часов = 0; Иначе Запись.Дней = 1; Запись.Часов = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР добавляем рекв. Алгоритм //РС Графики Дата,График,дней,Часов //РР ОН Сотрудник,Подразделение,Результат,Дней,график //Отчет ГрафикОтпусков (диаграммаГанта) &НаКлиенте Процедура Сформировать(Команда) СформироватьНаСервере(); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // &НаСервере Процедура СформироватьНаСервере() ДГ.Обновление = Ложь; Запрос = Новый Запрос("ВЫБРАТЬ | ОсновныеНачисленияФактическийПериодДействия.Сотрудник, | ОсновныеНачисленияФактическийПериодДействия.ВидРасчета, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало КАК Начало, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец КАК Конец |ИЗ | РегистрРасчета.ОсновныеНачисления.ФактическийПериодДействия( | ПериодДействия МЕЖДУ &ДатаНачала И &ДатаОкончания | И ВидРасчета.Алгоритм = &Алгоритм) КАК ОсновныеНачисленияФактическийПериодДействия"); Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", Период.ДатаОкончания); Запрос.УстановитьПараметр("Алгоритм", Перечисления.Алгоритмы.Отпуск); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Точка = ДГ.УстановитьТочку(Выборка.Сотрудник); Серия = ДГ.УстановитьСерию(Выборка.ВидРасчета); Значение = ДГ.ПолучитьЗначение(Точка, Серия); Интервал = Значение.Добавить(); Интервал.Начало = Выборка.Начало; Интервал.Конец = Выборка.Конец; КонецЦикла; ДГ.Обновление = Истина; КонецПроцедуры // СформироватьНаСервере() //Отчет ВедомостьНачислений ВЫБРАТЬ ОсновныеНачисления.ПериодРегистрации, ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.Результат ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодРегистрации МЕЖДУ &ДатаНачала И &ДатаОкончания //3.27 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //По основному месту работы сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в днях. //Сумма начисления по окладу определяется как дневная ставка, умноженная на количество фактически отработанных дней. //Дневная ставка оклада одинакова для всех сотрудников и должна быть определена по специальной шкале в зависимости от общего трудового стажа работы сотрудника. //При решении задачи необходимо иметь в виду, что на момент начала ведения учета у сотрудника может быть трудовой стаж отличный от нуля. //Расчет ведется по пятидневному графику работы. //Одну или несколько полных недель в течение расчетного периода сотрудники предприятия могут выполнять работы вахтовым методом. //За работу на вахте сотрудники получают оплату по дневному тарифу. //Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных дней. //Тарифная ставка в расчетном периоде не меняется. //За каждый день работы сотрудникам предприятия начисляется определенная сумма денег в качестве компенсации затрат на обеды. //Компенсация за один обед рассчитывается как 100 рублей за каждый отработанный день в текущем расчетном периоде, независимо от места работы. //Некоторым сотрудникам предприятия начисляются удержания по исполнительным листам. //Размер удержания рассчитывается как 25% от всех начислений, сделанных в периоде начисления удержания. //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление оклада с 10.01 по 31.01, а запись: оклад с 10.01 по 03.02 вводить нельзя. //С помощью диаграммы Ганта показать фактический период действия записей с разбивкой по сотрудникам, и для каждого сотрудника – по видам расчета. //Отчет может быть построен за любой расчетный период. //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактДни |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ФактДни; СтрокаДвижения.ОтработаноДни = Выборка.ФактДни; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.ОтработаноДниБаза, 0) КАК ОтработаноДниБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = Новый Массив; измерение.Добавить("Сотрудник"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Измерение",Измерение); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = Выборка.ОтработаноДниБаза*100; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьУД(Ссылка, Удержания) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(УдержанияБазаОсновныеНачисления.НомерСтроки, УдержанияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(УдержанияБазаДополнительныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(УдержанияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБАза |ИЗ | РегистрРасчета.Удержания.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК УдержанияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.Удержания.БазаДополнительныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК УдержанияБазаДополнительныеНачисления | ПО УдержанияБазаОсновныеНачисления.НомерСтроки = УдержанияБазаДополнительныеНачисления.НомерСтроки"; Измерение = Новый Массив; измерение.Добавить("Сотрудник"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Измерение",Измерение); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); для каждого СтрокаДвижения из Удержания цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = Выборка.РезультатБАза*0.25; КонецЦикла; КонецЦикла; Удержания.Записать(,Истина); КонецПроцедуры //три тч для начзп Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации, | ВЫБОР | КОГДА НачислениеЗарплатыОсновныеНачисления.Сотрудник.ДатаПриема = ДАТАВРЕМЯ(1, 1, 1) | ТОГДА 0 | ИНАЧЕ РАЗНОСТЬДАТ(НачислениеЗарплатыОсновныеНачисления.Сотрудник.ДатаПриема, &ТекущийМесяц, ГОД) | КОНЕЦ + НачислениеЗарплатыОсновныеНачисления.Сотрудник.НачальныйСтаж КАК ТрудовойСтаж |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.ВидРасчета, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ТЧДок.Размер, | ТЧДок.ПериодРегистрации, | ТЧДок.ТрудовойСтаж, | ЕСТЬNULL(ШкалаТрудовойСтаж.РазмерСтавки, 0) КАК Ставка |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаТрудовойСтаж КАК ШкалаТрудовойСтаж | ПО (ВЫБОР | КОГДА ТЧДок.ТрудовойСтаж = 0 | ТОГДА ТЧДок.ТрудовойСтаж >= ШкалаТрудовойСтаж.От | И ТЧДок.ТрудовойСтаж <= ШкалаТрудовойСтаж.До | ИНАЧЕ ТЧДок.ТрудовойСтаж > ШкалаТрудовойСтаж.От | И ТЧДок.ТрудовойСтаж <= ШкалаТрудовойСтаж.До | КОНЕЦ)"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ТекущийМесяц", НачалоМесяца(Дата)); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Движение.Размер = Выборка.Ставка; КонецЕсли; КонецЦикла; Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,СтрокаДвижения); Движение.ПериодРегистрации = Дата; Движение.БазовыйПериодНачало = НачалоМесяца(Дата); Движение.БазовыйПериодКонец = КонецМесяца(Дата); КонецЦикла; Для каждого СтрокаДвижения из Удержания цикл Движение = Движения.Удержания.Добавить(); ЗаполнитьЗначенияСвойств(Движение, СтрокаДвижения); Движение.ПериодРегистрации = Дата; Движение.БазовыйПериодНачало = НачалоМесяца(Дата); Движение.БазовыйПериодКонец = КонецМесяца(Дата) КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); Движения.Удержания.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления); РасчетЗаработнойПлаты.РассчитатьУД(Ссылка, Движения.Удержания); КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Прочитать(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение =1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 1; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Оклад,Тариф) //ДН (КомпенсацияЗаОбеды) //У (Штраф) //РС ГрафикиРаботы (Дата,ГрафикРаботы,Значение) //РС ШкалаТрудовойСтаж (От,До, РазмерСтавки) //РР ОН (Сотрудник, Результат,ОтработаноДни...Размер) //ДН (Сотрудник,Результат) //У (Сотрудник,Результат) //Отчет ДиаграммаГанта &НаКлиенте Процедура КомандаСформировать(Команда) СформироватьОтчетНАСервере(); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // &НаСервере Процедура СформироватьОтчетНАСервере() ДГ.Обновление = Истина; //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияФактическийПериодДействия.Сотрудник, | ОсновныеНачисленияФактическийПериодДействия.ВидРасчета, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало КАК Начало, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец КАК Конец |ИЗ | РегистрРасчета.ОсновныеНачисления.ФактическийПериодДействия КАК ОсновныеНачисленияФактическийПериодДействия |ГДЕ | ОсновныеНачисленияФактическийПериодДействия.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода"; Запрос.УстановитьПараметр("КонецПериода", Период.ДатаОкончания); Запрос.УстановитьПараметр("НачалоПериода", Период.ДатаНачала); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Точка = Дг.УстановитьТочку(ВыборкаДетальныеЗаписи.Сотрудник); Серия = Дг.УстановитьСерию(ВыборкаДетальныеЗаписи.ВидРАсчета); Значение = Дг.ПолучитьЗначение(ТОчка, Серия); Запись = Значение.Добавить(); ЗаполнитьЗначенияСвойств(Запись, ВыборкаДетальныеЗаписи); КонецЦикла; ДГ.Обновление = Истина; КонецПроцедуры // СформироватьОтчетНАСервере() //3.28 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по часовому тарифу. //Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных часов. //Тарифная ставка в расчетном периоде может меняться не чаще, чем один раз в день. //Сотрудники работают по сменному графику «Сутки через двое». Для организации непрерывного рабочего цикла на предприятии работает три бригады: 1 бригада в первый день работает, во второй и третий отдыхает, 2 бригада работает во второй день, в первый и третий отдыхает, и 3 бригада в третий день работает, в первый и второй отдыхает. //В случае болезни сотрудник дополнительно получает пособие, размер которого определяется как количество часов болезни умноженное на среднюю часовую ставку. //Часы болезни рассчитываются по пятидневному графику. //Средняя часовая ставка определяется как сумма начисленной в прошлом месяце оплаты по тарифу, поделенная на количество рабочих часов в том же месяце. //Невыход сотрудника на работу без уважительной причины должен быть зафиксирован в информационной базе, но не оплачивается. //Ежемесячно с сотрудников организации удерживается 1% от суммы всех начислений за период в качестве профсоюзных взносов. //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление тарифа с 10.01 по 31.01, а запись: тариф с 10.01 по 03.02 вводить нельзя. //С помощью диаграммы Ганта показать фактический период действия записей с разбивкой по сотрудникам, и для каждого сотрудника – по видам расчета. //Отчет может быть построен за любой расчетный период. //Для анализа начисленных сотрудникам пособий по болезни в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасы, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод, 0) КАК ЧасовБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета В (ЗНАЧЕНИЕ(планВидовРасчета.ОсновныеНачисления.Оклад), ЗНАЧЕНИЕ(планВидовРасчета.ОсновныеНачисления.Болезнь))) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета В (ЗНАЧЕНИЕ(планВидовРасчета.ОсновныеНачисления.Оклад), ЗНАЧЕНИЕ(планВидовРасчета.ОсновныеНачисления.Болезнь))) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ФактЧасы; Иначе СредняяСтавка = ?(Выборка.ЧасовБаза=0,0,Выборка.РезультатБаза/Выборка.ЧасовБаза); СтрокаДвижения.Результат = СредняяСтавка*Выборка.ФактЧасы; СтрокаДвижения.ЧасовБолезни = Выборка.ФактЧасы; КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьУД(Ссылка, Удержания) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УдержанияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(УдержанияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.Удержания.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК УдержанияБазаОсновныеНачисления"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из Удержания цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = выборка.РезультатБаза*0.01; КонецЦикла; КонецЦикла; Удержания.Записать(,Истина); КонецПроцедуры //док нач зп. тч осн и уд. Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник КАК Сотрудник, | ТЧДок.Подразделение КАК Подразделение, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Тариф, 0) КАК Тариф, | &НачалоМесяца КАК НачалоВИстории |ПОМЕСТИТЬ ТарифыПоДням |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДОк КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(планВидовРасчета.ОсновныеНачисления.Оклад)) | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | СведенияОСотрудниках.Сотрудник, | СведенияОСотрудниках.Подразделение, | СведенияОСотрудниках.Тариф, | СведенияОСотрудниках.Период |ИЗ | РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках |ГДЕ | СведенияОСотрудниках.Период > &НачалоМесяца | И СведенияОСотрудниках.Период <= &КонецМесяца | И СведенияОСотрудниках.Сотрудник В | (ВЫБРАТЬ | Т.Сотрудник | ИЗ | ТЧдок КАК Т) | И СведенияОСотрудниках.Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧДок КАК Т) | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник КАК Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета КАК ВидРасчета, | ТЧДок.ГрафикРаботы, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(ТарифыПоДням.Тариф, 0) КАК Тариф, | ТарифыПоДням.НачалоВИстории КАК НачалоВИстории, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ТарифыПоДням КАК ТарифыПоДням | ПО ТЧДок.Сотрудник = ТарифыПоДням.Сотрудник | И ТЧДок.Подразделение = ТарифыПоДням.Подразделение | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(планВидовРасчета.ОсновныеНачисления.Оклад)) | |СГРУППИРОВАТЬ ПО | ТЧДок.ПериодДействияКонец, | ТЧДок.Подразделение, | ТарифыПоДням.НачалоВИстории, | ТЧДок.ВидРасчета, | ТЧДок.ГрафикРаботы, | ТЧДок.Сотрудник, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(ТарифыПоДням.Тариф, 0) | |УПОРЯДОЧИТЬ ПО | ВидРасчета, | НачалоВИстории |ИТОГИ ПО | Сотрудник"; Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Дата)); Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка",Ссылка); Результат = Запрос.Выполнить(); ВыборкаСотрудник = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСотрудник.Следующий() Цикл Выборка = ВыборкаСотрудник.Выбрать(); НовыйСотрудник = Истина; Пока Выборка.Следующий() Цикл Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Если Ложь Тогда Движение = Неопределено; КонецЕсли; Если не НовыйСотрудник Тогда Движение.ПериодДействияКонец = МАКС(Выборка.ПериодДействияНачало, выборка.НачалоВИстории)-1; КонецЕсли; Движение = Движения.ОсновныеНачисления.Добавить(); Движение.ПериодРегистрации = Дата; Движение.ПериодДействияНачало = МАКС(Выборка.ПериодДействияНачало, выборка.НачалоВИстории); Движение.ПериодДействияКонец = Выборка.ПериодДействияКонец; Движение.Сотрудник = Выборка.Сотрудник; Движение.Подразделение = Выборка.Подразделение; Движение.ВидРасчета = Выборка.ВидРасчета; Движение.ГрафикРаботы = Выборка.ГрафикРаботы; Движение.Размер = Выборка.Тариф; НовыйСотрудник = Ложь; ИначеЕсли Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Болезнь Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, выборка); Движение.ГрафикРаботы = Справочники.ГрафикРаботы.Пятидневка; Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Движение.ПериодДействия),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Движение.ПериодДействия)-1; Иначе Движение =Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); КонецЕсли; КонецЦикла; КонецЦикла; Для каждого СтрокаУдержания из Удержания цикл Движение = Движения.Удержания.Добавить(); ЗаполнитьЗначенияСвойств(Движение, СтрокаУдержания); Движение.ПериодРегистрации = Дата; Движение.БазовыйПериодНачало = НачалоМесяца(Дата); Движение.БазовыйПериодКонец = КонецМесяца(Дата); КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.Удержания.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьУД(Ссылка, Движения.Удержания); КонецПроцедуры //ЗаполнениеГрафиков Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, ГрафикРаботы) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.ГрафикРаботы.Установить(ГрафикРаботы); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Счетчик = 0; Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.ГрафикРаботы = ГрафикРаботы; Если ГрафикРаботы = Справочники.ГрафикРаботы.СуткиЧерезДвоеБригада1 ИЛИ ГрафикРаботы = Справочники.ГрафикРаботы.СуткиЧерезДвоеБригада2 ИЛИ ГрафикРаботы = Справочники.ГрафикРаботы.СуткиЧерезДвоеБригада3 Тогда Счетчик = Счетчик+1; Если Счетчик %3=0 тогда Запись.Значение = 8; Иначе Запись.Значение = 0; КонецЕсли; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Болезнь,Невыход, Оклад) //ДН (Штраф) //РР ОН (Сотрудник,Подразделение,результат, ЧасовБолезни, Размер,ГрафикРаботы) //У (Сотрудник,Подразделение,Результат) //3.29 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в днях. //Дневная ставка рассчитывается как начальное значение оклада, деленное на количество рабочих дней в том же периоде, что и фактически отработанные дни. //Первоначальное значение оклада может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода. //В случае болезни сотрудник дополнительно получает пособие, размер которого определяется как количество часов болезни умноженное на среднюю часовую ставку. //Часы болезни рассчитываются по пятидневному графику. //Средняя часовая ставка определяется как сумма начисленной в текущем месяце оплаты по окладу, поделенная на количество отработанных часов в этом же месяце. //За каждый день болезни сотрудникам предприятия дополнительно начисляется фиксированная сумма денег в качестве компенсации затрат на лекарства. //Размер суммы в течение расчетного периода не меняется. //Если у сотрудника заболел ребенок, то за время болезни ни оклад, ни больничный не начисляется, а начисляется пособие по уходу за ребенком, как 100% от среднего оклада за месяц, предшествующий болезни ребенка, но не больше, чем установленный максимум. //Создать отчет «Перерасчет зарплаты», в котором пользователь должен увидеть записи регистра расчета, которые возможно требуется пересчитать. //Саму процедуру перерасчета записей в рамках данной задачи реализовывать не требуется. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление оклада с 10.01 по 31.01, а запись: оклад с 10.01 по 03.02 вводить нельзя. С помощью диаграммы Ганта показать фактический период действия записей с разбивкой по сотрудникам, и для каждого сотрудника – по видам расчета. Отчет может быть построен за любой расчетный период. //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт //----оклад Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниПериодДействия, 0) КАК ПланДни, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниФактическийПериодДействия, 0) КАК ФактДни, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ОтработаноЧасов |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = ?(Выборка.ПланДни=0,0,СтрокаДвижения.Размер/Выборка.ПланДни*Выборка.ФактДни); СтрокаДвижения.ОтработаноЧасов = выборка.ОтработаноЧасов; СтрокаДвижения.ОтработаноДней = выборка.ФактДни; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); //пособия Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниПериодДействия, 0) КАК ПланДни, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниФактическийПериодДействия, 0) КАК ФактДни, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ОтработаноЧасов, | ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, | ОсновныеНачисленияБазаОсновныеНачисления.ОтработаноЧасовБаза, | ОсновныеНачисленияБазаОсновныеНачисления.ОтработаноДнейБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Пособие), ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.ПособиепоУходуЗаРебенком))) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Пособие), ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.ПособиепоУходуЗаРебенком))) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Пособие Тогда СредняяЧасовая = ?(Выборка.ОтработаноЧасовБаза=0,0,Выборка.РезультатБаза/Выборка.ОтработаноЧасовБаза); СтрокаДвижения.Результат = СредняяЧасовая*Выборка.ОтработаноЧасов; СтрокаДвижения.ОтработаноЧасов = Выборка.ОтработаноЧасов; СтрокаДвижения.ОтработаноДней = Выборка.ФактДни; Иначе Результат = ?(Выборка.ОтработаноДнейБаза=0,0,Выборка.ФактДни*Выборка.РезультатБаза/Выборка.ОтработаноДнейБаза); СтрокаДвижения.Результат = МИН(СтрокаДвижения.Размер, Результат); КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ДополнительныеНачисленияБазаОсновныеНачисления.ОтработаноДнейБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) Цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ОтработаноДнейБаза; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры //ДокНачЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ТЧДок.Размер, | ТЧДок.ГрафикРаботы, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Оклад, 0) КАК Оклад, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.МаксимумПособие, 0) КАК МаксПособие |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДОк КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение"; Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл ВидРасчета = Выборка.ВидРасчета; Если ТипЗнч(ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Пособие Тогда Движение.ГрафикРаботы = Справочники.ГрафикРаботы.Пятидневка; Движение.БазовыйПериодНачало = НачалоМесяца(Движение.ПериодДействия); Движение.БазовыйПериодКонец = КонецМесяца(Движение.ПериодДействия); ИначеЕсли ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.ПособиеПоУходуЗаРебенком Тогда Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Движение.ПериодДействия),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Движение.ПериодДействия)-1; Движение.Размер = Выборка.МаксПособие; Иначе Движение.Размер = Выборка.Оклад; Движение.БазовыйПериодНачало = Движение.ПериодДействияНачало; Движение.БазовыйПериодКонец = Движение.ПериодДействияКонец; КонецЕсли; Иначе Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Движение.БазовыйПериодНачало = НачалоМесяца(Дата); Движение.БазовыйПериодКонец = КонецМесяца(Дата); КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления); КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, ГрафикРаботы) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.ГрафикРаботы.Установить(ГрафикРаботы); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.ГрафикРаботы = ГрафикРаботы; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Запись.ЗначениеДни = 0; Иначе Запись.Значение = 8; Запись.ЗначениеДни = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Оклад, Пособие , ПособиеПоУходуЗаРебенком). ДН (ФиксированнаяСумма), У(Штраф) //РС ГрафикиРаботы (Дата, ГрафикРаботы,Значение,ЗнаениеДни) //РР ОН(Сотрудник,Подразделение,Результат,ОтработаноЧасов,ОтработаноДней, Размер,графикРаботы, Перерасч - Основной (Сотрудник,Подразделение)) //ДН (Сотрудник,Подразделение, Результат,Размер) //Отчет ПересчетЗаработнойПлаты ВЫБРАТЬ Основной.ОбъектПерерасчета, Основной.ВидРасчета, Основной.Сотрудник, Основной.Подразделение ИЗ РегистрРасчета.ОсновныеНачисления.Основной КАК Основной //ОтчетДиаграммаГанта &НаКлиенте Процедура Команда1(Команда) СформироватьНаСервере(); КонецПроцедуры &НаСервере Процедура СформироватьНаСервере() ДГ.Обновление = Ложь; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияФактическийПериодДействия.Сотрудник, | ОсновныеНачисленияФактическийПериодДействия.ВидРасчета, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало КАК Начало, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец КАК Конец |ИЗ | РегистрРасчета.ОсновныеНачисления.ФактическийПериодДействия(ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода) КАК ОсновныеНачисленияФактическийПериодДействия"; Запрос.УстановитьПараметр("КонецПериода", Интервал.ДатаОкончания); Запрос.УстановитьПараметр("НачалоПериода", Интервал.ДатаНачала); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Точка = ДГ.УстановитьТочку(ВыборкаДетальныеЗаписи.Сотрудник); Серия = ДГ.УстановитьСерию(ВыборкаДетальныеЗаписи.ВидРасчета); Значение = ДГ.ПолучитьЗначение(Точка, Серия); Запись = Значение.Добавить(); ЗаполнитьЗначенияСвойств(Запись, ВыборкаДетальныеЗаписи); КонецЦикла; дг.Обновление = Истина; КонецПроцедуры //3.30 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //По основному месту работы сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в днях. //Сумма начисления по окладу определяется как начальное значение оклада, деленное на количество рабочих дней в том же периоде, что и фактически отработанные дни. //Начальное значение оклада одинаково для всех сотрудников конкретного подразделения и должно быть определено по специальной шкале в зависимости от отработанного времени. //Одну или несколько полных недель в течение расчетного периода сотрудники предприятия могут выполнять работы вахтовым методом. //За работу на вахте сотрудники получают оплату по часовому тарифу по шестидневному графику работы. //Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных часов. //В течение расчетного периода тарифная ставка может быть один раз изменена. //Расчет должен производиться исходя из действующей на рассчитываемую дату тарифной ставки. //Например, если эта ставка изменилась 10 августа, то до 10 августа при расчете берется старое значение, а начиная с 10 августа – новое. //Невыход сотрудника на работу по невыясненной причине должен быть зафиксирован в информационной базе, но не оплачивается. //Если сотрудник не вышел на работу по неуважительной причине, то за каждый день прогула начисляется штраф в размере 200 рублей. //В любой момент времени сотрудникам предоставляется оплачиваемый отпуск, размер которого определяется как количество дней отпуска умноженное на среднюю дневную ставку. //Дни отпуска рассчитываются по шестидневному графику. Средняя дневная ставка определяется как сумма всех начислений (без учета отпуска) за предыдущий квартал, поделенная на количество отработанных дней в трех предыдущих месяцах. //Количество предоставляемых в расчетном периоде рабочих дней отпуска не должно превышать 10. //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление оклада с 10.01 по 31.01, а запись: оклад с 10.01 по 03.02 вводить нельзя. //Необходимо предоставить пользователю возможность самостоятельно создавать новые виды расчетов и привязывать их к существующим алгоритмам расчета. //С помощью диаграммы Ганта показать фактический период действия записей с разбивкой по сотрудникам, и для каждого сотрудника – по видам расчета. //Отчет может быть построен за любой расчетный период. //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК ПланДни, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактДни, | ЕСТЬNULL(ОкладыПодразделений.Оклад, 0) КАК Оклад, | ОсновныеНачисленияДанныеГрафика.ЗначениеШестидневкаЧасыФактическийПериодДействия КАК ФактЧасыШестидневка, | ОсновныеНачисленияДанныеГрафика.ЗначениеШестидневкаДниФактическийПериодДействия КАК ФактДниШестидневка, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.ДниБаза, 0) КАК ОтработаноДнейБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Отпуск)) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОкладыПодразделений КАК ОкладыПодразделений | ПО ОсновныеНачисленияДанныеГрафика.Подразделение = ОкладыПодразделений.Подразделение | И (ВЫБОР | КОГДА ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) = 0 | ТОГДА ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия >= ОкладыПодразделений.От | И ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия <= ОкладыПодразделений.До | ИНАЧЕ ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия > ОкладыПодразделений.От И ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия<=ОкладыПодразделений.До | КОНЕЦ)"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.ВидРасчета.АлгоритмРасчета = Перечисления.АлгоритмыРасчета.Оклад Тогда СтрокаДвижения.Результат = ?(Выборка.ПланДни=0,0,Выборка.Оклад/Выборка.ПланДни*Выборка.ФактДни); СтрокаДвижения.Дни = Выборка.ФактДни; СтрокаДвижения.Размер = Выборка.Оклад; ИначеЕсли СтрокаДвижения.ВидРасчета.АлгоритмРасчета = Перечисления.АлгоритмыРасчета.Тариф Тогда СтрокаДвижения.Результат = Выборка.ФактЧасыШестидневка * СтрокаДвижения.Размер; СтрокаДвижения.Дни = Выборка.ФактДниШестидневка; ИначеЕсли СтрокаДвижения.ВидРасчета.АлгоритмРасчета = Перечисления.АлгоритмыРасчета.Отпуск Тогда СтрокаДвижения.Результат = ?(Выборка.ОтработаноДнейБаза=0,0, Выборка.РезультатБаза/Выборка.ОтработаноДнейБаза); ИначеЕсли СтрокаДвижения.ВидРасчета.АлгоритмРасчета = Перечисления.АлгоритмыРасчета.Невыход Тогда СтрокаДвижения.Дни = Выборка.ФактДни; КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьУД(Ссылка, Удержания) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УдержанияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(УдержанияБазаОсновныеНачисления.ДниБаза, 0) КАК ДниБаза |ИЗ | РегистрРасчета.Удержания.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК УдержанияБазаОсновныеНачисления"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из Удержания цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = 200*Выборка.ДниБаза; КонецЦикла; КонецЦикла; Удержания.Записать(,Истина); КонецПроцедуры //Док Нач ЗП Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета.АлгоритмРасчета КАК АлгоритмРасчета |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник КАК Сотрудник, | ТЧДок.Подразделение КАК Подразделение, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Оклад, 0) КАК Оклад, | &НачалоМесяца КАК НачалоВИстории |ПОМЕСТИТЬ ВТОклады |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | СведенияОСотрудниках.Сотрудник, | СведенияОСотрудниках.Подразделение, | СведенияОСотрудниках.Оклад, | СведенияОСотрудниках.Период |ИЗ | РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках |ГДЕ | СведенияОСотрудниках.Период > &НачалоМесяца | И СведенияОСотрудниках.Период <= &КонецМесяца | И СведенияОСотрудниках.Сотрудник В | (ВЫБРАТЬ | Т.Сотрудник | ИЗ | ТЧДок КАК Т) | И СведенияОСотрудниках.Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧдок КАК Т) | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТОклады.Сотрудник КАК Сотрудник, | ВТОклады.Подразделение КАК Подразделение, | ВТОклады.Оклад, | ВТОклады.НачалоВИстории |ПОМЕСТИТЬ ВТОкладыСгр |ИЗ | ВТОклады КАК ВТОклады | |СГРУППИРОВАТЬ ПО | ВТОклады.Сотрудник, | ВТОклады.НачалоВИстории, | ВТОклады.Подразделение, | ВТОклады.Оклад | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник КАК Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета КАК ВидРасчета, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ТЧДок.Размер, | ТЧДок.ПериодРегистрации, | ВТОкладыСгр.НачалоВИстории КАК НачалоВИстории, | ЕСТЬNULL(ВТОкладыСгр.Оклад, 0) КАК Тариф, | ТЧДок.АлгоритмРасчета |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ ВТОкладыСгр КАК ВТОкладыСгр | ПО ТЧДок.Сотрудник = ВТОкладыСгр.Сотрудник | И ТЧДок.Подразделение = ВТОкладыСгр.Подразделение | И (ТЧДок.АлгоритмРасчета = ЗНАЧЕНИЕ(Перечисление.АлгоритмыРАсчета.Тариф)) | |УПОРЯДОЧИТЬ ПО | ВидРасчета, | НачалоВИстории |ИТОГИ ПО | Сотрудник"; Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Дата)); Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка",Ссылка); Результат = Запрос.Выполнить(); ВыборкаСотрудник = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСотрудник.Следующий() Цикл // Вставить обработку выборки ВыборкаСотрудник Выборка = ВыборкаСотрудник.Выбрать(); НоваяСтрока = Ложь; Пока Выборка.Следующий() Цикл Если Выборка.АлгоритмРасчета = Перечисления.АлгоритмыРасчета.Тариф Тогда Если Ложь Тогда Движение = Неопределено; КонецЕсли; Если НоваяСтрока Тогда Движение.ПериодДействияКонец = МАКС(Выборка.ПериодДействияНачало,Выборка.НачалоВИстории)-1; КонецЕсли; Движение = Движения.ОсновныеНачисления.Добавить(); Движение.ПериодРегистрации = Дата; Движение.ПериодДействияНачало = МАКС(Выборка.ПериодДействияНачало,Выборка.НачалоВИстории); Движение.ПериодДействияКонец = Выборка.ПериодДействияКонец; Движение.Сотрудник = Выборка.Сотрудник; Движение.Подразделение = Выборка.Подразделение; Движение.ВидРасчета = Выборка.ВидРасчета; Движение.Размер = Выборка.Тариф; НоваяСтрока = Истина; ИначеЕсли Выборка.АлгоритмРасчета = Перечисления.АлгоритмыРасчета.Оклад Или Выборка.АлгоритмРасчета = Перечисления.АлгоритмыРасчета.Невыход Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); ИначеЕсли Выборка.АлгоритмРасчета = Перечисления.АлгоритмыРасчета.Отпуск Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Движение.ПериодДействия),-3); Движение.БазовыйПериодКонец = НачалоМесяца(Движение.ПериодДействия)-1; Иначе Движение = Движения.Удержания.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Движение.БазовыйПериодНачало = НачалоМесяца(Дата); Движение.БазовыйПериодКонец = КонецМесяца(Дата); КонецЕсли; КонецЦикла; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.Удержания.Записать(); ПроверитьОтпуск(Отказ); Если Отказ Тогда Возврат; КонецЕсли; РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьУД(Ссылка, Движения.Удержания); КонецПроцедуры Процедура ПроверитьОтпуск(ОТказ) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактОтпуск, | ОсновныеНачисленияДанныеГрафика.Сотрудник, | ОсновныеНачисленияДанныеГрафика.Подразделение |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | ВидРасчета.АлгоритмРасчета = ЗНАЧЕНИЕ(Перечисление.АлгоритмыРасчета.Отпуск) | И ПериодРегистрации = &ТекущийМесяц) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("ТекущийМесяц", НачалоМесяца(Дата)); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если ВыборкаДетальныеЗаписи.ФактОтпуск >10 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Отпуск превышает 10 дней"; Сообщение.Сообщить(); ОТказ = Истина; КонецЕсли; КонецЦикла; КонецПроцедуры //Переч АлгоритмыРасчета (Оклад,Тариф,отпуск,Невыход,Штраф) //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Прочитать(); НАбор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 1; КонецЕсли; пДеньНедели = ДеньНедели(Дат); Если пДеньНедели = 7 тогда Запись.ЗначениеШестидневкаДни = 0; Запись.ЗначениеШестидневкаЧасы = 0; Иначе Запись.ЗначениеШестидневкаДни =1; Запись.ЗначениеШестидневкаЧасы = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //Добавляем в пвр реквизит. //ПВР ОН (Невыход,Оклад,Отпуск, ТарифВахтовыйМетод) //У (Штарф) //РС ГрафикиРаботы (Дата. Значение, ЗначениеШестидневкаДни, ЗначениеШестидневкаЧасы) //ОкладыПодразделений (Изм: Подразделение. От,До, рес. Оклад) //РР ОН (Сотрудник,Подразделение,результат,Дни... Размер) //У (Сотрудник,Подразделение,Результат,..Размер) //ДиаграммаГанта &НаКлиенте Процедура Команда1(Команда) СформироватьНаСервере(ДГ,Интервал); КонецПроцедуры &НаСервере Процедура СформироватьНаСервере(ДГ,Интервал) ДГ.Обновление = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияФактическийПериодДействия.Сотрудник, | ОсновныеНачисленияФактическийПериодДействия.ВидРасчета, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало КАК Начало, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец КАК Конец |ИЗ | РегистрРасчета.ОсновныеНачисления.ФактическийПериодДействия(ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода) КАК ОсновныеНачисленияФактическийПериодДействия"; Запрос.УстановитьПараметр("КонецПериода", Интервал.ДатаОкончания); Запрос.УстановитьПараметр("НачалоПериода", Интервал.ДатаНачала); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Точка = ДГ.УстановитьТочку(ВыборкаДетальныеЗаписи.Сотрудник); Серия = ДГ.УстановитьСерию(ВыборкаДетальныеЗаписи.ВидРасчета); Значение = ДГ.ПолучитьЗначение(Точка, Серия); Запись = Значение.Добавить(); ЗаполнитьЗначенияСвойств(Запись, ВыборкаДетальныеЗаписи); КонецЦикла; ДГ.Обновление = Истина; КонецПроцедуры //3.31 Начисление зарплаты сотрудникам охранного предприятия осуществляется еженедельно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждого охранника отдельно. //Для организации непрерывной охраны предприятия работает три смены охраны: первая смена работает с 0 до 8 часов, вторая – с 9 до 16 часов, третья – с 17 до 24 часов. //Каждый охранник может работать в любую смену. Сотрудники получают оплату по часовому тарифу. //Сумма начисления по тарифу определяется как часовая ставка, умноженная на количество фактически отработанных часов. //Часовая ставка в расчетном периоде не меняется. //В случае болезни сотрудник дополнительно получает пособие, размер которого определяется как количество часов болезни умноженное на среднюю часовую ставку. //Часы болезни рассчитываются по пятидневному графику. //Средняя часовая ставка определяется как сумма начисленной за прошедшую неделю оплаты по тарифу, поделенная на количество рабочих часов в той же неделе. //Не зависимо от отработанного времени сотрудникам предприятия еженедельно выплачивается фиксированная сумма денег в качестве компенсации затрат на обмундирование. //Размер суммы одинаков для всех сотрудников и может быть изменен один раз только в начале года. //Если в течение недели сотрудник отработал времени больше, чем ему было положено по норме, то за каждый час переработки выплачивается премия 100 рублей. //Норма часов в неделю одна для всех сотрудников. //Ее значение должно храниться в информационной базе. //Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одной недели. //Для анализа полученных сотрудниками предприятия премий в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт //рассчитаем тариф Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК ФактЧасов, | ОсновныеНачисленияДанныеГрафика.НомерСтроки |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Тариф)) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ФактЧасов; СтрокаДвижения.ОтработаноВремени = Выборка.ФактЧасов; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); //пособие Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасов, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод, 0) КАК ЧасовБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Пособие)) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Пособие)) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СредняяЧасоваяСтавка = ?(Выборка.ЧасовБаза=0,0,Выборка.РезультатБаза/Выборка.ЧасовБаза); СтрокаДвижения.Результат = СредняяЧасоваяСтавка*Выборка.ФактЧасов; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.ОтработаноВремениБаза, 0) КАК ОтработаноВремениБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Премия)) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если Выборка.ОтработаноВремениБаза >СтрокаДвижения.Размер Тогда Доплатить = (Выборка.ОтработаноВремениБаза-СтрокаДвижения.Размер)*100; СтрокаДвижения.Результат = Доплатить; СтрокаДвижения.ЧасовПереработки = Выборка.ОтработаноВремениБаза-СтрокаДвижения.Размер; КонецЕсли; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры //Константа НормыЧасовСотрудников (число) //ДокНачЗп 2 тч Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации, | ЕСТЬNULL(СведенияОСотрудниках.Тариф, 0) КАК Тариф |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках | ПО НачислениеЗарплатыОсновныеНачисления.Сотрудник = СведенияОСотрудниках.Сотрудник |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Тариф Тогда Движение.Размер = Выборка.Тариф; ИначеЕсли Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Пособие Тогда Движение.БазовыйПериодНачало = НачалоНедели(НачалоНедели(Дата)-1); Движение.БазовыйПериодКонец = НачалоНедели(Дата)-1; Движение.ГрафикРаботы = Справочники.ГрафикРаботы.Пятидневка; КонецЕсли; КонецЦикла; НормаСотрудников = Константы.НормыЧасовСотрудников.Получить(); ФиксированнаяСумма = РегистрыСведений.ФиксированнаяСуммаСотрудникам.ПолучитьПоследнее().Сумма; Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, СтрокаДвижения); Движение.ПериодРегистрации = Дата; Движение.ПериодДействияНачало = НачалоНедели(Дата); Движение.ПериодДействияКонец = КонецНедели(Дата); Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.Премия Тогда Движение.БазовыйПериодНачало = НачалоНедели(Дата); Движение.БазовыйПериодКонец = КонецНедели(Дата); Движение.Размер = НормаСотрудников; Иначе Движение.Результат = ФиксированнаяСумма; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления); КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, Сотрудник, ГрафикРаботы,ЧасыРаботы) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.Сотрудник.Установить(Сотрудник); Набор.Отбор.ГрафикРаботы.Установить(ГрафикРаботы); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.Сотрудник = Сотрудник; Запись.ГрафикРаботы = ГрафикРаботы; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Если ГрафикРаботы = Справочники.ГрафикРаботы.Смена1 Тогда Запись.Значение = 8; ИначеЕсли ГрафикРаботы = Справочники.ГрафикРаботы.Смена2 ИЛИ ГрафикРаботы =Справочники.ГрафикРаботы.Смена3 Тогда Запись.Значение = 7; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Пособие,Тариф), ДН (Премия, ФиксированнаяСумма), У(Штраф). //СведенияОСотрудниках (Подразделение,Сотрудник,Тариф). РС ФиксированнаяСуммаСотрудникам (в пределах года, рес.Сумма) //РР ОН (Сотрудник. Результат, ОтработаноВремени, Размер, ГрафикРаботы) ДН (Сотрудник,Результат, ЧасовПереработки, Размер) //Отчет АнализПремий ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.ЧасовПереработки, ДополнительныеНачисления.Результат ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления //3.32 Начисление зарплаты сотрудникам охранного предприятия осуществляется еженедельно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждой смены отдельно. //Для организации непрерывной охраны предприятия работает три смены охраны: первая смена в первый день работает, во второй и третий отдыхает, вторая смена работает во второй день, в первый и третий отдыхает, третья смена в третий день работает, в первый и второй отдыхает. //Каждый охранник может работать только в свою смену. Сотрудники получают оплату по часовому тарифу. //Сумма начисления по тарифу определяется как часовая ставка, умноженная на количество фактически отработанных часов. //Часовая ставка в расчетном периоде не меняется. Не зависимо от отработанного времени сотрудникам предприятия еженедельно выплачивается фиксированная сумма денег в качестве компенсации затрат на обмундирование. //Размер суммы определяется как определенный процент от среднего заработка сотрудника за предыдущий год. //Средний заработок рассчитывается как сумма начисления по тарифу в прошлом году, поделенная на количество рабочих часов за этот год. //Размер процента одинаков для всех сотрудников и может быть изменен один раз только в начале года Один календарный месяц в году сотрудникам предоставляется оплачиваемый отпуск, размер которого определяется как количество дней отпуска умноженное на среднюю дневную ставку. //Дни отпуска рассчитываются по пятидневному графику. //Средняя дневная ставка определяется как сумма всех начислений за три предыдущих отпуску месяца, поделенная на количество отработанных дней в трех предыдущих месяцах. //Следует учесть, что данные об отпуске не могут вводиться в систему задним числом. Создать обработку «Перерасчет зарплаты», в котором пользователь должен не только увидеть записи регистра расчета, которые возможно требуется пересчитать, но и выполнить саму процедуру перерасчета. //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления, ЭтоПересчет = Ложь) Экспорт УсловиеПересчета = ""; Запрос = новый Запрос; Если ЭтоПересчет Тогда Запрос.Текст = Запрос.Текст+ "ВЫБРАТЬ | Основной.Сотрудник |ПОМЕСТИТЬ ТЧПересчет |ИЗ | РегистрРасчета.ОсновныеНачисления.Основной КАК Основной |ГДЕ | Основной.ОбъектПерерасчета = &Ссылка | И Основной.ВидРасчета = Значение(ПланВидовРасчета.ОсновныеНачисления.Отпуск) |///////////////////////////////// |;"; УсловиеПересчета = " И Сотрудник В (Выбрать Т.Сотрудник из ТЧПересчет как Т)"; КонецЕсли; Запрос.Текст = Запрос.Текст+ "ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.ОтработаноДнейБаза, 0) КАК ОтработаноДнейБаза |ПОМЕСТИТЬ ВТБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка"+?(ЭтоПересчет,УсловиеПересчета,"")+") КАК ОсновныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка"+?(ЭтоПересчет,УсловиеПересчета,"")+") КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ВТБаза.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ВТБаза.ОтработаноДнейБаза, 0) КАК ОтработаноДнейБаза, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК НормаЧасов, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасов, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниФактическийПериодДействия, 0) КАК ФактДни |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка"+?(ЭтоПересчет,УсловиеПересчета,"")+") КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ ВТБаза КАК ВТБаза | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ВТБаза.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.ОплатаПоЧасовомуТарифу Тогда СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ФактЧасов; СтрокаДвижения.ОтработаноДней = Выборка.ФактДни; СтрокаДвижения.НормаЧасов = Выборка.НормаЧасов; Иначе СредняяДневнаяСтавка = ?(Выборка.ОтработаноДнейБаза=0,0,Выборка.РезультатБаза/Выборка.ОтработаноДнейБаза); СтрокаДвижения.Результат = СредняяДневнаяСтавка * Выборка.ФактДни; КонецЕсли; КонецЦикла; КонецЦикла; ТолькоЗапись = ?(ЭтоПересчет, Ложь,Истина); ОсновныеНачисления.Записать(,ТолькоЗапись); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления, ЭтоПересчет = Ложь) Экспорт Запрос = Новый Запрос; УсловиеПересчета = ""; Если ЭтоПересчет Тогда Запрос.Текст = Запрос.Текст+ "ВЫБРАТЬ | Дополнительно.Сотрудник |ПОМЕСТИТЬ ТЧПересчеты |ИЗ | РегистрРасчета.ДополнительныеНачисления.Дополнительно КАК Дополнительно |ГДЕ | Дополнительно.ОбъектПерерасчета = &Ссылка | И Дополнительно.ВидРасчета = Значение(ПланВидовРасчета.ДополнительныеНачисления.ФиксированнаяСумма) |///////////////////////////////// |;"; УсловиеПересчета = " И Сотрудник В (Выбрать Т.Сотрудник из ТЧПересчеты как Т)"; КонецЕсли; Запрос.Текст = Запрос.Текст + "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.НормаЧасовБаза, 0) КАК НормаЧасовБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка"+?(ЭтоПересчет,УсловиеПересчета,"")+") КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СредняяДневнаяСтавка= ?(Выборка.НормаЧасовБаза=0,0,Выборка.РезультатБаза/Выборка.НормаЧасовБаза); СтрокаДвижения.Результат = СредняяДневнаяСтавка*СтрокаДвижения.Размер; КонецЦикла; КонецЦикла; ТолькоЗапись = ?(ЭтоПересчет,Ложь, Истина); ДополнительныеНачисления.Записать(,ТолькоЗапись); КонецПроцедуры //ДокНАчЗП 2 тч Процедура ОбработкаПроведения(Отказ, РежимПроведения) //основные начисления Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.ВидРасчета, | ТЧДок.ПериодДействияКонец, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Тариф, 0) КАК Тариф, | СведенияОСотрудникахСрезПоследних.ГрафикРаботы |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | Сотрудник В | (ВЫБРАТЬ | Т.Сотрудник | ИЗ | ТЧДОк КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник"; Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда Движение.ГрафикРаботы = Справочники.ГрафикРаботы.Пятидневка; Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Дата),-3); Движение.БазовыйПериодКонец = НачалоМесяца(Дата)-1; Иначе Движение.Размер = Выборка.Тариф; КонецЕсли; КонецЦикла; //дополнительные начисления РазмерПроцента = РегистрыСведений.ПроцентыНаКомпенсацию.ПолучитьПоследнее(Дата).Процент; Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, СтрокаДвижения); Движение.ПериодРегистрации = Дата; Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоГода(Дата),-12); Движение.БазовыйПериодКонец = НачалоГода(Дата)-1; Движение.Размер = РазмерПроцента/100; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления); КонецПроцедуры Процедура ПересчетДокумента() Экспорт НачатьТранзакцию(); Движения.ОсновныеНачисления.Прочитать(); Движения.ДополнительныеНачисления.Прочитать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления, Истина); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления, Истина); Попытка Записать(РежимЗаписиДокумента.Запись); Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ОписаниеОшибки(); Сообщение.Сообщить(); ОтменитьТранзакцию(); Возврат; КонецПопытки; НаборПересчет = РегистрыРасчета.ОсновныеНачисления.Перерасчеты.Основной.СоздатьНаборЗаписей(); НаборПересчет.Отбор.ОбъектПерерасчета.Установить(Ссылка); НаборПересчет.Записать(); НаборПересчет = РегистрыРасчета.ДополнительныеНачисления.Перерасчеты.Дополнительно.СоздатьНаборЗаписей(); НаборПересчет.Отбор.ОбъектПерерасчета.Установить(Ссылка); НаборПересчет.Записать(); ЗафиксироватьТранзакцию(); КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни,ГрафикРаботы) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); набор.Отбор.ГрафикРаботы.Установить(ГрафикРаботы); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Счетчик = 0; Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.ГрафикРаботы = ГрафикРаботы; Если ГрафикРаботы = Справочники.ГрафикРаботы.Смена1 ИЛИ ГрафикРаботы =Справочники.ГрафикРаботы.Смена2 ИЛИ ГрафикРаботы =Справочники.ГрафикРаботы.Смена3 Тогда Счетчик = Счетчик+1; Если Счетчик%3=0 Тогда Запись.Значение = 24; Запись.ЗначениеДни = 1; Иначе Запись.Значение = 0; Запись.ЗначениеДни = 0; КонецЕсли; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Запись.ЗначениеДни = 0; Иначе Запись.Значение = 8; Запись.ЗначениеДни = 1; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //Обработка ПересчетЗарплаты тч Объекты (ОбъектПерерасчета, Сотрудник,ВидРАсчета) //МодуьФормы &НаКлиенте Процедура Заполнить(Команда) ЗаполнитьНаСервере(); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // &НаСервере Процедура ЗаполнитьНаСервере() ДокументОбъект = РеквизитФормыВЗначение("Объект"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Дополнительно.ОбъектПерерасчета, | Дополнительно.ВидРасчета, | Дополнительно.Сотрудник |ИЗ | РегистрРасчета.ДополнительныеНачисления.Дополнительно КАК Дополнительно | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | Основной.ОбъектПерерасчета, | Основной.ВидРасчета, | Основной.Сотрудник |ИЗ | РегистрРасчета.ОсновныеНачисления.Основной КАК Основной"; Результат = Запрос.Выполнить(); ДокументОбъект.Объекты.Загрузить(Результат.Выгрузить()); ЗначениеВРеквизитФормы(ДокументОбъект,"Объект"); КонецПроцедуры // ЗаполнитьНаСервере() &НаКлиенте Процедура КомандаПересчитать(Команда) ПересчетНаСервере(); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // &НаСервере Процедура ПересчетНаСервере() Для каждого Строка из Объект.Объекты цикл ДокументОбъект = Строка.ОбъектПерерасчета.ПолучитьОбъект(); ДокументОбъект.ПересчетДокумента(); КонецЦикла; КонецПроцедуры // ПересчетНаСервере() //ПВР ОН (ОплатаПоЧасовомуТарифу, Отпуск), ДН (ФиксированнаяСумма), У(Штраф) //РС СведенияОСотрудниках (Сотрудник,Тариф,графикРАботы) //РС ГрафикРаботы (Дата,ГрафикРаботы,Значение, ЗначениеДни) //РС ПроцентыНаКомпенсацию (В пределах года, Процент) //РР ОН (Сотрудник, Результат,ОтработаноДней,нормаЧасов... Размер,ГрафикРаботы Перерасчет - Основной(Сотрудник)) //ДН (Сотрудник,Результат,Размер, Перерасчет - Дополнительно (Сотрудник)) //3.33 Начисление зарплаты сотрудникам охранного предприятия осуществляется еженедельно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждого охранника отдельно. //Для организации непрерывной охраны предприятия работает три смены охраны: первая смена работает с 0 до 8 часов, вторая – с 9 до 16 часов, третья – с 17 до 24 часов. //Каждый охранник может работать в любую смену. Сотрудники получают оплату по часовому тарифу. //Сумма начисления по тарифу определяется как часовая ставка, умноженная на количество фактически отработанных часов. //Часовая ставка в расчетном периоде не меняется. В начале недели в информационную базу вводится информация о планируемой занятости сотрудников. //В случае невыхода сотрудника на работу его должен подменить сотрудник из другой смены. //Факт подмены не отменяет работы по основному графику. //Не зависимо от отработанного времени сотрудникам предприятия ежемесячно выплачивается определенная сумма денег в качестве компенсации затрат на обмундирование или за обеды. //Обе компенсации начисляются в виде фиксированной суммы, указанной в документе, и одновременно начислены быть не могут. //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одной недели или одного месяца. //С помощью диаграммы Ганта показать фактический период действия записей с разбивкой по сотрудникам, и для каждого сотрудника – по сменам. //Отчет может быть построен за любой расчетный период. //Для анализа сделанных сотрудникам предприятия ежемесячны //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасов |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ФактЧасов; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры //Спр Смены. //Док нач зп 2 тч В тч осн добавляем рекв (Смена, СотрудникЗамена (физЛ)). . ТЧ доп - Сотрудник, видРАчета,Размер //Модуль Об Процедура ОбработкаПроведения(Отказ, РежимПроведения) Для каждого СтрокаДвижения из ОсновныеНачисления цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, СтрокаДвижения); Движение.ПериодДействияНачало = НачалоДня(СтрокаДвижения.ДатаНачала); Движение.ПериодДействияКонец = КонецДня(СтрокаДвижения.ДатаОкончания); Движение.ПериодРегистрации = Дата; Если НЕ ЗначениеЗаполнено(СтрокаДвижения.СотрудникЗамена) Тогда Движение.СотрудникЗамена = СтрокаДвижения.Сотрудник; КонецЕсли; КонецЦикла; Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, СтрокаДвижения); Движение.ПериодРегистрации = Дата; Движение.Результат = СтрокаДвижения.Размер; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); КонецПроцедуры //ДОк ПланируемаяЗанятостьСотрудников //тч Графики (Дата,Сотрудник,Смены,Значение) Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ГрафикиРаботы Движения.ГрафикиРаботы.Записывать = Истина; Для Каждого ТекСтрокаГрафики Из Графики Цикл Движение = Движения.ГрафикиРаботы.Добавить(); Движение.Дата = ТекСтрокаГрафики.Дата; Движение.Сотрудник = ТекСтрокаГрафики.Сотрудник; Движение.Смена = ТекСтрокаГрафики.Смены; Движение.Значение = ТекСтрокаГрафики.Значение; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Прочитать(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Невыход,Оклад) ДН (Премия) //РС ГрафикиРаботы (Дата,Сотрудник,Смена,Значение) //РР ОН (Сотрудник, Результат, Размер,Смена, СотрудникЗамена) //ДН (Сотрудник, Результат, Размер,Смена, СотрудникЗамена) //Отчет ДиаграммаГанта &НаКлиенте Процедура Команда1(Команда) СформироватьНаСервере(); КонецПроцедуры &НаСервере Процедура СформироватьНаСервере() ДГ.Обновление = ЛОжь; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияФактическийПериодДействия.Сотрудник, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало КАК Начало, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец КАК Конец, | ОсновныеНачисленияФактическийПериодДействия.Смена |ИЗ | РегистрРасчета.ОсновныеНачисления.ФактическийПериодДействия(ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода) КАК ОсновныеНачисленияФактическийПериодДействия"; Запрос.УстановитьПараметр("КонецПериода", Интервал.ДатаОкончания); Запрос.УстановитьПараметр("НачалоПериода", Интервал.ДатаНачала); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Точка = ДГ.УстановитьТочку(ВыборкаДетальныеЗаписи.Сотрудник); Серия = ДГ.УстановитьСерию(ВыборкаДетальныеЗаписи.Смена); Значение = ДГ.ПолучитьЗначение(Точка, Серия); Запись = Значение.Добавить(); ЗаполнитьЗначенияСвойств(Запись, ВыборкаДетальныеЗаписи); КонецЦикла; ДГ.Обновление = Истина; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА КонецПроцедуры //Отчет АнализНачислений ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.ПериодДействия, ОсновныеНачисления.Результат ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.ПериодРегистрации, ДополнительныеНачисления.Результат ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода // 3.34 Начисление зарплаты сотрудникам охранного предприятия осуществляется еженедельно с использованием метода отклонений. //Для организации непрерывной охраны предприятия работает три смены охраны: первая смена в первый день работает, во второй и третий отдыхает, вторая смена работает во второй день, в первый и третий отдыхает, третья смена в третий день работает, в первый и второй отдыхает. //Каждый охранник может работать в любую смену. Сотрудники получают оплату по часовому тарифу. //Сумма начисления по тарифу определяется как часовая ставка, умноженная на количество фактически отработанных часов. //Часовая ставка в расчетном периоде не меняется. В начале недели в информационную базу вводится информация о планируемой занятости сотрудников. //В случае невыхода сотрудника на работу его должен подменить сотрудник из другой смены. //Факт подмены не отменяет работы по основному графику. //Не зависимо от отработанного времени сотрудникам предприятия еженедельно выплачивается определенная сумма денег в качестве компенсации затрат на обмундирование или за обеды. //Для новых сотрудников обе компенсации одновременно начислены быть не могут. //Если сотрудник отработал больше ста дней, то он получает обе надбавки. //Обе компенсации начисляются в виде фиксированной суммы, указанной в документе, и одновременно начислены быть не могут. //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одной недели. //Необходимо предоставить пользователю возможность исправлять результат расчета в форме документа. //С помощью диаграммы Ганта показать фактический период действия записей с разбивкой по сотрудникам, и для каждого сотрудника – по сменам. //Отчет может быть построен за любой расчетный период. //Для анализа сделанных сотрудникам предприятия еженедельных начислений в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасов |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.Результат <>0 Тогда Продолжить; КонецЕсли; СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ФактЧасов; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаДополнительныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.Результат <>0 Тогда Продолжить; КонецЕсли; Если СтрокаДвижения.РезультатБаза <>0 Тогда СтрокаДвижения.Результат = 0; КонецЕсли; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры //Созд Спр Смены //ДокНачЗП ПериодРегистрации 2 тч (ОН - добавляем Смену) //Модуль формы &НаКлиенте Процедура КомандаЗаполнитьТЧ(Команда) ЗаполнитьНаСервере(); КонецПроцедуры &НаСервере Процедура ЗаполнитьНаСервере() ДокОбъект =РеквизитФормыВЗначение("Объект"); //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! //Запрос = Новый Запрос; //Запрос.Текст = // "ВЫБРАТЬ // | ПлановаяЗанятость.Смена, // | ПлановаяЗанятость.Начало, // | ПлановаяЗанятость.Конец, // | ПлановаяЗанятость.Сотрудник // |ИЗ // | РегистрСведений.ПлановаяЗанятость КАК ПлановаяЗанятость // |ГДЕ // | ПлановаяЗанятость.Начало >= &ПериодРегистрации // | И ПлановаяЗанятость.Конец <= &КонецНедели"; // //Запрос.УстановитьПараметр("КонецНедели", КонецНедели(Объект.ПериодРегистрации)); //Запрос.УстановитьПараметр("ПериодРегистрации", ПериодРегистрации); //Результат = Запрос.Выполнить(); //ВыборкаДетальныеЗаписи = Результат.Выбрать(); //Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // // Вставить обработку выборки ВыборкаДетальныеЗаписи //КонецЦикла; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА КонецПроцедуры // ЗаполнитьНаСервере\() //ДокПлановаяЗанятость тч Занятость - Стотрудник , ДатаНач, ДатаКон, Смена Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ПлановаяЗанятость Движения.ПлановаяЗанятость.Записывать = Истина; Для Каждого ТекСтрокаЗанятость Из Занятость Цикл Движение = Движения.ПлановаяЗанятость.Добавить(); Движение.Сотрудник = ТекСтрокаЗанятость.Сотрудник; Движение.Начало = ТекСтрокаЗанятость.ДатаНач; Движение.Конец = КонецДня(ТекСтрокаЗанятость.ДатаКон); Движение.Смена = ТекСтрокаЗанятость.Смена; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Прочитать(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Тариф), ДН (ЗатратыНаОбеды, ЗатратыОбмундирование) //РС ПлановаяЗанятость (Сотрудник,Начало,Конец,Смена) //Рег Обор ОтработанныйДни (Сотрудник рес.ДНи) //РР ОН (Сотрудник,Результат.. Размер,Смена) //РР ДН (Сотрудник,Результат.. Размер,) //РС График (Дата,Смена,Значение) //3.35 Начисление зарплаты сотрудникам авто-предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждого водителя отдельно. //Сотрудники работают на собственных автомобилях, поэтому обмен автомобилями между водителями не возможен. //Сотрудники предприятия получают оплату по часовому тарифу. //Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных часов. //Тарифная ставка одинакова для всех сотрудников и должна быть определена по специальной шкале в зависимости от отработанного времени. //Если водитель в расчетном периоде наездил больше 1000 часов, то ему должна быть начислена компенсация на ремонт автомобиля процентом от начисленной в том же расчетном периоде оплаты по тарифу. //Процент компенсации общий для всех сотрудников. //В течение периода начисления может изменяться не чаще, чем один раз в день, но берется на начало текущего расчетного периода. //В информационной базе необходимо хранить историю изменения процента премии. //Если сотрудник не вышел на работу по неуважительной причине, то за каждый день прогула начисляется штраф в размере 5000 рублей. //Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по тарифу с 10.01 по 31.01, а запись: тариф с 10.01 по 03.02 вводить нельзя. //Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида: Отчет может быть построен за любой расчетный период. //При создании отчета необходимо использовать механизм компоновки данных. //Для анализа полученных сотрудниками предприятия компенсаций на ремонт в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасов, | ЕСТЬNULL(ТарифнаяШкала.РазмерСтавки, 0) КАК Тариф, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниФактическийПериодДействия, 0) КАК ДниФакт |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТарифнаяШкала КАК ТарифнаяШкала | ПО (ВЫБОР | КОГДА ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) = 0 | ТОГДА ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) МЕЖДУ ТарифнаяШкала.От И ТарифнаяШкала.До | ИНАЧЕ ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) > ТарифнаяШкала.От | И ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) <= ТарифнаяШкала.До | КОНЕЦ)"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.ОкладПоТарифу Тогда СтрокаДвижения.Результат = Выборка.Тариф*выборка.ФактЧасов; СтрокаДвижения.ОтработаноЧасов = Выборка.ФактЧасов; СтрокаДвижения.Размер = Выборка.Тариф; Иначе СтрокаДвижения.ДнейНевыхода = Выборка.ДниФакт; КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.ОтработаноЧасовБаза, 0) КАК ЧасовБаза, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока выборка.НайтиСледующий(Поиск) цикл Если выборка.ЧасовБаза>100 Тогда СтрокаДвижения.Результат = СтрокаДвижения.Размер/100*выборка.РезультатБаза; КонецЕсли; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьУД(Ссылка, Удержания) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УдержанияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(УдержанияБазаОсновныеНачисления.ДнейНевыходаБаза, 0) КАК ДнейНевыходБаза |ИЗ | РегистрРасчета.Удержания.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК УдержанияБазаОсновныеНачисления"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из Удержания цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = Выборка.ДнейНевыходБаза*5000; КонецЦикла; КонецЦикла; Удержания.Записать(,Истина); КонецПроцедуры //ДокНАчЗП - 3 тч Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.Ссылка.Дата КАК ПериодРегистрации, | НАЧАЛОПЕРИОДА(НачислениеЗарплатыДополнительныеНачисления.Ссылка.Дата, МЕСЯЦ) КАК БазовыйПериодНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыДополнительныеНачисления.Ссылка.Дата, МЕСЯЦ) КАК БазовыйПериодКонец, | ЕСТЬNULL(ПроцентыКомпенсацииСрезПоследних.Процент, 0) КАК Размер |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления, | РегистрСведений.ПроцентыКомпенсации.СрезПоследних(&НачалоМесяца, ) КАК ПроцентыКомпенсацииСрезПоследних |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | НачислениеЗарплатыУдержания.Сотрудник КАК Сотрудник, | НачислениеЗарплатыУдержания.Подразделение, | НачислениеЗарплатыУдержания.ВидРасчета, | НачислениеЗарплатыУдержания.Ссылка.Дата КАК ПериодРегистрации, | НАЧАЛОПЕРИОДА(НачислениеЗарплатыУдержания.Ссылка.Дата, МЕСЯЦ) КАК БазовыйПериодНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыУдержания.Ссылка.Дата, МЕСЯЦ) КАК БазовыйПериодКонец |ИЗ | Документ.НачислениеЗарплаты.Удержания КАК НачислениеЗарплатыУдержания |ГДЕ | НачислениеЗарплатыУдержания.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.ВыполнитьПакет(); Выборка = Результат[0].Выбрать(); Пока Выборка.Следующий() цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); КонецЦикла; Выборка = Результат[1].Выбрать(); Пока Выборка.Следующий() цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); КонецЦикла; Выборка = Результат[2].Выбрать(); Пока Выборка.Следующий() цикл Движение = Движения.Удержания.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); Движения.Удержания.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления); РасчетЗаработнойПлаты.РассчитатьУД(Ссылка, Движения.Удержания); КонецПроцедуры //ЗаполениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, Сотрудник) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.Сотрудник.Установить(Сотрудник); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.Сотрудник = Сотрудник; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Запись.ЗначениеДни = 0; Иначе Запись.Значение = 8; Запись.ЗначениеДни = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Невыход, ОкладПоТарифу), ДН (Премия) У (Штраф). //РС ГРафик Дата,Сотрудник,Значение,ЗначениеДни //РС ПроцентыКомпенсации - в пределах дня . рс. Процент //РС ТарифнаяШкала От, до, РазмерСтавки //РР ОН Сотрудник, Подразделение, Результат, ДнейНевыхода,ОтработаноЧасов.... Размер. //ДН Сотрудник, Подразделение, Результат,.... Размер. //У ДН Сотрудник, Подразделение, Результат,.... Размер. //Отчет АнализНачислений ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.ПериодДействия, ОсновныеНачисления.Результат ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.ПериодРегистрации, ДополнительныеНачисления.Результат ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Удержания.Сотрудник, Удержания.Подразделение, Удержания.ВидРасчета, Удержания.ПериодРегистрации, -Удержания.Результат ИЗ РегистрРасчета.Удержания КАК Удержания ГДЕ Удержания.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода //Отчет АнализКомпенсаций ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.ОтработаноЧасов, 0 КАК Результат, 0 КАК БылоУдержание ПОМЕСТИТЬ ТЧ ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода И ОсновныеНачисления.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.ОкладПоТарифу) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, 0, ДополнительныеНачисления.Результат, 0 ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Удержания.Сотрудник, 0, 0, Удержания.Результат ИЗ РегистрРасчета.Удержания КАК Удержания ГДЕ Удержания.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТЧ.Сотрудник, СУММА(ТЧ.ОтработаноЧасов) КАК ОтработаноЧасов, СУММА(ТЧ.Результат) КАК Результат, ВЫБОР КОГДА МАКСИМУМ(ТЧ.БылоУдержание) = 0 ТОГДА "нет" ИНАЧЕ "Да" КОНЕЦ КАК БылоУдержание ИЗ ТЧ КАК ТЧ СГРУППИРОВАТЬ ПО ТЧ.Сотрудник //3.36 Начисление зарплаты сотрудникам авто-предприятия осуществляется ежемесячно с использованием метода отклонений. //Сотрудники работают по графику работы, установленному для каждого водителя отдельно. //Все сотрудники работают на автомобилях предприятия, поэтому возможен обмен автомобилями между водителями. //Не зависимо от отработанного времени сотрудникам предприятия ежемесячно выплачивается фиксированная сумма денег. //Размер суммы одинаков для всех сотрудников и не меняется в течение расчетного периода. Дополнительно, каждому водителю начисляется специальная надбавка. //Размер надбавки определяется как часовая ставка, умноженная на количество фактически отработанных часов. //Часовая ставка одинакова для всех сотрудников. Она может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода. //В зависимости от величины пробега автомобиля в расчетном периоде каждому сотруднику выплачивается определенная сумма денег в качестве компенсации затрат на бензин. //Размер компенсации должен быть определен из расчета некоторой суммы, указанной в документе «Начисление зарплаты» и выплачиваемой за каждые 100 километров пробега. //В случае болезни сотрудник получает пособие, размер которого определяется как количество дней болезни умноженное на среднюю дневную ставку. //Дни болезни рассчитываются по пятидневному графику. //Средняя дневная ставка определяется как 50% от суммы начисленного за предыдущий месяц гарантированного оклада, поделенная на количество рабочих дней в предыдущем месяце. //В случае получения сотрудником пособия начисление компенсации затрат на бензин не производится. //Следует учесть, что данные о болезни могут вводиться в систему задним числом. Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по больничному с 10.01 по 31.01, а запись: больничный с 10.01 по 03.02 вводить нельзя. //Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасов, | ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПятидневкаДниФактическийПериодДействия, 0) КАК ДниФактПятидневка, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниБазовыйПериод, 0) КАК ДниБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Пока Выборка.НайтиСледующий(Поиск) цикл Сторно = ?(СтрокаДвижения.Сторно,-1,1); Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Надбавка Тогда СтрокаДвижения.Результат = СтрокаДвижения.Размер*Выборка.ФактЧасов*Сторно; Иначе СредняяДневнаяСтавка = ?(Выборка.ДниБаза=0,0, Выборка.РезультатБаза*0.5/Выборка.ДниБаза); СтрокаДвижения.Результат = СредняяДневнаяСтавка * Выборка.ДниФактПятидневка*Сторно; КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.КомпенсацияЗатратНаБензин)) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если Выборка.РезультатБаза <>0 Тогда СтрокаДвижения.Результат = 0; КонецЕсли; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры //Созд Спра Автомобили //НачЗП 2 тч Процедура ОбработкаПроведения(Отказ, РежимПроведения) ТарифнаяСтавка = РегистрыСведений.ЧасоваяСтавка.ПолучитьПоследнее(Дата).Ставка; Для каждого СтрокаТЧ из ОсновныеНачисления цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, СтрокаТЧ); Движение.ПериодРегистрации = Дата; Движение.ПериодДействияНачало = СтрокаТЧ.ДатаНачала; Движение.ПериодДействияКонец = КонецДня(СтрокаТЧ.ДатаОкончания); Если СтрокаТЧ.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Пособие тогда Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Дата),-1); Движение.БазовыйПериодКонец = НачалоМесяца(Дата)-1; Иначе Движение.Размер = ТарифнаяСтавка; КонецЕсли; КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.Размер, | НачислениеЗарплатыДополнительныеНачисления.Ссылка.Дата КАК ПериодРегистрации, | НАЧАЛОПЕРИОДА(НачислениеЗарплатыДополнительныеНачисления.Ссылка.Дата, МЕСЯЦ) КАК БазовыйПериодНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыДополнительныеНачисления.Ссылка.Дата, МЕСЯЦ) КАК БазовыйПериодКонец |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.Размер, | ТЧДок.ПериодРегистрации, | ТЧДок.БазовыйПериодНачало, | ТЧДок.БазовыйПериодКонец, | ЕСТЬNULL(ПробегАвтомобиляОбороты.пробегОборот, 0) КАК Пробег |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПробегАвтомобиля.Обороты( | , | &КонецМесяца, | , | Водитель В | (ВЫБРАТЬ | Т.Сотрудник | ИЗ | ТЧДок КАК Т)) КАК ПробегАвтомобиляОбороты | ПО ТЧДок.Сотрудник = ПробегАвтомобиляОбороты.Водитель"; Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.КомпенсацияЗатратНаБензин Тогда Движение.Результат = Цел(Выборка.Пробег/100)*Выборка.Размер; Иначе Движение.Результат = Выборка.Размер; КонецЕсли; КонецЦикла; НаборЗаписей = Движения.ОсновныеНачисления.ПолучитьДополнение(); Для каждого СтрокаНабора из НаборЗаписей цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.ПериодДействияНачало = СтрокаНабора.ПериодДействияНачалоСторно; Движение.ПериодДействияКонец = СтрокаНабора.ПериодДействияКонецСторно; Движение.ПериодРегистрации = СтрокаНабора.ПериодРегистрацииСторно; Движение.Сторно = Истина; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления); КонецПроцедуры //Док ПутевойЛист //тч. ТЧ Водитель, Автомобиль, Пробег Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ПробегАвтомобиля Движения.ПробегАвтомобиля.Записывать = Истина; Для Каждого ТекСтрокаТЧ Из ТЧ Цикл Движение = Движения.ПробегАвтомобиля.Добавить(); Движение.Период = Дата; Движение.Водитель = ТекСтрокаТЧ.Водитель; Движение.Автомобиль = ТекСтрокаТЧ.Автомобиль; Движение.пробег = ТекСтрокаТЧ.Пробег; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, Водитель) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.Водитель.Установить(Водитель); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.Водитель = Водитель; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Запись.ЗначениеПятидневкаДни = 0; Запись.ЗначениеДни =0; Иначе Запись.Значение = 8; Запись.ЗначениеПятидневкаДни = 1; Запись.ЗначениеДни =1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Надбавка, Пособие). ДН (КомпенсацияЗатратНаБензин,ФиксированнаяСумма). //РС ГрафикиРаботы (Дата, Водитель, Значение, ЗначениеПятидневкаДни, ЗначениеДни). //РС ЧасоваяСтавка - в пределах дня, рес.Ставка //Рег Обор ПробегАвтомобиля (Водитель,Автомобиль, пробег) //РР ОН (Сотрудник,Подразделение,результат,Размер) ДН (Сотрудник,Подразделение,результат,Размер). //Отчет АнализНачислений ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.ПериодДействия, ОсновныеНачисления.Результат ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.ПериодРегистрации, ДополнительныеНачисления.Результат ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода Отчет АнализКомпенсаций ВЫБРАТЬ ДополнительныеНачисления.Сотрудник КАК Сотрудник, ДополнительныеНачисления.Результат ПОМЕСТИТЬ Начисления ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода ИНДЕКСИРОВАТЬ ПО Сотрудник ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПробегАвтомобиляОбороты.Автомобиль, СУММА(ПробегАвтомобиляОбороты.пробегОборот) КАК пробегОборот, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПробегАвтомобиляОбороты.Автомобиль) КАК КоличествоМашин, ПробегАвтомобиляОбороты.Водитель ПОМЕСТИТЬ ВТОбороты ИЗ РегистрНакопления.ПробегАвтомобиля.Обороты( &НачалоПериода, &КонецПериода, , Водитель В (ВЫБРАТЬ Т.Сотрудник ИЗ Начисления КАК Т)) КАК ПробегАвтомобиляОбороты СГРУППИРОВАТЬ ПО ПробегАвтомобиляОбороты.Автомобиль, ПробегАвтомобиляОбороты.Водитель ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Начисления.Сотрудник, ВЫБОР КОГДА ВТОбороты.КоличествоМашин = 0 ТОГДА Начисления.Результат ИНАЧЕ Начисления.Результат / ВТОбороты.КоличествоМашин КОНЕЦ КАК СуммаКомпенсации, ЕСТЬNULL(ВТОбороты.пробегОборот, 0) КАК Пробег, ВТОбороты.Автомобиль ИЗ Начисления КАК Начисления ЛЕВОЕ СОЕДИНЕНИЕ ВТОбороты КАК ВТОбороты ПО Начисления.Сотрудник = ВТОбороты.Водитель //1.37 Начисление зарплаты сотрудникам авто-предприятия осуществляется ежемесячно с использованием метода отклонений. //Сотрудники работают по графику работы, установленному для каждого автомобиля отдельно. //Все сотрудники работают на автомобилях предприятия, поэтому возможен обмен автомобилями между водителями. //Не зависимо от отработанного времени сотрудникам предприятия ежемесячно выплачивается фиксированная сумма денег. //Размер суммы одинаков для всех сотрудников и не меняется в течение расчетного периода. //Сотруднику предприятия выплачивается надбавка, рассчитываемая как общая сумма оплат пассажиров за текущий месяц, полученная сотрудником, умноженная на определенный процент. //Значение процента для надбавки может быть изменено только один раз в течение расчетного периода. В этом случае, расчет начисления должен производиться исходя из действующего на рассчитываемый период процента. //Например, если процент изменился 10 августа, то до 10.10 при расчете берется старый процент, а после 10.10 (включительно) уже новый. //В зависимости от общего пробега автомобиля с каждого сотрудника удерживается определенная сумма денег в качестве компенсации затрат на ремонт автомобиля. //Размер компенсации должен быть определен из расчета по специальной шкале. //Сотрудникам предоставляется оплачиваемый отпуск, размер которого определяется как количество дней отпуска умноженное на среднюю дневную ставку. //Дни отпуска рассчитываются по шестидневному графику. //Средняя дневная ставка определяется как сумма всех начислений за три предыдущих месяца, поделенная на количество отработанных дней в трех предыдущих месяцах. //Следует учесть, что данные об отпуске не могут вводиться в систему задним числом. //Создать отчет «Перерасчет зарплаты», в котором пользователь должен увидеть записи регистра расчета, которые возможно требуется пересчитать. //Обратите внимание, в отчете должна отражаться также информация о необходимости перерасчета надбавки при исправлении суммы оплат пассажиров. //Саму процедуру перерасчета записей в рамках данной задачи реализовывать не требуется. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление отпуска с 10.01 по 31.01, а запись: отпуск с 10.01 по 03.02 вводить нельзя. //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.ОтработаноДниБаза, 0) КАК ОтработаноДниБаза |ПОМЕСТИТЬ ВТБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ВТБаза.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ВТБаза.ОтработаноДниБаза, 0) КАК ОтработаноДниБаза, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниШестидневкаФактическийПериодДействия, 0) КАК ДниОтпуска, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактДни |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ ВТБаза КАК ВТБаза | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ВТБаза.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Надбавка Тогда СтрокаДвижения.Результат = СтрокаДвижения.СуммаОплат*СтрокаДвижения.Размер/100; СтрокаДвижения.ОтработаноДни = Выборка.ФактДни; Иначе СредняяСтавка = ?(Выборка.ОтработаноДниБаза=0,0, Выборка.РезультатБаза/Выборка.ОтработаноДниБаза); СтрокаДвижения.Результат = ?(Выборка.ОтработаноДниБаза=0,0,Выборка.ДниОтпуска*СредняяСтавка); КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры //Создаем Спр Автомобили //три тч док нач зп Процедура ОбработкаПроведения(Отказ, РежимПроведения) //основные начисления Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.Автомобиль |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.ПроцентНадбавки, 0) КАК ПроцентНадбавки, | &НачалоМесяца КАК НачалоВИстории |ПОМЕСТИТЬ ВТНадбавка |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | Сотрудник В | (ВЫБРАТЬ | Т.Сотрудник | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | СведенияОСотрудниках.Сотрудник, | СведенияОСотрудниках.ПроцентНадбавки, | СведенияОСотрудниках.Период |ИЗ | РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках |ГДЕ | СведенияОСотрудниках.Период > &НачалоМесяца | И СведенияОСотрудниках.Период <= &КонецПериода | И СведенияОСотрудниках.Сотрудник В | (ВЫБРАТЬ | Т.Сотрудник | ИЗ | ТЧДок КАК Т) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТНадбавка.Сотрудник КАК Сотрудник, | ВТНадбавка.ПроцентНадбавки, | ВТНадбавка.НачалоВИстории |ПОМЕСТИТЬ ВТНадбавкаСгр |ИЗ | ВТНадбавка КАК ВТНадбавка | |СГРУППИРОВАТЬ ПО | ВТНадбавка.НачалоВИстории, | ВТНадбавка.Сотрудник, | ВТНадбавка.ПроцентНадбавки | |ИНДЕКСИРОВАТЬ ПО | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник КАК Сотрудник, | ТЧДок.ВидРасчета КАК ВидРасчета, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ТЧДок.Размер, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(МаршрутныйЛистОбороты.СуммаОплатОборот, 0) КАК СуммаОплат, | ЕСТЬNULL(ВТНадбавкаСгр.ПроцентНадбавки, 0) КАК ПроцентНадбавки, | ВТНадбавкаСгр.НачалоВИстории КАК НачалоВИстории, | ТЧДок.Автомобиль |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.МаршрутныйЛист.Обороты( | &НачалоМесяца, | &КонецПериода, | , | Водитель В | (ВЫБРАТЬ | Т.Сотрудник | ИЗ | ТЧДок КАК Т)) КАК МаршрутныйЛистОбороты | ПО ТЧДок.Сотрудник = МаршрутныйЛистОбороты.Водитель | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Надбавка)) | ЛЕВОЕ СОЕДИНЕНИЕ ВТНадбавкаСгр КАК ВТНадбавкаСгр | ПО ТЧДок.Сотрудник = ВТНадбавкаСгр.Сотрудник | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Надбавка)) | |УПОРЯДОЧИТЬ ПО | ВидРасчета, | НачалоВИстории |ИТОГИ ПО | Сотрудник"; Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Дата)); Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаСотрудник = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСотрудник.Следующий() Цикл НоваяСтрокаПоСотруднику = Ложь; Выборка = ВыборкаСотрудник.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Надбавка Тогда Если Ложь Тогда Движение = Неопределено; КонецЕсли; Если НоваяСтрокаПоСотруднику Тогда Движение.ПериодДействияКонец = МАКС(Выборка.ПериодДействияНачало, Выборка.НачалоВИстории)-1; КонецЕсли; Движение = Движения.ОсновныеНачисления.Добавить(); Движение.ПериодРегистрации = Выборка.ПериодРегистрации; Движение.ПериодДействияНачало = МАКС(Выборка.ПериодДействияНачало,Выборка.НачалоВИстории); Движение.ПериодДействияКонец = Выборка.ПериодДействияКонец; Движение.ВидРасчета = Выборка.ВидРасчета; Движение.Сотрудник = Выборка.Сотрудник; Движение.Автомобиль = Выборка.Автомобиль; Движение.Размер = Выборка.ПроцентНадбавки; Движение.СуммаОплат = Выборка.СуммаОплат; НоваяСтрокаПоСотруднику = Истина; Иначе Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Движение.ПериодДействия),-3); Движение.БазовыйПериодКонец = НачалоМесяца(Движение.ПериодДействия)-1; КонецЕсли; КонецЦикла; КонецЦикла; //дополнительные начисления Для каждого СтрокаТЧ из ДополнительныеНачисления цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, СтрокаТЧ); Движение.ПериодРегистрации = Дата; Движение.Результат = СтрокаТЧ.Размер; КонецЦикла; //удержания Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыУдержания.Сотрудник, | НачислениеЗарплатыУдержания.ВидРасчета, | НачислениеЗарплатыУдержания.ПробегАвтомобиля, | НачислениеЗарплатыУдержания.Ссылка.Дата КАК ПериодРегистрации, | ЕСТЬNULL(ШкалаПробегов.Размер, 0) КАК Размер |ИЗ | Документ.НачислениеЗарплаты.Удержания КАК НачислениеЗарплатыУдержания | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаПробегов КАК ШкалаПробегов | ПО (ВЫБОР | КОГДА НачислениеЗарплатыУдержания.ПробегАвтомобиля = 0 | ТОГДА НачислениеЗарплатыУдержания.ПробегАвтомобиля >= ШкалаПробегов.От | И НачислениеЗарплатыУдержания.ПробегАвтомобиля <= ШкалаПробегов.До | ИНАЧЕ НачислениеЗарплатыУдержания.ПробегАвтомобиля > ШкалаПробегов.От | И НачислениеЗарплатыУдержания.ПробегАвтомобиля <= ШкалаПробегов.До | КОНЕЦ) |ГДЕ | НачислениеЗарплатыУдержания.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.Удержания.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.Результат = Выборка.Размер; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); Движения.Удержания.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); КонецПроцедуры //Док МаршрутныйЛист тч Маршрут (Водитель,Автомобиль,СуммаОплат) Процедура ОбработкаПроведения(Отказ, Режим) // регистр МаршрутныйЛист Движения.МаршрутныйЛист.Записывать = Истина; Для Каждого ТекСтрокаМаршрут Из Маршрут Цикл Движение = Движения.МаршрутныйЛист.Добавить(); Движение.Период = Дата; Движение.Водитель = ТекСтрокаМаршрут.Водитель; Движение.Автомобиль = ТекСтрокаМаршрут.Автомобиль; Движение.СуммаОплат = ТекСтрокаМаршрут.СуммаОплат; КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисления.Сотрудник, | ОсновныеНачисления.ВидРасчета, | ОсновныеНачисления.Регистратор КАК ОбъектПерерасчета |ИЗ | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления |ГДЕ | ОсновныеНачисления.ПериодДействия МЕЖДУ &НачалоМесяца И &КонецМесяца | И ОсновныеНачисления.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Надбавка) | |СГРУППИРОВАТЬ ПО | ОсновныеНачисления.Регистратор, | ОсновныеНачисления.ВидРасчета, | ОсновныеНачисления.Сотрудник |ИТОГИ ПО | ОбъектПерерасчета"; Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Дата)); Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока Выборка.Следующий() Цикл Набор = РегистрыРасчета.ОсновныеНачисления.Перерасчеты.Основной.СоздатьНаборЗаписей(); Набор.Отбор.ОбъектПерерасчета.Установить(выборка.ОбъектПерерасчета); ВыборкаДоп = Выборка.Выбрать(); Пока ВыборкаДоп.Следующий() цикл Запись = Набор.Добавить(); ЗаполнитьЗначенияСвойств(Запись, ВыборкаДоп) КонецЦикла; Попытка Набор.Записать(); Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ОписаниеОшибки(); Сообщение.Сообщить(); КонецПопытки; КонецЦикла; КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, Автомобиль) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.Автомобиль.Установить(Автомобиль); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.Автомобиль = Автомобиль; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 1; КонецЕсли; пДеньНедели = ДеньНедели(Дат); Если пДеньНедели = 7 Тогда Запись.ЗначениеДниШестидневка = 0; Иначе Запись.ЗначениеДниШестидневка = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР (ОН - надбавка,Отпуск) ДН(ФиксированнаяСумма) У (КомпенсацияНаРемонт) //РС ГрафикиРаботы (Дата,Автомобиль, Значение, ЗначениеДниШестидневка) //РС СведенияОСотрудниках - в пределах дня (Сотрудник,ПроцентНадбавки) //ШкалаПробегов (От, До, размер) //РегОБ МаршрутныйЛист (Водитель,Автомобиль,СумаОплат) //РР ОН (Сотрудник,Результат, ОтработаноДНи.... Автомобиль,Размер,СуммаОплат перерасч. Основной - сотрудник) //ДН (Сотрудник,результат).. У (Сотрудник,результат) // //Отчет ПересчетЗарплаты ВЫБРАТЬ Основной.ОбъектПерерасчета, Основной.ВидРасчета, Основной.Сотрудник ИЗ РегистрРасчета.ОсновныеНачисления.Основной КАК Основной //3.38 Начисление зарплаты сотрудникам авто-предприятия осуществляется еженедельно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждого водителя отдельно. Сотрудники работают на собственных автомобилях, поэтому обмен автомобилями между водителями не возможен. //Сотрудники предприятия получают оплату по часовому тарифу. //Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных часов. //Тарифная ставка одинакова для всех сотрудников и должна быть определена по специальной шкале в зависимости от трудового стажа работы сотрудника на данном предприятии. //Если водитель в расчетном периоде наездил больше 1000 часов, то ему должна быть начислена компенсация на ремонт автомобиля процентом от начисленной в том же расчетном периоде оплаты по тарифу. //Процент компенсации общий для всех сотрудников. //В течение периода начисления может изменяться не чаще, чем один раз в день, но берется на начало текущего расчетного периода. //В информационной базе необходимо хранить историю изменения процента премии. //В зависимости от величины пробега автомобиля в расчетном периоде каждому сотруднику выплачивается определенная сумма денег в качестве компенсации затрат на бензин. //Размер компенсации должен быть определен из расчета некоторой суммы, указанной в документе «Начисление зарплаты» и выплачиваемой за каждые 100 километров пробега. //Если сотрудник опоздал выехать на трассу, то за каждые целые 30 минут опоздания начисляется штраф в размере 250 рублей. //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, //можно указать начисление по тарифу с 10.01 по 31.01, а запись: тариф с 10.01 по 03.02 вводить нельзя. //Для анализа сделанных сотрудникам предприятия начислений в //конфигурации необходимо предусмотреть отчет следующего вида: //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеЧасыФактическийПериодДействия, 0) КАК ФактЧасов, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ЧасовОпоздания |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.ТарифнаяСтавка Тогда СтрокаДвижения.Результат = Выборка.ФактЧасов*СтрокаДвижения.Размер; СтрокаДвижения.ОтработаноЧасов = Выборка.ФактЧасов; Иначе СтрокаДвижения.ЧасовОпоздания = Выборка.ЧасовОпоздания; КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.ОтработаноЧасовБаза, 0) КАК ЧасовБаза, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.Надбавка)) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если Выборка.ЧасовБаза>10 Тогда СтрокаДвижения.Результат =Выборка.РезультатБаза*СтрокаДвижения.Размер/100; КонецЕсли; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(); КонецПроцедуры Процедура РассчитатьУД(Ссылка, Удержания) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УдержанияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(УдержанияБазаОсновныеНачисления.ЧасовОпозданияБаза, 0) КАК ЧасовБаза |ИЗ | РегистрРасчета.Удержания.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК УдержанияБазаОсновныеНачисления"; Измерение = новый Массив; Измерение.Добавить("Сотрудник"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из Удержания цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат =Выборка.ЧасовБаза*СтрокаДвижения.Размер; КонецЦикла; КонецЦикла; Удержания.Записать(); КонецПроцедуры //Созд Спр Автомобиль //Три тч док нач зп в он добавляем автомобиль Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | НачислениеЗарплатыОсновныеНачисления.ДатаОкончания КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Автомобиль, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации, | ВЫБОР | КОГДА НачислениеЗарплатыОсновныеНачисления.Сотрудник.ДатаПриема = ДАТАВРЕМЯ(1, 1, 1) | ТОГДА 0 | ИНАЧЕ РАЗНОСТЬДАТ(НачислениеЗарплатыОсновныеНачисления.Сотрудник.ДатаПриема, &НачалоМесяца, ГОД) | КОНЕЦ + НачислениеЗарплатыОсновныеНачисления.Сотрудник.НачальныйСтаж КАК ТрудовойСтаж |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.ВидРасчета, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ТЧДок.Автомобиль, | ТЧДок.ПериодРегистрации, | ТЧДок.ТрудовойСтаж, | ЕСТЬNULL(ШкалаТрудовойСтаж.РазмерСтавки, 0) КАК РазмерСтавки |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаТрудовойСтаж КАК ШкалаТрудовойСтаж | ПО (ВЫБОР | КОГДА ТЧДок.ТрудовойСтаж = 0 | ТОГДА ТЧДок.ТрудовойСтаж >= ШкалаТрудовойСтаж.От | И ТЧДок.ТрудовойСтаж <= ШкалаТрудовойСтаж.До | ИНАЧЕ ТЧДок.ТрудовойСтаж > ШкалаТрудовойСтаж.От | И ТЧДок.ТрудовойСтаж <= ШкалаТрудовойСтаж.До | КОНЕЦ)"; Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.ТарифнаяСтавка Тогда Движение.Размер = Выборка.РазмерСтавки; КонецЕсли; КонецЦикла; ПроцентКомпенсации = РегистрыСведений.ПроцентыКомпенсации.ПолучитьПоследнее(НачалоМесяца(Дата)).Компенсация; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.Размер, | НачислениеЗарплатыДополнительныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.ВидРасчета, | ТЧДок.Размер, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(ПробегАвтоОбороты.ПробегОборот, 0) КАК Поле1 |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПробегАвто.Обороты( | &НачалоМесяца, | &КонецМесяца, | , | Водитель В | (ВЫБРАТЬ | Т.Сотрудник | ИЗ | ТЧДок КАК Т)) КАК ПробегАвтоОбороты | ПО ТЧДок.Сотрудник = ПробегАвтоОбороты.Водитель"; Запрос.УстановитьПараметр("КонецМесяца", КонецНедели(Дата)); Запрос.УстановитьПараметр("НачалоМесяца", НачалоДня(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.Надбавка Тогда Движение.БазовыйПериодНачало = НачалоДня(Выборка.ПериодРегистрации); Движение.БазовыйПериодКонец = КонецНедели(Выборка.ПериодРегистрации); Движение.Размер = ПроцентКомпенсации; Движение.Пробег = Выборка.ПробегАвтоОбороты; КонецЕсли; КонецЦикла; Для каждого СтрокаТЧ из Удержания цикл Движение = Движения.Удержания.Добавить(); ЗаполнитьЗначенияСвойств(Движение, СтрокаТЧ); Движение.ПериодРегистрации = Дата; Движение.БазовыйПериодНачало = НачалоДня(Дата); Движение.БазовыйПериодКонец = КонецНедели(Дата); КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); Движения.Удержания.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьУД(Ссылка, Движения.Удержания); КонецПроцедуры //Док МаршрутныйЛист (тч Маршрут - Водитель,Автомобиль,Пробег) Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ПробегАвто Движения.ПробегАвто.Записывать = Истина; Для Каждого ТекСтрокаМаршрут Из Маршрут Цикл Движение = Движения.ПробегАвто.Добавить(); Движение.Период = Дата; Движение.Водитель = ТекСтрокаМаршрут.Водитель; Движение.Автомобиль = ТекСтрокаМаршрут.Автомобиль; Движение.Пробег = ТекСтрокаМаршрут.Пробег; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры Заполнение графика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, Водитель) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.Водитель.Установить(Водитель); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 3600; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); НужноЗаполнитьЧасы = Истина; СтараяДата = Неопределено; Пока Дат <= ДатаОкончания Цикл Если СтараяДата <> ДеньНедели(Дат) Тогда НужноЗаполнитьЧасы = Истина; КонецЕсли; Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.Водитель = Водитель; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Если НужноЗаполнитьЧасы Тогда НужноЗаполнитьЧасы = Ложь; СтараяДата = ДеньНедели(Дат); Запись.ЗначениеЧасы = 0; КонецЕсли; Иначе Если НужноЗаполнитьЧасы Тогда НужноЗаполнитьЧасы = Ложь; СтараяДата = ДеньНедели(Дат); Запись.ЗначениеЧасы = 8; КонецЕсли; Запись.Значение = 0.50; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //РС ГрафикРаботы (Дата, Водитель,Значение, ЗначениеЧасы) //РС СведенияОСотрудниках (Сотрудник, Тариф) //РС ШкалаТрудовойСтаж (От, До.. РазмерСтавки) //РС ПроцентыКомпенсации (в пределах дня рес.Компенсация) //РегОб ПробегАвто (Водитель,Автомобиль,Пробег) //ПВР ОН (Опоздание, ТарифнаяСтавка). //ДН (КомпенсацияНаБензин,Надбавка), У(Штраф) //РР ОН (Сотрудник, Результат, ОтработаноЧасов, ЧасовОпоздания... Автомобиль,Размер) //РР ДН (Сотрудник,Результат,Размер,Пробег) //У (Сотрудник,Результат,Размер) //3.39 Начисление зарплаты сотрудникам авто-предприятия осуществляется еженедельно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждого водителя отдельно. //Все сотрудники работают на автомобилях предприятия, поэтому возможен обмен автомобилями между водителями. //Не зависимо от отработанного времени сотрудникам предприятия еженедельно выплачивается фиксированная сумма денег. //Размер суммы одинаков для всех сотрудников и не меняется в течение расчетного периода. //Дополнительно, каждому водителю начисляется специальная надбавка. //Размер надбавки определяется как часовая ставка, умноженная на количество фактически отработанных часов. //Часовая ставка своя для каждого из сотрудников. //Она может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода. //В информационной базе необходимо хранить историю изменения ставки. //В зависимости от величины пробега автомобиля в расчетном периоде каждому сотруднику выплачивается определенная сумма денег в качестве компенсации затрат на бензин. //Размер компенсации должен быть определен как некий процент от начисленной на прошлой неделе надбавки. //Используемый при расчете процент в течение периода начисления не меняется и задается в документе «Начисление зарплаты». //В случае болезни сотрудник получает пособие, размер которого определяется как количество дней болезни умноженное на среднюю дневную ставку. //Дни болезни рассчитываются по пятидневному графику. Средняя дневная ставка определяется как 30% от суммы начисленного за предыдущий месяц гарантированного оклада, поделенная на количество отработанных часов на предыдущей неделе. //В случае получения сотрудником пособия начисление надбавки не производится. //Следует учесть, что данные о болезни не могут вводиться в систему задним числом. //Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по больничному с 10.01 по 31.01, а запись: больничный с 10.01 по 03.02 вводить нельзя. //Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ Расчеты Процедура Расчет(Ссылка, ПериодРегистрации) Экспорт Набор = РегистрыРасчета.ОсновныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Измерения = Новый Массив; Измерения.Добавить("Сотрудник"); Запрос = Новый Запрос("ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ДниФактическийПериодДействия, 0) КАК ДниФакт, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЧасыФактическийПериодДействия, 0) КАК ЧасыФакт, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.ДниБаза, 0) КАК ДниБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки"); Запрос.УстановитьПараметр("Измерения", Измерения); ЗАпрос.УстановитьПараметр("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура("НомерСтроки"); Для Каждого Движение Из Набор Цикл Отбор.НомерСтроки = Движение.НомерСтроки; Выборка.Сбросить(); Если Выборка.НайтиСледующий(Отбор) Тогда Если Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.ГарантированныйОклад Тогда Движение.Дни = Выборка.ДниФакт; ИначеЕсли Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Надбавка Тогда Движение.Результат = Выборка.ЧасыФакт * Движение.Параметр; Иначе Движение.Результат = ?(Выборка.ДниБаза=0,0,30 * Выборка.ДниФакт * Выборка.РезультатБаза / Выборка.ДниБаза / 100); КонецЕсли; КонецЕсли; КонецЦикла; Набор.Записать(, Истина); //--------------------------------------------------------------------------------------------------- Набор = РегистрыРасчета.ДополнительныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Измерения = Новый Массив; Измерения.Добавить("Сотрудник"); Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ | НачислениеЗарплатыДополнительныНачисления.Автомобиль КАК Автомобиль |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ДополнительныНачисления КАК НачислениеЗарплатыДополнительныНачисления |ГДЕ | НачислениеЗарплатыДополнительныНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Автомобиль |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ПробегиОбороты.ПробегОборот, 0) КАК Пробег |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Пробеги.Обороты( | &ДатаНачала, | &ДатаОкончания, | , | Автомобиль В | (ВЫБРАТЬ | Список.Автомобиль | ИЗ | Список КАК Список)) КАК ПробегиОбороты | ПО ДополнительныеНачисленияБазаОсновныеНачисления.Автомобиль = ПробегиОбороты.Автомобиль"); Запрос.УстановитьПараметр("Измерения", Измерения); ЗАпрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", ПериодРегистрации); Запрос.УстановитьПараметр("ДатаОкончания", КонецНедели(ПериодРегистрации)); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура("НомерСтроки"); Для Каждого Движение Из Набор Цикл Отбор.НомерСтроки = Движение.НомерСтроки; Выборка.Сбросить(); Если Выборка.НайтиСледующий(Отбор) Тогда Движение.Результат = Выборка.Пробег * Выборка.РезультатБаза * Движение.Параметр / 100 / 1000; КонецЕсли; КонецЦикла; Набор.Записать(, Истина); КонецПроцедуры //Создаем константу ГарантированныйОклад и формуКонстант //Создаем спраГрафики, Автомобили //ДокНачЗП - ПериодРегистрации - две тч // //В ОН добавляем график и автомобиль в ДН добавляем Автомобиль и процент Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) ПериодРегистрации = НачалоНедели(ПериодРегистрации); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) ГарантированныйОклад = Константы.ГарантированныйОклад.Получить(); Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.График, | НачислениеЗарплатыОсновныеНачисления.Автомобиль |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.ПериодРегистрации, | Список.Сотрудник, | Список.ВидРасчета, | Список.ПериодДействияНачало, | Список.ПериодДействияКонец, | Список.График, | Список.Автомобиль, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Тариф, 0) КАК Тариф |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &ДатаНачала, | Сотрудник В | (ВЫБРАТЬ | Список.Сотрудник | ИЗ | Список КАК Список)) КАК СведенияОСотрудникахСрезПоследних | ПО Список.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", ПериодРегистрации); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Надбавка Тогда Движение.Параметр = Выборка.Тариф; ИначеЕсли Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Пособие Тогда Движение.БазовыйПериодНачало = НачалоНедели(ПериодРегистрации-1); Движение.БазовыйПериодКонец = ПериодРегистрации-1; Движение.График = Справочники.Графики.Пятидневка; Иначе Движение.Результат = ГарантированныйОклад; КонецЕсли; Если НачалоМесяца(Выборка.ПериодДействияНачало) <> НачалоМесяца(Выборка.ПериодДействияКонец) Тогда Движение.ПериодДействияКонец = КонецМесяца(Выборка.ПериодДействияНачало); Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.ПериодДействияНачало = НачалоМесяца(Выборка.ПериодДействияКонец); Если Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Надбавка Тогда Движение.Параметр = Выборка.Тариф; ИначеЕсли Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Пособие Тогда Движение.БазовыйПериодНачало = НачалоНедели(ПериодРегистрации-1); Движение.БазовыйПериодКонец = ПериодРегистрации-1; Движение.График = Справочники.Графики.Пятидневка; КонецЕсли; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыДополнительныНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыДополнительныНачисления.Сотрудник, | НачислениеЗарплатыДополнительныНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныНачисления.Автомобиль, | НачислениеЗарплатыДополнительныНачисления.Процент Параметр |ИЗ | Документ.НачислениеЗарплаты.ДополнительныНачисления КАК НачислениеЗарплатыДополнительныНачисления |ГДЕ | НачислениеЗарплатыДополнительныНачисления.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.БазовыйПериодНачало = НачалоНедели(ПериодРегистрации-1); Движение.БазовыйПериодКонец = ПериодРегистрации-1; КонецЦикла; Движения.ДополнительныеНачисления.Записать(); Расчеты.Расчет(Ссылка, ПериодРегистрации); КонецПроцедуры //Создаем док ПутевойЛист (рекв. Автомобиль, пробег) //Модуль док Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Пробеги Движения.Пробеги.Записывать = Истина; Движение = Движения.Пробеги.Добавить(); Движение.Период = Дата; Движение.Автомобиль = Автомобиль; Движение.Пробег = Пробег; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //РС ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, Сотрудник, График) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.Сотрудник.Установить(Сотрудник); Набор.Отбор.График.Установить(График); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.Сотрудник = Сотрудник; Запись.График = График; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дни = 0; Запись.Часы = 0; Иначе Запись.Часы = 8; Запись.Дни = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (ГарантированныйОклад, Надбавка,Пособие) ДН(КомпенсацияНаБензин) //РС ГрафикиРаботы (Дата,СОтрудник,График... Дни,Часы). //РС СведенияОСОтрудник(Сотрудник,Тариф) //РегОбор Пробеги (Автомобиль,Пробег) //РР ОН (Сотрудник,Результат,Дни,Автомобиль,График,Параметр) //ДН (Сотрудник,Результат,Автомобиль,Параметр) //Отчет ВедомостьНачислений ВЫБРАТЬ Т.ВидРасчета, Т.Сотрудник, Т.Автомобиль, Т.Период, СУММА(Т.Результат) КАК Результат ИЗ (ВЫБРАТЬ ОсновныеНачисления.ВидРасчета КАК ВидРасчета, ОсновныеНачисления.Сотрудник КАК Сотрудник, ОсновныеНачисления.Автомобиль КАК Автомобиль, НАЧАЛОПЕРИОДА(ОсновныеНачисления.ПериодДействияНачало, НЕДЕЛЯ) КАК Период, ОсновныеНачисления.Результат КАК Результат ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодДействияНачало МЕЖДУ &ДатаНачала И &ДатаОкончания ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Автомобиль, ДОБАВИТЬКДАТЕ(ДополнительныеНачисления.БазовыйПериодКонец, СЕКУНДА, 1), ДополнительныеНачисления.Результат ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДОБАВИТЬКДАТЕ(ДополнительныеНачисления.БазовыйПериодКонец, СЕКУНДА, 1) МЕЖДУ &ДатаНачала И &ДатаОкончания) КАК Т СГРУППИРОВАТЬ ПО Т.ВидРасчета, Т.Сотрудник, Т.Автомобиль, Т.Период //3.40 Начисление зарплаты сотрудникам авто-предприятия осуществляется еженедельно с использованием метода отклонений. //Все сотрудники работают по графику работы, установленному для каждого автомобиля отдельно. //Все сотрудники работают на автомобилях предприятия, поэтому возможен обмен автомобилями между водителями. //Не зависимо от отработанного времени сотрудникам предприятия еженедельно выплачивается фиксированная сумма денег. //Размер суммы одинаков для всех сотрудников и не меняется в течение расчетного периода. //Сотруднику предприятия выплачивается надбавка, рассчитываемая как общая сумма оплат пассажиров за прошлый месяц, полученная сотрудником, умноженная на определенный процент. //Значение процента для надбавки может быть изменено только один раз в течение расчетного периода, но берется на начало периода расчетов. //В зависимости от общего пробега автомобиля с каждого сотрудника удерживается определенная сумма денег в качестве компенсации затрат на ремонт автомобиля. //Размер компенсации должен быть определен из расчета по специальной шкале. //Один календарный месяц в году сотрудникам предоставляется оплачиваемый отпуск, размер которого определяется как количество дней отпуска умноженное на среднюю дневную ставку. //Дни отпуска рассчитываются по пятидневному графику. //Средняя дневная ставка определяется как сумма всех начислений за три предыдущих отпуску месяца, поделенная на количество рабочих дней в трех предыдущих месяцах. //Следует учесть, что данные об отпуске не могут вводиться в систему задним числом. //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление отпуска с 10.01 по 31.01, а запись: отпуск с 10.01 по 03.02 вводить нельзя. //Необходимо предоставить пользователю возможность исправлять результат расчета в форме документа, а также самостоятельно создавать новые виды расчетов и привязывать их к существующим алгоритмам расчета. //Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ Расчеты Процедура Расчет(Ссылка, ПериодРегистрации) Экспорт Набор = РегистрыРасчета.ОсновныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Измерения = Новый Массив; Измерения.Добавить("Сотрудник"); Запрос = Новый Запрос("ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ВремяФакт, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод, 0) КАК ВремяБаза, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Измерения", Измерения); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура("НомерСтроки"); Для Каждого Движение Из Набор Цикл Если Движение.ВидРасчета.Алгоритм <> Перечисления.АлгоритмыРасчета.Отпуск Тогда Продолжить; КонецЕсли; Отбор.НомерСтроки = Движение.НомерСтроки; Выборка.Сбросить(); Если Выборка.НайтиСледующий(Отбор) Тогда Движение.Результат = ?(Выборка.ВремяБаза=0,0,Выборка.ВремяФакт * Выборка.РезультатБаза / Выборка.ВремяБаза); КонецЕсли; КонецЦикла; Набор.Записать(, Истина); //----------------------------------------------------------------------------------------- Набор = РегистрыРасчета.ДополнительныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Измерения = Новый Массив; Измерения.Добавить("Сотрудник"); Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ | НачислениеЗарплатыДополнительныеНачисления.Автомобиль КАК Автомобиль, | НачислениеЗарплатыДополнительныеНачисления.Сотрудник КАК Сотрудник |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Автомобиль, | Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДополнительныеНачисления.НомерСтроки, | ЕСТЬNULL(ОплатыПокупателейОбороты.СуммаОборот, 0) КАК ОплатаПокупателей, | ЕСТЬNULL(ГарантированныйОкладСрезПоследних.Сумма, 0) КАК ГарантированныйОклад, | ЕСТЬNULL(СтавкиКомпенсаций.Сумма, 0) КАК СуммаКомпенсации, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.ПроцентНадбавки, 0) КАК ПроцентНадбавки, | ПробегиОбороты.ПробегОборот |ИЗ | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Пробеги.Обороты( | &НачалоВремен, | &КонецНедели, | , | Автомобиль В | (ВЫБРАТЬ | Список.Автомобиль | ИЗ | Список КАК Список)) КАК ПробегиОбороты | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтавкиКомпенсаций КАК СтавкиКомпенсаций | ПО (ЕСТЬNULL(ПробегиОбороты.ПробегОборот, 0) МЕЖДУ СтавкиКомпенсаций.Мин И СтавкиКомпенсаций.Макс) | ПО ДополнительныеНачисления.Автомобиль = ПробегиОбороты.Автомобиль | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОплатыПокупателей.Обороты( | &НачалоПрошлогоМесяца, | &КонецПрошлогоМесяца, | , | Сотрудник В | (ВЫБРАТЬ | Список.Сотрудник | ИЗ | Список КАК Список)) КАК ОплатыПокупателейОбороты | ПО ДополнительныеНачисления.Сотрудник = ОплатыПокупателейОбороты.Сотрудник | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГарантированныйОклад.СрезПоследних(&ПериодРегистрации, ) КАК ГарантированныйОкладСрезПоследних | ПО (ИСТИНА) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &ПериодРегистрации, | Сотрудник В | (ВЫБРАТЬ | Список.Сотрудник | ИЗ | Список КАК Список)) КАК СведенияОСотрудникахСрезПоследних | ПО ДополнительныеНачисления.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник |ГДЕ | ДополнительныеНачисления.Регистратор = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("НачалоВремен", Дата(1,1,1)); Запрос.УстановитьПараметр("НачалоПрошлогоМесяца", ДобавитьМесяц(НачалоМесяца(ПериодРегистрации),-1)); Запрос.УстановитьПараметр("КонецПрошлогоМесяца", НачалоМесяца(ПериодРегистрации)-1); Запрос.УстановитьПараметр("ПериодРегистрации", ПериодРегистрации); Запрос.УстановитьПараметр("КонецНедели", КонецНедели(ПериодРегистрации)); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура("НомерСтроки"); Для Каждого Движение Из Набор Цикл Отбор.НомерСтроки = Движение.НомерСтроки; Выборка.Сбросить(); Если Выборка.НайтиСледующий(Отбор) Тогда Если Движение.ВидРасчета.Алгоритм = Перечисления.АлгоритмыРасчета.Надбавка Тогда Движение.Результат = Выборка.ОплатаПокупателей * Выборка.ПроцентНадбавки / 100; ИначеЕсли Движение.ВидРасчета.Алгоритм = Перечисления.АлгоритмыРасчета.ФиксированнаяСумма Тогда Движение.Результат = Выборка.ГарантированныйОклад; ИначеЕсли Движение.ВидРасчета.Алгоритм = Перечисления.АлгоритмыРасчета.КомпенсацияЗатрат Тогда Движение.Результат = -Выборка.СуммаКомпенсации; КонецЕсли; КонецЕсли; КонецЦикла; Набор.Записать(, Истина); КонецПроцедуры //Создаем СПР Графики , Автомобили //ДокНАчЗП ПериодРегистрации, 2 тч. В ОН Добавляем Автомобиль,График,Результат. В ДН Добавляем Автомобиль,Результат //Модуль формы &НаКлиенте Процедура Рассчитать(Команда) РассчитатьСерв(); КонецПроцедуры &НаСервере Процедура РассчитатьСерв() ДокОбъект = РеквизитФормыВЗначение("Объект"); ДокОбъект.РассчитатьДокумент(); ЗначениеВРеквизитФормы(ДокОбъект, "Объект"); КонецПроцедуры //МодульОб Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) ПериодРегистрации = НачалоНедели(ПериодРегистрации); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) СформироватьДвижения(); КонецПроцедуры Процедура РассчитатьДокумент() Экспорт Если Модифицированность() Тогда Записать(РежимЗаписиДокумента.Запись); КонецЕсли; НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); СформироватьДвижения(); Расчеты.Расчет(Ссылка, ПериодРегистрации); ПеренестиВДокумент(); ОтменитьТранзакцию(); КонецПроцедуры Процедура СформироватьДвижения() Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.Сотрудник, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Автомобиль, | НачислениеЗарплатыОсновныеНачисления.График, | НачислениеЗарплатыОсновныеНачисления.Результат |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Движение.ВидРасчета.Алгоритм = Перечисления.АлгоритмыРасчета.Отпуск Тогда Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(ПериодРегистрации),-3); Движение.БазовыйПериодКонец = НачалоМесяца(ПериодРегистрации)-1; Движение.График = Справочники.Графики.Пятидневка; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Автомобиль, | НачислениеЗарплатыДополнительныеНачисления.Результат, | НачислениеЗарплатыДополнительныеНачисления.Ссылка.ПериодРегистрации КАК Период |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Движения.ДополнительныеНачисления.Загрузить(Запрос.Выполнить().Выгрузить()); Движения.ДополнительныеНачисления.Записать(); КонецПроцедуры Процедура ПеренестиВДокумент() Запрос = Новый Запрос("ВЫБРАТЬ | ОсновныеНачисления.Сотрудник, | ОсновныеНачисления.ВидРасчета, | ОсновныеНачисления.ПериодДействияНачало КАК ДатаНачала, | ОсновныеНачисления.ПериодДействияКонец КАК ДатаОкончания, | ОсновныеНачисления.Результат, | ОсновныеНачисления.Автомобиль, | ОсновныеНачисления.График |ИЗ | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления |ГДЕ | ОсновныеНачисления.Регистратор = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); ОсновныеНачисления.Загрузить(Запрос.Выполнить().Выгрузить()); Запрос = Новый Запрос("ВЫБРАТЬ | ДополнительныеНачисления.Сотрудник, | ДополнительныеНачисления.ВидРасчета, | ДополнительныеНачисления.Результат, | ДополнительныеНачисления.Автомобиль |ИЗ | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления |ГДЕ | ДополнительныеНачисления.Регистратор = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); ДополнительныеНачисления.Загрузить(Запрос.Выполнить().Выгрузить()); КонецПроцедуры //Док ПутевойЛИст (рекв.Автомобиль, Пробег) Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Пробеги Движения.Пробеги.Записывать = Истина; Движение = Движения.Пробеги.Добавить(); Движение.Период = Дата; Движение.Автомобиль = Автомобиль; Движение.Пробег = Пробег; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //Док ОплатаЗаПроезд (рекв. СОтрудник,Сумма) //Переч АлгоритмыРасчета (ФиксированнаяСумма, Надбавка, КомпенсацияЗатрат,Отпуск) //ЗаполениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, Автомобиль, График) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.Автомобиль.Установить(Автомобиль); Набор.Отбор.График.Установить(График); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Автомобиль = Автомобиль; Запись.График = График; Запись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //РС СведенияОСотрудниках (Сотрудник,ПроцентНадбавки) //РС ГарантированныйОклад (рес. Сумма) //РС СтавкиКомпенсаций (мин,Макс, Сумма) //Рег Об Пробеги (Автомобиль,Пробег) //Рег Ост ОплатыПокупателей (Сотрудник,Сумма) //РР ОН (Сотрудник,Результат, Автомобиль,График), ДН (Сотрудник,Результат,Автомобиль, Период (Дата)) //Отчет ВедомостьНачислений ВЫБРАТЬ Т.Сотрудник, СУММА(Т.Результат) КАК Результат, Т.ВидРасчета, Т.Автомобиль, Т.Период ИЗ (ВЫБРАТЬ ОсновныеНачисления.Сотрудник КАК Сотрудник, ОсновныеНачисления.Результат КАК Результат, ОсновныеНачисления.ВидРасчета КАК ВидРасчета, ОсновныеНачисления.Автомобиль КАК Автомобиль, НАЧАЛОПЕРИОДА(ОсновныеНачисления.ПериодДействияНачало, НЕДЕЛЯ) КАК Период ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ НАЧАЛОПЕРИОДА(ОсновныеНачисления.ПериодДействияНачало, МЕСЯЦ) МЕЖДУ &ДатаНачала И &ДатаОкончания ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Результат, ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.Автомобиль, НАЧАЛОПЕРИОДА(ДополнительныеНачисления.Период, НЕДЕЛЯ) ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ НАЧАЛОПЕРИОДА(ДополнительныеНачисления.Период, МЕСЯЦ) МЕЖДУ &ДатаНачала И &ДатаОкончания) КАК Т СГРУППИРОВАТЬ ПО Т.Сотрудник, Т.ВидРасчета, Т.Автомобиль, Т.Период //3.41 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Количество фактически отработанных часов вводится в систему с помощью документа «Табель». //Документ может заполняться на список сотрудников. //Для каждого сотрудника, на каждый день месяца, вводится количество фактически отработанных часов на основном месте работы и в командировке. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в часах. //Часовая ставка рассчитывается как начальное значение оклада, деленное на количество рабочих часов в том же периоде, что и фактически отработанные часы. //Первоначальное значение оклада может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода. //Дополнительно, сотрудникам компании должна быть начислена премия процентом от начисленного в том же расчетном периоде оклада. //Процент премии должен храниться в информационной базе и не меняется в течение периода начисления. //По мере необходимости любой сотрудник может быть отправлен в командировку. В этом случае начисление по окладу и премии не происходит. //асы, проведенные в командировке, определяются по пятидневному графику работы. Часовая ставка для расчета командировки определяется как сумма всехначислений за два предыдущих месяца, деленная на количество рабочих часов в двух предыдущих месяцах. //Следует учесть, что данные о командировке не могут вводиться в систему задним числом. Механизм перерасчетов в рамках данной задачи использовать не надо. //Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ПОМЕСТИТЬ ВТБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК ПланЧасов, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод, 0) КАК ЧасовБаза, | ЕСТЬNULL(ВТБаза.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ ВТБаза КАК ВТБаза | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ВТБаза.НомерСтроки"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.ВидРАсчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда СтрокаДвижения.Результат = ?(Выборка.ПланЧасов=0,0, СтрокаДвижения.Размер/Выборка.ПланЧасов*СтрокаДвижения.ФактЧасов); Иначе Начислено = ?(Выборка.ЧасовБаза=0,0, Выборка.РезультатБаза/Выборка.ЧасовБаза); СтрокаДвижения.Результат = Начислено*СтрокаДвижения.ФактЧасов; КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = Выборка.РезультатБаза*СтрокаДвижения.Размер/100; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры //СоздСпр ГрафикиРаботы //ДокНачЗп - две тч. Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | &НачалоМесяца КАК ПериодДействияНачало, | &КонецМесяца КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ТЧДок.ГрафикРаботы, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Оклад, 0) КАК Оклад, | ЕСТЬNULL(ОтработанноеВремяОбороты.ЧасовОборот, 0) КАК ЧасовОборот, | ЕСТЬNULL(ОтработанноеВремяОбороты.ЧасовКомандировкаОборот, 0) КАК ЧасовКомандировки |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение | И (ТЧДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОтработанноеВремя.Обороты( | &НачалоМесяца, | &КонецМесяца, | , | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДОк КАК Т)) КАК ОтработанноеВремяОбороты | ПО ТЧДок.Сотрудник = ОтработанноеВремяОбороты.Сотрудник | И ТЧДок.Подразделение = ОтработанноеВремяОбороты.Подразделение"; Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Дата)); Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Движение.ФактЧасов = Выборка.ЧасовОборот; Движение.Размер = Выборка.Оклад; Иначе Движение.ГрафикРаботы = Справочники.ГрафикРаботы.Пятидневка; Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Движение.ПериодДействия),-2); Движение.БазовыйПериодКонец = НачалоМесяца(Движение.ПериодДействия)-1; Движение.ФактЧасов = Выборка.ЧасовКомандировки; КонецЕсли; КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.Ссылка.Дата КАК ПериодРегистрации, | ЕСТЬNULL(ПроцентыПремий.ПроцентПремии, 0) КАК ПроцентПремии |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПроцентыПремий КАК ПроцентыПремий | ПО НачислениеЗарплатыДополнительныеНачисления.Сотрудник = ПроцентыПремий.Сотрудник | И НачислениеЗарплатыДополнительныеНачисления.Подразделение = ПроцентыПремий.Подразделение |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, выборка); Движение.Размер = Выборка.ПроцентПремии; Движение.БазовыйПериодНачало = НачалоМесяца(Дата); Движение.БазовыйПериодКонец = КонецМесяца(Дата); КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления); КонецПроцедуры //ДокТабель (рекв. Подразделение,ПериодРегистркции.. тч. ОтработанноеВремя - Сотрудник, День1....День31) //МодуьОбъекта Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОтработанноеВремя.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТабельОтработанноеВремя.Сотрудник КАК Сотрудник, | ТабельОтработанноеВремя.День1, | ТабельОтработанноеВремя.День2, | ТабельОтработанноеВремя.День3, | ТабельОтработанноеВремя.День4, | ТабельОтработанноеВремя.День5, | ТабельОтработанноеВремя.День6, | ТабельОтработанноеВремя.День7, | ТабельОтработанноеВремя.День8, | ТабельОтработанноеВремя.День9, | ТабельОтработанноеВремя.День10, | ТабельОтработанноеВремя.День11, | ТабельОтработанноеВремя.День12, | ТабельОтработанноеВремя.День13, | ТабельОтработанноеВремя.День14, | ТабельОтработанноеВремя.День15, | ТабельОтработанноеВремя.День16, | ТабельОтработанноеВремя.День17, | ТабельОтработанноеВремя.День18, | ТабельОтработанноеВремя.День19, | ТабельОтработанноеВремя.День20, | ТабельОтработанноеВремя.День21, | ТабельОтработанноеВремя.День22, | ТабельОтработанноеВремя.День23, | ТабельОтработанноеВремя.День24, | ТабельОтработанноеВремя.День25, | ТабельОтработанноеВремя.День26, | ТабельОтработанноеВремя.День27, | ТабельОтработанноеВремя.День28, | ТабельОтработанноеВремя.День29, | ТабельОтработанноеВремя.День30, | ТабельОтработанноеВремя.День31 |ИЗ | Документ.Табель.ОтработанноеВремя КАК ТабельОтработанноеВремя |ГДЕ | ТабельОтработанноеВремя.Ссылка = &Ссылка |ИТОГИ ПО | Сотрудник"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаСотрудник = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСотрудник.Следующий() Цикл Выборка = ВыборкаСотрудник.Выбрать(); Счетчик = 1; Пока День(КонецМесяца(ПериодРегистрации))>=Счетчик И Выборка.СледующийПоЗначениюПоля("День"+Счетчик) Цикл Движение = Движения.ОтработанноеВремя.Добавить(); Движение.Период = Дата(Год(ПериодРегистрации),Месяц(ПериодРегистрации), Счетчик); Движение.Сотрудник = Выборка.Сотрудник; Движение.Подразделение = Подразделение; ЧасовКомандировки = 0; ЧасовРаботы = 0; ЗаполнениеЯчейки = Выборка["День"+Счетчик]; Если ЗаполнениеЯчейки= "К" Тогда ЧасовКомандировки = ЧасовКомандировки+8; ИначеЕсли ЗначениеЗаполнено(ЗаполнениеЯчейки) Тогда попытка ЧасовРаботы = ЧасовРаботы + Число(ЗаполнениеЯчейки); Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Для дня "+Счетчик+" не найдено соответствия в классификаторе"; Сообщение.Сообщить(); КонецПопытки; Иначе ЧасовКомандировки = 0; ЧасовРаботы = 0; КонецЕсли; Движение.Часов = ЧасовРаботы; Движение.ЧасовКомандировка = ЧасовКомандировки; Счетчик = Счетчик+1; КонецЦикла; КонецЦикла; КонецПроцедуры //ЗАполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни,ГрафикРаботы) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.ГрафикРАботы.Установить(ГрафикРаботы); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.ГрафикРаботы = ГрафикРаботы; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Командировка,Оклад), ДН (Премия) //РС График (Дата,ГрафикРАботы,Значение) //РС СведенияОСОтрудниках (Сотрудник,Подразделение,ОКлад) //РС ПроцентыПремий (Сотрудник,Подразделение, ПроцентПремии) //РегОборотов ОтработанноеВремя (Сотрудник,Подразделение, Часов, ЧасовКомандировка). //РР ОН (Сотрудник,Подразделение, Результата,ФактЧасов, ГрафикРаботы,размер) ДН (Сотрудник,Подразделение,Результат,Размер) //Очтет АнализНачислений ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.ПериодДействия, ОсновныеНачисления.Результат ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.ПериодРегистрации, ДополнительныеНачисления.Результат ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода //3.42 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Количество фактически отработанных дней вводится в систему с помощью документа «Табель». //Документ может заполняться на список сотрудников, для каждого сотрудника, каждый отработанный день месяца или день болезни, отмечается в табличной части документа. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в днях. //Сумма начисления по окладу определяется как начальное значение оклада, деленное на количество рабочих дней в том же периоде, что и фактически отработанные дни. //Начальное значение оклада одинаково для всех сотрудников конкретного подразделения и должно быть определено по специальной шкале в зависимости от отработанного времени. //В случае болезни сотрудник получает пособие, размер которого определяется как количество дней болезни умноженное на среднюю дневную ставку. Средняя дневная ставка определяется как сумма оклада, начисленного за два предыдущих месяца, поделенная на количество рабочих дней в двух предыдущих месяцах. //В случае получения сотрудником пособия начисление по окладу не производится. //За каждый день болезни сотрудникам предприятия дополнительно начисляется фиксированная сумма денег в качестве компенсации затрат на лекарства. //Размер начисленной суммы не может превышать определенного значения, зафиксированного для каждого сотрудника отдельно в информационной базе. //Механизм перерасчетов в рамках данной задачи спользовать не надо. //Для анализа начисленных сотрудникам предприятия компенсаций затрат на лекарства в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод, 0) КАК ДниБаза, | ЕСТЬNULL(ШкалаОкладов.Оклад, 0) КАК Оклад, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК ПланДней |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаОкладов КАК ШкалаОкладов | ПО ОсновныеНачисленияДанныеГрафика.Подразделение = ШкалаОкладов.Подразделение | И (ВЫБОР | КОГДА ОсновныеНачисленияДанныеГрафика.ФактДней = 0 | ТОГДА ОсновныеНачисленияДанныеГрафика.ФактДней >= ШкалаОкладов.От | И ОсновныеНачисленияДанныеГрафика.ФактДней <= ШкалаОкладов.До | ИНАЧЕ ОсновныеНачисленияДанныеГрафика.ФактДней > ШкалаОкладов.От | И ОсновныеНачисленияДанныеГрафика.ФактДней <= ШкалаОкладов.До | КОНЕЦ)"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда СтрокаДвижения.Результат = ?(Выборка.ПланДней = 0,0, Выборка.Оклад/Выборка.ПланДней*СтрокаДвижения.ФактДней); СтрокаДвижения.Размер = Выборка.Оклад; Иначе СредняяДневнаяСтавка = ?(Выборка.ДниБаза=0,0, Выборка.РезультатБаза/Выборка.ДниБаза); СтрокаДвижения.Результат = СредняяДневнаяСтавка*СтрокаДвижения.ФактДней; КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления,Отказ = Истина) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.ФактДнейБаза, 0) КАК ФактДнейБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Результат = Выборка.ФактДнейБаза*СтрокаДвижения.Размер; Если Результат>СтрокаДвижения.ДопустимыйРазмер Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Сумма больничного превышает допустимый размер.Сумма "+Результат+", допустимый размер "+СтрокаДвижения.ДопустимыйРазмер; Сообщение.Сообщить(); Отказ = Истина; Иначе СтрокаДвижения.Результат = Результат; КонецЕсли; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры //СозСпр ГрафикиРаботы //ДокНачЗп две тч Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации, | &НачалоМесяца КАК ПериодДействияНачало, | &КонецМесяца КАК ПериодДействияКонец |ПОМЕСТИТЬ ТЧдок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧдок.Сотрудник, | ТЧдок.Подразделение, | ТЧдок.ГрафикРаботы, | ТЧдок.ВидРасчета, | ТЧдок.Размер, | ТЧдок.ПериодРегистрации, | ЕСТЬNULL(ОтработанноеВремяОбороты.ЗначениеДниОборот, 0) КАК РабочихДней, | ЕСТЬNULL(ОтработанноеВремяОбороты.ЗначениеДниБолезньОборот, 0) КАК ДнейБолезни, | ТЧдок.ПериодДействияНачало, | ТЧдок.ПериодДействияКонец |ИЗ | ТЧдок КАК ТЧдок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОтработанноеВремя.Обороты( | &НачалоМесяца, | &КонецМесяца, | , | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК ОтработанноеВремяОбороты | ПО ТЧдок.Сотрудник = ОтработанноеВремяОбороты.Сотрудник | И ТЧдок.Подразделение = ОтработанноеВремяОбороты.Подразделение"; Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Движение.ФактДней = Выборка.РабочихДней; Иначе Движение.ФактДней = Выборка.ДнейБолезни; Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Дата),-2); Движение.БазовыйПериодКонец = НачалоМесяца(Дата)-1; КонецЕсли; КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.Размер, | НачислениеЗарплатыДополнительныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.Размер, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(СведенияОСотрудниках.РазмерОплатыБольничный, 0) КАК ДопустимыйРазмер |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках | ПО ТЧДок.Сотрудник = СведенияОСотрудниках.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудниках.Подразделение"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.БазовыйПериодНачало = НачалоМесяца(Дата); Движение.БазовыйПериодКонец = КонецМесяца(Дата); КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления, Отказ); КонецПроцедуры //ДокТабель рекв. ПОдразделение,ПериодРегистрации //тч ОтработанноеВремя (сотрудник, день1...День31) Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОтработанноеВремя.Записывать = Истина; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТабельОтработанноеВремя.Сотрудник КАК Сотрудник, | ТабельОтработанноеВремя.День1, | ТабельОтработанноеВремя.День2, | ТабельОтработанноеВремя.День3, | ТабельОтработанноеВремя.День4, | ТабельОтработанноеВремя.День5, | ТабельОтработанноеВремя.День6, | ТабельОтработанноеВремя.День7, | ТабельОтработанноеВремя.День8, | ТабельОтработанноеВремя.День9, | ТабельОтработанноеВремя.День10, | ТабельОтработанноеВремя.День11, | ТабельОтработанноеВремя.День12, | ТабельОтработанноеВремя.День13, | ТабельОтработанноеВремя.День14, | ТабельОтработанноеВремя.День15, | ТабельОтработанноеВремя.День16, | ТабельОтработанноеВремя.День17, | ТабельОтработанноеВремя.День18, | ТабельОтработанноеВремя.День19, | ТабельОтработанноеВремя.День20, | ТабельОтработанноеВремя.День21, | ТабельОтработанноеВремя.День22, | ТабельОтработанноеВремя.День23, | ТабельОтработанноеВремя.День24, | ТабельОтработанноеВремя.День25, | ТабельОтработанноеВремя.День26, | ТабельОтработанноеВремя.День27, | ТабельОтработанноеВремя.День28, | ТабельОтработанноеВремя.День29, | ТабельОтработанноеВремя.День30, | ТабельОтработанноеВремя.День31 |ИЗ | Документ.Табель.ОтработанноеВремя КАК ТабельОтработанноеВремя |ГДЕ | ТабельОтработанноеВремя.Ссылка = &Ссылка |ИТОГИ ПО | Сотрудник"; Запрос.УстановитьПараметр("Ссылка",Ссылка); Результат = Запрос.Выполнить(); ВыборкаСотрудник = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСотрудник.Следующий() Цикл Выборка = ВыборкаСотрудник.Выбрать(); Счетчик = 1; Пока День(КонецМесяца(ПериодРегистрации))>=Счетчик И Выборка.СледующийПоЗначениюПоля("День"+Счетчик) цикл Движение = Движения.ОтработанноеВремя.Добавить(); Движение.Период = Дата(Год(ПериодРегистрации),Месяц(ПериодРегистрации), Счетчик); Движение.Сотрудник = Выборка.Сотрудник; Движение.Подразделение = Подразделение; ДнейОтработано = 0; ДнейБольничный = 0; ЗначениеЯчейки = Выборка["День"+Счетчик]; Если ЗначениеЯчейки = "Б" Тогда ДнейБольничный = ДнейБольничный+1; ИначеЕсли ЗначениеЗаполнено(ЗначениеЯчейки) Тогда Попытка ДнейОтработано = ДнейОтработано+ЗначениеЯчейки; Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не найдено соответствия в класификаторе рабочего времени"; Сообщение.Сообщить(); КонецПопытки; КонецЕсли; Движение.ЗначениеДни = ДнейОтработано; Движение.ЗначениеДниБолезнь = ДнейБольничный; Счетчик = Счетчик+1; КонецЦикла; КонецЦикла; КонецПроцедуры //ЗаполениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, ГрафикРаботы) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.ГрафикРаботы.Установить(ГрафикРаботы); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.ГрафикРаботы = ГрафикРаботы; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Больничный,Оклад) ДН (ФиксированнаяСумма) //РС СведенияОСотрудниках (Сотрудник,Подразделение, РазмерОплатыБольничный) //РС График (Дата,ГрафикРаботы,значение) //РС ШкалаОкладов (ПОдразделение,От,До.Оклад) //РН Об ОтработанноеВремя (Сотрудник,Подразделние,значениеДни, ЗначениеДниБолезнь) //РР ОН (Сотрудник, Подразделение,результат, ФактДней... размер,ГрафикРаботы) //ДН (Сотрудник, Подразделение,результат,... размер, ДопустимыйРазмер) //Отчет АнализКомпенсаций ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.ФактДней КАК ДнейБолезни, ЕСТЬNULL(ДополнительныеНачисления.Результат, 0) КАК СуммаКомпенсации ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ПО ОсновныеНачисления.Сотрудник = ДополнительныеНачисления.Сотрудник И ОсновныеНачисления.Подразделение = ДополнительныеНачисления.Подразделение ГДЕ ОсновныеНачисления.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода И ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода И ОсновныеНачисления.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Больничный) //3.43 Начисление зарплаты сотрудникам предприятия осуществляется еженедельно. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Количество фактически отработанных часов вводится в систему с помощью документа «Табель». //Документ должен заполняться на список сотрудников только определенного подразделения. //Для каждого сотрудника, на каждый день недели, вводится количество фактически отработанных часов или информация о том, что он - в отпуске. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в часах. //Часовая ставка рассчитывается как начальное значение оклада, деленное на количество рабочих часов в том же периоде, что и фактически отработанные часы. //В течение расчетного периода первоначальное значение оклада может быть один раз изменено. //Расчет должен производиться исходя из действующего на рассчитываемую дату начального значения оклада. //Например, если начальное значение оклада изменилось 10 августа, то до 10 августа при расчете берется старое значение, а начиная с 10 августа – новое. //В любой момент времени сотрудникам предоставляется оплачиваемый отпуск, размер которого определяется как количество дней отпуска умноженное на среднюю дневную ставку. //Дни отпуска рассчитываются по шестидневному графику. //Средняя дневная ставка определяется как сумма начисленного оклада, за три предыдущих месяца, поделенная на количество отработанных дней в трех предыдущих месяцах. //Количество предоставляемых в год рабочих дней отпуска не должно превышать 24. //Механизм перерасчетов в рамках данной задачи использовать не надо. //Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ Расчеты Процедура Расчет(Ссылка, ПериодРегистрации) Экспорт Набор = РегистрыРасчета.ОсновныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Измерения = Новый Массив; Измерения.Добавить("Сотрудник"); Измерения.Добавить("Подразделение"); Запрос = Новый Запрос("ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЧасыБазовыйПериод, 0)) КАК ЧасыБаза, | СУММА(ЕСТЬNULL(СостоянияСотрудников.Часы, 0)) КАК ЧасыФакт, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0)) КАК РезультатБаза, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.ДниБаза, 0)) КАК ДниБаза, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ДниФактическийПериодДействия, 0)) КАК ДниФактПоГрафику, | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СостоянияСотрудников.Дата) КАК ДниФактПоТабелю |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников | ПО ОсновныеНачисленияДанныеГрафика.Подразделение = СостоянияСотрудников.Подразделение | И ОсновныеНачисленияДанныеГрафика.Сотрудник = СостоянияСотрудников.Сотрудник | И (СостоянияСотрудников.Дата МЕЖДУ ОсновныеНачисленияДанныеГрафика.ПериодДействияНачало И ОсновныеНачисленияДанныеГрафика.ПериодДействияКонец) | И (СостоянияСотрудников.Состояние = &СостояниеРаботает) | И (СостоянияСотрудников.Часы <> 0) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки | |СГРУППИРОВАТЬ ПО | ОсновныеНачисленияДанныеГрафика.НомерСтроки"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Измерения", Измерения); Запрос.УстановитьПараметр("СостояниеРаботает", Перечисления.СостоянияСотрудника.Работает); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Выборка.Сбросить(); Если Выборка.НайтиСледующий(Отбор) Тогда Если Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Движение.Результат = ?(Выборка.ЧасыБаза=0,0,Движение.Параметр * Выборка.ЧасыФакт / Выборка.ЧасыБаза); Движение.Дни = Выборка.ДниФактПоТабелю; Иначе Движение.Результат = ?(Выборка.ДниБаза=0,0,Выборка.ДниФактПоГрафику * Выборка.РезультатБаза / Выборка.ДниБаза); КонецЕсли; КонецЕсли; КонецЦикла; Набор.Записать(, Истина); КонецПроцедуры //Спр Графики //Перечисленине СостоянияСотрудника (Работает,Отпуск) //ДокНачЗп периодРегистрации Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) ПериодРегистрации = НачалоНедели(ПериодРегистрации); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.График |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.ПериодРегистрации, | Список.Сотрудник, | Список.Подразделение, | Список.ВидРасчета, | Список.График, | ЕСТЬNULL(СведенияОСотрудникахНачало.Оклад, 0) КАК ОкладНачало, | ЕСТЬNULL(СведенияОСотрудникахКонец.Оклад, 0) КАК ОкладКонец, | СведенияОСотрудникахКонец.Период КАК ДатаИзменения |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &ДатаНачала, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК СведенияОСотрудникахНачало | ПО Список.Сотрудник = СведенияОСотрудникахНачало.Сотрудник | И Список.Подразделение = СведенияОСотрудникахНачало.Подразделение | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &ДатаОкончания, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК СведенияОСотрудникахКонец | ПО Список.Сотрудник = СведенияОСотрудникахКонец.Сотрудник | И Список.Подразделение = СведенияОСотрудникахКонец.Подразделение"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", ПериодРегистрации); Запрос.УстановитьПараметр("ДатаОкончания", КонецНедели(ПериодРегистрации)); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.ПериодДействияНачало = ПериодРегистрации; Движение.ПериодДействияКонец = Мин(КонецМесяца(ПериодРегистрации), КонецНедели(ПериодРегистрации)); Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(ПериодРегистрации), -3); Движение.БазовыйПериодКонец = НачалоМесяца(ПериодРегистрации)-1; Движение.График = Справочники.Графики.Шестидневка; Иначе Если Выборка.ОкладНачало = Выборка.ОкладКонец Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.ПериодДействияНачало = ПериодРегистрации; Движение.ПериодДействияКонец = КонецНедели(ПериодРегистрации); Движение.Параметр = Выборка.ОкладНачало; Движение.БазовыйПериодНачало = ПериодРегистрации; Движение.БазовыйПериодКонец = КонецНедели(ПериодРегистрации); Иначе Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.ПериодДействияНачало = ПериодРегистрации; Движение.ПериодДействияКонец = Выборка.ДатаИзменения-1; Движение.Параметр = Выборка.ОкладНачало; Движение.БазовыйПериодНачало = ПериодРегистрации; Движение.БазовыйПериодКонец = КонецНедели(ПериодРегистрации); Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.ПериодДействияНачало = Выборка.ДатаИзменения; Движение.ПериодДействияКонец = КонецНедели(ПериодРегистрации); Движение.Параметр = Выборка.ОкладКонец; Движение.БазовыйПериодНачало = ПериодРегистрации; Движение.БазовыйПериодКонец = КонецНедели(ПериодРегистрации); КонецЕсли; КонецЕсли; КонецЦикла; Для Каждого Движение Из Движения.ОсновныеНачисления Цикл РазделитьЗаписьПомесячно(Движение); КонецЦикла; Движения.ОсновныеНачисления.Записать(); Расчеты.Расчет(Ссылка, ПериодРегистрации); Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ | НачислениеЗарплатыОсновныеНачисления.Сотрудник |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СостоянияСотрудников.Сотрудник, | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СостоянияСотрудников.Дата) КАК ДнейОтпуска |ПОМЕСТИТЬ ВТ |ИЗ | РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников |ГДЕ | СостоянияСотрудников.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания | И СостоянияСотрудников.Состояние = &СостояниеОтпуск | |СГРУППИРОВАТЬ ПО | СостоянияСотрудников.Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ.Сотрудник, | ВТ.ДнейОтпуска |ИЗ | ВТ КАК ВТ |ГДЕ | ВТ.ДнейОтпуска > 24"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", НачалоГода(ПериодРегистрации)); Запрос.УстановитьПараметр("ДатаОкончания", КонецНедели(ПериодРегистрации)); Запрос.УстановитьПараметр("СостояниеОтпуск", Перечисления.СостоянияСотрудника.Отпуск); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "По сотруднику " + Выборка.Сотрудник + " превышение количества дней отпуска: " + Выборка.ДнейОтпуска; Сообщение.Сообщить(); КонецЦикла КонецПроцедуры Процедура РазделитьЗаписьПомесячно(Движение) Если НачалоМесяца(Движение.ПериодДействияНачало) <> НачалоМесяца(Движение.ПериодДействияКонец) Тогда ДопДвижение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(ДопДвижение, Движение); Движение.ПериодДействияКонец = КонецМесяца(Движение.ПериодДействияНачало); ДопДвижение.ПериодДействияНачало = НачалоМесяца(ДопДвижение.ПериодДействияКонец); КонецЕсли; КонецПроцедуры //Док Табель (рекв. ПериодРегистрации,Подразделенеие) тч Список (Сотрудник,Дата,Состояние,часы) //ФормаДОк &НаКлиенте Процедура Заполнить(Команда) ЗаполнитьСерв(); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // &НаСервере Процедура ЗаполнитьСерв() Запрос = Новый Запрос("ВЫБРАТЬ | СведенияОСотрудникахСрезПоследних.Сотрудник КАК Сотрудник, | ГрафикиРаботы.Дата КАК Дата, | ЕСТЬNULL(ГрафикиРаботы.Часы, 0) КАК Часы, | &Состояние |ИЗ | РегистрСведений.СведенияОСотрудниках.СрезПоследних(&ДатаНачала, Подразделение = &Подразделение) КАК СведенияОСотрудникахСрезПоследних | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы | ПО СведенияОСотрудникахСрезПоследних.График = ГрафикиРаботы.График | И (ГрафикиРаботы.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания) | |УПОРЯДОЧИТЬ ПО | Сотрудник, | Дата"); Запрос.УстановитьПараметр("ДатаНачала", Объект.ПериодРегистрации); Запрос.УстановитьПараметр("ДатаОкончания", КонецНедели(Объект.ПериодРегистрации)); Запрос.УстановитьПараметр("Подразделение", Объект.Подразделение); Запрос.УстановитьПараметр("Состояние", Перечисления.СостоянияСотрудника.Работает); Объект.Список.Загрузить(Запрос.Выполнить().Выгрузить()); КонецПроцедуры // ЗаполнитьСерв() Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр СостоянияСотрудников Движения.СостоянияСотрудников.Записывать = Истина; Для Каждого ТекСтрокаСписок Из Список Цикл Движение = Движения.СостоянияСотрудников.Добавить(); Движение.Период = Дата; Движение.Сотрудник = ТекСтрокаСписок.Сотрудник; Движение.Подразделение = Подразделение; Движение.Дата = ТекСтрокаСписок.Дата; Движение.Состояние = ТекСтрокаСписок.Состояние; Движение.Часы = ТекСтрокаСписок.Часы; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, График) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.График.Установить(График); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.График = График; Запись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дни = 0; Запись.Часы = 0; Иначе Запись.Часы = 8; Запись.Дни = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Оклад,отпуск) //РС СведенияОСотрудниках (Сотрудник,Подразделение, Оклад,График) //РС СостоянияСотрудников (Сотрудник,Подразделение,Дата,Состояние,Часы) //РР ОН (Сотрудник,Подразделение,Результат,Дни..., Параметр,График) //Отчет ВедомостьНачислений ВЫБРАТЬ НАЧАЛОПЕРИОДА(ОсновныеНачисления.ПериодДействияНачало, НЕДЕЛЯ) КАК Период, ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.Результат ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ НАЧАЛОПЕРИОДА(ОсновныеНачисления.ПериодДействияНачало, НЕДЕЛЯ) МЕЖДУ &ДатаНачала И &ДатаОкончания Отчет ДиаграммаГанта &НаКлиенте Процедура Сформировать(Команда) СформироватьСерв(); КонецПроцедуры &НаСервере Процедура СформироватьСерв() ДГ.Обновление = Ложь; Запрос = Новый Запрос("ВЫБРАТЬ | ОсновныеНачисленияФактическийПериодДействия.ВидРасчета, | ОсновныеНачисленияФактическийПериодДействия.Сотрудник, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало КАК Начало, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец КАК Конец |ИЗ | РегистрРасчета.ОсновныеНачисления.ФактическийПериодДействия КАК ОсновныеНачисленияФактическийПериодДействия |ГДЕ | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало МЕЖДУ &ДатаНачала И &ДатаОкончания"); Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", Период.ДатаОкончания); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Точка = ДГ.УстановитьТочку(Выборка.Сотрудник); Серия = ДГ.УстановитьСерию(Выборка.ВидРасчета); Значение = ДГ.ПолучитьЗначение(Точка, Серия); Интервал = Значение.Добавить(); Интервал.Начало = Выборка.Начало; Интервал.Конец = Выборка.Конец; КонецЦикла; ДГ.Обновление = Истина; КонецПроцедуры // СформироватьСерв() //3.44 Начисление зарплаты сотрудникам предприятия осуществляется еженедельно. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Количество фактически отработанных дней вводится в систему с помощью документа «Табель». //Документ может заполняться на список сотрудников только определенного подразделения. //Для каждого сотрудника, каждый отработанный день недели, день невыхода по невыясненной причине, прогул или день болезни, отмечается в табличной части документа. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в днях. //Дневная ставка рассчитывается как начальное значение оклада, деленное на количество рабочих дней в том же периоде, что и фактически отработанные дни. //Первоначальное значение оклада может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода. //В случае болезни сотрудник получает пособие, размер которого определяется как количество дней болезни умноженное на среднюю дневную ставку. //Средняя дневная ставка определяется как 50% от суммы начисленного за предыдущий месяц оклада, поделенная на количество рабочих дней в предыдущем месяце. //В случае получения сотрудником пособия начисление по окладу не производится. Невыход по невыясненной причине не оплачивается. //За каждый день невыхода сотрудника на работу без уважительной причины сотруднику начисляется штраф в размере 200 рублей. //Механизм перерасчетов в рамках данной задачи использовать не надо. //С помощью диаграммы Ганта показать фактический период действия записей с разбивкой по сотрудникам, и для каждого сотрудника – по видам расчета. //Отчет может быть построен за любой расчетный период. //ОМ Расчеты Процедура Расчет(Ссылка, ПериодРегистрации) Экспорт Набор = РегистрыРасчета.ОсновныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Измерения = Новый Массив; Измерения.Добавить("Сотрудник"); Измерения.Добавить("Подразделение"); Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ДниБазовыйПериод, 0)) КАК ДниБаза, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0)) КАК РезультатБаза, | СУММА(ВЫБОР | КОГДА СостоянияСотрудниковОбороты.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРаботников.Работа) | ТОГДА СостоянияСотрудниковОбороты.ДниОборот | ИНАЧЕ 0 | КОНЕЦ) КАК ДниФактРабота, | СУММА(ВЫБОР | КОГДА СостоянияСотрудниковОбороты.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРаботников.Болезнь) | ТОГДА СостоянияСотрудниковОбороты.ДниОборот | ИНАЧЕ 0 | КОНЕЦ) КАК ДниФактБолезнь |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СостоянияСотрудников.Обороты( | &ДатаНачала, | &ДатаОкончания, | , | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК СостоянияСотрудниковОбороты | ПО ОсновныеНачисленияДанныеГрафика.Сотрудник = СостоянияСотрудниковОбороты.Сотрудник | И ОсновныеНачисленияДанныеГрафика.Подразделение = СостоянияСотрудниковОбороты.Подразделение | И (СостоянияСотрудниковОбороты.Дата МЕЖДУ ОсновныеНачисленияДанныеГрафика.ПериодДействияНачало И ОсновныеНачисленияДанныеГрафика.ПериодДействияКонец) | |СГРУППИРОВАТЬ ПО | ОсновныеНачисленияДанныеГрафика.НомерСтроки"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Измерения", Измерения); Запрос.УстановитьПараметр("ДатаНачала", ПериодРегистрации); Запрос.УстановитьПараметр("ДатаОкончания", КонецНедели(ПериодРегистрации)); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Если Выборка.НайтиСледующий(Отбор) Тогда Если Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Движение.Результат = ?(Выборка.ДниБаза=0,0,ДВижение.Параметр * Выборка.ДниФактРабота / Выборка.ДниБаза); Иначе Движение.Результат = ?(Выборка.ДниБаза=0,0,Выборка.ДниФактБолезнь * Выборка.РезультатБАза / Выборка.ДниБаза / 2); КонецЕсли; КонецЕсли; КонецЦикла; Набор.Записать(, Истина); //------------------------------------------------------------------------------------------------------------------------------------ Набор = РегистрыРасчета.Удержания.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Измерения = Новый Массив; Измерения.Добавить("Сотрудник"); Измерения.Добавить("Подразделение"); Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ | НачислениеЗарплатыУдержания.Сотрудник КАК Сотрудник, | НачислениеЗарплатыУдержания.Подразделение КАК Подразделение |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.Удержания КАК НачислениеЗарплатыУдержания |ГДЕ | НачислениеЗарплатыУдержания.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Удержания.НомерСтроки, | ЕСТЬNULL(СостоянияСотрудниковОбороты.ДниОборот, 0) КАК ДниФактПрогул |ИЗ | РегистрРасчета.Удержания КАК Удержания | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СостоянияСотрудников.Обороты( | &ДатаНачала, | &ДатаОкончания, | , | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список) | И Состояние = &СостояниеПрогул) КАК СостоянияСотрудниковОбороты | ПО Удержания.Сотрудник = СостоянияСотрудниковОбороты.Сотрудник | И Удержания.Подразделение = СостоянияСотрудниковОбороты.Подразделение |ГДЕ | Удержания.Регистратор = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("СостояниеПрогул", Перечисления.СостоянияРаботников.Прогул); Запрос.УстановитьПараметр("ДатаНачала", ПериодРегистрации); Запрос.УстановитьПараметр("ДатаОкончания", КонецНедели(ПериодРегистрации)); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Если Выборка.НайтиСледующий(Отбор) Тогда Движение.Результат = Выборка.ДниФактПрогул * 200; КонецЕсли; КонецЦикла; Набор.Записать(, Истина); КонецПроцедуры //ДокНачЗп рекв. ПериодРегистарции. Две тч. Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) ПериодРегистрации = НачалоНедели(ПериодРегистрации); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации, НЕДЕЛЯ) КАК ПериодДействияКонец |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.ПериодРегистрации, | Список.Сотрудник, | Список.Подразделение, | Список.ВидРасчета, | Список.ПериодДействияНачало, | Список.ПериодДействияКонец, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Оклад, 0) КАК Оклад, | СведенияОСотрудникахСрезПоследних.График КАК График |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &ДатаНачала, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК СведенияОСотрудникахСрезПоследних | ПО Список.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И Список.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", ПериодРегистрации); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.Параметр = Выборка.Оклад; Движение.БазовыйПериодНачало = ПериодРегистрации; Движение.БазовыйПериодКонец = КонецНедели(ПериодРегистрации); ИначеЕсли Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Пособие Тогда Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(ПериодРегистрации), -1); Движение.БазовыйПериодКонец = НачалоМесяца(ПериодРегистрации)-1; КонецЕсли; ПроверитьНаСменуМесяца(Движение); КонецЦикла; Движения.ОсновныеНачисления.Записать(); Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыУдержания.Ссылка.ПериодРегистрации, | НачислениеЗарплатыУдержания.Сотрудник, | НачислениеЗарплатыУдержания.Подразделение, | НачислениеЗарплатыУдержания.ВидРасчета, | НачислениеЗарплатыУдержания.Ссылка.ПериодРегистрации КАК Период |ИЗ | Документ.НачислениеЗарплаты.Удержания КАК НачислениеЗарплатыУдержания |ГДЕ | НачислениеЗарплатыУдержания.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Движения.Удержания.Загрузить(Запрос.Выполнить().Выгрузить()); Движения.Удержания.Записать(); Расчеты.Расчет(Ссылка, ПериодРегистрации); КонецПроцедуры Процедура ПроверитьНаСменуМесяца(Движение) Если НачалоМесяца(Движение.ПериодДействияНачало) <> НачалоМесяца(Движение.ПериодДействияКонец) Тогда ДопДвижение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(ДопДвижение, Движение); Движение.ПериодДействияКонец = КонецМесяца(Движение.ПериодДействияНачало); ДопДвижение.ПериодДействияНачало = НачалоМесяца(ДопДвижение.ПериодДействияКонец); КонецЕсли; КонецПроцедуры //Перечисление СостоянияРаботников (Работа,Невыход,Прогул,болезнь) //ДОк Табель (ПериодРегистрации, Подразделение.. тч Список - Сотрудник,Дата,Состояние) //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, График) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.График.Установить(График); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.График = График; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Дни = 0; Иначе Запись.Дни = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Оклад,Пособие), У(Штраф) //РС ГрафикРаботы (Дата,График,Дни) //РС СведенияОСотрудниках (Сотрудник,Подразделение,Оклад,График) //Рег Об СостоянияСотрудников (Подразделение,Сотрудник,Дата,Состояние...Дни) //РР ОН (Сотрудник,Подразеделение.. Результат, ГрафикРаботы,Параметр) //У (Сотрудник,Подразделение..Результат...Период) //ДиаграммаГанта &НаКлиенте Процедура Сформировать(Команда) СформироватьСерв(); КонецПроцедуры Процедура СформироватьСерв() ДГ.Обновление = Ложь; Запрос = Новый Запрос("ВЫБРАТЬ | ОсновныеНачисленияФактическийПериодДействия.Сотрудник, | ОсновныеНачисленияФактическийПериодДействия.ВидРасчета, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало КАК Начало, | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец КАК Конец |ИЗ | РегистрРасчета.ОсновныеНачисления.ФактическийПериодДействия КАК ОсновныеНачисленияФактическийПериодДействия |ГДЕ | ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало МЕЖДУ &ДатаНачала И &ДатаОкончания"); Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", Период.ДатаОкончания); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Точка = ДГ.УстановитьТочку(Выборка.Сотрудник); Серия = ДГ.УстановитьСерию(Выборка.ВидРасчета); Значение = ДГ.ПолучитьЗначение(Точка, Серия); Интервал = Значение.Добавить(); Интервал.Начало = Выборка.Начало; Интервал.Конец = Выборка.Конец; КонецЦикла; ДГ.Обновление = Истина; КонецПроцедуры //3.45 Начисление зарплаты сотрудникам предприятия осуществляется еженедельно. //Все сотрудники работают по пятидневному графику работы, однаков решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Количество фактически отработанных дней вводится в систему с помощью документа «Табель». //Документ может заполняться на список сотрудников только определенного подразделения. //Для каждого сотрудника, каждый отработанный день недели отмечается флажком в табличной части документа. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в днях. //Дневная ставка рассчитывается как начальное значение оклада, деленное на количество рабочих дней в том же периоде, что и фактически отработанные дни. //Первоначальное значение оклада может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода. //Дополнительно, сотрудникам компании может быть начислена премия процентом от начисленного в том же расчетном периоде оклада. //Процент премии в течение периода начисления не меняется. //Сотруднику предприятия выплачивается надбавка, рассчитываемая как общая сумма продаж товаров за предыдущий квартал по подразделению, в котором работает сотрудник, умноженная на определенный процент. //Значение процента для надбавки пределяется по специальной шкале в зависимости от суммы продаж. //Первого числа каждого месяца шкала может быть изменена, но хранить историю изменения шкалы не требуется. //Создать отчет «Перерасчет зарплаты», в котором пользователь должен увидеть записи регистра расчета, которые возможно требуется пересчитать. //Обратите внимание, в отчете должна отражаться также информация о необходимости перерасчета надбавки при исправлении суммы продаж. //Саму процедуру перерасчета записей в рамках данной задачи реализовывать не требуется. //Ввод информации о начислении премии и надбавки происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца. //ОМ Расчеты Процедура Расчет(Ссылка, ПериодРегистрации) Экспорт Набор = РегистрыРасчета.ОсновныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | МАКСИМУМ(ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод, 0)) КАК ДниПлан, | СУММА(ЕСТЬNULL(РабочиеДниОбороты.ЗначениеОборот, 0)) КАК ДниФакт |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РабочиеДни.Обороты( | &ДатаНачала, | &ДатаОкончания, | Регистратор, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК РабочиеДниОбороты | ПО ОсновныеНачисленияДанныеГрафика.Сотрудник = РабочиеДниОбороты.Сотрудник | И ОсновныеНачисленияДанныеГрафика.Подразделение = РабочиеДниОбороты.Подразделение | И (РабочиеДниОбороты.Период МЕЖДУ ОсновныеНачисленияДанныеГрафика.ПериодДействияНачало И ОсновныеНачисленияДанныеГрафика.ПериодДействияКонец) | |СГРУППИРОВАТЬ ПО | ОсновныеНачисленияДанныеГрафика.НомерСтроки"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", ПериодРегистрации); Запрос.УстановитьПараметр("ДатаОкончания", КонецНедели(ПериодРегистрации)); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Выборка.Сбросить(); Если Выборка.НайтиСледующий(Отбор) Тогда ДВижение.Результат = ?(Выборка.ДниПлан=0,0,Движение.Параметр * Выборка.ДниФакт / Выборка.ДниПлан); КонецЕсли; КонецЦикла; Набор.Записать(, Истина); //---------------------------------------------------------------------------------------------------------------- Набор = РегистрыРасчета.ДополнительныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Измерения = Новый Массив; Измерения.Добавить("Сотрудник"); Измерения.Добавить("Подразделение"); Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ | НачислениеЗарплатыДополнительныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение КАК Подразделение |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДополнительныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.ПроцентПремии, 0) КАК ПроцентПремии, | ЕСТЬNULL(ПроцентыСПродаж.Процент, 0) КАК ПроцентНадбавки, | ЕСТЬNULL(ПродажиОбороты.СуммаОборот, 0) КАК Продажи |ИЗ | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления | ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты( | &ДатаНачала, | &ДатаОкончания, | , | Подразделение В | (ВЫБРАТЬ | Список.Подразделение | ИЗ | Список КАК Список)) КАК ПродажиОбороты | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПроцентыСПродаж КАК ПроцентыСПродаж | ПО (ЕСТЬNULL(ПродажиОбороты.СуммаОборот, 0) МЕЖДУ ПроцентыСПродаж.Мин И ПроцентыСПродаж.Макс) | ПО ДополнительныеНачисления.Подразделение = ПродажиОбороты.Подразделение | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &ПериодРегистрации, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК СведенияОСотрудникахСрезПоследних | ПО ДополнительныеНачисления.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ДополнительныеНачисления.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение |ГДЕ | ДополнительныеНачисления.Регистратор = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ПериоДРегистрации", ПериодРегистрации); Запрос.УстановитьПараметр("ДатаНачала", ДобавитьМесяц(НачалоКвартала(ПериодРегистрации), -3)); Запрос.УстановитьПараметр("ДатаОкончания", НачалоКвартала(ПериодРегистрации)-1); Запрос.УстановитьПараметр("Измерения", Измерения); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Выборка.Сбросить(); Если Выборка.НайтиСледующий(Отбор) Тогда Если Движение.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.Премия Тогда Движение.Результат = Выборка.РезультатБаза * Выборка.ПроцентПремии / 100; Иначе Движение.Результат = Выборка.Продажи * Выборка.ПроцентНадбавки / 100; КонецЕсли; КонецЕсли; КонецЦикла; Набор.Записать(, Истина); КонецПроцедуры //ДокНачЗП - ПериодРегистрации ОН ДН Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) ПериодРегистрации = НачалоНедели(ПериодРегистрации); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации, НЕДЕЛЯ) КАК ПериодДействияКонец |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.ПериодРегистрации, | Список.Сотрудник, | Список.Подразделение, | Список.ВидРасчета, | СведенияОСотрудникахСрезПоследних.График, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Оклад, 0) КАК Параметр, | Список.ПериодДействияНачало, | Список.ПериодДействияКонец |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &ДатаНачала, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК СведенияОСотрудникахСрезПоследних | ПО Список.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И Список.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", ПериодРегистрации); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Движение = ДВижения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.БазовыйПериодНачало = ПериодРегистрации; Движение.БазовыйПериодКонец = КонецНедели(ПериодРегистрации); Если НачалоМесяца(Движение.ПериодДействияНачало) <> НачалоМесяца(Движение.ПериодДействияКонец) Тогда ДопДвижение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(ДопДвижение, Движение); Движение.ПериодДействияКонец = КонецМесяца(Движение.ПериодДействияНачало); ДопДвижение.ПериодДействияНачало = НачалоМесяца(ДопДвижение.ПериодДействияКонец); КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыДополнительныеНачисления.Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.Премия Тогда Движение.БазовыйПериодНачало = ПериодРегистрации; Движение.БазовыйПериодКонец = КонецНедели(ПериодРегистрации); КонецЕсли; КонецЦикла; Движения.ДополнительныеНачисления.Записать(); Расчеты.Расчет(Ссылка, ПериодРегистрации); КонецПроцедуры //Док Табель (ПериодРегистрации,Подразделение) ТЧ Список (Дата1....Дата7) //ФормаДок &НаКлиенте Процедура Заполнить(Команда) ЗаполнитьСерв(); КонецПроцедуры Процедура ЗаполнитьСерв() ДокОбъект = РеквизитФормыВЗначение("Объект"); ДокОбъект.Список.Очистить(); Запрос = Новый Запрос("ВЫБРАТЬ | СведенияОСотрудникахСрезПоследних.Сотрудник КАК Сотрудник, | ГрафикиРаботы.Дата КАК Дата, | ГрафикиРаботы.Значение |ИЗ | РегистрСведений.СведенияОСотрудниках.СрезПоследних(&ДатаНачала, Подразделение = &Подразделение) КАК СведенияОСотрудникахСрезПоследних | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы | ПО СведенияОСотрудникахСрезПоследних.График = ГрафикиРаботы.График | И (ГрафикиРаботы.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания) | |УПОРЯДОЧИТЬ ПО | Сотрудник, | Дата |ИТОГИ ПО | Сотрудник"); Запрос.УстановитьПараметр("ДатаНачала", Объект.ПериодРегистрации); Запрос.УстановитьПараметр("ДатаОкончания", КонецНедели(Объект.ПериодРегистрации)); Запрос.УстановитьПараметр("Подразделение", Объект.Подразделение); Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока Выборка.Следующий() Цикл НоваяСтрока = ДокОбъект.Список.Добавить(); НоваяСтрока.Сотрудник = Выборка.Сотрудник; ВыборкаДет = Выборка.Выбрать(); Пока ВыборкаДет.Следующий() Цикл ДеньНедели = (ВыборкаДет.Дата - Объект.ПериодРегистрации) / (24 * 3600) + 1; НоваяСтрока["Дата" + ДеньНедели] = ?(ВыборкаДет.Значение<>0, Истина, Ложь); КонецЦикла; КонецЦикла; ЗначениеВРеквизитФормы(ДокОбъект, "Объект"); КонецПроцедуры //МодульОб Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр РабочиеДни Движения.РабочиеДни.Записывать = Истина; Для Каждого ТекСтрокаСписок Из Список Цикл Для Ном = 1 По 7 Цикл Если НЕ ТекСтрокаСписок["Дата" + Ном] Тогда ПродолжитЬ; КонецЕсли; Движение = Движения.РабочиеДни.Добавить(); Движение.Период = ПериодРегистрации + (Ном-1) * 24 * 3600; Движение.Сотрудник = ТекСтрокаСписок.Сотрудник; Движение.Подразделение = Подразделение; Движение.Значение = 1; КонецЦикла; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, График) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.График.Установить(График); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.График = График; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Оклад), ДН (Надбавка,Премия) //СведенияОСотрудниках (Сотрудник,Подраздеделение,... Оклад,График,ПроцентПремии) //РС ПроцентыСПродаж (Мин,Макс,Процент) //РегОБ РабочиеДни (Сотрудник,Подразделение,Значение) //РегОБ Продажи (Подразделение,Сумма) //РР ОН (Сотрудник,Подразделение,Результата, График,Параметр) ДН (Сотрудник,Подразделение,Результат... Перерасчет Перерасчет1 (Сотрудник,Подразделение)) //Отчет Перерасчеты ВЫБРАТЬ Перерасчет1.ОбъектПерерасчета, Перерасчет1.ВидРасчета, Перерасчет1.Сотрудник, Перерасчет1.Подразделение ИЗ РегистрРасчета.ДополнительныеНачисления.Перерасчет1 КАК Перерасчет1 //3.46 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений и ведется одновременно в двух валютах (рублях и долларах). //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по часовому тарифу. //Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных часов, причем для каждого подразделения компании ведется свой график. //Тарифная ставка должна быть определена отдельно для каждого подразделения по специальной шкале в зависимости от отработанного времени. //Например: За каждый рабочий день по графику в течение периода начисления сотрудникам предприятия полагается фиксированная сумма денег в качестве компенсации затрат на разговоры по мобильному телефону. //Размер суммы врасчетном периоде не меняется и для каждого сотрудника должен быть указан в документе «Начисление зарплаты». //За произвольный период отработанного времени (должен указываться в документе и может быть меньше периода ведения расчетов, например, всего несколько дней) сотрудникам компании начисляется премия процентом от всех начислений, сделанных за те же дни, за которые была начислена премия. //Процент премии в течение периода расчетов не меняется. Вместо премии, за любой отработанный день, сотруднику может быть выплачена произвольная сумма денег. //Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по тарифу с 10.01 по 31.01, а запись: тариф с 10.01 по 03.02 вводить нельзя. //Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасов, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниФактическийПериодДействия, 0) КАК ФактДней, | ЕСТЬNULL(ШкалаПодразделений.РазмерСтавки, 0) КАК РазмерСтавки |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад), ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.ПроизвольнаяСумма))) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаПодразделений КАК ШкалаПодразделений | ПО (ВЫБОР | КОГДА ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) = 0 | ТОГДА ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) >= ШкалаПодразделений.От | И ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) <= ШкалаПодразделений.До | ИНАЧЕ ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) > ШкалаПодразделений.От | И ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) <= ШкалаПодразделений.До | КОНЕЦ)"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда СтрокаДвижения.РезультатРуб = Выборка.РазмерСтавки *Выборка.ФактЧасов; СтрокаДвижения.РезультатUSD = ?(СтрокаДвижения.Курс = 0,0,СтрокаДвижения.РезультатРуб /СтрокаДвижения.Курс); СтрокаДвижения.Дни = Выборка.ФактДней; СтрокаДвижения.Размер = Выборка.РазмерСтавки; Иначе СтрокаДвижения.РезультатРуб =Выборка.ФактДней*СтрокаДвижения.Размер; СтрокаДвижения.РезультатUSD =СтрокаДвижения.РезультатРуб/СтрокаДвижения.Курс; КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатРубБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатРуб, 0) КАК РезультатБазаРуб, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатUSDБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатUSD, 0) КАК РезультатБазаДол |ПОМЕСТИТЬ ВТБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Премия)) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Премия)) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниФактическийПериодДействия, 0) КАК ФактДни, | ЕСТЬNULL(ВТБаза.РезультатБазаРуб, 0) КАК БазаРуб, | ЕСТЬNULL(ВТБаза.РезультатБазаДол, 0) КАК БазаДол |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Премия)) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ ВТБаза КАК ВТБаза | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ВТБаза.НомерСтроки"; Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда СтрокаДвижения.РезультатРуб = Выборка.БазаРуб *СтрокаДвижения.Размер/100; СтрокаДвижения.РезультатUSD = Выборка.БазаДол *СтрокаДвижения.Размер/100; Иначе СтрокаДвижения.РезультатРуб =Выборка.ФактДни*СтрокаДвижения.Размер; СтрокаДвижения.РезультатUSD =?(СтрокаДвижения.Курс=0,0,СтрокаДвижения.РезультатРуб/СтрокаДвижения.Курс); КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.ДниБаза, 0) КАК ДниБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.РезультатРуб = Выборка.ДниБаза*СтрокаДвижения.Размер; СтрокаДвижения.РезультатUSD = СтрокаДвижения.РезультатРуб/СтрокаДвижения.Курс; КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры //Константа ВалютаUSD - СправочникСсылкаВалюты //Док НачЗП добавить периодРегистрации Процедура ОбработкаПроведения(Отказ, РежимПроведения) Отбор = Новый Структура("Валюта",Константы.ВалютаUSD.Получить()); Курс = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(НачалоМесяца(ПериодРегистрации),Отбор).Курс; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата КАК ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.ПериодДействияНачало, | ТЧДок.ПериодДействияКонец, | ТЧДок.Размер, | ТЧДок.ГрафикРаботы, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.ПроцентПремии, 0) КАК ПроцентПремии |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение"; Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(ПериодРегистрации)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.Курс = Курс; Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда Движение.Размер = Выборка.ПроцентПремии; Движение.БазовыйПериодНачало = Выборка.ПериодДействияНачало; Движение.БазовыйПериодКонец = Выборка.ПериодДействияКонец; КонецЕсли; КонецЦикла; Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,СтрокаДвижения); Движение.ПериодРегистрации = НачалоМесяца(ПериодРегистрации); Движение.БазовыйПериодНачало = НачалоМесяца(ПериодРегистрации); Движение.БазовыйПериодКонец = КонецМесяца(ПериодРегистрации); Движение.Курс = Курс; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления); КонецПроцедуры Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, ГрафикРаботы, Подразделение) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.ГрафикРаботы.Установить(ГрафикРаботы); Набор.Отбор.Подразделение.Установить(Подразделение); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.ГрафикРаботы = ГрафикРаботы; Запись.Подразделение = Подразделение; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Запись.ЗначениеДни =0; Иначе Запись.Значение = 8; Запись.ЗначениеДни = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Оклад.Премия, ПроизвольнаяСумма) ДН (КомпенсацияНаСвязь) //РС СведенияОСотрудниках Подразделение,Сотрудник, ПроцентПремии //РС ШкалаПодразделений (Подразделение,От,До, РазмерСтавки) //РР ОН (Сотрудник,Подарзделение, РезультатРуб, РезультатUSD, Дни, ... Размер,ГрафикРаботы,Курс ) ДН (Сотрудник,Подарзделение, РезультатРуб, РезультатUSD...Размер,Курс). //Отчет АнализНачислений ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.ПериодДействия, ОсновныеНачисления.РезультатРуб, ОсновныеНачисления.РезультатUSD ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.ПериодРегистрации, ДополнительныеНачисления.РезультатРуб, ДополнительныеНачисления.РезультатUSD ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода //3.47 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений и ведется одновременно в трех валютах (рублях, долларах и евро). //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по часовому тарифу. //Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных часов, причем для каждого подразделения компании ведется свой график. //Тарифная ставка должна быть определена отдельно для каждого подразделения по специальной шкале в зависимости от отработанного времени. //Например: За каждый день работы сотрудникам предприятия начисляется определенная сумма денег в качестве компенсации затрат на обеды. //Компенсация за один обед рассчитывается как определенная сумма, указываемая для каждого сотрудника отдельно и ранящаяся в информационной базе. //Сотрудникам предоставляется оплачиваемый отпуск, размер которого определяется как количество дней отпуска умноженное на среднюю дневную ставку. //Дни отпуска рассчитываются по шестидневному графику. //Средняя дневная ставка определяется как сумма всех начислений за три предыдущих месяца, поделенная на количество отработанных дней в трех предыдущих месяцах. //Следует учесть, что данные об отпуске не могут вводиться в систему задним числом. //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по тарифу с 10.01 по 31.01, а запись: тариф с 10.01 по 03.02 вводить нельзя. //В конфигурации необходимо создать документ «Зарплата к выплате». //В табличной части документа для каждого сотрудника указывается сумма выплачиваемой зарплаты. //Документ должен заполняться автоматически данными о еще не выплаченной зарплате. Проводить документ не надо. //На форме документа необходимо предусмотреть кнопку «Печать». //При нажатии на кнопку должна открыться печатная форма следующего вида: //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления, Дата, ВыплатаЗП) ЭКспорт КурсДол = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата,Новый Структура("Валюта",Справочники.Валюты.Доллар)).Курс; КурсЕвро = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата,Новый Структура("Валюта",Справочники.Валюты.Евро)).Курс; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатРубБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатРубБаза, 0) КАК БазаРуб, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.ДниБаза, 0) КАК ДниБаза |ПОМЕСТИТЬ ВТБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Отпуск)) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления( | &Измерение, | &Измерение, | , | Регистратор = &Ссылка | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Отпуск)) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЕСТЬNULL(ВТБаза.БазаРуб, 0) КАК БазаРуб, | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасы, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеДниШестидневкаФактическийПериодДействия, 0) КАК ФактДниШестидневка, | ЕСТЬNULL(ШкалаСтавок.Ставка, 0) КАК Ставка, | ОсновныеНачисленияДанныеГрафика.ЗначениеДниФактическийПериодДействия КАК ДниФакт, | ЕСТЬNULL(ВТБаза.ДниБаза, 0) КАК ДниБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ ВТБаза КАК ВТБаза | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ВТБаза.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШкалаСтавок КАК ШкалаСтавок | ПО (ВЫБОР | КОГДА ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) = 0 | ТОГДА ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) >= ШкалаСтавок.От | И ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) <= ШкалаСтавок.До | ИНАЧЕ ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) > ШкалаСтавок.От | И ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) <= ШкалаСтавок.До | КОНЕЦ) | И ОсновныеНачисленияДанныеГрафика.Подразделение = ШкалаСтавок.Подразделение"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Если СтрокаДвижения.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда СтрокаДвижения.РезультатРуб = Выборка.ФактЧасы*Выборка.Ставка; СтрокаДвижения.РезультатДол = ?(КурсДол=0,0,СтрокаДвижения.РезультатРуб/ КурсДол); СтрокаДвижения.РезультатЕвро = ?(КурсЕвро=0,0,СтрокаДвижения.РезультатРуб/ КурсЕвро); СтрокаДвижения.Размер = Выборка.Ставка; СтрокаДвижения.Дни = Выборка.ДниФакт; НоваяСтрока = ВыплатаЗП.Добавить(); НоваяСтрока.Период = Дата; НоваяСтрока.Сотрудник = СтрокаДвижения.Сотрудник; НоваяСтрока.НачисленоРуб = СтрокаДвижения.РезультатРуб; НоваяСтрока.НачисленоДол = СтрокаДвижения.РезультатДол; НоваяСтрока.НачисленоЕвро = СтрокаДвижения.РезультатЕвро; Иначе СредняяДневнаяРуб = ?(Выборка.ДниБаза=0,0,Выборка.БазаРуб/Выборка.ДниБаза); СредняяДневнаяДол = ?(Выборка.ДниБаза=0,0,СредняяДневнаяРуб/КурсДол); СредняяДневнаяЕвр = ?(Выборка.ДниБаза=0,0,СредняяДневнаяРуб/КурсЕвро); СтрокаДвижения.РезультатРуб = Выборка.ФактДниШестидневка*СредняяДневнаяРуб; СтрокаДвижения.РезультатДол = Выборка.ФактДниШестидневка*СредняяДневнаяДол; СтрокаДвижения.РезультатЕвро = Выборка.ФактДниШестидневка*СредняяДневнаяЕвр; НоваяСтрока = ВыплатаЗП.Добавить(); НоваяСтрока.Период = Дата; НоваяСтрока.Сотрудник = СтрокаДвижения.Сотрудник; НоваяСтрока.НачисленоРуб = СтрокаДвижения.РезультатРуб; НоваяСтрока.НачисленоДол = СтрокаДвижения.РезультатДол; НоваяСтрока.НачисленоЕвро = СтрокаДвижения.РезультатЕвро КонецЕсли; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления,Дата,ВыплатаЗП) Экспорт КурсДол = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата,Новый Структура("Валюта",Справочники.Валюты.Доллар)).Курс; КурсЕвро = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата,Новый Структура("Валюта",Справочники.Валюты.Евро)).Курс; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.ДниБаза, 0) КАК ДниБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.РезультатРуб = Выборка.ДниБаза*СтрокаДвижения.Размер; СтрокаДвижения.РезультатДол = СтрокаДвижения.РезультатРуб/КурсДол; СтрокаДвижения.РезультатЕвро = СтрокаДвижения.РезультатРуб/КурсЕвро; НоваяСтрока = ВыплатаЗП.Добавить(); НоваяСтрока.Период = Дата; НоваяСтрока.Сотрудник = СтрокаДвижения.Сотрудник; НоваяСтрока.НачисленоРуб = СтрокаДвижения.РезультатРуб; НоваяСтрока.НачисленоДол = СтрокаДвижения.РезультатДол; НоваяСтрока.НачисленоЕвро = СтрокаДвижения.РезультатЕвро КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры //ДокНачЗП ПериодРегистрации Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ВыплатаЗП.Записывать = Истина; Для каждого СтрокаТЧ из ОсновныеНачисления цикл Движение =Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,СтрокаТЧ); Движение.ПериодРегистрации = НачалоМесяца(ПериодРегистрации); Движение.ПериодДействияНачало = СтрокаТЧ.ДатаНачала; Движение.ПериодДействияКонец = КонецДня(СтрокаТЧ.ДатаОкончания); Если СтрокаТЧ.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(ПериодРегистрации),-3); Движение.БазовыйПериодКонец = НачалоМесяца(ПериодРегистрации)-1; КонецЕсли; КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.Ссылка.ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.КомпенсацияЗаОбед, 0) КАК Размер |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧдок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение"; Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.БазовыйПериодНачало = НачалоМесяца(Выборка.ПериодРегистрации); Движение.БазовыйПериодКонец = КонецМесяца(Выборка.ПериодРегистрации); КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления, Дата, Движения.ВыплатаЗП); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления, Дата, Движения.ВыплатаЗП); КонецПроцедуры //Док ЗарплатаКВыплате тч Зарплата (Сотрудник. НачисленоРуб, НачисленоДол, НачисленоЕвро) //МодульФормы док &НаКлиенте Процедура Заполнить(Команда) ЗаполнитьНаСервере(Объект.Дата); КонецПроцедуры // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // &НаСервере Процедура ЗаполнитьНаСервере(Дата) ДокументОбъект = РеквизитФормыВЗначение("Объект"); Блокировка = новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ВыплатаЗП"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВыплатаЗПОстатки.Сотрудник, | ВыплатаЗПОстатки.НачисленоРубОстаток КАК НачисленоРуб, | ВыплатаЗПОстатки.НачисленоДолОстаток КАК НачисленоДол, | ВыплатаЗПОстатки.НачисленоЕвроОстаток КАК НачисленоЕвро |ИЗ | РегистрНакопления.ВыплатаЗП.Остатки(&Дата, ) КАК ВыплатаЗПОстатки"; Запрос.УстановитьПараметр("Дата", Дата); Результат = Запрос.Выполнить(); ДокументОбъект.Зарплата.Загрузить(Результат.Выгрузить()); ЗначениеВРеквизитФормы(ДокументОбъект, "Объект"); КонецПроцедуры // ЗаполнитьНаСервере() //Команда док Печать &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) //{{_КОНСТРУКТОР_ПЕЧАТИ(Печать) ТабДок = Новый ТабличныйДокумент; Печать(ТабДок, ПараметрКоманды); ТабДок.ОтображатьСетку = Ложь; ТабДок.Защита = Ложь; ТабДок.ТолькоПросмотр = Ложь; ТабДок.ОтображатьЗаголовки = Ложь; ТабДок.Показать(); //}} КонецПроцедуры &НаСервере Процедура Печать(ТабДок, ПараметрКоманды) Документы.ЗарплатаКВыплате.Печать(ТабДок, ПараметрКоманды); КонецПроцедуры //Модуль менеджера Процедура Печать(ТабДок, Ссылка) Экспорт //{{_КОНСТРУКТОР_ПЕЧАТИ(Печать) Макет = Документы.ЗарплатаКВыплате.ПолучитьМакет("Печать"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗарплатаКВыплате.Зарплата.( | НомерСтроки, | Сотрудник, | НачисленоРуб, | НачисленоДол, | НачисленоЕвро | ) |ИЗ | Документ.ЗарплатаКВыплате КАК ЗарплатаКВыплате |ГДЕ | ЗарплатаКВыплате.Ссылка В (&Ссылка)"; Запрос.Параметры.Вставить("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок"); ОбластьЗарплатаШапка = Макет.ПолучитьОбласть("ЗарплатаШапка"); ОбластьЗарплата = Макет.ПолучитьОбласть("Зарплата"); ТабДок.Очистить(); ВставлятьРазделительСтраниц = Ложь; Пока Выборка.Следующий() Цикл Если ВставлятьРазделительСтраниц Тогда ТабДок.ВывестиГоризонтальныйРазделительСтраниц(); КонецЕсли; ТабДок.Вывести(ОбластьЗаголовок); ТабДок.Вывести(ОбластьЗарплатаШапка); ВыборкаЗарплата = Выборка.Зарплата.Выбрать(); Пока ВыборкаЗарплата.Следующий() Цикл ОбластьЗарплата.Параметры.Заполнить(ВыборкаЗарплата); ТабДок.Вывести(ОбластьЗарплата, ВыборкаЗарплата.Уровень()); КонецЦикла; ВставлятьРазделительСтраниц = Истина; КонецЦикла; //}} КонецПроцедуры //Заполнение Графика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, ГрафикРаботы, Подразделение) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); НАбор.Отбор.ГрафикРаботы.Установить(ГрафикРаботы); Набор.Отбор.Подразделение.Установить(Подразделение); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.ГрафикРаботы = ГрафикРаботы; Запись.Подразделение = Подразделение; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Запись.ЗначениеДни = 0; Иначе Запись.Значение = 8; Запись.ЗначениеДни = 1; КонецЕсли; Если ДеньНедели(Дат) = 7 Тогда Запись.ЗначениеДниШестидневка = 0;Иначе Запись.ЗначениеДниШестидневка =1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Оклад,Отпуск), ДН (КомпенсацияОбед) //РС ГрафикиРаботы (Дата,ГрафикРаботы,Подразделение,Значение, ЗначениеДни, ЗначениеДниШестидневка) //РС СведенияОСотрудниках (Сотрудник,Подразделния, КомпенсацияЗаОбед) //РС ШкалаСтавок (Подразделение,От,До,Ставка) //Рег Ост ВыплатаЗП (Сотрудник, НачисленоРуб, НачисленоДол, НачисленоЕвро) //РР ОН (Сотрудник,Подразделение, РезультатРуб, РезультатДол, РезультатЕвро, Дни...ГрафикРаботы,Размер) //РР ДН (Сотрудник,Подразделелние, РезультатРуб, РезультатДол, РезультатЕвро... Размер) //3.48 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений и ведется одновременно в разных валютах. //Количество валют ведения учета заранее не известно. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в часах. //Часовая ставка рассчитывается как начальное значение оклада, деленное на количество рабочих часов в том же периоде, что и фактически отработанные часы. //В течение расчетного периода первоначальное значение оклада может быть один раз изменено. //Расчет должен производиться исходя из действующего на рассчитываемую дату начального значения оклада. //Например, если начальное значение оклада изменилось 10 августа, то до 10 августа при расчете берется старое значение, а начиная с 10 августа – новое. //Сотрудникам предприятия ежемесячно начисляется фиксированная сумма денег в качестве компенсации затрат на разговоры по мобильному телефону. //Размер суммы в течение расчетного периода не меняется. //Сотрудникам компании может быть начислена премия процентом от начисленного в том же расчетном периоде оклада. //Процент премии в течение периода начисления не меняется. Создать отчет «Перерасчет зарплаты», в котором пользователь должен увидеть записи регистра расчета, которые возможно требуется пересчитать. //Саму процедуру перерасчета записей в рамках данной задачи реализовывать не требуется. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по окладу с 10.01 по 31.01, а запись: оклад с 10.01 по 03.02 вводить нельзя. //Для анализа сделанных сотрудникам предприятия начислений в конфигурации необходимо предусмотреть отчет следующего вида: //ОМ РасчетЗаработнойПлаты Процедура РассчитатьОН(Ссылка, ОсновныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК ПланЧасов, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактЧасов |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ОсновныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл Курс = ?(СтрокаДвижения.Курс=0,1,СтрокаДвижения.Курс); СтрокаДвижения.Результат = ?(Выборка.ПланЧасов=0,0, СтрокаДвижения.Размер/Выборка.ПланЧасов*Выборка.ФактЧасов)/Курс; КонецЦикла; КонецЦикла; ОсновныеНачисления.Записать(,Истина); КонецПроцедуры Процедура РассчитатьДН(Ссылка, ДополнительныеНачисления) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерение, &Измерение, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления"; Измерение = Новый Массив; Измерение.Добавить("Сотрудник"); Измерение.Добавить("Подразделение"); Запрос.УстановитьПараметр("Измерение", Измерение); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск= Новый Структура("НомерСтроки"); Для каждого СтрокаДвижения из ДополнительныеНачисления цикл Поиск.НомерСтроки = СтрокаДвижения.НомерСтроки; Выборка.Сбросить(); Пока Выборка.НайтиСледующий(Поиск) цикл СтрокаДвижения.Результат = (Выборка.РезультатБаза*СтрокаДвижения.Размер/100)/?(СтрокаДвижения.Курс=0,1,СтрокаДвижения.Курс); КонецЦикла; КонецЦикла; ДополнительныеНачисления.Записать(,Истина); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.Валюта, | НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.Размер, | НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации |ПОМЕСТИТЬ ТЧдок |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧдок.Сотрудник, | ТЧдок.Подразделение, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Оклад, 0) КАК РазмерОклада, | &НачалоМесяца КАК НачалоВИстории |ПОМЕСТИТЬ ВтОклады |ИЗ | ТЧдок КАК ТЧдок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧдок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧдок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | СведенияОСотрудниках.Сотрудник, | СведенияОСотрудниках.Подразделение, | СведенияОСотрудниках.Оклад, | СведенияОСотрудниках.Период |ИЗ | РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках |ГДЕ | СведенияОСотрудниках.Период > &НачалоМесяца | И СведенияОСотрудниках.Период <= &КонецМесяца | И СведенияОСотрудниках.Сотрудник В | (ВЫБРАТЬ | Т.Сотрудник | ИЗ | ТЧдок КАК Т) | И СведенияОСотрудниках.Подразделение В | (ВЫБРАТЬ | Т.Подразделение | ИЗ | ТЧДок КАК Т) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВтОклады.Сотрудник КАК Сотрудник, | ВтОклады.Подразделение КАК Подразделение, | ВтОклады.НачалоВИстории, | ВтОклады.РазмерОклада |ПОМЕСТИТЬ ВтОкладыСгр |ИЗ | ВтОклады КАК ВтОклады | |СГРУППИРОВАТЬ ПО | ВтОклады.Сотрудник, | ВтОклады.Подразделение, | ВтОклады.НачалоВИстории, | ВтОклады.РазмерОклада | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧдок.Сотрудник КАК Сотрудник, | ТЧдок.Подразделение, | ТЧдок.ВидРасчета КАК ВидРасчета, | ТЧдок.Валюта, | ТЧдок.ГрафикРаботы, | ТЧдок.ПериодДействияНачало, | ТЧдок.ПериодДействияКонец, | ТЧдок.Размер, | ТЧдок.ПериодРегистрации, | ВтОклады.НачалоВИстории КАК НачалоВИстории, | ЕСТЬNULL(ВтОклады.РазмерОклада, 0) КАК Оклад, | ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) КАК Курс |ИЗ | ТЧдок КАК ТЧдок | ЛЕВОЕ СОЕДИНЕНИЕ ВтОкладыСгр КАК ВтОклады | ПО ТЧдок.Сотрудник = ВтОклады.Сотрудник | И ТЧдок.Подразделение = ВтОклады.Подразделение | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних( | &НачалоМесяца, | Валюта В | (ВЫБРАТЬ | Т.Валюта | ИЗ | ТЧдок КАК Т)) КАК КурсыВалютСрезПоследних | ПО ТЧдок.Валюта = КурсыВалютСрезПоследних.Валюта | |УПОРЯДОЧИТЬ ПО | ВидРасчета, | НачалоВИстории |ИТОГИ ПО | Сотрудник"; Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Дата)); Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка",Ссылка); Результат = Запрос.Выполнить(); ВыборкаСотрудник = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСотрудник.Следующий() Цикл // Вставить обработку выборки ВыборкаСотрудник Выборка = ВыборкаСотрудник.Выбрать(); НоваяСтрокаСотрудника = Ложь; Пока Выборка.Следующий() Цикл Если Ложь Тогда Движение = Неопределено; КонецЕсли; Если НоваяСтрокаСотрудника Тогда Движение.ПериодДействияКонец = Макс(Выборка.ПериодДействияНачало, Выборка.НачалоВИстории)-1; КонецЕсли; Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сотрудник = Выборка.Сотрудник; Движение.Подразделение = Выборка.Подразделение; Движение.Валюта = Выборка.Валюта; Движение.ГрафикРаботы = Выборка.ГрафикРаботы; Движение.ПериодРегистрации = Выборка.ПериодРегистрации; Движение.ВидРасчета = Выборка.ВидРасчета; Движение.ПериодДействияНачало = Макс(Выборка.ПериодДействияНачало, Выборка.НачалоВИстории); Движение.ПериодДействияКонец = Выборка.ПериодДействияКонец; Движение.Размер = Выборка.Оклад; Движение.Курс = Выборка.Курс; НоваяСтрокаСотрудника = Истина; КонецЦикла; КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.Валюта, | НачислениеЗарплатыДополнительныеНачисления.Размер, | НачислениеЗарплатыДополнительныеНачисления.Ссылка.ПериодРегистрации |ПОМЕСТИТЬ ТЧДок |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧДок.Сотрудник, | ТЧДок.Подразделение, | ТЧДок.ВидРасчета, | ТЧДок.Валюта, | ТЧДок.Размер, | ТЧДок.ПериодРегистрации, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.ФиксСумма, 0) КАК ФиксСумма, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.ПроцентПремии, 0) КАК ПроцентПремии, | ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) КАК Курс |ИЗ | ТЧДок КАК ТЧДок | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &НачалоМесяца, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Т.Сотрудник, | Т.Подразделение | ИЗ | ТЧДок КАК Т)) КАК СведенияОСотрудникахСрезПоследних | ПО ТЧДок.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И ТЧДок.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних( | &НачалоМесяца, | Валюта В | (ВЫБРАТЬ | Т.Валюта | ИЗ | ТЧДок КАК Т)) КАК КурсыВалютСрезПоследних | ПО ТЧДок.Валюта = КурсыВалютСрезПоследних.Валюта"; Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Дата)); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ДополнительныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение,Выборка); Если Выборка.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.КомпенсацияЗатратТелефон Тогда Движение.Размер = Выборка.ФиксСумма; Движение.Результат = Выборка.ФиксСумма/?(Выборка.Курс=0,1,Выборка.Курс); иначе Движение.БазовыйПериодНачало = НачалоМесяца(Выборка.ПериодРегистрации); Движение.БазовыйПериодКонец = КонецМесяца(Выборка.ПериодРегистрации); Движение.Размер = Выборка.ПроцентПремии; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать(); РасчетЗаработнойПлаты.РассчитатьОН(Ссылка, Движения.ОсновныеНачисления); РасчетЗаработнойПлаты.РассчитатьДН(Ссылка, Движения.ДополнительныеНачисления); КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, ГрафикРаботы) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.ГрафикРаботы.Установить(ГрафикРаботы); Набор.Прочитать(); Набор.Очистить(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.ГрафикРаботы = ГрафикРаботы; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Оклад), ДН (КомпенсацияЗатратТелефон, Премия) //РС ГрафикиРаботы (Дата,ГрафикРАботы,Значение) //РС СведенияОСотрудниках (Сотрудник,Подразделение, Оклад,ФиксСумма,ПроцентПремии) //РР ОН (Сотрудник,подразделение,Валюта,...Результат... ГрафикРаботы,Размер,курс) //ДН (Сотрудник,подразделение,Валюта,...Результат...,Размер,курс.... Перерасчет (Дополнительно - Сотрудник,Подразделение)) //Отчет Пересчет ВЫБРАТЬ Дополнительно.ОбъектПерерасчета, Дополнительно.ВидРасчета, Дополнительно.Сотрудник, Дополнительно.Подразделение ИЗ РегистрРасчета.ДополнительныеНачисления.Дополнительно КАК Дополнительно Отчет АнализНачислений ВЫБРАТЬ ОсновныеНачисления.Сотрудник, ОсновныеНачисления.Подразделение, ОсновныеНачисления.Валюта, ОсновныеНачисления.ВидРасчета, ОсновныеНачисления.Результат ИЗ РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления ГДЕ ОсновныеНачисления.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДополнительныеНачисления.Сотрудник, ДополнительныеНачисления.Подразделение, ДополнительныеНачисления.Валюта, ДополнительныеНачисления.ВидРасчета, ДополнительныеНачисления.Результат ИЗ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления ГДЕ ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода //3.49 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все начисления могут осуществляться в различных валютах, но учет ведется только в основной валюте. //Основная валюта учета может быть изменена один раз, в начале года. Количество используемых валют заранее не известно. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в часах. //Часовая ставка рассчитывается как начальное значение оклада, еленное на количество рабочих часов в том же периоде, что и фактически отработанные часы. //В течение расчетного периода первоначальное значение оклада не может быть изменено. //Сотрудникам предприятия ежемесячно начисляется фиксированная сумма денег в качестве компенсации затрат на обеды. //Размер суммы в течение расчетного периода не меняется. //По мере необходимости любой сотрудник может быть отправлен в командировку. //В этом случае начисление по окладу не происходит. Часы, проведенные в командировке, определяются по пятидневному графику работы. //Часовая ставка для расчета командировки определяется как сумма всех начислений за два предыдущих есяца, деленная на количество рабочих часов в двух предыдущих месяцах. //Следует учесть, что данные о командировке не могут вводиться в систему задним числом. //Механизм перерасчетов в рамках данной задачи использовать не надо. //Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по окладу с 10.01 по 31.01, а запись: оклад с 10.01 по 03.02 вводить нельзя. В конфигурации необходимо создать документ «Зарплата к выплате». Документ формируется по конкретному подразделению. В табличной части документа для каждого сотрудника указывается сумма выплачиваемой зарплаты в основной валюте учета. Документ должен заполняться автоматически данными о еще не выплаченной зарплате. На форме документа необходимо предусмотреть кнопку «Печать». При нажатии на кнопку должна открыться печатная форма следующего вида: //ОМ Расчеты Процедура Расчет(Ссылка, ПериодРегистрации) Экспорт КурсОсновнойВалюты = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ПериодРегистрации, Новый Структура("Валюта", РегистрыСведений.ОсновнаяВалюта.ПолучитьПоследнее(ПериодРегистрации).Валюта)).Курс; Измерения = Новый Массив; Измерения.Добавить("Сотрудник"); Измерения.Добавить("Подразделение"); Разрезы = Новый Массив; Разрезы.Добавить("Валюта"); НаборВзаиморасчеты = РегистрыНакопления.ВзаиморасчетыСРаботниками.СоздатьНаборЗаписей(); НаборВзаиморасчеты.Отбор.Регистратор.Установить(Ссылка); Набор = РегистрыРасчета.ОсновныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Запрос = Новый Запрос("ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ВремяФакт, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод, 0) КАК ВремяБаза, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК ВремяПлан, | ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) КАК Курс |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Ссылка | И ПериодРегистрации = &ПериодРегистрации) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Измерения, | &Измерения, | , | Регистратор = &Ссылка | И ПериодРегистрации = &ПериодРегистрации) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления( | &Измерения, | &Измерения, | , | Регистратор = &Ссылка | И ПериодРегистрации = &ПериодРегистрации) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ПериодРегистрации, ) КАК КурсыВалютСрезПоследних | ПО ОсновныеНачисленияДанныеГрафика.Валюта = КурсыВалютСрезПоследних.Валюта"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ПериодРегистрации", ПериодРегистрации); Запрос.УстановитьПараметр("Измерения", Измерения); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Выборка.Сбросить(); Если Выборка.НайтиСледующий(Отбор) Тогда Если Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Движение.Результат = ?(Выборка.ВремяПлан=0,0,Движение.Параметр * Выборка.ВремяФакт / Выборка.ВремяПлан) * ?(КурсОсновнойВалюты=0,1,Выборка.Курс / КурсОсновнойВалюты); Иначе Движение.Результат = ?(Выборка.ВремяБаза=0,0,Выборка.ВремяФакт * Выборка.РезультатБаза / Выборка.ВремяБаза) * ?(КурсОсновнойВалюты=0,1,Выборка.Курс / КурсОсновнойВалюты); КонецЕсли; ДвижениеВзаиморасчеты = НаборВзаиморасчеты.Добавить(); ДвижениеВзаиморасчеты.Период = ПериодРегистрации; ДвижениеВзаиморасчеты.ВидДвижения = ВидДвиженияНакопления.Приход; ДвижениеВзаиморасчеты.Подразделение = Движение.Подразделение; ДвижениеВзаиморасчеты.Сотрудник = Движение.Сотрудник; ДвижениеВзаиморасчеты.Сумма = Движение.Результат; ДвижениеВзаиморасчеты.ВидРасчета = Движение.ВидРасчета; КонецЕсли; КонецЦикла; Набор.Записать(, Истина); //---------------------------------------------------------------------- Набор = РегистрыРасчета.ДополнительныеНачисления.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Набор.Прочитать(); Запрос = Новый Запрос("ВЫБРАТЬ | ДополнительныеНачисления.НомерСтроки, | ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) КАК Курс |ИЗ | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ПериодРегистрации, ) КАК КурсыВалютСрезПоследних | ПО ДополнительныеНачисления.Валюта = КурсыВалютСрезПоследних.Валюта |ГДЕ | ДополнительныеНачисления.Регистратор = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ПериодРегистрации", ПериодРегистрации); Выборка = Запрос.Выполнить().Выбрать(); Отбор = Новый Структура; Для Каждого Движение Из Набор Цикл Отбор.Вставить("НомерСтроки", Движение.НомерСтроки); Выборка.Сбросить(); Если Выборка.НайтиСледующий(Отбор) Тогда Движение.Результат = Движение.Параметр * ?(КурсОсновнойВалюты=0,1,Выборка.Курс / КурсОсновнойВалюты); КонецЕсли; ДвижениеВзаиморасчеты = НаборВзаиморасчеты.Добавить(); ДвижениеВзаиморасчеты.Период = ПериодРегистрации; ДвижениеВзаиморасчеты.ВидДвижения = ВидДвиженияНакопления.Приход; ДвижениеВзаиморасчеты.Подразделение = Движение.Подразделение; ДвижениеВзаиморасчеты.Сотрудник = Движение.Сотрудник; ДвижениеВзаиморасчеты.Сумма = Движение.Результат; ДвижениеВзаиморасчеты.ВидРасчета = Движение.ВидРасчета; КонецЦикла; Набор.Записать(, Истина); НаборВзаиморасчеты.Записать(); КонецПроцедуры //ДокНачЗП Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) ПериодРегистрации = НачалоМесяца(ПериодРегистрации); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.График, | НачислениеЗарплатыОсновныеНачисления.Валюта |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.ПериодРегистрации, | Список.Сотрудник, | Список.Подразделение, | Список.ВидРасчета, | Список.ПериодДействияНачало, | Список.ПериодДействияКонец, | Список.График, | Список.Валюта, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Оклад, 0) КАК Оклад |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &ДатаНачала, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК СведенияОСотрудникахСрезПоследних | ПО Список.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И Список.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", ПериодРегистрации); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОсновныеНачисления.Добавить(); ЗаполнитьЗначенияСвойств(Движение, Выборка); Если Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Движение.Параметр = Выборка.Оклад; Иначе Движение.График = Справочники.Графики.Пятидневка; Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации, -2); Движение.БазовыйПериодКонец = ПериодРегистрации-1; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(); Запрос = Новый Запрос("ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Ссылка.ПериодРегистрации, | НачислениеЗарплатыДополнительныеНачисления.Сотрудник КАК Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.Подразделение КАК Подразделение, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | НачислениеЗарплатыДополнительныеНачисления.Валюта |ПОМЕСТИТЬ Список |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Список.ПериодРегистрации, | Список.Сотрудник, | Список.Подразделение, | Список.ВидРасчета, | Список.Валюта, | ЕСТЬNULL(СведенияОСотрудникахСрезПоследних.Компенсация, 0) КАК Параметр |ИЗ | Список КАК Список | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &ДатаНачала, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ | Список.Сотрудник, | Список.Подразделение | ИЗ | Список КАК Список)) КАК СведенияОСотрудникахСрезПоследних | ПО Список.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник | И Список.Подразделение = СведенияОСотрудникахСрезПоследних.Подразделение"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДатаНачала", ПериодРегистрации); Движения.ДополнительныеНачисления.Загрузить(Запрос.Выполнить().Выгрузить()); Движения.ДополнительныеНачисления.Записать(); Расчеты.Расчет(Ссылка, ПериодРегистрации); КонецПроцедуры //Док ЗарплатаКВыплате (Подразделение,ПериодРегистрации) тч Список (Сотрудник, Сумма) Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ВзаиморасчетыСРаботниками Расход Движения.ВзаиморасчетыСРаботниками.Записывать = Истина; Для Каждого ТекСтрокаСписок Из Список Цикл Движение = Движения.ВзаиморасчетыСРаботниками.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Сотрудник = ТекСтрокаСписок.Сотрудник; Движение.Подразделение = Подразделение; Движение.Сумма = ТекСтрокаСписок.Сумма; Движение.ВидРасчета = ПланыВидовРасчета.Удержания.Выплата; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, График) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.График.Установить(График); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.График = График; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 8; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Командировка,Оклад,) ДН (Компенсация) У - не зависит не от чего (Выплата) //РС ГрафикиРаботы (Дата,График,знаение). РС СведенияОСОтрудниках ( Сотрудник,Подразделение, Оклад, Компенсация). РС ОсновнаяВалюта (рес Валюта). //РН Ост ВзаиморасчетыСРаботниками (Сотрудник,Подразделение,Сумма.... ВидРасчета) //РР ОН (Сотрудник,Подразделение, Результат, Параметр,График,Валюта) ДН (Сотрудник,Подразделение, Результат, Параметр,Валюта). //3.50 Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. //Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам. //Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в днях. //Сумма начисления по окладу определяется как дневная ставка, умноженная на количество фактически отработанных дней. //Дневная ставка оклада одинакова для всех сотрудников и должна быть определена по специальной шкале в зависимости от общего трудового стажа работы сотрудника. //При решении задачи необходимо иметь в виду, что на момент начала ведения учета у сотрудника может быть трудовой стаж отличный от нуля. //Сотрудникам предприятия ежемесячно начисляется фиксированная сумма денег в качестве компенсации затрат на обеды. //Размер суммы в течение расчетного периода не меняется. //За каждый день невыхода сотрудника на работу без уважительной причины сотруднику начисляется штраф в размере процента от всех начислений, сделанных в текущем расчетном периоде. //Размер процента может быть указан отдельно для каждого сотрудника в документе «Начисление зарплаты». //Механизм перерасчетов в рамках данной задачи использовать не надо. Ввод всех начислений происходит документом «Начисление зарплаты». //Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление по окладу с 10.01 по 31.01, а запись: оклад с 10.01 по 03.02 вводить нельзя. //В конфигурации необходимо создать документ «Зарплата к выплате». Документ формируется по конкретному подразделению. //В табличной части документа для каждого сотрудника указывается сумма выплачиваемой зарплаты. Порядок выплаты заработной платы происходит в два этапа: 10 числа каждого месяца сотрудникам выплачивается аванс, сумма аванса устанавливается отдельно для каждого из сотрудников; //В последний день месяца выплачивается окончательная зарплата. //При выплате зарплаты нужно учитывать выплаченный ранее аванс. //Документ должен заполняться автоматически данными о еще не осуществленных выплатах. //На форме документа необходимо предусмотреть кнопку «Печать». //При нажатии на кнопку должна открыться печатная форма следующего вида: //ОМ Расчет // <Описание процедуры> // // Параметры // <Параметр1> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // <Параметр2> - <Тип.Вид> - <описание параметра> // <продолжение описания параметра> // Процедура РассчитатьНачисления(Регистратор) Экспорт НаборЗаписей = РегистрыРасчета.ОсновныеНачисления.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Регистратор); НаборЗаписей.Прочитать(); ////////////////////////////////// НаборЗаписейДоп = РегистрыРасчета.ДополнительныеНачисления.СоздатьНаборЗаписей(); НаборЗаписейДоп.Отбор.Регистратор.Установить(Регистратор); НаборЗаписейДоп.Прочитать(); ////////////////////////////////// Таблица = НаборЗаписей.Выгрузить(); Таблица.Свернуть("ВидРасчета"); ////////////////////////////////// ЕстьОклад = Таблица.НайтиСтроки(Новый Структура("ВидРасчета", ПланыВидовРасчета.ОсновныеНачисления.Оклад)); Если ЕстьОклад.Количество() > 0 Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ОсновныеНачисленияДанныеГрафика.ВидРасчета, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.Параметр, 0) КАК Параметр, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК Факт |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Регистратор | И ПериодРегистрации = &ПериодРегистрации | И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)) КАК ОсновныеНачисленияДанныеГрафика"; Запрос.УстановитьПараметр("Регистратор", Регистратор); Запрос.УстановитьПараметр("ПериодРегистрации", Регистратор.ПериодРегистрации); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Отбор = Новый Структура("НомерСтроки"); Для каждого Запись Из НаборЗаписей Цикл Отбор.НомерСтроки = Запись.НомерСтроки; Если Выборка.НайтиСледующий(Отбор) Тогда Запись.Результат = Выборка.Параметр * Выборка.Факт; КонецЕсли; ////////////////// Выборка.Сбросить(); ////////////////// КонецЦикла; ////////////////////////////////////// НаборЗаписей.Записать(Истина, Истина); ////////////////////////////////////// КонецЕсли; //////////////////////////////////////////// ТаблицаДоп = НаборЗаписейДоп.Выгрузить(); ТаблицаДоп.Свернуть("ВидРасчета"); //////////////////////////////////////////// ЕстьКомпенсация = ТаблицаДоп.НайтиСтроки(Новый Структура("ВидРасчета", ПланыВидовРасчета.ДополнительныеНачисления.Компенсация)); Если ЕстьКомпенсация.Количество() > 0 Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеНачисления.НомерСтроки, | ДополнительныеНачисления.ВидРасчета, | ЕСТЬNULL(ДополнительныеНачисления.Параметр, 0) КАК Параметр |ИЗ | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления |ГДЕ | ДополнительныеНачисления.ПериодРегистрации = &ПериодРегистрации | И ДополнительныеНачисления.Регистратор = &Регистратор"; Запрос.УстановитьПараметр("Регистратор", Регистратор); Запрос.УстановитьПараметр("ПериодРегистрации", Регистратор.ПериодРегистрации); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Отбор = Новый Структура("НомерСтроки"); Для каждого Запись Из НаборЗаписейДоп Цикл Отбор.НомерСтроки = Запись.НомерСтроки; Если Выборка.НайтиСледующий(Отбор) Тогда Запись.Результат = Выборка.Параметр; КонецЕсли; ////////////////// Выборка.Сбросить(); ////////////////// КонецЦикла; ////////////////////////////////////// НаборЗаписейДоп.Записать(Истина, Истина); ////////////////////////////////////// КонецЕсли; ////////////////////////////////////////// ////////////////////////////////// ЕстьШтраф = Таблица.НайтиСтроки(Новый Структура("ВидРасчета", ПланыВидовРасчета.ОсновныеНачисления.Штраф)); Если ЕстьШтраф.Количество() > 0 Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ОсновныеНачисленияДанныеГрафика.ВидРасчета, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.Параметр, 0) КАК Параметр, | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК Факт, | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | Регистратор = &Регистратор | И ПериодРегистрации = &ПериодРегистрации) КАК ОсновныеНачисленияДанныеГрафика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления( | &Массив, | &Массив, | , | Регистратор = &Регистратор | И ПериодРегистрации = &ПериодРегистрации) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления( | &Массив, | &Массив, | , | Регистратор = &Регистратор | И ПериодРегистрации = &ПериодРегистрации) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки"; ///////////////////////////////////// Массив = Новый Массив; Массив.Добавить("Подразделение"); Массив.Добавить("Сотрудник"); ///////////////////////////////////// Запрос.УстановитьПараметр("Массив", Массив); Запрос.УстановитьПараметр("Регистратор", Регистратор); Запрос.УстановитьПараметр("ПериодРегистрации", Регистратор.ПериодРегистрации); ////////////////////////////////////////////////////////////////////////////// РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Отбор = Новый Структура("НомерСтроки"); Для каждого Запись Из НаборЗаписей Цикл Отбор.НомерСтроки = Запись.НомерСтроки; Если Выборка.НайтиСледующий(Отбор) Тогда Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Штраф Тогда Запись.Результат = - Выборка.РезультатБаза * Выборка.Факт * Выборка.Параметр / 100; КонецЕсли; КонецЕсли; ////////////////// Выборка.Сбросить(); ////////////////// КонецЦикла; ////////////////////////////////////// НаборЗаписей.Записать(Истина, Истина); ////////////////////////////////////// КонецЕсли; //////////////////////////////////////////// КонецПроцедуры // РассчитатьНачисления() //ДокНачЗП Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) ПериодРегистрации = НачалоМесяца(ПериодРегистрации); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) /////////////////////////////////////////////////////// Движения.ОсновныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Записывать = Истина; /////////////////////////////////////////////////////// Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачислениеЗарплатыОсновныеНачисления.Ссылка, | НачислениеЗарплатыОсновныеНачисления.НомерСтроки, | НачислениеЗарплатыОсновныеНачисления.Подразделение, | НачислениеЗарплатыОсновныеНачисления.Сотрудник, | НачислениеЗарплатыОсновныеНачисления.ВидРасчета, | НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало, | НачислениеЗарплатыОсновныеНачисления.ДатаОкончания КАК ПериодДействияКонец, | НачислениеЗарплатыОсновныеНачисления.График, | ВЫБОР | КОГДА НачислениеЗарплатыОсновныеНачисления.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад) | ТОГДА ЕСТЬNULL(РазмерыСтавок.Ставка, 0) | ИНАЧЕ ЕСТЬNULL(НачислениеЗарплатыОсновныеНачисления.Параметр, 0) | КОНЕЦ КАК Параметр |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РазмерыСтавок КАК РазмерыСтавок | ПО (ИСТИНА) |ГДЕ | НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка | И НачислениеЗарплатыОсновныеНачисления.Сотрудник.Стаж МЕЖДУ РазмерыСтавок.ЗначениеС И РазмерыСтавок.ЗначениеПо |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | НачислениеЗарплатыДополнительныеНачисления.Ссылка, | НачислениеЗарплатыДополнительныеНачисления.НомерСтроки, | НачислениеЗарплатыДополнительныеНачисления.Подразделение, | НачислениеЗарплатыДополнительныеНачисления.Сотрудник, | НачислениеЗарплатыДополнительныеНачисления.ВидРасчета, | ЕСТЬNULL(НачислениеЗарплатыДополнительныеНачисления.Параметр, 0) КАК Параметр |ИЗ | Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления |ГДЕ | НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); РезультатЗапроса = Запрос.ВыполнитьПакет(); Если Не РезультатЗапроса[0].Пустой() Тогда Выборка = РезультатЗапроса[0].Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.ПериодРегистрации = ПериодРегистрации; ЗаполнитьЗначенияСвойств(Движение, Выборка); Движение.ПериодДействияКонец = КонецДня(Выборка.ПериодДействияКонец); Если Выборка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Штраф Тогда Движение.БазовыйПериодНачало = ПериодРегистрации; Движение.БазовыйПериодКонец = КонецМесяца(ПериодРегистрации); КонецЕсли; КонецЦикла; КонецЕсли; ////////////////////////////// Если Не РезультатЗапроса[1].Пустой() Тогда Выборка = РезультатЗапроса[1].Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ДополнительныеНачисления.Добавить(); Движение.ПериодРегистрации = ПериодРегистрации; ЗаполнитьЗначенияСвойств(Движение, Выборка); КонецЦикла; КонецЕсли; ///////////////////////////// Движения.Записать(); //////////////////////////////////// Расчет.РассчитатьНачисления(Ссылка); ///////////////////////////////////////////// Движения.ВыплатаЗарплаты.Записывать = Истина; ///////////////////////////////////////////// Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисления.Подразделение, | ОсновныеНачисления.Сотрудник, | СУММА(ОсновныеНачисления.Результат) КАК Результат |ПОМЕСТИТЬ ВТ_ОсновныеНачисления |ИЗ | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления |ГДЕ | ОсновныеНачисления.ПериодРегистрации = &ПериодРегистрации | И ОсновныеНачисления.Регистратор = &Регистратор | |СГРУППИРОВАТЬ ПО | ОсновныеНачисления.Подразделение, | ОсновныеНачисления.Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДополнительныеНачисления.Подразделение, | ДополнительныеНачисления.Сотрудник, | СУММА(ДополнительныеНачисления.Результат) КАК Результат |ПОМЕСТИТЬ ВТ_ДополнительныеНачисления |ИЗ | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления |ГДЕ | ДополнительныеНачисления.ПериодРегистрации = &ПериодРегистрации | И ДополнительныеНачисления.Регистратор = &Регистратор | |СГРУППИРОВАТЬ ПО | ДополнительныеНачисления.Подразделение, | ДополнительныеНачисления.Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЕСТЬNULL(ВТ_ОсновныеНачисления.Подразделение, ВТ_ДополнительныеНачисления.Подразделение) КАК Подразделение, | ЕСТЬNULL(ВТ_ОсновныеНачисления.Сотрудник, ВТ_ДополнительныеНачисления.Сотрудник) КАК Сотрудник, | ЕСТЬNULL(ВТ_ОсновныеНачисления.Результат, 0) + ЕСТЬNULL(ВТ_ДополнительныеНачисления.Результат, 0) КАК Сумма |ИЗ | ВТ_ОсновныеНачисления КАК ВТ_ОсновныеНачисления | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДополнительныеНачисления КАК ВТ_ДополнительныеНачисления | ПО ВТ_ОсновныеНачисления.Подразделение = ВТ_ДополнительныеНачисления.Подразделение | И ВТ_ОсновныеНачисления.Сотрудник = ВТ_ДополнительныеНачисления.Сотрудник"; Запрос.УстановитьПараметр("Регистратор", Ссылка); Запрос.УстановитьПараметр("ПериодРегистрации", ПериодРегистрации); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ВыплатаЗарплаты.ДобавитьПриход(); Движение.Период = ПериодРегистрации; Движение.Подразделение = Выборка.Подразделение; Движение.Сотрудник = Выборка.Сотрудник; Движение.Сумма = Выборка.Сумма; КонецЦикла; ////////////////////////////////////////// КонецПроцедуры //Док ВыплатаЗарплаты (Подразделение, Аванс(булево)) тч Зарплата (Сотрудник,Сумма) //Форма док &НаКлиенте Процедура Заполнить(Команда) ЗаполнитьТаблицу(); КонецПроцедуры &НаСервере Процедура ЗаполнитьТаблицу() Если Объект.Аванс Тогда /////////////////////////// Объект.Зарплата.Очистить(); /////////////////////////// Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СведенияОСотрудникахСрезПоследних.Сотрудник |ИЗ | РегистрСведений.СведенияОСотрудниках.СрезПоследних(&Дата, Подразделение = &Подразделение) КАК СведенияОСотрудникахСрезПоследних"; Запрос.УстановитьПараметр("Дата", Объект.Дата); Запрос.УстановитьПараметр("Подразделение", Объект.Подразделение); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Строка = Объект.Зарплата.Добавить(); Строка.Сотрудник = Выборка.Сотрудник; КонецЦикла; Иначе ////////////////////////////// Объект.Зарплата.Очистить(); ////////////////////////////// Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВыплатаЗарплатыОбороты.Сотрудник, | ЕСТЬNULL(ВыплатаЗарплатыОбороты.СуммаОборот, 0) КАК Сумма |ИЗ | РегистрНакопления.ВыплатаЗарплаты.Обороты(&НачалоПериода, &КонецПериода, , Подразделение = &Подразделение) КАК ВыплатаЗарплатыОбороты"; Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Объект.Дата)); Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Объект.Дата)); Запрос.УстановитьПараметр("Подразделение", Объект.Подразделение); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Строка = Объект.Зарплата.Добавить(); Строка.Сотрудник = Выборка.Сотрудник; Строка.Сумма = Выборка.Сумма; КонецЦикла; КонецЕсли; КонецПроцедуры //Команда Печать &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) //{{_КОНСТРУКТОР_ПЕЧАТИ(Печать) ТабДок = Новый ТабличныйДокумент; Печать(ТабДок, ПараметрКоманды); ТабДок.ОтображатьСетку = Ложь; ТабДок.Защита = Ложь; ТабДок.ТолькоПросмотр = Ложь; ТабДок.ОтображатьЗаголовки = Ложь; ТабДок.Показать(); //}} КонецПроцедуры &НаСервере Процедура Печать(ТабДок, ПараметрКоманды) Документы.ВыплатаЗарплаты.Печать(ТабДок, ПараметрКоманды); КонецПроцедуры //МодульОбдъекта Процедура ОбработкаПроведения(Отказ, Режим) Движения.ВыплатаЗарплаты.Записывать = Истина; Для Каждого ТекСтрокаЗарплата Из Зарплата Цикл Движение = Движения.ВыплатаЗарплаты.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Подразделение = Подразделение; Движение.Сотрудник = ТекСтрокаЗарплата.Сотрудник; Движение.Сумма = ТекСтрокаЗарплата.Сумма; КонецЦикла; КонецПроцедуры //Модуль менеджера Процедура Печать(ТабДок, Ссылка) Экспорт Макет = Документы.ВыплатаЗарплаты.ПолучитьМакет("Печать"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеНачисления.Сотрудник, | ОсновныеНачисления.ВидРасчета, | ЕСТЬNULL(ОсновныеНачисления.Результат, 0) КАК Сумма |ПОМЕСТИТЬ ВТ_Начислено |ИЗ | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления |ГДЕ | ОсновныеНачисления.ПериодРегистрации = &НачалоПериода | И ОсновныеНачисления.Подразделение = &Подразделение | И ОсновныеНачисления.ВидРасчета <> ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Штраф) | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ДополнительныеНачисления.Сотрудник, | ДополнительныеНачисления.ВидРасчета, | ЕСТЬNULL(ДополнительныеНачисления.Результат, 0) |ИЗ | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления |ГДЕ | ДополнительныеНачисления.ПериодРегистрации = &НачалоПериода | И ДополнительныеНачисления.Подразделение = &Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВыплатаЗарплатыЗарплата.Сотрудник, | ""Выплачено"" КАК ВидРасчета, | ВыплатаЗарплатыЗарплата.Сумма |ПОМЕСТИТЬ ВТ_Выплачено |ИЗ | Документ.ВыплатаЗарплаты.Зарплата КАК ВыплатаЗарплатыЗарплата |ГДЕ | ВыплатаЗарплатыЗарплата.Ссылка = &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВыплатаЗарплатыОбороты.Сотрудник, | ""АВАНС"" КАК ВидРасчета, | ВыплатаЗарплатыОбороты.СуммаРасход КАК Аванс |ПОМЕСТИТЬ ВТ_Аванс |ИЗ | РегистрНакопления.ВыплатаЗарплаты.Обороты(&НачалоПериода, &КонецПериода, Запись, Подразделение = &Подразделение) КАК ВыплатаЗарплатыОбороты |ГДЕ | ВыплатаЗарплатыОбороты.Регистратор <> &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОсновныеНачисления.Сотрудник, | ОсновныеНачисления.ВидРасчета, | -ОсновныеНачисления.Результат КАК Штраф |ПОМЕСТИТЬ ВТ_Штраф |ИЗ | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления |ГДЕ | ОсновныеНачисления.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Штраф) | И ОсновныеНачисления.ПериодРегистрации = &НачалоПериода | И ОсновныеНачисления.Подразделение = &Подразделение |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_Начислено.Сотрудник КАК Сотрудник, | ВТ_Начислено.ВидРасчета КАК ВидРасчета, | 0 КАК НачальноеСальдо, | 0 КАК Аванс, | 0 КАК Штраф, | ВТ_Начислено.Сумма КАК Начислено, | 0 КАК КВыплате |ИЗ | ВТ_Начислено КАК ВТ_Начислено | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВТ_Выплачено.Сотрудник, | ВТ_Выплачено.ВидРасчета, | 0, | 0, | 0, | 0, | ВТ_Выплачено.Сумма |ИЗ | ВТ_Выплачено КАК ВТ_Выплачено | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВыплатаЗарплатыОстатки.Сотрудник, | ""Начальное сальдо"", | ВыплатаЗарплатыОстатки.СуммаОстаток, | 0, | 0, | 0, | 0 |ИЗ | РегистрНакопления.ВыплатаЗарплаты.Остатки(&НачалоПериода, Подразделение = &Подразделение) КАК ВыплатаЗарплатыОстатки | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВТ_Аванс.Сотрудник, | ВТ_Аванс.ВидРасчета, | 0, | ВТ_Аванс.Аванс, | 0, | 0, | 0 |ИЗ | ВТ_Аванс КАК ВТ_Аванс | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВТ_Штраф.Сотрудник, | ВТ_Штраф.ВидРасчета, | 0, | 0, | ВТ_Штраф.Штраф, | 0, | 0 |ИЗ | ВТ_Штраф КАК ВТ_Штраф |ИТОГИ | СУММА(НачальноеСальдо), | СУММА(Аванс), | СУММА(Штраф), | СУММА(Начислено), | СУММА(КВыплате) |ПО | ОБЩИЕ, | Сотрудник"; Запрос.Параметры.Вставить("Ссылка", Ссылка[0].Ссылка); Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Ссылка[0].Дата)); Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Ссылка[0].Дата)); Запрос.УстановитьПараметр("Подразделение", Ссылка[0].Подразделение); ВыборкаИтог = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); //////////////////////////////////////////////////// Шапка = Макет.ПолучитьОбласть("Шапка"); ОбластьЗарплатаШапка = Макет.ПолучитьОбласть("ЗарплатаШапка"); ОбластьЗарплатаГруппа = Макет.ПолучитьОбласть("ЗарплатаГруппа"); ОбластьЗарплата = Макет.ПолучитьОбласть("Зарплата"); ОбластьИтого = Макет.ПолучитьОбласть("Итого"); ТабДок.Очистить(); ///////////////////////////////////// Шапка.Параметры.Месяц = Формат(НачалоМесяца(Ссылка[0].Дата), "ДФ=MMMM"); Шапка.Параметры.Подразделение = Ссылка[0].Подразделение; ТабДок.Вывести(Шапка); ТабДок.Вывести(ОбластьЗарплатаШапка); ///////////////////////////////////// Пока ВыборкаИтог.Следующий() Цикл ВыборкаГруппа = ВыборкаИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаГруппа.Следующий() Цикл ОбластьЗарплатаГруппа.Параметры.Заполнить(ВыборкаГруппа); ТабДок.Вывести(ОбластьЗарплатаГруппа); Выборка = ВыборкаГруппа.Выбрать(); Пока Выборка.Следующий() Цикл ОбластьЗарплата.Параметры.Заполнить(Выборка); ОбластьЗарплата.Параметры.Сотрудник = ""; ТабДок.Вывести(ОбластьЗарплата); КонецЦикла; КонецЦикла; ОбластьИтого.Параметры.Заполнить(ВыборкаИтог); ТабДок.Вывести(ОбластьИтого); КонецЦикла; КонецПроцедуры //ЗаполнениеГрафика Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни,График) Экспорт Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); Набор.Отбор.График.Использование = Истина; Набор.Отбор.График.Значение = График; Набор.Прочитать(); ЧислоСекундВСутках = 86400; Дат = ДатаНачала; Для к = 0 По Набор.Количество()-1 Цикл Запись = Набор[к]; Если Запись.Дата < ДатаНачала Тогда Продолжить; ИначеЕсли Запись.Дата =Дат Тогда Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; Иначе Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл НоваяЗапись = Набор.Добавить(); НоваяЗапись.Дата = Дат; НоваяЗапись.График = График; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда НоваяЗапись.Значение = 0; Иначе НоваяЗапись.Значение = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Если Запись.Дата > ДатаОкончания Тогда Прервать; Иначе Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 1; КонецЕсли; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЕсли; КонецЦикла; Набор.Записать(); Пока Дат <= ДатаОкончания Цикл Запись = Набор.Добавить(); Запись.Дата = Дат; Запись.График = График; Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда Запись.Значение = 0; Иначе Запись.Значение = 1; КонецЕсли; Дат = Дат + ЧислоСекундВСутках; КонецЦикла; Набор.Записать(); КонецПроцедуры //ПВР ОН (Оклад,Штраф), ДН (Компенсация) , У (Штраф) //РС ГрафикиРаботы (Дата,График,Значенине) //РС СведенияОСотрудниках (Подразделение,Сотрудник,Оклад) //РС РазмерыСтавок (ЗначениеС,ЗначениеПо,Ставка) //РегОСт ВыплатаЗарплаты (Сотрудник,Подразделение,Сумма) //РР ОН (Сотрудник,Подразделение,Результат,ГрафикРАботы,Параметр) //ДН (Сотрудник,Подразделение,Результат, ,Параметр)