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

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

kuzyara

  • Пользователь
  • **
  • Сообщений: 26
  • ФИО: дядя Коля
Re: Билет 1. Спец по платформе V8
« Ответ #210 : Октябрь 06, 2016, 05:22:34 pm »
1. В этой задаче обязателен запрос на выборку номенклатуры без услуг.
интересно, зачем тогда про них в условии говорится ;)
Обращение через точку в цикле - ошибка!
а если еще и понимать отличия объектной модели данных от табличной... ???
2. По совету коллег – не использовать метод "Сообщить("")"
ох уж эти вредные советы :D
плохо работает в Web интерфейсе
1с вообще плохо работает в веб-интерфейсе  ;D
Производительность моего решения показала лучший результат
только преподу этого не ляпни ???
Готов услышать критику и замечания.
комментарии повторяешь по два раза, по два раза :-X

Fundo0rin

  • Пользователь
  • **
  • Сообщений: 12
Re: Билет 1. Спец по платформе V8
« Ответ #211 : Октябрь 06, 2016, 05:45:00 pm »
плохо работает в Web интерфейсе
1с вообще плохо работает в веб-интерфейсе  ;D
Производительность моего решения показала лучший результат
только преподу этого не ляпни ???

1. В целом она неплохо справляется с Web интерфейсом для определенных задач. Только одно но, самая стабильная и функциональная 1с в Вебе получается при запуске в IE. (К примеру для работы(загрузки) файлов необходимо использовать только IE)

2. Как я понял из комментариев сдававших то главная их ошибка при сдаче, они не уверены в своей правоте потому что сделали "Как все", "Так нам на курсах говорили" и т.д. Здесь я конкретно взял два решения, и сделал замер производительности. И, пока что, я уверен что мое решение получилось более эффективным.



alex1248

  • Призрак форума
  • *****
  • Сообщений: 714
Re: Билет 1. Спец по платформе V8
« Ответ #212 : Октябрь 06, 2016, 06:04:59 pm »
И, пока что, я уверен что мое решение получилось более эффективным.
Поскольку сделано на основе моего решения, тоже прокомментирую. Увы, но новая методика в этой задаче получит -1 балл, почти наверняка. Уверенность нужна не в тех вопросах, по которым у экзаменаторов есть однозначное мнение (именно поэтому мне пришлось позже поменять своё отношение к этому пунктику).

По поводу Сообщить, даже не знаю, откуда оно в моем решении ). Видимо решение было выложено в начале подготовлено. Да, крайне нежелательно его использовать. Именно под несоответствие веб-интерфейсу и будет подведено, и штрафные баллы конкретно указаны за это. Так что только СообщениеПользователю.

freemaestro

  • Пользователь
  • **
  • Сообщений: 79
  • ФИО: Сергей А.
Re: Билет 1. Спец по платформе V8
« Ответ #213 : Октябрь 06, 2016, 11:32:02 pm »
И, пока что, я уверен что мое решение получилось более эффективным.
Поскольку сделано на основе моего решения, тоже прокомментирую. Увы, но новая методика в этой задаче получит -1 балл, почти наверняка. Уверенность нужна не в тех вопросах, по которым у экзаменаторов есть однозначное мнение (именно поэтому мне пришлось позже поменять своё отношение к этому пунктику).

По поводу Сообщить, даже не знаю, откуда оно в моем решении ). Видимо решение было выложено в начале подготовлено. Да, крайне нежелательно его использовать. Именно под несоответствие веб-интерфейсу и будет подведено, и штрафные баллы конкретно указаны за это. Так что только СообщениеПользователю.

Добрый день, alex1248 !

Поясните, пожалуйста, про -1 балл. За что?




alex1248

  • Призрак форума
  • *****
  • Сообщений: 714
Re: Билет 1. Спец по платформе V8
« Ответ #214 : Октябрь 07, 2016, 05:26:11 am »
Поясните, пожалуйста, про -1 балл. За что?
За "использование менее эффективной методики проведения документов".

kuzyara

  • Пользователь
  • **
  • Сообщений: 26
  • ФИО: дядя Коля
Re: Билет 1. Спец по платформе V8
« Ответ #215 : Октябрь 07, 2016, 07:18:58 am »
Читаю методику.
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Мало товара " + Выборка.НаименованиеПолное + " на складе - "+ Склад +" нужно еще " + (-Выборка.КоличествоОстаток);
Сообщение.Сообщить();
Без ключа данных эти три строки абсолютно идентичны методу:
Сообщить("Мало товара " + Выборка.НаименованиеПолное + " на складе - "+ Склад +" нужно еще " + (-Выборка.КоличествоОстаток));, а по сему использовать этот объект для такого сообщения бессмысленно, не?
« Последнее редактирование: Октябрь 07, 2016, 08:11:08 am от kuzyara »

kuzyara

  • Пользователь
  • **
  • Сообщений: 26
  • ФИО: дядя Коля
Re: Билет 1. Спец по платформе V8
« Ответ #216 : Октябрь 07, 2016, 11:24:30 am »
Код Alex1248:
Процедура ОбработкаПроведения(Отказ, Режим)
// ...

// регистр ОстаткиНоменклатуры Расход
Движения.ОстаткиНоменклатуры.Записывать = Истина;

// регистр Себестоимость Расход
Движения.Себестоимость.Записывать = Истина;

// регистр бухгалтерии
//Движения.РегистрБухгалтерии.Записывать = Истина;

Блокировка = Новый БлокировкаДанных;
ЭлБлокировки = Блокировка.Добавить("РегистрНакопления.Себестоимость");
ЭлБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");

ЭлБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
ЭлБлокировки.УстановитьЗначение("Склад", Склад);
Блокировка.Заблокировать();


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ остатки";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Момент", МоментВремени());

//Движения по регистрам накопления
Пакет = Запрос.ВыполнитьПакет();
Почему нет Движения.ОстаткиНоменклатуры.Записать() перед блокировкой, ведь тогда на момент запроса в итогах мешаются старые движения документа?

Fundo0rin

  • Пользователь
  • **
  • Сообщений: 12
Re: Билет 1. Спец по платформе V8
« Ответ #217 : Октябрь 07, 2016, 11:43:19 am »
Код Alex1248:
Процедура ОбработкаПроведения(Отказ, Режим)
// ...

// регистр ОстаткиНоменклатуры Расход
Движения.ОстаткиНоменклатуры.Записывать = Истина;

// регистр Себестоимость Расход
Движения.Себестоимость.Записывать = Истина;

// регистр бухгалтерии
//Движения.РегистрБухгалтерии.Записывать = Истина;

Блокировка = Новый БлокировкаДанных;
ЭлБлокировки = Блокировка.Добавить("РегистрНакопления.Себестоимость");
ЭлБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");

ЭлБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
ЭлБлокировки.УстановитьЗначение("Склад", Склад);
Блокировка.Заблокировать();


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ остатки";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Момент", МоментВремени());

//Движения по регистрам накопления
Пакет = Запрос.ВыполнитьПакет();
Почему нет Движения.ОстаткиНоменклатуры.Записать() перед блокировкой, ведь тогда на момент запроса в итогах мешаются старые движения документа?

Не обращайте внимания на код Алекса, он не эталонный, тем более он "устаревший". Я брал его решение просто для примера "Старого" метода что бы провести замер производительности.

erdem.badluev

  • Проверенный
  • ***
  • Сообщений: 139
Re: Билет 1. Спец по платформе V8
« Ответ #218 : Октябрь 11, 2016, 12:42:51 pm »
моё решение
Буду рад критике
 :D

Обновлено: http://forum.chistov.pro/index.php?topic=3638.msg48933#msg48933
« Последнее редактирование: Ноябрь 11, 2016, 05:16:50 am от erdem.badluev »

Fundo0rin

  • Пользователь
  • **
  • Сообщений: 12
Re: Билет 1. Спец по платформе V8
« Ответ #219 : Октябрь 11, 2016, 03:28:47 pm »
Все, на этом я собираюсь остановиться.

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

Результаты оказались менее впечатляющими   :-[ .

Производительность Старого метода:
Кол-во записей в документе: 3
Время выполнения: ~0.048 секунды.

Кол-во записей в документе: 1000
Время выполнения: ~1.2 секунды

Производительность Нового метода:
Кол-во записей в документе: 3
Время выполнения: ~0.040 секунды.

Кол-во записей в документе: 1000
Время выполнения: ~1.1 секунда

Т.е. "новый" метод работает на 10-20% быстрее чем "Старый".
Однако, хотел бы сделать акцент на следующем моменте (если я все правильно понимаю):
В новом методе, не блокируются записи в регистре Бухгалтерии и в Регистре с себестоимостью пока не пройдет проверка на остатки. А, между прочим, проверка на остатки занимает ~15% Времени проведения документа.
Т.е. Мало того что метод работает на 10-20% быстрее так еще на дополнительные 15% уменьшается время блокировки 2-х ключевых регистров системы.
А в случае отказа транзакции из-за отсутствия товара, эти регистры не блокируются вовсе.

Представляю на суд 2 модуля которые я сравнивал:

Пример "Нового" метода ОП/БУ Документ Расходник
Процедура ОбработкаПроведения(Отказ, РежимПроведения)

Метод = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Новый Граница(МоментВремени())).МетодСписания; // быстрее в 2 раза чем через запрос

Если ЗначениеЗаполнено(Метод) Тогда
Если Метод = Перечисления.МетодСписания.LIFO Тогда
Порядок = " Убыв";
Иначе
Порядок = "";
КонецЕсли;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Заполните Учетную политику!";
Сообщение.Сообщить();
Отказ = Истина;
Возврат;
КонецЕсли;

//- Получить учетную политику

//+ Получаем номенклатуру без услуг Делаем движения по отаткам

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

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

РезультатЗапроса1 = Запрос.ВыполнитьПакет();
СписатьОстатки = РезультатЗапроса1[1].Выбрать();

Движения.ОстаткиТоваров.Записывать = Истина;
Движения.ОстаткиТоваров.Очистить();

Пока СписатьОстатки.Следующий() Цикл
Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
Движение.Период = Дата;
Движение.Склад = Склад;
Движение.Номенклатура = СписатьОстатки.Номенклатура;
Движение.Количество = СписатьОстатки.Количество;
КонецЦикла;

Движения.ОстаткиТоваров.БлокироватьДляИзменения = Истина;
Движения.Записать();

//- Получаем номенклатуру без услуг Делаем движения по отаткам


//+ Проверяем отриц остатки

Запрос.Текст = "ВЫБРАТЬ
| Остатки.Номенклатура.НаименованиеПолное КАК НаименованиеПолное,
| Остатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(
| &ТочкаИтогов,
| Номенклатура В
| (ВЫБРАТЬ
| ДокТЧ.Номенклатура
| ИЗ
| ДокТЧ КАК ДокТЧ)
| И Склад = &Склад) КАК Остатки
|ГДЕ
| Остатки.КоличествоОстаток < 0
|";

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

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

Если НЕ РезультатЗапроса.Пустой() Тогда
Отказ = Истина;

Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Мало товара " + Выборка.НаименованиеПолное + " на складе - "+ Склад +" нужно еще " + (-Выборка.КоличествоОстаток);
Сообщение.Сообщить();
КонецЦикла; 
КонецЕсли;

Если Отказ Тогда
Возврат;
КонецЕсли;

//- Проверяем отриц остатки

//+ Блокировка Создаем движения в регистре партий

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

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


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

Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
Движения.СтоимостьТоваров.Очистить();
Движения.СтоимостьТоваров.БлокироватьДляИзменения = Истина;
движения.СтоимостьТоваров.Записать();

Движения.Основной.Очистить();
Движения.Основной.БлокироватьДляИзменения = Истина;
движения.Основной.Записать();
КонецЕсли;

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

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

Запрос.УстановитьПараметр("Момент", МоментВремени());

Движения.СтоимостьТоваров.Очистить();
Движения.Основной.Очистить();


РезультатЗапроса = Запрос.ВыполнитьПакет();
ВыборкаТовар = РезультатЗапроса[0].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаТовар.Следующий() Цикл

ОсталосьСписать = ВыборкаТовар.Количество;

ВыборкаПартия = ВыборкаТовар.Выбрать();
Пока ВыборкаПартия.Следующий() И ОсталосьСписать <> 0 Цикл

Списать = МИН(ОсталосьСписать, ВыборкаПартия.КоличествоОстаток);

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

ОсталосьСписать = ОсталосьСписать - Списать;
КонецЦикла;

КонецЦикла;

Движения.СтоимостьТоваров.Записывать = Истина;

//- Блокировка Создаем движения в регистре партий

//+ Движения по регистру бухгалтерии
Результат = РезультатЗапроса[1].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока Результат.Следующий() Цикл

Если Результат.КолДок > Результат.КолОст Тогда
Сообщить("Товара не хватает!");
Отказ = Истина;
Возврат;
КонецЕсли;

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

Пока Выборка.Следующий() И Остаток > 0 Цикл

Движение = Движения.Основной.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.СчетКт = ПланыСчетов.Управленческий.Товары;
Движение.СубконтоКт.Номенклатура = Выборка.Номенклатура;
Движение.СубконтоКт.СрокГодности = Выборка.Дата;
Движение.КоличествоКТ = мин(Остаток,Выборка.КолОст);
Движение.Период = Дата;
Движение.Сумма = ?(Выборка.КолОст =0,0, Движение.КоличествоКТ * Выборка.СумОст / Выборка.КолОст);

Остаток = Остаток - Движение.КоличествоКТ;
КонецЦикла;

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

КонецЦикла;

Движения.Основной.Записывать = Истина;

//- Движения по регистру бухгалтерии
КонецПроцедуры




Fundo0rin

  • Пользователь
  • **
  • Сообщений: 12
Re: Билет 1. Спец по платформе V8
« Ответ #220 : Октябрь 11, 2016, 03:29:05 pm »
Пример "Старого" метода ОП/БУ Документ Расходник
Процедура ОбработкаПроведения(Отказ, Режим)

Метод = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Новый Граница(МоментВремени())).Метод;

Если ЗначениеЗаполнено(Метод) Тогда
Если Метод = Перечисления.УчетнаяПолитика.ЛИФО Тогда
Порядок = " Убыв";
Иначе
Порядок = "";
КонецЕсли;
Иначе
Сообщить("Заполните метод списания!");
Отказ = Истина;
Возврат;
КонецЕсли;

Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Себестоимость.Записывать = Истина;
Движения.РегистрБухгалтерии.Записывать = Истина;

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

ЭлБлокировки = Блокировка.Добавить("РегистрНакопления.Себестоимость");
ЭлБлокировки.ИсточникДанных = СписокНомБезУсл;
ЭлБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");

ЭлБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлБлокировки.ИсточникДанных = СписокНомБезУсл;
ЭлБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
ЭлБлокировки.УстановитьЗначение("Склад", Склад);

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

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

Если Режим = РежимПроведенияДокумента.Оперативный Тогда
Движения.ОстаткиНоменклатуры.Очистить();
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
Движения.ОстаткиНоменклатуры.Записать();

Движения.Себестоимость.Очистить();
Движения.Себестоимость.БлокироватьДляИзменения = Истина;
Движения.Себестоимость.Записать();

Движения.РегистрБухгалтерии.Очистить();
Движения.РегистрБухгалтерии.БлокироватьДляИзменения = Истина;
Движения.РегистрБухгалтерии.Записать();
КонецЕсли;


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


ВидыСубконто = Новый Массив;
ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура);
ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Дата);

Запрос.УстановитьПараметр("Момент", МоментВремени());
Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто);

//Движения по регистрам накопления
Пакет = Запрос.ВыполнитьПакет();
Результат = Пакет[0].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока Результат.Следующий() Цикл

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

Пока Выборка.Следующий() И Остаток > 0 Цикл

Если Выборка.КолДок > Выборка.КолСклад Тогда
Сообщить("Товара не хывтает");
Отказ = Истина;
Возврат;
КонецЕсли;

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

//Себестоимость
Движение = Движения.Себестоимость.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Партия = Выборка.Партия;
Движение.Колво = мин(Выборка.КолОст,Остаток);
Движение.Себестоимость = ?(Выборка.КолОст = 0,0, Движение.Колво * Выборка.СумОст / Выборка.КолОст);

Остаток = Остаток - Движение.Колво;
КонецЦикла;

КонецЦикла;

//Движения по регистру бухгалтерии
Результат = Пакет[1].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока Результат.Следующий() Цикл

Если Результат.КолДок > Результат.КолОст Тогда
Сообщить("Товара не хватает!");
Отказ = Истина;
Возврат;
КонецЕсли;

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

Пока Выборка.Следующий() И Остаток > 0 Цикл

Движение = Движения.РегистрБухгалтерии.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.СчетКт = ПланыСчетов.Управленческий.Товары;
Движение.СубконтоКт.Номенклатура = Выборка.Номенклатура;
Движение.СубконтоКт.Дата = Выборка.Дата;
Движение.КолвоКт = мин(Остаток,Выборка.КолОст);
Движение.Период = Дата;
Движение.Сумма = ?(Выборка.КолОст =0,0, Движение.КолвоКт * Выборка.СумОст / Выборка.КолОст);

Остаток = Остаток - Движение.КолвоКт;
КонецЦикла;

Движение = Движения.РегистрБухгалтерии.Добавить();
Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели;
Движение.Период = Дата;
Движение.Сумма = Результат.Сумма;

КонецЦикла;

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


Fundo0rin

  • Пользователь
  • **
  • Сообщений: 12
Re: Билет 1. Спец по платформе V8
« Ответ #221 : Октябрь 11, 2016, 03:47:26 pm »
моё решение
Буду рад критике
 :D

1. Учет остатков ведется в разрезе складов, себестоимость не учитывает склады.
Т.е. При списании со склада ты можешь списать товар с 1 склада а себестоимость может быть списан "как-бы" с другого склада (т.е. товар с такой себестоимостью пришедший на другой склад).

2. Списываться товар должен со склада в шапке, никаких отборов по складу в запросе - нет.

3. Решение на 1 регистре – как по мне - ошибка. Потом этот регистр обзаведется кучей записей и проверять наличие остатков он будет довольно долго. Да и чем больше измерений, тем регистр медленнее.

4. "Избыточная" (как по мне) блокировка записей регистров. Номенклатуру - услуги блокировать в регистре ни к чему. (Хотя. мне кажется это я уже излишне заморачиваюсь)

kuzyara

  • Пользователь
  • **
  • Сообщений: 26
  • ФИО: дядя Коля
Re: Билет 1. Спец по платформе V8
« Ответ #222 : Октябрь 11, 2016, 05:10:20 pm »
Все, на этом я собираюсь остановиться.
Рано. Рекомендую вам пока отложить этот билет и разобрать остальные 5.

Хорошие программисты пишут код, понятный людям. (с) С.Макконнелл «Совершенный код»

Fundo0rin

  • Пользователь
  • **
  • Сообщений: 12
Re: Билет 1. Спец по платформе V8
« Ответ #223 : Октябрь 11, 2016, 07:02:23 pm »
Все, на этом я собираюсь остановиться.
Рано. Рекомендую вам пока отложить этот билет и разобрать остальные 5.

Хорошие программисты пишут код, понятный людям. (с) С.Макконнелл «Совершенный код»

5?
Почему 5? билетов же 15?))
В целом да, просто для себя я поставил точку в этом билете по ОУ

kuzyara

  • Пользователь
  • **
  • Сообщений: 26
  • ФИО: дядя Коля
Re: Билет 1. Спец по платформе V8
« Ответ #224 : Октябрь 12, 2016, 06:17:26 am »
5?
Мне казалось сдающим из регионов нужно готовиться только к первым 6 билетам.