Продвинутый курс. Домашнее задание №12
Эта запись посвящена первому потоку продвинутого курса по программированию.
Для выполнения рекомендуется изучить следующие главы 2-го блока.
Глава 3. Особенные свойства регистров.
Глава 4. Агрегаты регистров накопления.
Глава 5. Особенности запросов к виртуальным таблицам регистров.
Глава 6. Автоматические и управляемые блокировки.
Глава 7. Способы организации складского учета.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
С резервами пришлось повозится
Задание выполнено.
Создан новый докумен Заказ покупателя, регистр накопления и реквизит ТЧ в документе Реализация.
Приход по регистру делается при проведении заказа, расход при проведении реализации с анализом по документу резерва
Готово.
ДЗ № 12 сделала
ДЗ 12 выполнил. Создал Документ ЗаказПокупателя и Регистр Накопления РезервыТоваров с измерениями номенклатура, контрагент и ресурсом количество. При проведении ЗаказаПокупателя делается приход по регистру РезервыТоваров и расход по регистру остатков ТМЦ. Здесь же проводится контроль возможности резервирования товаров по документу.
В документе Реализация добавлена табличная часть ДокументыРезерва. Форма выбора изменена так, чтобы отбирались только проведенные документы резерва по контрагенту. Проведение реализации модифицировано так, что сначала производится расход товаров по регистру РезервыТМЦ по методу fifo,и только затем производится списание остатков в регистре ОстаткиТМЦ.
ДЗ № 12
Создается новый документ ЗаказПокупателя.
В док. реализация в ТЧ товары добавляется реквизит Заказ.
Создается рег. Накопления (вид регистра «остатки») ТоварыВРезерве с измерениями Номенклатура, Заказ, ресурсом Количество. Регистраторами для этого регистра являются док. ЗаказПокупателя (приход) и Реализация (расход)
В модуле объекта док. ЗаказПокупателя сначала делаются движения (расход) по рег. Остатки (уменьшается свободный остаток) и (приход) по рег. ТоварыВРезерве. Чтобы избежать проблем при параллельной работе нескольких пользователей для набора регистра Остатки устанавливается БлокироватьДляИзменения=Истина.
в Подписку НаСобытиеПередЗаписьюДокументов в качестве источника добавляется документ ЗаказПокупателя.
В модуле объекта док. Реализация делаются движения (расход) по рег. ТоварыВРезерве (для строк, для которых проставлены значения реквизита Заказ) и движения (расход) по рег. Остатки (для строк, у которых не проставлены значения реквизита Заказ). Чтобы избежать проблем при параллельной работе нескольких пользователей для наборов регистров ТоварыВРезерве и Остатки устанавливается БлокироватьДляИзменения=Истина
в Подписки НаСобытие ПередЗаписьюРегистраОстатки и ПриЗаписьюРегистраОстатки в качестве источника добавляется регистр ТоварыВРезерве
В этих подписках, в зависимости от источника (или рег. ТоварыВрезерве или рег. Остатки) изменяются тексты запросов для проверки отрицательных остатков по регистрам (для рег. ТоварыВРезерве добавляется поле Заказ)
Задание выполнено. Добавлен документ ЗаказПокупателя и регистр накопления Резервы. Заказ покупателя делает приход по регистру, реализация – расход (если в ТЧ указан заказ). По регистру Остатки заказ покупателя при проведении делает расход. Реализация делает расход по регистру Остатки только если в ТЧ не указан заказ.
Задание выполнил.
1) Добавил документ Заказ покупателя и регистр накопления Товары в резерве.
При проведении документа Заказ покупателя выполняется контроль наличия резервируемого
товара (остаток на складе за минусом резерва не должен превышать резервируемое количество)
и добавляется движение Приход по регистру Товары в резерве.
2) В табличную часть документа Реализация товаров и услуг добавил реквизит Заказ покупателя.
При проведении документа, если списание выполняется по заказу покупателя из резерва, производится
движение Расход по регистру Товары в резерве.
При проведении выполняется проверка на достаточность зарезервированных по заказам товаров для товаров, отгружаемых по заказам
и остатков за минусом резервов, для товаров, списываемых из свободного остатка.
3) Корректная работа конфигурации в клиент-серверном варианте обеспечивается за счет наложения блокировок на наборы
записей, используемых в алгоритмах установкой свойства БлокироватьДляИзменения = Истина перед записью набора.
Готово !..
Решение подглядел у Ильи Чернова – проверять сначала резерв потом весь остаток..
1. Создал док. ЗаказПокупателя и рег. РезервыТоваров..
2. Ч/з ФО и 2 константы сделал видимость заказа в шапке или ТЧ..
3. В подписку Проведения добавил Запрос на проверку разницы Добавленного резерва и Остатка (за минусом движений сделанных реализацией на основании данного документа – на случай перепроведения)
4. В старый запрос проверки осатков добвил проверку Резерва – в итое в одном запросе проверяется резерв и остатки..
Домашнее задание выполнено.
Добавил новый регистр РезервыТоваров Измерения: Номенклатура,ЗаказПокупателя Ресурс: Количество. И Документ Заказ покупателя. В Обработке проведения этого документа формировал движения приход по регистру РезервыТоваров. И поместил в подписки на события перед запись и обработка проведения.
В подписке перед записью проверял тип документа, и заполненность заказа покупателя в ТЧ Товары Реализации и в зависимости от него формировал движения по регистрам РезервыТоваров и ОстаткиТоваров. Добавил два флажка <code>КонтрольСвобОстатков = ДвиженияОстатков.Количество() > 0;
КонтрольРезерва = ДвиженияРезерва.Количество() > 0; </code>. И в зависимости от истинности в подписке на события ПередЗаписью анализировал изменения документа, а в ОбработкеПроведения контроль отрицательных остатков и превышения резерва
Так как используется новая технология проведения: сначала запись, потом проведение для наборов записей выставляем свойство БлокироватьДляИзменения в значение Истина для установки блокировки.
Задание выполнено:
В регистр Остатки товаров добавлено измерение Заказ. Логика регистра: если товар свободен, то измерение заказ пустое, если товар зарезервирован, то указывается документ заказа…
Создан документ Заказ. При оформление заказа в рег. Остатки товаров происходит расход не зарезервированной номенклатуры и приход ее же, но уже с заполненным измерением резерв.
В табл. часть документа Реализация добавлено поле Заказ.
В итоге все списание и контроль ведется по одному регистру.
ДЗ № 12 выполнила.
Добавила документ “ЗаказПокупателя”, регистр накопления ТоварыВРезерве с такой же структурой, как и РН ОстаткиТоваров, но еще одним измерением “ЗаказПокупателя”. Включила новый документ в ранее созданные подписки. Документ “ЗаказПокупателя” в ОбработкеПроведения делает приходные движения в регистр ТоварыВРезерве и расходные движения по регистру ОстаткиТоваров. Далее выполняется контроль остатков, реализованный ранее в подписках. В табличную часть Товары документа РеализацияТоваров добавила реквизит Заказ. При проведении документа в модуле документа по строкам с выбранным заказом делаются расходные движения по РН ТоварыВРезерве, а по остальным строкам – по РН ОстаткиТоваров и далее в подписках осуществляется контроль.
ДЗ выполнено.
Все оказалось очень просто.
1. В процессе решения в конфигурацию был добавлен документ “Заказ” и одноименный регистр накопления. Также добавлен реквизит “Заказ” в табличной части реализации
2. В подписке на событие при контроле остатков в запросе делаю левое соединение с регистром резервов и анализирую что получилось по новой методике контроля остатков.
3. Обеспечение работы в клиент-серверном режиме сделал через устанавливаемые блокировки на данные.
Сделала.
Добавила регистр накопления РезервТоваров (Номенклатура, Количество), документ Заказ покупателя, реквизит ЗаказПокупателя в табличную часть документа Реализация.
При вводе Заказа покупателя, записываю приход в РезервТоваров.
В обработке проведения документа реализации, добавила расход в РезервТоваров, если в строке есть заказ. В подписке на событие – добавила контроль на отрицательные остатки по РезервТоваров.
Задание выпонил
1. Добавил новый документ ЗаказПокупателя и РН ТоварыВРезерве изм.Номенклатура,Заказ рес.Количество.
2. При проведении заказа приход в резерв.
3. При списании, доработал контроль по остаткам с учетом количества в резерве и добавил второй контроль уже по регистру ТоварыВРезерве. Идея такова, что вначале проверяю после проведения общие остатки минус общий резерв, далее по ТоварамВРезерве на отрицательный резерв по заказно. Все реализованно в подписке по документу реализация.
док.ЗаказПокупателя, в док.РеализацияТоваровИУслуг + таб.ЗаказыПокупателей/колонка: док.ЗаказыПокупателей (заполнение таб.Товары при заполнении таб.ЗаказыПокупателей возможно), регОст.РезервыПокупателей: приход – ЗаказПокупателя, расход – РеализацияТоваровИУслуг из табличныхчастей привязаных док.ЗаказПокупателя. ОстатокТовараДляДокумента = рег.ОстаткиТоваровОстатки – (рег.РезервыПокупателейОстаток -рег.РезервыПокупателейОстаток где регистраторы Прихода из таб.ЗаказыПокупателей текущей РеализацияТоваровИУслуг)
ДЗ выполнено. Добавил документ Заказ и регистр накопления (остатки) Резервы – измерения номенклатура, заказ, ресурс количество. По регистру документ Заказ делает приход, Реализация – расход. При проведении Заказа система контролирует возможность резервирования, если нет то ругается. Заказ указывается в табличной части (опционально можно сделать контроль, чтобы пользователь не указал количество больше чем зарезервировано). В ОбработкуПроведения Реализации добавил движения по списанию резерва. В подписке на событие контролирую остатки с учетом резерва.
<p>Готово!</p>
<p>Ухищрялся как мог. Сделал второй регистр РезервыТоваров, регистраторы заказ и реализация.
Так же в остатках товара добавил регистратор заказ.</p>
<p>1. Заказ покупателя ведет себя следующим образом. Он сначала уменьшает остатки, используя те же подписки что и реализация (с прошлого дз). Проверяет, а не зашли ли мы в минус, и если такие позиции есть, то все отменяется и с ошибкой что недостаточно товара для резерва, на этом все заканчивается. Если все ок, то движение по остаткам очищаются. Транзакция проходит до конца и появляется резерв в регистр резервов.</p>
<p> http://prntscr.com/1ih9r
</p>
<p>2. Реализация. </p>
<p>Сначала пытается списать резерв по тем позициям где указан заказ, алгоритм аналогичен контролю отрицательных остатков.
<p>
http://prntscr.com/1iha9
</p>
<p>Если он прошел, то задублированные строки (строки с заказом и без) суммируются и просто проводятся по остаткам, опять же с контролем, что был раньше.</p>
<p>
http://prntscr.com/1ihan
</p>
<p>Сообщение конечно не очень информативное, но с ним не стал замораживаться </p>
<p>При проведении накладываются блокировки. Проверял списать параллельно нельзя.</p>
Илья, а Вы учли – подводный камень: если отменить проведение и снова проводить, при условии нулевых остатков – остатки уйдут в минус..
При чтении задания возник вопрос, написано –
… Алхимов запрашивает 10, предварительно имея в резерве 6 и так как на остатке всего 10, 6 уходит с резерва (рег. ТоварыВРезерве) и 4 со свободного остатка (рег. ОстаткиТоваров). При такой интерпретации сама запись движений в регистр должна быть переписана (сейчас просто цикл по ТЧ и потом контроль в подписках).. Тогда цель всей схемы с пост контролем изменившихся строк становится смутной..
Могли бы вы пояснить?
Денис, кажется все однозначно.
Если в строке указан заказ, то списываем из резерва, если нет – со свободного остатка.
Задание выполнено: Новый документ ЗаказПокупателя, который уменьшает количество свободного остатка (расход по регистру ОстаткиТоваров) и увеличивает резерв (приход по регистру ТоварыВРезерве).
Новый регистр ТоварыВРезерве (изм. ЗаказаПокупателя, Номенклатура; ресурс Количество).
В документ РеализацияТоваров в ТЧ добавлен реквизит ЗаказПокупателя. Если в ТЧ указан заказ списываем с него; если нет, то из свободного остатка.
Таким образом алгоритм проверки остатков для регистра ОстаткиТоваров из прошлого урока не изменился.
А для регистра ТоварыВРезерве уход остатков в минус проверяется точно также, как и для ОстаткиТоваров (добавлены подписки ПередЗаписью и ПриЗаписи).
Создала документ Заказ и Регистр накопления РезервыТоваров с измерениями Номенклатура и Заказ, и ресурсом Количество.
РН РезервыТоваров двигается в плюс документом Заказ и в минус Документом Расходная.
При проведении документа Заказ Контроль свободного остатка РН ОстаткиТовара по новой методике.
У РН ОстаткиТоваров добавила Измерение Заказ. При поступлении товара это измерение – пустой документ Заказ.
При проведении Заказа в РН ОстаткиТовара списывается товар с пустым заказом и увеличивается с заказом текущим.
Такой подход позволяет определять свободный остаток при резервировании – с пустым заказом и отпускать товар сверх заказа
из свободного резерва – второй строкой.
В документ Расходная добавила реквизит табличной части – Заказ. Расходная вводится “на основании” заказа, но может корректироваться.
При вводе На основании в документ попадает товар еще не “забранный”.
При проведении Расходной контролируется остаток в РН РезервыТоваров.
Задание выполнил.
Создал документ “ЗаказПокупателя”, и новый регистр “РезервыТоваров”.
Документом “ЗаказПокупателя” переношу товар в резерв.
В табличную часть документа “РеализацияТоваровИУслуг” добавил реквизит “ЗаказПокупателя”.
В запросе учитываю что ещё появились заказы и могут быть резервы по ним.
Выполнено.
Создан документ Заказ покупателя и регистр накопления остатков для него с измерением ЗаказПокупателя, Номенклатура. В документе в обработке проведения контролируется наличие свободного остатка по новой схеме, сначала запись, потом проверка отрицательных остатков.
В документ Реализация добавлен реквизит в табличную часть ЗаказПокупателя. В подписке на событие Обработка проведения, где в прошлом задании выполнялся контроль остатков теперь выполняется еще и запись в новый регистр, а также проверка на отрицательные остатки по нему. Это все дописывалось дополнительными временными таблицами в запросах. При проверке на отрицательные остатки выдается сообщение и на отрицательные остатки по товарам и на отрицательные остатки по заказам.
В документах перед записью движений в регистры свойство наборов записей БлокироватьДляИзменения = Истина.
Добавила
Документ ЗаказПокупателя
Регистр Накопления Резервы товаров
В табличную часть документа РеализацияТоваровИУслуг добавила реквизит ЗаказПокупателя
Сначала при проведение документа ЗаказПокупателя реализовала так, как реализовано проведение реализации в домашнем задании 11. Проверки на наличие остатков за минусом резерва проводятся для измененных строк в модуле объекта Регистр РезервыТоваров
Потом, еще раз прослушав уроки о задаче отслеживания заказов, решила, что это будет неправильно. Если отслеживать остатки при проведении заказа, получим данный регистр только для резервирования, а иначе у него будет две функции и резервирование и заказ, так как при отсутствии остатка номенклатура будет считаться заказанной и эти заказы впоследствии можно будет выполнить.
При проведении документа ЗаказПокупателя пишу приход в регистр РезервыТоваров
Изменила проведение документа Реализация товаров.
Выполняю проведение по регистру Резервы товаров по тем строкам, для которых указан заказ. Блокирую данные этого регистра.
В продолжении предыдущего домашнего задания (правильное его решение перенесла из предоставлено ИБ) – в той же подписке на событие, если проводится РеализацияТоваровиУслуг – то сначала проверяю, хватает ли количества указанного в строках с заполненным заказом для списания по регистру РезервыТоваров.
Если нехватка – Отказ = Ложь – дальнейшие действия не выполняются
Выполняю проверку остатков за минусом резервов.
Для получения остатков без резервов Использую объедиенени запросов по регистру ОстаткиТоваров и РезервыТоваров, количество резервов беру с минусом, и дальше группирую по товару. Поскольку по строкам с указанным заказом резервы на данным момент списаны – при определении резервов обрабатываются строки с пустым заказом покупателя.
Для красоты можно при подборе заказа покупателю в РеализацияТоваровИУслуг для выбора формировать список существующих заказов по данному товару и еще и проверить ,чтобы количество для реализации по заказу было доступным по складу – но такая задача не ставилась – не делала
Задание выполнил.
На регистр остатков добавил реквизит “ЗаказПокупателя”.
Новым документом “Заказ покупателя” перебрасываю количество по номенклатуре с пустого заказа на ссылку этого документа. Реализован контроль резервирования “в минус”.
В ТЧ документа “РеализацияТоваровИУслуг” добавил ссылку на заказ. В алгоритме проверки остаток проверяю в разрезе каждого заказа. Если заказ в строке не указан, то остаток по пустому заказу и есть ни кем не зарезервированный товар. Движения по расходу так же делаю в разрезе каждого заказа.
Так как регистр один, проблем с многопользовательской работой возникнуть не должно.
Только увидел свой “ляп”. :)
Конечно не реквизит, а измерение.
Дошел до главы про управляемые блокировки.
Понял что требовалось в задании. Дописал установку блокировки регистра остатков с помощью установки набору записей БлокироватьДляИзменения = Истина.
Задание выполнил.
Созданы документ “Заказ покупателя”, регистр “Товары в резерве”, добавлен реквизит “Заказ покупателя” в табличную часть реализации. Контроль резервов осуществляется в модуле объекта.
Модифицирован алгоритм контроля остатка. Недостатком итоговых алгоритмов является то, что при нехватке резервов по заказам обработка проведения не выдает ошибки по остаткам. При отказе нет захода в подписку на событие “При записиРегистраОстатки”.
В сообщении от ошибках по остаткам отвязался от строк с заполненным заказом покупателя.
Изменения:
1) Добавил Документ ЗаказПокупателя;
2) Добавил регистр накопления ТоварыВРезерве (Измерения: Номенклатура, ДокументРезерва; Ресурсы: Количество). Регистраторы ЗаказПокупателя, РеализацияТоваровИУслуг;
3) В модуле Документа ЗаказПокупателя, сделал проверку свободных остатков, по схеме сначала запись в регистр, затем проверка есть ли Отрицательные свободные остатки. При этом перед записью набора устанавливаю БлокироватьДляИзменения=Истина;
4) В документ РеализацияТоваровИУслуг добавил в табличную часть Товары реквизит ДокументРезерва.
5)При проведении документа РеализацияТоваровИУслуга. Пришлось изменить проверку остатков.
Алгоритм проверки остатков при проведении РТиУ:
1) Перед записью сохраняю в Доп.Свойства ТЗТоварыСтарые, также признак Проведен ли документ.
2) В обработке проведения:
– создаю набор записей по регистру Товары в резерве только для тех позиций у которых указан ДокументРезерва.
– создаю набор записей по регистру Отсатки товаров, только для тех позиций у которых указан ДокументРезерва.
– в МодулеПодписки сначала записываю НаборЗаписей по ТоварамВРезерве перед этим устанавливая БлокироватьДляИзменения=Истина, при этом также записываю и набор записей по регистру ОстаткиТоваров полученный ранее ; далее делаю проверку есть ли остаток резерва по указанному Заказу.
– изменил запрос получения Измененных строк в документе (который теперь учитывает реквизит ДокументРезерва). Создаю набор записей по регистру ОстаткиТоваров по строкам где не указан ДокументРезерва. Записываю этот набор с указанным свойством БлокироватьДляИзменения=Истина. Далее по изменным строкам проверяю свободный остаток.
Результат в случае не хватки остатка по заказу и свободных остатков: http://s55.radikal.ru/i149/1101/7a/0f2880748883.jpg
Проверил взаимные блокировки в клиент серверном варианте, блокировки отрабатывают нормально: http://i007.radikal.ru/1101/1d/40c252b92486.jpg
PS. так и не додумал можно ли Одной записью в регистр ОстаткиТоваров сделать нормальную проверку остатков, даже не проверку, а нормальную выдачу сообщений о нехватке остатка.
При резервировании я предполагаю забирать достаточную номенклатуру из регистра ОстаткиТоваров в регистр ТоварыВРезерве. ТоварыВРезерве имеют измерением Заказ. При реализации под Заказ, мы не делали резервирование, но в регистре ОстаткиТоваров такой товар есть, нужно ли его забирать?
Можно попробовать обойтись одним регистром, добавив в Остатки товаров измерение Заказ и поробовать поработать с ним.
Если на цифрах.
Есть диван 10 штук.
Под заказ Алхимова зарезервировали 6 штук.
Тогда отгрузить Белявскому сможем только 4 штуки.
А если Алхимов вдруг захотел 10. Не делаю новый заказ по одной строке, указав 10 отгрузим?
Нет, 10 штук одной строкой не отгрузим.
Единственный возможный вариант:
6 штук отгрузить по заказу
4 штуки без указания заказа.
Тогда. Задание выполнено.
Нужно ли учитывать, что если в резерве под заказ не стоит, то можно забирать свободный остаток? Если да, то тогда механизм контроля “после проведения” не может быть реализован, необходимо выполнять контроль непосредственно при проведении.
Сергей, приведите пример.