воскресенье, 28 июня 2015 г.

Результаты сдачи экзамена 1с специалист.

Наконец-то прошел этот день X и теперь на душе как-то полегче.
Главное экзамен сдал. (иначе я бы не писал эту заметку) ).
Но обо всем по порядку:
Оценка 3 меня не сильно расстроила (ведь в сертификате она не упоминается) немножко расстроили допущенные ошибки. Обо всех их я сейчас упомяну:

  1.  В процессе прорешивания задач по ОУ и БУ я ж всегда начинал обработку проведения с этого
Движения.НазваниеРегистра.Записывать = Истина;
Движения.НазваниеРегистра.Очистить();
Движения.НазваниеРегистра.Записать();

Но тут меня точно бес попутал, почему-то я испугался замечания что одна из команд лишняя и решил убрать последнюю (Записать()). Что привело естественно к серьезной ошибке при оперативном проведении. Ведь  старые движения документа еще остаются до команды Записать().
      2.   "Проблема копеек".  Тут также нет оправданий. Нужно было хотя бы добавить проверку на типа
Если СписываемоеКоличество = ОстатокКол Тогда
СписываемаяСумма = ОстатокСум
КонецЕсли;

   3.  Вот это было для меня новинка. В задаче требовалось реализовать списание по FIFO. Я даже не подозревал кроющуюся здесь опасность. Сделал в запросе УПОРЯДОЧИТЬ ПАРТИЯ и все.
Оказывается это заблуждение. Нужно упорядочивать по полю МОМЕНТВРЕМЕНИ.
Запомните и не повторяйте моих ошибок.
Штирлиц еще никогда так не был близко к провалу, благо задача по расчетам и по УФ не вызвали замечаний.

Дам еще несколько советов.

  1. Приходите как минимум за полчаса до начала. За это время я можно нарисовать подсистемы, сделать заготовки общих модулей и т.д все что не зависит от условий задачи.
  2. В процессе подготовки попробуйте решать задачи с замером времени. Я этого не делал и времени мне нехватило. Оно просто таяло катастрофически, хотя я нигде не тупил просто неспеша набирал код и тестил. А вот мой сосед как начал строчить в темпе вальса что за 15 минут до конца попросился сдавать первым.
  3. Делайте шпаргалки. Можно было пользоваться книгами 1с и даже списывать со шпаргалок (не официально конечно)).
  4. Уделите должное внимание документу "Операция". Он должен при отмене проведения, менять активность, при копировании должны копироваться и движения и уберите период из ТЧ, заполните его тоже перед записью, таким образом Вы сразу возвыситесь в глазах преподавателя.
  5. Обязательно в задачах БУ используйте параметр массивсубконто. Передо мной сдавал паренек. Я так понял он в-принципе сделал отчет правильно, но не указал субконто и в итоге получил отчет работает неверно.
Вроде бы все. Всем удачи!






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

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


Сложное для понимания условие. Основная путаница в  том какую структуру регистра сведений "Графики работы" выбрать.
В условии говорится о сменах и о том что "Каждый охранник может работать в любую смену", значит можно так понимать что вчера охранник работал в смену 1, сегодня в смену 3, а завтра может в смену 2. Далеко не очевидно тогда как это увязывается с условием "Все сотрудники работают по графику работы, установленному для каждого охранника отдельно",  что намекает на то что измерение сотрудник должно быть в регистре и оно в свою очередь должно быть связано с измерением реквизита расчета.
Таким образом видится 2 варианта РС.


 

С практической точки зрения первый вариант слегка абсурден, ведь для каждого сотрудника придется заполнять график для каждой из смен и пятидневку для отпуска, это нормально если сотрудников больше 1000?.
Еще смены 2 и 3 имеют протяженность в 7 часов. В остальном ничего нового. Периодичность РР = "месяц", при формировании записей проконтролируем переход из одного месяца в другой  и при необходимость разобьем запись на 2.

ПВР "Основные начисления" (Тариф, Больничный). Больничный естественно вытесняет тариф а тариф является базовым для больничного.
ПВР "Дополнительные начисления". (Компенсация и переработка). Базовым ВР для переработки будет также тариф.

При расчете тарифа все стандартно.
Для расчета больничного заполним его базовый период равный прошлой неделе.
Для расчета компенсации добавим РС "Размеры компенсаций" с периодичность год, и единственным ресурсом "Размер". Заполним значение результата прямо в обработке проведения документа.
Для расчета переработки добавим константу "Недельная норма часов", в РР "основные начисления" добавим ресурс "Отработано часов". При расчете будем сравнивать значение базы по этому ресурсу со значением константы. Если случилась переработка, то часы пераработки умножим на 100.

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



понедельник, 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) КАК УправленческийОборотыДтКт




пятница, 19 июня 2015 г.

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

На мой взгляд единственная сложность этой задачи в ее простоте, как бы не парадоксально это не звучало. В условии задачи явно не сказано о том, что нужны документы "Перемещение" или "Сборка". Исходя из этого предполагаю что разработчик на свое усмотрение выбирает способ решения. В моем решении будет все максимально просто только 2 документа "Расходная накладная" для продажи и "Операция" для всего остального.

1) Добавляем недостающий справочник "Склады". Добавляем предопределенное  значение "Центральный склад". В справочник "Номенклатура" добавляем булевый реквизит "Это Компьютер".
2) ПВХ "Виды субконто". 

  • Заполняем типы значений характеристик и дополнительные значения характеристик. 
  • Согласно условия задачи заводим 2 предопределенных элемента "Номенклатура"  и "Cклады.
3) Дорабатываем план счетов. 
  • Добавляем признак учета субконто "количественный",
  •  на закладке "субконто" заполняем тип субконто и устанавливаем значение субконто=2.
  • Редактируем предопределенный счет "Товары". (признак учета и 2 субконто),  "материалы (признак учета и 1 субконто) и Прибыли убытки  (субконто "Номенклатура");
4) Добавляем регистр бухгалтерии "Управленческий".
  • Связываем его с планом счетов
  • Добавляем ресурсы (количество, сумма) ";
  • Выбираем регистраторы.
5) Не забываем о том, что в задачах бухгалтерского учета необходимо добавить документ,  с помощью которого можно добавлять записи в регистр вручную. Назовем его "Ручная операция".  укажем что он является регистратором нашего регистра. Запретим его проведение. Добавим форму и на форму вытащим реквизит Объект-движения-управленческий.
ВАЖНО!. Ранее я не учитывал следующий момент: Если сделать документ "Операция" не проведенным, то движения никуда не исчезнут, что не совсем корректно. Поэтому добавлен следующий код, который изменит признак активности.

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


6) Переходим к Расходной накладной.




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

Движения.Управленческий.Записывать = Истина;

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

Запрос.УстановитьПараметр("Ссылка", Ссылка);
ПакетРезультатов = Запрос.ВыполнитьПакет();

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

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

Блокировка.Заблокировать(); 


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

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

ПакетРезультатов = Запрос.ВыполнитьПакет();

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


Движение = Движения.Управленческий.Добавить();
Движение.Период = Дата;
Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели;
Движение.Сумма = Выборка.СумДок;


КонецЦикла;
КонецЕсли;

РезультатТовары = ПакетРезультатов[1];
Если Не РезультатТовары.Пустой() Тогда
Выборка = РезультатТовары.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ОстатокКол < Выборка.КолДок Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара "+ Выборка.Номенклатура + "имеется только "+ Выборка.ОстатокКол;
Сообщение.Сообщить();
Отказ = Истина;
Продолжить;
КонецЕсли;
Движение = Движения.Управленческий.Добавить();
Движение.Период = Дата;
Движение.СчетКт = ПланыСчетов.Управленческий.Материалы;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
Движение.КоличествоКт = Выборка.КолДок;
Движение.Сумма = Выборка.КолДок * (Выборка.ОстатокСум/Выборка.ОстатокКол);


Движение = Движения.Управленческий.Добавить();
Движение.Период = Дата;
Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели;
Движение.Сумма = Выборка.СумДок;

КонецЦикла;
КонецЕсли;


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



7) Отчеты
Отчет по остаткам не требует комментариев,  кроме того что в плане счетов у нас нет субконто "Склад" у счета "материалы", но по условию задачи материалы есть только на одном центральном складе, поэтому может решить вопрос объединением таблиц и у таблицы материалов через параметр установить склад равный предопределенному значению.


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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
&Центр,
УправленческийОстатки.Субконто1,
УправленческийОстатки.КоличествоОстаток,
УправленческийОстатки.СуммаОстаток
ИЗ

РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Материалы), , ) КАК УправленческийОстатки

Отчет о продажах построим на счете "ПрибылиУбытки"

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

СГРУППИРОВАТЬ ПО
УправленческийОбороты.Субконто1


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