Автор Тема: Билет 1. Спец по платформе V8  (Прочитано 146775 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

letyurij

  • Пользователь
  • **
  • Сообщений: 87
Re: Билет 1. Спец по платформе V8
« Ответ #1020 : Август 19, 2019, 12:07:41 pm »

1. Набор записей также формируем запросом, как и у меня
2. Записываем этот набор записей. В вашем варианте этот пункт не написан, это не обязательное действие, чтобы обращаться к виртуальным таблицам регистра? или это входит в пункт создаем набор записей?
3. Выполняем расчет в общем модуле и заполняем табличные части документы
4. Очищаем движения
5. Возвращаем полученный результат на форму

Наверное проще кусок кода выложить ...
Как нетрудно заметить по коду, движения были сделаны конструктором и скопированы из Обработки проведения, т.е. написание кода руками — минимально.
&НаСервере
Процедура РассчитатьНаСервере()

ТекДокумент = РеквизитФормыВЗначение("Объект");
Движения = ТекДокумент.Движения;

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

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

ТекДокумент.Записать();
ЗначениеВРеквизитФормы(ТекДокумент, "Объект");

РаботаСДанными.Расчет(ТекДокумент.Ссылка, Движения);

Объект.ОсновныеНачисления.Загрузить(Движения.ОсновныеНачисления.Выгрузить());
Объект.ДополнительныеНачисления.Загрузить(Движения.ДополнительныеНачисления.Выгрузить());

Движения.ОсновныеНачисления.Очистить();
Движения.ДополнительныеНачисления.Очистить();

Движения.ОсновныеНачисления.Записать();
Движения.ДополнительныеНачисления.Записать();

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

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

Общий модуль
Процедура Расчет(Ссылка, Движения) Экспорт

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

Запрос.УстановитьПараметр("Нач", НачалоМесяца(Ссылка.Дата));
Запрос.УстановитьПараметр("Оклад", ПланыВидовРасчета.ОсновныеНачисления.Оклад);
Запрос.УстановитьПараметр("Ссылка", Ссылка);

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

ВыборкаОклад = РезультатЗапроса.Выбрать();

Для каждого СтрНабора Из Движения.ОсновныеНачисления Цикл

Если СтрНабора.ВидРасчета <> ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда
Продолжить;
КонецЕсли;

ВыборкаОклад.Сбросить();
ВыборкаОклад.НайтиСледующий(СтрНабора.НомерСтроки, "НомерСтроки");
СтрНабора.Результат = ?(ВыборкаОклад.Норма = 0, 0, ВыборкаОклад.Размер / ВыборкаОклад.Норма * ВыборкаОклад.Факт);
СтрНабора.Размер = ВыборкаОклад.Размер;
    СтрНабора.Факт = ВыборкаОклад.Факт;

КонецЦикла;

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

//Расчет по ПРЕМИИ

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

Измерение = Новый Массив;
Измерение.Добавить("Сотрудник");
Запрос.УстановитьПараметр("Измерение", Измерение);
Запрос.УстановитьПараметр("Премия", ПланыВидовРасчета.ДополнительныеНачисления.Премия);
Запрос.УстановитьПараметр("Ссылка", Ссылка);

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

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

Для каждого СтрНабора Из Движения.ДополнительныеНачисления Цикл

Если СтрНабора.ВидРасчета <> ПланыВидовРасчета.ДополнительныеНачисления.Премия Тогда
Продолжить;
КонецЕсли;

ВыборкаПремия.Сбросить();
ВыборкаПремия.НайтиСледующий(СтрНабора.НомерСтроки, "НомерСтроки");

СтрНабора.Результат = ВыборкаПремия.РезультатБаза * ВыборкаПремия.Процент / 100;
СтрНабора.Процент = ВыборкаПремия.Процент;
    СтрНабора.Стаж = ВыборкаПремия.Стаж;
СтрНабора.Размер = ВыборкаПремия.РезультатБаза;

КонецЦикла;

Движения.ДополнительныеНачисления.Записать();


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

Xamele0n

  • Пользователь
  • **
  • Сообщений: 11
  • ФИО: Кирилл
Re: Билет 1. Спец по платформе V8
« Ответ #1021 : Август 19, 2019, 01:36:37 pm »
Спасибо за приведенный пример, так реально проще и быстрее.


letyurij

  • Пользователь
  • **
  • Сообщений: 87
Re: Билет 1. Спец по платформе V8
« Ответ #1022 : Август 19, 2019, 01:46:00 pm »
Ещё рекомендую обратить внимание на такой нюанс
Особенности функции языка запросов РАЗНОСТЬДАТ https://its.1c.ru/db/metod8dev#content:2666:hdoc

SpiRUS

  • Новичок
  • *
  • Сообщений: 6
Re: Билет 1. Спец по платформе V8
« Ответ #1023 : Август 26, 2019, 01:45:19 pm »
Здравствуйте. Если у кого будет время посмотрите пожалуйста

Михаил Проходцев

  • Проверенный
  • ***
  • Сообщений: 218
Re: Билет 1. Спец по платформе V8
« Ответ #1024 : Август 27, 2019, 01:25:22 am »
Здравствуйте. Если у кого будет время посмотрите пожалуйста

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

Из того, что всё-таки заметил:
1) Приходная накладная - не нужно записывать пустой набор записей. Пустой набор нужно записывать лишь при старой методики контроля остатков для того, чтобы при получении данных из таблицы остатков не учесть движения текущего документа. Здесь это точно лишняя записи в базу данных.
2) Расходная накладная
При списании с регистра Партии допускается писать на экзамене вместо конструкции:
Движение.Сумма = ?(Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток,
    ВыборкаДетальныеЗаписи.СуммаОстаток, 
    ВыборкаДетальныеЗаписи.Суммаостаток / ВыборкаДетальныеЗаписи.КоличествоОстаток * Движение.Количество);
конструкцию:
Движение.Сумма = Движение.Количество / ВыборкаДетальныеЗаписи.КоличествоОстаток * ВыборкаДетальныеЗаписи.СуммаостатокРезультат будет тот же, код меньше. Но это на Ваше усмотрение.
3) Смущает пустой модуль объекта ПередЗаписью. Добавили бы заполнение Периода датой документа и управлению Активностью при установки пометки удаления. Но опять же последние замечания от экзаменаторов по этому поводу были довольно давно, возможно сейчас на это при проверке закрывают глаза.
4) Расчетная часть. Вы же рассчитываете значение стажа при вычислении суммы по Премии, почему бы не добавить реквизит в регистр расчета со стажем и в него сразу не помещать эту информацию. Необходимо стремиться к тому, чтобы отчет максимально быстро формировался, а у Вас будет для каждого сотрудника снова рассчитываться стаж.
5) Условие о том, что все работают по пятидневке, однако в решении необходимо предусмотреть возможность работы по различным графикам подразумевает не только измерение График в регистре графиков работы. Необходимо и в документ добавить соответствующий реквизит и в регистр. Иначе непонятно как в Вашем решении можно реализовать работу не по пятидневке.
5) Регистр адресации у Вас заполнен неверно, не вижу, чтобы у Вас были занесены все кладовщики, все бухгалтеры в регистр адресации.
6) Реквизиты адресации в задаче не связаны с соответствующими измерениями регистра адресации.
7) На рабочий стол нужно вынести форму списка невыполненных задач текущего пользователя, а не просто форму списка задач.

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

SpiRUS

  • Новичок
  • *
  • Сообщений: 6
Re: Билет 1. Спец по платформе V8
« Ответ #1025 : Август 27, 2019, 09:10:06 am »
Здравствуйте. Если у кого будет время посмотрите пожалуйста

Пробежал глазами по решению.


Большое спасибо за замечания) Все исправлю. БП первый раз делал, так что понакосячил

Prog3rrr

  • Новичок
  • *
  • Сообщений: 2
  • ФИО: Пузыревский Сергей Кириллович
Re: Билет 1. Спец по платформе V8
« Ответ #1026 : Сентябрь 03, 2019, 03:51:50 am »
Ребята, здравствуйте. Сделал ПР из 1ого билета, покритикуйте. Заранее благодарен.

Amorality

  • Новичок
  • *
  • Сообщений: 1
Re: Билет 1. Спец по платформе V8
« Ответ #1027 : Сентябрь 04, 2019, 06:04:41 am »
По сложившейся традиции попрошу оценить свое решение, буду рад любым замечаниям и обнаруженным ошибкам, заранее спасибо :)

Рамзис

  • Новичок
  • *
  • Сообщений: 6
Re: Билет 1. Спец по платформе V8
« Ответ #1028 : Сентябрь 12, 2019, 12:10:47 pm »
Если списание товаров должно быть организовано по партиям, это значит что нужен отдельный регистр накопления ПартииТоваров или можно обойтись одним ОстаткиТоваров, в котором будет и ресурс сумма и измерение партия, объясните пожалуйста данный вопрос

DanJer74

  • Пользователь
  • **
  • Сообщений: 24
  • ФИО: Иванов Даниил Александрович
Re: Билет 1. Спец по платформе V8
« Ответ #1029 : Сентябрь 12, 2019, 01:01:47 pm »
Если списание товаров должно быть организовано по партиям, это значит что нужен отдельный регистр накопления ПартииТоваров или можно обойтись одним ОстаткиТоваров, в котором будет и ресурс сумма и измерение партия, объясните пожалуйста данный вопрос
Здесь нужно 2 регистра накопления, потому что себестоимость надо расчитывать по всей номенклатуре. Применять надо для записи в регистр остатков старую методику проведения, то есть сначала записать, а потом проверить, не ушли ли мы в минус.

Рамзис

  • Новичок
  • *
  • Сообщений: 6
Re: Билет 1. Спец по платформе V8
« Ответ #1030 : Сентябрь 12, 2019, 02:50:34 pm »
В обработке проведения расходной накладной в первом запросе создается временная таблица, чтобы использовать ее в следующем запросе
Процедура ОбработкаПроведения(Отказ, Режим)
   Запрос = Новый Запрос;
   Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
      |   СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
      |   СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма
      |ПОМЕСТИТЬ ТабЧасть
      |ИЗ
      |   Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
      |ГДЕ
      |   РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
      |   И РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры = &ВидНоменклатуры
      |
      |СГРУППИРОВАТЬ ПО
      |   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура
      |
      |ИНДЕКСИРОВАТЬ ПО
      |   Номенклатура
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |   ТабЧасть.Номенклатура КАК Номенклатура,
      |   ТабЧасть.Количество КАК Количество,
      |   ТабЧасть.Сумма КАК Сумма
      |ИЗ
      |   ТабЧасть КАК ТабЧасть";
   
   Запрос.УстановитьПараметр("ВидНоменклатуры", Перечисления.ВидыНоменклатуры.Товар);
   Запрос.УстановитьПараметр("Ссылка", Ссылка);
   
   РезультатЗапроса = Запрос.Выполнить();
   
   ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
   
   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
      // регистр ОстаткиНоменклатуры Расход
      Движение = Движения.ОстаткиНоменклатуры.Добавить();
      Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
      Движение.Период = Дата;
      Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
      Движение.Склад = Склад;
      Движение.Количество = ВыборкаДетальныеЗаписи.Количество;
   КонецЦикла;
   
   Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
   Движения.ОстаткиНоменклатуры.Записать();
КонецПроцедуры

В следующем запросе у меня не получается использовать временную таблицу, пишет не найдена таблица ТабЧасть
Делаю следующее:
Запускаю конструктор запроса с обработкой результата
Выбираю виртуальную таблицу остатки
Нажимаю параметры виртуальной таблицы
Нажимаю Условие
Пишу: Номенклатура В (   )
Запускаю конструктор запроса, там создаю описание временной таблицы и пишу имя таблицы ТабЧасть, добавляю поле Номенклатура
Нажимаю ОК и еще раз ОК
Он пишет не найдена таблица ТабЧасть

Делаю как в примере, там это работает, у меня нет, не знаю что делать с этим


DanJer74

  • Пользователь
  • **
  • Сообщений: 24
  • ФИО: Иванов Даниил Александрович
Re: Билет 1. Спец по платформе V8
« Ответ #1031 : Сентябрь 12, 2019, 03:12:37 pm »
Там строка есть наверное, Запрос = новый Запрос; если делаете конструктором. Надо ее удалить. А вообще если есть сложности с менеджером - можно без него - Белоусов так сказал.

Рамзис

  • Новичок
  • *
  • Сообщений: 6
Re: Билет 1. Спец по платформе V8
« Ответ #1032 : Сентябрь 12, 2019, 03:16:56 pm »
Да в следующем запросе не должно быть строки Запрос = Новый Запрос, два часа потратил на этот вопрос, спасибо

DanJer74

  • Пользователь
  • **
  • Сообщений: 24
  • ФИО: Иванов Даниил Александрович
Re: Билет 1. Спец по платформе V8
« Ответ #1033 : Сентябрь 12, 2019, 03:45:21 pm »
Я делал так: создавал запрос, выбирал документ, переименовывал его как нужно, доделывал запрос а потом после выхода из конструктора удалял строку Запрос = Новый Запрос.

letyurij

  • Пользователь
  • **
  • Сообщений: 87
Re: Билет 1. Спец по платформе V8
« Ответ #1034 : Сентябрь 12, 2019, 03:54:33 pm »
На экзамене МВТ использовать НЕ НАДО. Плюсов вам за него не добавят, а время потратите. Используйте конструктор и не заморачивайтесь.