Контроль остатков 1с программирование

Контроль товарных остатков в системах 1С

Этой статьей автор хотел бы поднять вопрос о слабых местах типовых систем 1С «УПП, УТ, Комплексная», методах их устранения и определить интерес аудитории к проблеме в целом.
В первой из них затрагивается вопрос о «контроле товарных остатков».

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

Как это работает.
В своей статье в качестве базовой конфигурации я буду рассматривать УПП (управление производственным предприятием) так как она содержит наибольшее количество подсистем. Представленный метод подходит и для других систем 1С в которых есть регистр «Свободных остатков».
В системе присутствуют демо данные и включен механизм контроля «Свободных остатков».

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

Читайте также:  Разработчиком языка программирования лого является

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

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

Все хорошо. Контроль вроде бы есть. Но проваливаясь в реализацию (клавиша F12). Видим все то чем написано выше. Система контролирует только оперативный остаток.

Система без контроля пропускает большую часть документов, которые заводятся в прошлом периоде. Было бы логично сообщать о ошибках данных в момент ее появления, когда у оператора есть первичный документ на руках, а не в момент закрытия месяца, когда документы в архиве и узнать правду не представляется возможным.
Каждый раз начиная совершенно разные проекты, первым делом что приходилось закрывать именно эту брешь в контроле остатков. Только это одно действие может значительным образом повысить качество данных системы и ее полезность в целом.
Дополняем обработку не оперативного проведения.
Теперь хорошие новости.
Ничего существенного дорабатывать не нужно все доработки сводятся к 4 строкам.
1.Блокируем выход из процедуры если проведение не оперативное.

 //Если РежимПроведения <> РежимПроведенияДокумента.Оперативный Тогда // Возврат; //КонецЕсли; 
| РегистрНакопления.СвободныеОстатки.Остатки(&МоментВремени, 
Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения=РежимПроведенияДокумента.Оперативный,Текущаядата(),Новый Граница(СтруктураШапкиДокумента.Ссылка.МоментВремени(),ВидГраницы.Включая))); 

Проверяем.
Сформируем документ в прошлом периоде и убедимся что системы блокирует его проведение при превышении остатка. Дополнительно используем отчет «Анализ доступности товаров на складах».

Выводы.
В данной статье освещается один из методов усовершенствования типовых систем 1С. Рассказано о методах проведения документов и их особенностях. Показано как несколькими штрихами можно значительно повысить качество данных системы.
Спасибо за внимание.
P.S. Предложенное автором решение характеризуется простотой и доступностью, но не претендует на 100 процентную гарантию о чем в следующих статьях.

Источник

Как реализовать контроль остатков в 1С?

Изучаю реализацию контроля остатков в 1С, по всем примерам делаю вроде, но результаты чтетны. Помогите, подскажите, что не так?

Документы: ПолучениеУчебников и РеализацияУчебников
Табличные части: Учебники
Регистр накопления: ОстаткиУчебников

Код отрабатывает без ошибок, но не отображает остаток.
Вот код:

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

Движения.ОстатокУчебников.Записывать = Истина;
Для Каждого ТекСтрокаУчебники Из Учебники Цикл
Движение = Движения.ОстатокУчебников.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Учебники = ТекСтрокаУчебники.Наименование;
Движение.Количество = ТекСтрокаУчебники.Количество;
КонецЦикла;

Если Режим = РежимПроведенияДокумента.Оперативный Тогда

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Сообщить (Режим); Сообщить (ВыборкаДетальныеЗаписи.Количество());

Что значит «результаты чтетны»?

Из того что я вижу (как я понимаю это модуль объекта документа РеализацияУчебников, а что творится в модуле объекта документа ПолучениеУчебников и модуля набора записей регистра ОстаткиУчебников остается неизвестным) хочу отметить несколько моментов:

1) В модулях объектов не принято писать вызов метода Сообщить(). И не только потому, что он устаревший и не рекомендуется к использованию (вместо него нужно использовать объект СообщениеПользователю), а поскольку нет 100% вероятности, что данное сообщение будет показано и прочитано — к примеру при работе регламентного задания.

2) Если у вашего документа запрещено оперативное проведение, то блок в условии «Режим = РежимПроведенияДокумента.Оперативный» не будет выполнен.

3) В вашей логике пропущена запись набора движения до выполнения запроса. Команда «Движения.ОстатокУчебников.Записывать = Истина;» говорит лишь о том, что при завершении процедуры проведения записи из свойства Движения.ОстатокУчебников необходимо записать в базу данных. Но, если вы в рамках проведения хотите запросом проверять измененное состояние в базе, то проводки перед этим стоит записать явно методом Записать().

Здесь проблема в запросе! То что Вы указали и без всего записывает в бд. Делаю простой запрос типа: Запрос.Текст =
«ВЫБРАТЬ
| ОстатокУчебниковОстатки.Учебники,
| ОстатокУчебниковОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстатокУчебников.Остатки КАК ОстатокУчебниковОстатки
|ГДЕ
| ОстатокУчебниковОстатки.КоличествоОстаток < 0";

Все работает, но при достижении у кого наименования учебника отрицательного значения — все перестает проводить. Проблема во вложенном запросе. Если знаете, то помогите.

Pepper1, согласен подзапрос написан несколько бредово.

Во первых, неправильное условие отбора; должно быть так:
«ГДЕ РеализацияУчебниковУчебники.Ссылка = &Ссылка».

Во вторых, что вы выбираете? У вас действительно в табличной части учебников ссылка на учебник названа НАИМЕНОВАНИЕ. Мне кажется, что там у вас какая-то вспомагательная информация (если такое поле вообще существует). А правильным должно быть что-то такое:
«ВЫБРАТЬ РеализацияУчебниковУчебники.Учебник».

5a1b0cf2eb748479124651.jpeg

Вот изображение где обозначена вся структура.

Разбираюсь с 1С 1 мес и в основном по вечерам, так что прошу сильно морально «не пинать», сами таким были.

Помогите с запросом, что не так делаю? Изучаю по примеру из видео Гилева за 21 день. Все делаю 1 в 1 а он все не работает.

Pepper1, это Гилев такое пример придумал? Тот который Евгений? Ну-ну.

Главную ошибку поняли из моего предыдущего комментария? Из условия нужно удалить слово НАИМЕНОВАНИЕ — просто ССЫЛКА.

Учебники — это у вас строка, которую вы каждый раз вносите вручную со всеми ISBN в надежде не сделать опечатку? Срочно переделать на использование справочника. Тогда из табличных частей документов Получения и Реализации учебников удалить строковый реквизит Наименование, а сделать новый реквизит Учебник, типа СправочникСсылка.Учебники. Реквизит Учебники из регистра ОстаткиУчебников переделать из типа Строка на тип СправочникСсылка.Учебники. И тогда строчка, которую я дал в прошлом комментарии будет верной. Если вы мазохист и любите много печатать, то в вашем варианте достаточно исправить «Выбрать РеализацияУчебниковУчебники.Наименование.Ссылка» на просто «Выбрать РеализацияУчебниковУчебники.Наименование»

Источник

Проверка остатков при проведении

Всем доброго дня.
Занимаюсь изучением программирования/конфигурирования 1с и для этого с нуля пишу свою конфигурацию, дабы глубже вникнуть.
возникла следующая ситуация:
Остатки на складе хранятся не только в разрезе номенклатуры но и в разрезе цен закупки и счета закупа.
т.е. регистр накопления имеет следующие реквизиты:

Номенклатура
Цена
СредстваЗакупки

В проводимом документе в табличной части так же есть эти реквизиты.
Для проведения документа и проверки остатков решил воспользоваться новым методом, т.е. списываем а потом смотрим что ушло в минус. Родился следующий код:

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

Проблема данного кода заключается в следующем. Предположим на складе есть:

|Номенклатура|ЦенаЗакупа|СчетЗакупа |количество|
| Стул | 11.20 |Основной | 5 |
| Стул | 15 |Не Основной | 1 |

Если АктВыполненыхРабот содержит стулья по одной цене, то все отрабатывает корректно. при этом не важно одной строчкой или несколькими строками. все пересчитывается.
а вот если пытаюсь списать один стул за 15 и один стул за 11 то не проводится и прилетает отчет что не хватает 1 стула

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

Источник

Оцените статью