понедельник, 22 июня 2015 г.

1c специалист. Решение задачи 2.38.


После первого прочтения задача показалась самой легкой из сборника. Но это прошло когда дошел до отчета и основного вопроса как организовать структуру  субконто  чтобы  не было обращения к регистратору через точку и данные регистров закрывались в ноль.
В итоге получилось следующее

Имя Количественный Субконто 1 Субконто 2 Субконто 3
Счета
Активы
Касса
Товары Истина  Номенклатура Склад ДатаПрибытия
ТоварыВПути Отправление Склад ДатаПрибытия

Отправление тип = "ДокументСсылка.Отправление".
ДатаПрибытия тип = Дата (только обороты в обоих счетах)

Можно обойтись итогов по счету товары в пути, поэтому для этого счета все субконто будут с признаком "только обороты".

Документ "Отправление".




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

Документ "Прибытие".


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

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

Отчет"Задержки".


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




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