Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Новая методика контроля отрицательных остатков при проведении документов в системе 1С:Предприятие 8.2          
Vofka Подменю пользователя
сообщение 28.02.11, 9:27
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4519 раз
Рейтинг: 3641.2

Новая методика контроля отрицательных остатков при проведении документов в системе 1С:Предприятие 8.2.

За последние полгода меня уже серьезно достали! Достали тем, что просят рассказать о новом контроле остатков. Причем все вроде как слышали «там сначала списываем, а потом проверяем, не ушли ли в минус?». И почему-то новая методика всеми считается панацеей.

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

Вводная ситуация.

Имеем конфигурацию с одним регистром накопления «ОстаткиТоваров», регистр имеет 2 измерения: «Номенклатура» и «Склад» и один ресурс «Количество». По регистру движения формируют 2 документа: «Приходная» и «Расходная». Справочники, реквизиты документов и типы данных надеюсь очевидны.

Про «Приходную» писать нечего, там просто формируются в «плюс» остатки. Про «Расходную поговорим подробнее. Для начала вспомним, как формировалась процедура проведения в 8.1.

Для начала мы получали запросом данные табличной части документа, группировали ее, чтобы исключить дубли строк, и соединяли с таблицей остатков регистра:

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

|     РасходнаяТовары.Номенклатура,

|     СУММА(РасходнаяТовары.Количество) КАК Количество

|ПОМЕСТИТЬ ДокТЧ

|ИЗ

|     Документ.Расходная.Товары КАК РасходнаяТовары

|ГДЕ

|     РасходнаяТовары.Ссылка = &Ссылка

|

|СГРУППИРОВАТЬ ПО

|     РасходнаяТовары.Номенклатура

|;

|

|////////////////////////////////////////////////////////////////////////////////

|ВЫБРАТЬ

|     ДокТЧ.Номенклатура,

|     ДокТЧ.Количество,

|     ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток,0) КАК Остаток

|ИЗ

|     ДокТЧ КАК ДокТЧ

|           ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(

|                       ,

|                       Склад = &Склад

|                            И Номенклатура В

|                                  (ВЫБРАТЬ

|                                        ДокТЧ.Номенклатура

|                                  ИЗ

|                                        ДокТЧ КАК ДокТЧ)) КАК ОстаткиТоваровОстатки

|           ПО ДокТЧ.Номенклатура = ОстаткиТоваровОстатки.Номенклатура";

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

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

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


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

Обратите также внимание на функцию ЕСТЬNULL которую мы использовали для гарантии избавления от типа значения NULL в результате запроса. Остатки, которых на складе нет, не присоединятся в таблице документа, и мы поля с остатком заполним значением 0 (ноль).

После того как данные запросом были получены нам оставалось проверить остатки и сформировать движения по регистру. Причем в нашем случае никто не мешает сделать это за один проход.

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

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

      Если Выборка.Количество < Выборка.Остаток Тогда

            Сообщить("Не хватает товара " + Выборка.Номенклатура + ", из необходимых " + Выборка.Количество + " в наличие имеется только " + Выборка.Остаток;

            Отказ = Истина;

      КонецЕсли;



      Если Не Отказ Тогда

            Движение = Движения.ОстаткиТоваров.Добавить();

            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;

            Движение.Период = Дата;

            Движение.Номенклатура = Выборка.Номенклатура;

            Движение.Склад = Склад;

            Движение.Количество = Выборка.Количество;

КонецЕсли;

КонецЦикла;


Вроде бы, куда уж проще и быстрее? Однако есть куда!

Разберем новую методику контроля остатоков.

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

     Запрос = Новый Запрос;

      Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

      Запрос.Текст = "ВЫБРАТЬ

      |     РасходнаяТовары.Номенклатура,

      |     СУММА(РасходнаяТовары.Количество) КАК Количество

      |ПОМЕСТИТЬ ДокТЧ

      |ИЗ

      |     Документ.Расходная.Товары КАК РасходнаяТовары

      |ГДЕ

      |     РасходнаяТовары.Ссылка = &Ссылка

      |

      |СГРУППИРОВАТЬ ПО

      |     РасходнаяТовары.Номенклатура

      |;

      |

      |////////////////////////////////////////////////////////////////////////////////

      |ВЫБРАТЬ

      |     ДокТЧ.Номенклатура,

      |     ДокТЧ.Количество

      |ИЗ

      |     ДокТЧ КАК ДокТЧ";

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

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


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

Далее сформируем движения по регистру.

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

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

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

      Движение = Движения.ОстаткиТоваров.Добавить();

      Движение.ВидДвижения = ВидДвиженияНакопления.Расход;

      Движение.Период = Дата;

      Движение.Номенклатура = Выборка.Номенклатура;

      Движение.Склад = Склад;

      Движение.Количество = Выборка.Количество;

КонецЦикла;

Движения.Записать();


В приведенном примере я подразумеваю, что для документа установлен режим записи движений «Записывать выбранные». Именно поэтому я перед циклом установил пометку необходимости записи движений (на самом деле это можно было сделать и после цикла).

Движения записываем в регистр. Причем при записи движений я обращаюсь не к конкретному набору записей (Движения.ОстаткиТоваров.Записать()), а ко всей коллекции «Движения». Подобный вызов записи гарантирует запись данных в регистры в той последовательности, в которой они расположены на дереве метаданных, что в свою очередь резко уменьшает взаимные блокировки и как следствие ошибки DeadLock.

После того как я записал движения в регистр я получу остатки. Обратите внимание, что при чтении данных из регистра у меня сейчас будут обновленные данные с учетом движений самого документа.

Запрос.Текст = "ВЫБРАТЬ

|     Номенклатура,

|     КоличествоОстаток КАК Остаток

|ИЗ

|     РегистрНакопления.ОстаткиТоваров.Остатки(

|                       ,

|                       Склад = &Склад

|                            И Номенклатура В

|                                  (ВЫБРАТЬ

|                                        ДокТЧ.Номенклатура

|                                  ИЗ

|                                        ДокТЧ КАК ДокТЧ))

|ГДЕ

|     КоличествоОстаток < 0";



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

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


Посмотрите, мы избавились от соединений, и, что не маловажно, от проверки типа значения NULL. Запрос получит данные только по отрицательным остаткам и покажет их пользователю!

Обратимся к результату запроса и известим пользователя о минусах на складе.

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

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

            Сообщение = Новый СообщениеПользователю;

            Сообщение.Текст = "Не хватает товара " + Выборка.Номенклатура + ", после проведения документа остаток составит " + Выборка.Остаток;

            Сообщение.Сообщить();

            Отказ = Истина;        

КонецЦикла;


Вот собственно и вся новая методика контроля остатков. Перечислим плюсы этого метода:
Нет необходимости соединять в запросе таблицу документа и данными регистров
Не надо производить проверку на NULL
Нет необходимости получать излишние данные (остатки) для проведения документа. Ведь мы чаще все же записываем документ с правильными цифрами и он проводится, чем документы которые уводят остатки в минус.

Однако не стоит думать, что такая технология может быть применена повсеместно. На секунду задумайтесь, что в этой задаче необходимо еще и себестоимость рассчитать при списании, и Вы придете к выводу, что необходим «старый» метод контроля остатков.

Автор: Павел Чистов

Спасибо сказали: audit7buh, logist, mister-x, Sergio_zab,

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 16.04.24, 16:43
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!