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

Прежде чем приступить к разъяснению, хотело бы напомнить, что такое «проведение» в терминологии 1С? «Проведение» в 1С – свойство, которым обладают документы, предназначенные для ввода в базу данных первичной информации о совершенной операции. Однако информация об одной и той же хозяйственной операции может отображаться в различных документах, а значит при создании первичного документа она должна попасть в них и сохраниться. Эта процедура и называется в 1С «проведением».

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

Если пользователь выполняет «проводку» документа вчерашним днем, то программа сама определяет режим неоперативного проведения. Так же как и при создании нового документа по умолчанию используется оперативный режим проведения. А вот если проведенный документ вы откорректировали и решили перепровести, то программа обязательно попросит вас выбрать режим проведения.

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

Первое, что следует запомнить – это то, что документ, проведенный оперативно, нельзя провести будущей датой. Программа в этом случае выдаст ошибку. Возьмем к примеру Приходно-кассовый ордер. Разумеется, что сегодня вы не знаете, сколько денег поступит в кассу завтра. Это вы узнаете только по факту совершения операции, когда кассир получит деньги на руки и проведет документ.

Второй важный момент. На основании режима проведения документов в типовых программах (особенно предназначенных для торговли: и 1С: Управление производственным предприятием 8 ()) разработчики реализовали функции контроля различных конфликтов. Например, контроль достаточности складского запаса товаров для проведения операции по его реализации.

Эти контроли опираются на понимание того, что оперативно проведенный документ не может отражать будущую операцию, а значит, из всех аналогичных документов он является самым актуальным. Поэтому при оперативном проведении документа программа подключает к нему всякие модули контроля, которые в качестве основы используют ранее введенную информацию. Если же пользователь выбирает неоперативное проведение, то это заведомо сообщает системе, что данный документ с большей степенью вероятности не будет самым последним, поэтому многие функции контроля использовать просто нецелесообразно. Таким образом, выбирая неоперативное проведение документа пользователь отключает контроль, реализованный в программе, а это может привести к некоторым последующим ошибкам в работе. Например, не сработал контроль наличия достаточного количества на складе, и оператор продал то, чего уже нет.

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

Для внедренцев, которые работают с типовыми или собственными конфигурациями – и тех, кто готовится к Аттестации на 1С:Специалист по платформе.

В статье мы разберем:

  • как правильно использовать управляемые блокировки при оперативном и неоперативном проведении документов
  • к чему может привести отсутствие блокировок
  • как не совершать ошибок, которые обнаружатся не сразу и могут иметь серьезные последствия:)

Время на прочтение – 20 минут.

Итак, две методики контроля остатков в 1С:Предприятии 8.3

Давайте начнем с того, что обозначения “старая методика” и “новая методика” достаточно условны. В самом деле, если “новая методика” используется с 2010 года – она уже не очень новая:)

Однако, мы еще раз вынуждены на этом остановиться, потому что различать эти подходы нужно и это имеет критическое значение .

“Старая методика” – это подход к контролю остатков, который использовался со времен «1С:Предприятие 8.0».

C 2010 года, с развитием платформы и добавлением новых возможностей с «1С:Предприятие 8.2» – применяется “новая методика” (однако – не везде ).

В чем разница?

Принципиальная разница – в моменте контроля остатков:

  • В “старой” методике остатки контролируются ДО записи движений в регистры.
    Сначала проверяем остатки, если остатков “не хватает” (будут возникать отрицательные остатки) – проводить документ не будем
  • В “новой” методике – контроль происходит ПОСЛЕ записи движений, то есть постфактум.
    Если после проведения образовались отрицательные остатки – нужно «откатить» транзакцию, то есть отменить проведение документа.

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

Ok, значит, старая методика ушла в прошлое и это удел УТ 10.3?

Нет, это не совсем так.

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

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

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

Например, вот так:

Однако встречаются конфигурации, где и количество, и стоимость учитываются на одном регистре. И вот здесь-то обоснованно остается работать старая методика контроля остатков !

Вот пример одного регистра и для количества, и для себестоимости:

А что насчет типовых конфигураций? Там ведь только новая методика, верно?

Не всегда!

Вот, например, в «1C:Управление торговлей 11.3» есть 2 регистра:

При проведении документов отгрузки регистр «Себестоимость товаров» не заполняется вообще. Данные в этот регистр попадают только при выполнении регламентных операций по закрытию месяца.

В УТ 11 используется новая методика , так как все данные для проведения документов можно получить, не обращаясь к контролируемым регистрам.

Что касается «1C:Бухгалтерии», то там и количество, и себестоимость хранятся в одном регистре бухгалтерии, на соответствующих счетах БУ.

Поэтому в БП 3.0 используется старая методика .

Обратите внимание, что количественный и стоимостной учет в УТ 11 ведутся с разной аналитикой. Например, себестоимость дополнительно ведется в разрезе организации, подразделения, менеджера, виды деятельности НДС и так далее.

В рамках текущей статьи мы разберем блокировки и для старой, и для новой методики контроля остатков.

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

В этом простом вопросе часто встречаются заблуждения.

Иногда считают, что оперативное проведение – это контроль остатков по новой методике. Это не так, от слова «совсем».

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

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

Настраивается оно с помощью специального свойства документа:

Что значит «регистрировать здесь и сейчас»? Платформа для оперативно проводимых документов выполняет ряд действий:

  • Документам, проводимым сегодня, присваивается текущее время
  • Если два документа проводятся одновременно, каждый будет иметь свое время (то есть система разнесет документы по разным секундам)
  • Документы нельзя будет провести будущей датой.

Но главное другое – система передает признак оперативности проведения документа в обработку проведения:

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

Актуальные остатки хранятся в системе и получаются максимально быстро (остатки на другие даты в большинстве случаев получаются расчетным путем).

Таким образом оперативное проведение можно принять и для старой, и для новой методики контроля остатков .

Интересный факт.

В УТ 11 документам, списывающим номенклатуру, запрещено проводиться оперативно. Например, это документы «Реализация товаров и услуг», «Сборка товаров», «Перемещение товаров», «Внутреннее потребление товаров» и другие.

Почему так сделано?

В системе контроль остатков всегда выполняется на актуальный момент времени (параметр Период в запросе не задается). А отсутствие оперативного проведения позволяет вводить документы будущим числом, такая задача часто требуется клиентам.

Контроль остатков по новой методике – без блокировок

Коротко рассмотрим алгоритм контроля остатков при проведении документа «Реализация товаров и услуг» на модельной конфигурации.

Есть два регистра:

  • Свободные остатки – для количественного учета
  • Себестоимость товаров – для учета себестоимости

Для контроля остатков товаров достаточно работы с регистром «Свободные остатки».

Код обработки проведения будет выглядеть таким образом:

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


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


#Область Область2
Запрос.Текст =
"ВЫБРАТЬ

|ПОМЕСТИТЬ ТоварыДокумента
|ИЗ
|ГДЕ
|
|СГРУППИРОВАТЬ ПО
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;

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

// 4. Запись движений в БД
#Область Область4
Движения.Записать();
#КонецОбласти


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


#Область Область6
МоментКонтроляОстатков =
?(Режим = РежимПроведенияДокумента.Оперативный,
Неопределено,
Новый Граница(МоментВремени(), ВидГраницы.Включая));
Запрос.УстановитьПараметр("МоментВремени", МоментКонтроляОстатков);
РезультатЗапроса = Запрос.Выполнить();
#КонецОбласти


#Область Область7
Если НЕ РезультатЗапроса.Пустой() Тогда
Отказ = Истина;
ВыборкаОшибки = РезультатЗапроса.Выбрать();
Пока ВыборкаОшибки.Следующий() Цикл
Сообщение.Текст = "Недостаточно товара в количестве: "+ВыборкаОшибки.Дефицит;
Сообщение.Поле = "Товары["+(ВыборкаОшибки.НомерСтроки-1)+"].Количество";
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
#КонецОбласти


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

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

Рассмотрим ключевые точки алгоритма контроля остатков.

1. Инициализация менеджера временных таблиц

Менеджер будет необходим, чтобы созданная в запросе временная таблица была доступна и в следующих запросах.

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

2. Запрос, группирующий данные табличной части

В запросе выбираются сгруппированные данные табличной части.

Обратите внимание, что выбирается и номер строки документа – он потребуется для контекстной привязки сообщения об ошибке. Для номера строки используется агрегатная функция МИНИМУМ() – то есть сообщение будет привязано к первой строке, где встречается указанная номенклатура.

В первом запросе пакета создается временная таблица. Во втором запросе выбираются данные временной таблицы и добавляются 2 поля, необходимые для каждой записи регистра – Период и ВидДвижения.

Плюсы такого подхода:

  • Не нужно выполнять предварительную очистку, то есть использовать метод Очистить()
  • Не нужно организовывать цикл по выборке или табличной части.

Кстати, подобный подход используется в типовых конфигурациях, в частности, в УТ 11 и БП 3.0.

4. Запись движений в БД

Запись можно было бы выполнить одной командой (вместо двух) – Движения.СвободныеОстатки.Записать().

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

Но более универсальным является такой подход:

  • Вначале установить флаг Записывать у необходимых наборов записей регистров
  • Затем вызывать метод Записать() коллекции Движения, который записывает в БД все наборы с установленным флагом Записывать

После выполнения команды «Движения.Записать()» флаг Записывать у всех наборов сбросится в Ложь.

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

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

Метод Записать() коллекции Движения записывает наборы записей в одинаковой последовательности даже для разных документов.

Запись же движений вручную может привести к проблемам.

Приведем пример.

Если в документе «Реализация» выполнить запись так:

Движения.СвободныеОстатки.Записать();
...
Движения.СебестоимостьТоваров.Записать();

А в документе «Перемещение товаров» изменить порядок:

Движения. СебестоимостьТоваров.Записать();
...
Движения. СвободныеОстатки.Записать();

То это может привести к взаимоблокировке документов на пересекающихся наборах номенклатуры.

Приведенный подход записи движений можно использовать, если указано соответствующее значение записи движений в свойствах документа:

5. Запрос, получающий отрицательные остатки

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

Отрицательный остаток – это и есть нехватка (дефицит) товара.

Соединение с товарами из документа выполняется только для получения номера строки.

Если бы мы не планировали делать привязку сообщений к полям документа, запрос можно сильно упросить – будут получаться данные из одной таблицы (остатков регистра).

6. Определение момента времени для контроля остатков

Вот здесь нам пригодилось оперативное проведение.

Если документ проводится оперативно, то момент для получения остатков – Неопределено, что означает получение актуальных остатков.

Если это неоперативное проведение, то мы получаем момент времени «после» документа – чтобы учесть только что сделанные движения.

Напомним, что получение актуальных остатков – быстрая операция по сравнению с получением остатков на произвольным момент времени.

Именно в этом и заключается выигрыш оперативно проводимых документов.

7. Если запрос не пустой, значит, образовались отрицательные остатки

В цикле обходим все отрицательные остатки и выводим сообщение привязанной к строкам табличной части.

Вот так будет выглядеть диагностическое сообщение:

8. Если есть ошибки, то возвращаемся из обработчика события

Если была хоть одна ошибка – выходим из процедуры.

Поскольку нет смысла продолжать проведение, транзакция всё равно не будет зафиксирована (а дальше у нас будет разработан код по списанию партий).

Реализация списания себестоимости по партиям

После того, как проверка остатков прошла успешно, можно приступать к списанию партий.

Код для списания по FIFO будет таким:

// I. Анализ смещения даты документа вперед


И НЕ ЭтотОбъект.ЭтоНовый()
И ЭтотОбъект.Проведен Тогда

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Документ.Дата КАК Дата
|ИЗ
|ГДЕ

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДокумент.Следующий();

Иначе
Ложь);
КонецЕсли;

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

Процедура ПриЗаписи(Отказ)

ЭтотОбъект.ДополнительныеСвойства.Вставить("ДатаДокументаСдвинутаВперед",
ЭтотОбъект.Дата>


КонецЕсли;

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

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

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

// 1. Инициализация менеджера временных таблиц
#Область Область1
...
#КонецОбласти

// 2. Запрос, группирующий данные табличной части
#Область Область2
...
#КонецОбласти

// 4. Запись движений в БД
#Область Область4
...
#КонецОбласти

// 5. Запрос, получающий отрицательные остатки
#Область Область5
...
#КонецОбласти

// 6. Определение момента времени для контроля остатков
#Область Область6
...
#КонецОбласти

// 7. Если запрос не пустой, значит образовались отрицательные остатки
#Область Область7
...
#КонецОбласти

// 8. Если есть ошибки, то возвращаемся из обработчика события
#Область Область8
...
#КонецОбласти

// II. Подготовка наборов записей регистра "Себестоимость товаров"
#Область ОбластьII

Движения.Записать();
КонецЕсли;
Движения.СебестоимостьТоваров.Записывать = Истина;
#КонецОбласти

// III. Запрос получающий остатки партий для списания по FIFO
#Область ОбластьIII
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыДокумента.Номенклатура КАК Номенклатура,
| ТоварыДокумента.НомерСтроки КАК НомерСтроки,

| Остатки.Партия КАК Партия
|ИЗ
| ТоварыДокумента КАК ТоварыДокумента
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| ИЗ

|УПОРЯДОЧИТЬ ПО
|ИТОГИ
| МАКСИМУМ(Количество),
| СУММА(КоличествоОстаток)
|ПО
| Номенклатура";
РезультатЗапроса = Запрос.Выполнить();
#КонецОбласти

// IV. Цикл по номенклатуре документа
#Область ОбластьIV

// V. Получим количество для списания
// VI. Цикл по партиям по FIFO
Пока ВыборкаПартии.Следующий() И ОсталосьСписать>0 Цикл
// VII. Проверка на нулевой остаток
Если ВыборкаПартии.КоличествоОстаток=0 Тогда
Продолжить;
КонецЕсли;
Движение.Период = Дата;

// VIII. Расчет количества и суммы для списания

// IX. Уменьшим количество для списания
КонецЦикла;
КонецЦикла;
#КонецОбласти

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

Разберем ключевые точки алгоритма списания партий по FIFO.

I. Анализ смещения даты документа вперед

Здесь мы понимаем, сдвигается ли дата проведенного документа вперед. Эта информация будет полезна ниже, при очистке движений.

Для анализа сдвига даты документа потребуется 2 события:

  • Перед записью – для получения старой даты документа и проверки режима проведения документа
  • При записи – для получения новой даты документа

Данные между событиями передаем через специальную коллекцию объекта – «ДополнительныеСвойства». Она существует пока текущая версия объекта находится в памяти, то есть доступна для всех событий при проведении.

Похожий прием используется в типовой «1С:Бухгалтерии 8». Но там используется одно событие «Перед записью».

Почему в БП не нужно задействовать «При записи»?

Всё просто – документы отгрузки в бухгалтерии не могут проводиться оперативно. А это значит, что время документа не будет принимать оперативную отметку (если документ перепроводится текущим днем), поэтому и старую и новую дату документа можно получить в событии «Перед записью».

II. Подготовка наборов записей регистра «Себестоимость товаров»

Для документа установлен режим удаления движений – “При отмене проведения”:

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

Приведем пример:

  • Остаток мониторов LG на момент проведения документов – 10 шт.
  • Проводится документ, который списывает 8 шт.
  • В этом же документе время увеличивается на 1 минуту, перепроводим

Если не будет удаления старых движений, то система сообщит о нехватке 6 мониторов, поскольку текущие движения документа уже списали 8 из 10 имеющихся мониторов.

Примечание. Иногда встречается совет – удалять движения только при оперативном проведении.

Но это неправильно: ситуации изменения «неоперативных» документов (вчерашних и более ранних) они не учтут.

То есть проблема «нехватки 6 мониторов» (см. выше) будет в этом случае решена только для документов изменяемых сегодняшним числом.

III. Запрос, получающий остатки партий для списания по FIFO

В запросе обращаемся к остаткам по партиям, при этом накладываем итоги по номенклатуре.

На уровне итогов получается количество из документа – МАКСИМУМ(Количество) и остаток партии – СУММА(КоличествоОстаток).

Как Вы думаете, может ли количество из документа превышать суммарный остаток номенклатуры по всем партиям?

Если движения по регистрам “СвободныеОстатки” и “СебестоимостьТоваров” по количеству делаются синхронно (и приход, и расход), то такой ситуации возникнуть не может. На это мы и будем закладываться при списании партий.

IV. Цикл по номенклатуре документа

Благодаря итогам в запросе во внешнем цикле обходим номенклатуру из документа.

V. Получим количество для списания

Запомним, какое количество нужно списать. Далее это количество будет уменьшаться.

VI. Цикл по партиям по FIFO

Вложенный цикл будет содержать партии по текущей номенклатуре.

VII. Проверка на нулевой остаток

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

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

VIII. Расчет количества и суммы для списания

Количество для списания - это минимальное значение между остатком партии и тем, что осталось списать.

Сумма рассчитывается элементарной пропорцией.

Если списывается весь остаток партии, то будет списана и вся сумма этой партии. Это математика 3-го класса церковно-приходской школы: Х*Y/X = Y:)

То есть НЕ нужно делать дополнительных проверок (иногда дают такой совет) на то, что списывается все количество. Этот совет даже имеет своё название – «проблема копеек ».

А тем, кто дает вредные советы имеет смысл заглянуть в конфигурацию «1С:Бухгалтерия 8». Там (о, ужас!) нет проверки на то, что списывается партия целиком:)

Вот скрин общего модуля «Учет товаров», метод «СписатьОстаткиТоваров»:

IX. Уменьшим количество для списания

Нужно понять, сколько еще осталось списать. Для этого вычтем количество из движения регистра.

Зачем нужны управляемые блокировки?

Вот мы и дошли до управляемых блокировок.

Казалось бы, представленные выше алгоритмы работают, как часы. Можете сами их потестировать (ссылки на выгрузки баз в конце статьи).

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

Приведем пример наиболее типичной проблемы при списании товара, когда 2 пользователя практически одновременно пытаются списать товар (оформить продажу):

В этом примере два пользователя почти одновременно проводят продажу товаров – документ №2 начал проводиться чуть позже документа 1.

При получении остатка система сообщает, что остаток 10 шт., и оба документа успешно проводятся. Печальный итог – на складе минус 5 мониторов LG.

Но при этом контроль остатков работает! То есть, если документ №2 будет проводиться после окончания проведения документа №1, система не проведет документ №2:

Иногда встречается заблуждение – «У меня в базе одновременно работают только 3-4 пользователя, вероятность параллельного проведения документов равна нулю, поэтому на блокировки можно не отвлекаться».

Это очень опасное рассуждение .

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

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

Как решить проблему при параллельном проведении документов?

Решение простое – заблокировать мониторы LG в момент времени Т1, так чтобы другие транзакции не могли обратиться к остаткам по этому товару.

Тогда в момент времени Т2 система будет ждать, когда монитор LG будет разблокирован. И после этого система получит актуальный остаток товаров и будет выполнено (или не выполнено) списание товаров.

Буквально пару слов о классификации блокировок.

Существует 2 типа блокировок:

  • Объектные
  • Транзакционные .

Если говорить просто, то объектные блокировки не позволяют интерактивно изменить двум пользователям один объект (элемент справочника или документ).

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

В этой статье нас будут интересовать именно транзакционные блокировки, далее просто блокировки.

Когда нужно накладывать блокировки?

Задача установки блокировок становится актуальной, как только в базе начинает работать более одного пользователя .

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

То есть блокировки нужно накладывать при проведении всех документов?

Ни в коем случае. Устанавливать блокировки «на всякий случай» точно не стоит . Ведь сами по себе блокировки снижают параллельность работы пользователей (масштабируемость системы).

Блокировки нужно накладывать на ресурсы (строки таблицы), которые читаются и изменяются в транзакциях. Например, при проведении документов.

В примере выше таким ресурсом является остаток по товару. Система должна была заблокировать остаток с момента получения данных об остатке (Т1) до окончания транзакции (Т3).

Примечание. Транзакция при проведении документа №1 начинается раньше, чем момент получения остатков. Но для простоты считаем, что Т1 – и время начала проведения документа, и момент получения остатков.

Пример, когда не нужно накладывать блокировку – проведение документа «Поступление товаров». В этом случае нет никакой конкуренции за ресурсы (остатки, …), поэтому блокировка будет вредна: она уменьшит масштабируемость системы.

Автоматические и управляемые блокировки

Здесь мы не будем вдаваться в теорию (это тема отдельной статьи), а скажем лишь, что управляемые блокировки являются более оптимальными.

Вместо теории можем привести пруф – все современные типовые конфигурации работают на управляемых блокировках.

Поэтому в нашей модельной конфигурации будет выбран соответствующий режим:

Управляемые блокировки в новой технологии контроля остатков

Блокировку будем накладывать на регистр “Свободные остатки” и только на номенклатурные позиции, встречающиеся в документе.

Причем правильный вариант наложения блокировки – как можно позднее.

В новой методике контроля остатков это нужно сделать перед записью (или в момент записи) движений в регистр “Свободные остатки”, чтобы другие транзакции не смогли изменить этот разделяемый ресурс.

Блокировку можно накладывать вручную (программным образом) и чуть позже мы покажем, как это делается.

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

Нужно просто установить свойство БлокироватьДляИзменения у набора записей регистра:

// 3.1. Блокировка остатков регистра
#Область Область3_1
Движения.СвободныеОстатки.БлокироватьДляИзменения = Истина;
#КонецОбласти

// 4. Запись движений в БД
#Область Область4
Движения.СвободныеОстатки.Записывать = Истина;
Движения.Записать();
#КонецОбласти
...

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

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

Но для нашей статье принципиально следующее – система установит блокировку на комбинацию записываемых в регистр данных. А детально работу свойства БлокироватьДляИзменения мы рассмотрим в отдельной статье.

Кстати, в типовой УТ 11 не так-то просто найти установку свойства БлокироватьДляИзменения для регистра “Свободные остатки”. Дело в том, что это выполняется в модуле набора записей регистра, в событии “Перед записью”.

Вот и всё, одной строкой кода была обеспечена корректная работа системы!

Важно . Мы не накладываем блокировку на регистр “Себестоимость товаров”.

Почему? Такая блокировка являлась бы излишней (а это определенная нагрузка на сервер 1С), поскольку движения в регистры “Свободные остатки” и “Себестоимость товаров” выполняются всегда синхронно, то есть последовательно друг за другом.

Поэтому, заблокировав товары из “Свободных остатков”, мы не допустим другие транзакции до этих товаров и в регистре “Себестоимость товаров”.

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

Старая методика контроля остатков

Напомним, что старая методика может применяться, если количество и стоимость учитываются в одном регистре.

Пусть это будет регистр “Себестоимость товаров”:

Тогда алгоритм проведения документа “Реализация товаров” будет выглядеть вот так:

// 1. Обработчик события "Перед записью"
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Если РежимЗаписи = РежимЗаписиДокумента.Проведение
И НЕ ЭтотОбъект.ЭтоНовый()
И ЭтотОбъект.Проведен Тогда

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

ЭтотОбъект.ДополнительныеСвойства.Вставить("СтараяДатаДокумента", ВыборкаДокумент.Дата);

Иначе
КонецЕсли;

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

Процедура ПриЗаписи(Отказ)

Если НЕ ЭтотОбъект.ДополнительныеСвойства.Свойство("ДатаДокументаСдвинутаВперед") Тогда

ЭтотОбъект.ДополнительныеСвойства.Вставить("ДатаДокументаСдвинутаВперед",
ЭтотОбъект.Дата>ЭтотОбъект.ДополнительныеСвойства.СтараяДатаДокумента);

Сообщить(ЭтотОбъект.ДополнительныеСвойства.ДатаДокументаСдвинутаВперед);
КонецЕсли;

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

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

// 2. Удаление "старых" движений документа
Если ДополнительныеСвойства.ДатаДокументаСдвинутаВперед Тогда
Движения.СебестоимостьТоваров.Записывать = Истина;
Движения.СебестоимостьТоваров.Очистить();
Движения.Записать();
КонецЕсли;

// 3. Установка флага для записи движений в конце транзакции
Движения.СебестоимостьТоваров.Записывать = Истина;

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

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

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

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

// 5. Цикл по номенклатуре - проверяем достаточность количества для списания
Пока ВыборкаНоменклатура.Следующий() Цикл

ДефицитНоменклатуры = ВыборкаНоменклатура.Количество - ВыборкаНоменклатура.КоличествоОстаток;

Если ДефицитНоменклатуры>0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара в количестве: "+ДефицитНоменклатуры;
Сообщение.Поле = "Товары["+(ВыборкаНоменклатура.НомерСтроки-1)+"].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;

Если Отказ Тогда
Продолжить;
КонецЕсли;

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

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

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

// 11. Уменьшим количество для списания
ОсталосьСписать = ОсталосьСписать - Движение.Количество;

КонецЦикла;
КонецЦикла;

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

    1. Техника и концепция "Оперативное проведение" весьма условна и абстрактна, в том смысле что ни к чему не обязывает платформу как таковую. Т.е. изначально документы "оперативные" и "неоперативные" совершенно равноправны и никак не отличимы.
    2. Разница между теми и этими возникает только в момент, когда прогер ваяющий собственную конфигурацию анализирует второй параметр обработчика события ОбработкаПроведения(имя параметра - Режим). Он вставляет в месте анализа ветвление ЕСЛИ...ТОГДА и вот тут, и только тут , разница между тем и этим проявляется. И даже тут разница будет не между документами, а между процессами=алгоритмами их проведения. Т.е. платформа максимум что делает - это сообщает тот самый Режим проведения. Что делать с этим знанием, как на него реагировать и реагировать ли вообще - это все к конкретному автору конкретной конфигурации.

    Правильно написано?

  2. Если честно, то ход Ваших мыслей лично мне не понятен вообще уже вот как вторую тему. Все просто. Документ - это объект метаданных конфигурации. Он предназначен для отражения факта какого-либо события на предприятии. Документ делает, так называемые, движения (а может и не делать кстати) в регистры различные. (думаю следующая Ваша тема будет посвящена регистрам ). Самый банальный пример - это поступление товара на склад. В 1С есть такое понятие как последовательность документов, т.е. документы четко привязаны ко времени. Так вот мы подошли к самому главному. Документы можно проводить оперативно и неоперативно. Оперативно значит в текущий момент времени. А неоперативно значит датой отличной от текущего времени. Отличной причем только в меньшую сторону, т.е. провести документ будущей датой в нельзя. Сколько я занимаюсь программированием, то ни разу не встречал, чтобы в коде обработки проведения была привязка к режиму проведения.
  3. 1. Техника и концепция "Оперативное проведение" весьма условна и абстрактна, в том смысле что ни к чему не обязывает платформу как таковую. Т.е. изначально документы "оперативные" и "неоперативные" совершенно равноправны и никак не отличимы

    Нажмите, чтобы раскрыть...

    Она не условна и абстрактна а вполне конкретна. Качай книгу "Решение прикладных задач" есть такая у 1С и читай там до полного просветления.

  4. Оперативно значит в текущий момент времени. А неоперативно значит датой отличной от текущего времени. Отличной причем только в меньшую сторону, т.е. провести документ будущей датой в нельзя.

    Нажмите, чтобы раскрыть...

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

    Нажмите, чтобы раскрыть...

    А это, извините, вообще на толстый троллинг смахивает. Ну Радченко, первое упоминание обсуждаемого и простой пример к этому упоминанию - сразу же обработка ветвится в зависимости от режима. Второй параметр в ОбработкаПроведения платформа зачем передает, по вашему? Что вы вообще предлагаете делать с этими двумя режимами кроме их анализа в Обработке?

    а вполне конкретна

    Нажмите, чтобы раскрыть...

    Ну а есть код/пример конфига показывающий/доказывающий что платформа(сама !) конкретно

    Качай книгу "Решение прикладных задач"

    Нажмите, чтобы раскрыть...

    За этот хинт спасибо, попробую разобраться по ней. Но вопросы пускай покамест полежат тут, может ответит кто.

  5. Платформа реагирует тем, что при оперативном проведении дата документа устанавливается реальным временем проведения автоматически.
  6. Вы слишком "плаваете по поверхности" - ныряйте глубже. Когда факт [не]совпадения дат установлен - платформа-то как реагирует в том или ином случае?

    А это, извините, вообще на толстый троллинг смахивает. Ну Радченко, первое упоминание обсуждаемого и простой пример к этому упоминанию - сразу же обработка ветвится в зависимости от режима. Второй параметр в ОбработкаПроведения платформа зачем передает, по вашему? Что вы вообще предлагаете делать с этими двумя режимами кроме их анализа в Обработке?

    Ну а есть код/пример конфига показывающий/доказывающий что платформа(сама !) конкретно по разному реагирует на один и тот же документ в зависимости от режима?

    За этот хинт спасибо, попробую разобраться по ней. Но вопросы пускай покамест полежат тут, может ответит кто.

    Нажмите, чтобы раскрыть...

    Я лучше буду молчать...

  7. возможно я не до конца понял, что вы хотите сказать.

    Эм, это почему нельзя?

  8. Но так, если рассуждать, то да, между документами (и их движениями тоже, сходу не могу придумать пример обратного) проводимыми оперативно и не оперативно разницы нет, и все отличие в алгоритмах, которые будет использовать разработчик конфигурации анализируя текущий режим проведения.

    Нажмите, чтобы раскрыть...


    Вы передаёте момент времени и по нему система понимает оперативно проводится документ или нет.

  9. Есть отличия при чтении остатков из регистров. Если проводите оперативно то не важно передадите вы Границу или нет... чтение будет производится из таблицы остатков регистра рассчитанных на 3999 год.
    Вы передаёте момент времени и по нему система понимает оперативно проводится документ или нет.

    Нажмите, чтобы раскрыть...

    я не понял вашей фразы.

    Сразу скажу, первый и самый важный момент: смотрите то, что там остатки как-то будут читаться так или этак - это ведь и есть "алгоритм который использует разработчик". А если мне вообще не надо никакие остатки в моем документе при проведении читать? А что если при проведении мне надо читать остатки строго на начало года и не важно каким числом проводится документ? (не спрашивайте для чего, это просто пример с потолка). Таким образом разница между документом в разных режимах проведения - это то как разработчик конфигурации на это реагирует.

    А второй момент, хотел просто для себя спросить - вы о программном каком-то коде говорили в своей фразе или что? Я просто не понял.

    А, и да я подумал и все таки поправлюсь насчет своей фразы.

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

    Нажмите, чтобы раскрыть...

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

  10. А если мне вообще не надо никакие остатки в моем документе при проведении читать?

    Нажмите, чтобы раскрыть...

    Это уже какие то допущения. Вопрос стоял в том есть ли разница в поведение платформы при оперативном или не оперативном проведение. По крайней мере я его понял так.

    Нажмите, чтобы раскрыть...

    Читайте хоть на начало прошлого года. Я говорил о том что если в параметры виртуальной таблицы регистра накопления передать МоментВремени(то есть дата+ссылка) то платформа определит оперативно или нет проводится документ. И если он проводится оперативно то данные будут прочитаны из виртуальной таблицы остатков на 3999 год(или 5999 год... не помню точно).

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

  11. Я говорил о том что если в параметры виртуальной таблицы регистра накопления передать МоментВремени(то есть дата+ссылка) то платформа определит оперативно или нет проводится документ. И если он проводится оперативно то данные будут прочитаны из виртуальной таблицы остатков на 3999 год(или 5999 год... не помню точно).
    То есть если мы захотим исключить например движения самого документа из результата запроса и передадим например "границу" исключающую движения самого документа то это не сработает. И нужно предварительно очистить движения этого документа.
    Понимание этого механизма проверятся на спеце по платформе и разбирается подробно при подготовке.

    Нажмите, чтобы раскрыть...

    Понятно. Той статье Чистова в которой это разбирается (он же кажется писал?) наверно года два уже.
    Баг 1С выдается за фичу. Ну по факту баг это или фича не важно, но да, такой момент есть.
    Да, принимаю.

    Но, опять таки чтение остатков при проведении - это алгоритм или нет?
    Я думаю что алгоритм. Более того это конкретный алгоритм контроля остатков.
    И? Если мы уберем контроль остатков как алгоритм, то
    ?

В чем же отличие между неоперативным и оперативным проведением документов? Бухгалтера , использующие программу 1С: Предприятие 8 зачастую должны выбирать один из двух режимов проведения документов -либо оперативный, либо неоперативный. Такая процедура особенно непонятна тем пользователям, которые ранее работали в программах 1С: Предприятие. Версия 7.7. Процедура проведения документов в этой программе была определена однозначно, а в программе 1С: Предприятие 8 необходимо установить режим оперативного или неоперативного проведения. Так чем же они отличаются друг от друга?

Для понимания сути вопроса необходимо остановиться на понятии «проведение» в терминологии 1С? В 1С термин «проведение» - это свойство, которое имеют документы, создаваемые для записи первичной информации об осуществленной операции. Однако, различные документы могут содержать информацию об одной и той же хозяйственной операции, следовательно, при создании первичного документа такая информация должна попасть в эти документы и сохраниться там. Такая операция в 1С называется «проведением».

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

Если документ проводится вчерашним днем , то программа по умолчанию устанавливает режим неоперативного проведения. То же происходит и при создании нового документа - при этом в программе используется оперативный режим проведения. Но при корректировке документа и его перепроведении возникает необходимость выбора режима проведения.

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

Следующий момент. В типовых программах (1С: УПП 8 и 1С: УТ 8) программисты предусмотрели функции контроля всевозможных конфликтов, используя режим проведения документов. К примеру, для выполнения проведения операции реализации товаров программа осуществляет контроль достаточности запаса товаров на складе.

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

boston2005

26.10.12 — 21:33

Всем привет! Простой вопрос: имеется документ(любой), он учавствует как в бухучете, так и оперучете. Вопрос: какой должен быть режим проведения(оперативный, неоперативный) и, было бы неплохо, объяснить почему 🙂

zak555

1 — 26.10.12 — 21:36

переходи на 8.2

ILM

2 — 26.10.12 — 21:36

Ну если любой, то всёравно какой. Док ведь любой))

boston2005

3 — 26.10.12 — 21:37

сорри, неправильно написал. это и есть 8.2 Вопрос: оперативное проведение запретить или разрешить и почему

Djonny

4 — 26.10.12 — 21:39

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

boston2005

5 — 26.10.12 — 21:39

а документ Приходная/Расходная накладная

Djonny

6 — 26.10.12 — 21:40

zak555

7 — 26.10.12 — 21:47

http://infostart.ru/public/80344/

boston2005

8 — 26.10.12 — 21:52

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

AlexNew

9 — 26.10.12 — 22:44

При чем тут 8.2? Механизм реализации контроля поменялся в типовых, суть — нет.

Злопчинский

10 — 26.10.12 — 22:53

(7) >
Напомню, что под оперативным проведением в платформе 8.х понимается проведение документа текущей датой с присвоением ему в качестве времени оперативной отметки времени и установка параметра Режим проведения в процедуре Обработка проведения в значение Оперативный. Это принципиально отличает 8-ую версию платформы от версии 7.7 для которой использовалось понятие Точка актуальности и ничто не мешало проводить документы будущей датой.
.
Позавчерашний проведенный документ (или новый, записываемый в позавчера) — можно провети оперативно на отметку времени «позавчера»..?

aleks-id

11 — 26.10.12 — 22:54

переходи на рауз и забудь про оперативное/неоперативное

a_alenkin

12 — 26.10.12 — 22:56

(7)(офф)а что? — на мисте перестали банить за такие ссылки?

AlexNew

13 — 26.10.12 — 22:56

(10) Как в 8 оперативно на позавчера?

AlexNew

14 — 26.10.12 — 22:57

(12) За такие — да.

aleks-id

15 — 26.10.12 — 22:58

aleks-id

16 — 26.10.12 — 22:59

ну и за «логан» тоже могут забанить

AlexNew

17 — 26.10.12 — 23:00

aleks-id

18 — 26.10.12 — 23:01

(17) было бы чему

Злопчинский

19 — 27.10.12 — 01:57

(13) очень просто. так же как в 7.7 и прочих других самописках. при вводе документа позавчера мне надо знать — не произодет ли при проведении документа позавчерой уход в минус при проведении документа.

AlexNew

20 — 28.10.12 — 07:22

(19) Тут тебе это на поможет. Он уже будет неоперативный.

TurboConf 5 — расширение возможностей Конфигуратора 1С

ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку «Обновить» в браузере.

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

1С:Предприятие 8.1

Управление торговлей, ред. 10.3

В настройке дополнительных прав пользователей флаг «контролировать превышение объема заказа при отгрузке» не установлен. Почему при проведении документа «Реализация товаров и услуг» выдается сообщение о превышении резерва и накладная не проводиться?

Оперативное/Неоперативное проведение

Порядок действий:1.Ввели документ Заказа покупателя, далее зарезервировали товар в количестве 30 кг.2. На основании Заказа оформили документ Реализации товаров и услуг.3.Сняли флажок в Дополнительных настройках пользователя «контролировать превышение объема при отгрузке».4. При изменении количества реализуемого товара в документе «Реализация товаров и услуг», например, на 35 кг, при условии, что на складе до оформления Заказа было в свободном остатке данного товара 35 кг, программа выдает сообщение: Остаток резерва «Товар на складе «Главный склад» по документу «Заказ покупателя недостаточно. Не хватает 5 шт. Остаток 5шт. Требуется 35 шт.Является ли данное поведение программы правильным?Да эти шаги программы правильны.Отметка «контролировать превышение объема заказа при отгрузке» означает, что состав накладной должен полностью соответствовать заказу.Если флаг не установлен, то товар можно отгрузить сверх тех позиций, которые были указаны в заказе. Но эти дополнительные позиции должны быть отгружены со склада, а не из резерва (они не были зарезервированы).В данном случаи необходимо отгрузить товар из резерва, а часть товаров из текущего остатка на склад. Поэтому в реализации должно быть две строчки – в одной указано «Из резерва», а во второй «Со склада».Такое автономное разделение можно сделать в документе, если очистить распределение и нажать на кнопку «Заполнить и провести».

7. Отрицательные остатки — причины появления и методы работы с ними. Порядок работы с накладными.

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

Что такое отрицательные остатки? Это перерасход товара (продуктов).
Например, на складе кухни было 10 килограмм муки, которых (согласно технологическим картам) должно хватить на изготовление 20 булок хлеба (0,5 кг на булку), но изготовили и продали в этот день 21 булку хлеба. Таким образом при проведении расхода, со склада будет списано 10,5 кг. муки, что даст отрицательный остаток минус 0,5 кг. (10-10,5=-0,5).

Из этого примера видно, что отрицательный остаток — означает излишек товара на складе.
Откуда была взята мука на изготовление «лишней» булки хлеба? Откуда берутся отрицательные остатки? Разберем несколько вариантов их возникновения и способов работы с ними.

Самая вероятная причина — забыли внести приход в систему учета. То есть привезли ещё 0,5 кг. муки которую не учли. Решаеся путем пориходования товаров «задним» числом.

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

Или — воровство . Повар сознательно недокладывает продукты в блюдо, и «съэкономленные» товары уносит домой, или изготавливает из них блюда и продает «мимо кассы», по договоренности с официантами. А так как считать сколько недоложил — и сколько можно «пустить налево» непросто, то «лишние» блюда из «съэкономленных» товаров проходят через кассу.

Список можно продолжить, но думаю этого досточно. Главное, что отрицательные остатки — это не проблема , это информирование бухгалтера о возможных ошибках в учете или несоответсвии технологических процессов на кухне и в учете.

Что происходит, если появляются отрицательные остатки ?
Если на складе есть отрицательный остаток определённого товара, то на данный склад нельзя оприходовать этот товар.

Оперативное и неоперативное проведение документов 1С

Для описанного случая — это будет мука.

Что нужно сделать с отрицательными остатками (излишками)?
Излишки следует оприходовать на склад. Для этого необходимо:

а) Построить ведомость остатков, на дату в которой необходимо сделать приход. «Отчеты — Ведомость остатков — Ведомость остатков» Обратите внимание на установки фильтра в ведомости остатков. Рис. 30.

Рис.30. Построение ведомости остатков.

б) Провести копирование отрицательных остатков в сличительную ведомость — меню «документ — копировать в накладную» выбрать параметры как указано на рисунке:

Рис.31. Копирование отрицательных остатков в сличительную ведомость.

Рис.32. Сличительная ведомость с измененным кол-вом товара.

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


Рис.33. Процесс переноса сличительной ведомости на конец дня с 24 на 23 января.

Это необходимо для формирования корректных остатков на начало дня.

Хотелось бы акцентировать Ваше внимание на рекомендуемый порядок работы с документами в программе Store Hause. Итак, Вы пришли на работу:
1. Сделать приход за вчерашний день. (Создать приходные накладные), если приход был.
2. Сделать внутренее перемещение между складами за вчера, если таковые были.
3. Сделать расход (списание) блюд и товаров за вчера.
4. Проверить наличие отрицательных остатков на сегодняшний день. Если отрицательные остатки есть, то выполнить оприходование излишков, не забыть «перетащить» сличительные ведомости во «вчера».
При соблюдении данных правил, у вас не будут возникать ошибок связанных с «отрицательными остатками».

Отключение контроля остатков в 1С:Бухгалтерия

При попытке провести документ реализации выдается, что нет нужного количества на складе. При этом поступивший товар еще не оприходован в программу, но есть в наличии и уже нужно его отгружать. Можно ли отключить контроль остатков в 1С:Бухгалтерии редакции 3.0 ?

В программе 1С: Бухгалтерия 8 отключения контроля остатков производится следующим образом:

1). Необходимо зайти в меню Администрирование — выбрать пункт Проведение документов.

2). Устанавливается галочка для признака "Разрешить списание запасов при отсутствии остатков по данным учета".

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

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

Есть вопросы и нужна помощь специалиста 1С? Оставьте заявку! Оплата только за результат!

Многие компании используют механизмы резервирования товаров в 1C. Данное описание подходит для программ «1С:Управление торговлей, ред. 10.3» и «Управление производственным предприятием».

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

В этой статье мы постараемся исправить ситуацию, рассмотрим основные принципы резервирования и ответим на следующие вопросы:

Статья будет полезна пользователям, которые знакомы с программой и хотят обобщить свои знания по механизму резервирования.

Резервирование товара

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

Способ №1 – в заказе покупателя

В момент оформления заказа покупателя можно зарезервировать товары, указанные в заказе.

Меню: Документы – Продажи – Заказы покупателей

Для этого в таблице товаров нужно в колонке «Размещение» указать склад, на котором вы хотите сделать резерв.

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

Способ №2 – в корректировке заказе покупателя

Для исправления заказа покупателя многие пользователи создают документ «Корректировка заказа покупателя», указывая в нем добавляемые и удаляемые из заказа позиции.

Создать корректировку можно на основании заказа или вручную.

Меню: Документы – продажи – Корректировка заказа покупателя

Корректировка заказов покупателя также может устанавливать резерв, как и заказ покупателя. Указывайте склад в колонке «Размещение» или пользуйтесь кнопкой «Заполнить и провести».

Способ №3 – в документе «Резервирование товаров»

Поставить резерв можно отдельным документом «Резервирование товаров». Его можно создать на основании заказа покупателя или вручную.

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

Способ №4 – в момент поступления товаров

Этот способ действует, только если вы делаете заказы поставщикам для обеспечения заказов покупателей. В таком случае в заказе поставщику указывается, для какого покупателя заказан данный товар.

Меню: Документы – Закупки – Поступления товаров и услуг

Для установки резерва в поступлении товаров должна быть заполнена колонка «Заказ покупателя».

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

Способ №5 – во внутреннем заказе

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

Меню: Документы – Запасы (склад) – Внутренние заказы

Во внутреннем заказе, как и в заказе покупателя, присутствуют колонка «Размещение» и кнопка «Заполнить и провести», позволяющие поставить номенклатуру в резерв.

Это основные способы установки резерва. Самым популярным способом, естественно, является постановка резерва через документ «Заказ покупателя».

Помимо этих способов, есть другие варианты, когда программа может установить резерв:

  • В корректировке внутреннего заказа (по аналогии с корректировкой заказа покупателя)
  • В документе «Приходный ордер на товары», если установлен флаг «Без права продажи» (товары берутся на ответственное хранение)
  • В документе «Возврат товаров от покупателя» – при возврате товара, который был продан из резерва
  • В документе «Авансовый отчет», если подотчетник съездил за товарами по заказу поставщику (по аналогии с поступлением товаров).

Снятие товара с резерва в 1С

Для снятия резерва также существует множество способов, рассмотрим основные из них.

Способ №1 – в реализации товаров

В момент отгрузки товаров в программе оформляется документ «Реализация товаров и услуг».

Меню: Документы – Продажи – Реализации товаров и услуг

Если по заказу покупателя были зарезервированы товары, то в момент реализации резерв необходимо снять. Для того чтобы резерв с товаров был снят, нужно в таблице «Товары» указать способ списания «Из резерва».

В случае заполнения реализации товаров на основании заказа покупателя, программа сама определяет какой товар в резерве, а какой будет списан из свободного остатка на складе. Будьте очень внимательны при заполнении документа вручную: если указать способ списания «Со склада», товар спишется, но резерв по нему не снимется и «повиснет».

Способ №2 – в документе «Закрытие заказов покупателей »

Этот документ используется для закрытия заказов, по которым были не отгружены какие-то товары или клиент вообще отказался от покупки.

Меню: Документы – Продажи – Закрытие заказов покупателя

В документе указываются заказы покупателей, которые необходимо закрыть. В момент проведения документа программа проверяет, есть ли по указанным заказам резервы. Если есть резервы, то они автоматически снимаются.

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

Способ №3 – в документе «Резервирование товаров »

Помимо установки резерва, этот документ можно использовать также и для снятия резерва.

Меню: Документы – Продажи – Резервирование товаров

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

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

Способ №4 – в «Требовании-накладной » или «Перемещении товаров »

Документы «Требование-накладная» и «Перемещение товаров» используются для списания товаров на затраты подразделения и перемещения товаров с одного склада на другой соответственно.

Меню: Документы – Запасы (склад) – Перемещение товаров

Меню: Документы – Запасы (склад) – Требование-накладная

Если документы оформляются на основе внутреннего заказа, в котором был установлен резерв, то в момент проведения документов необходимо резерв снять. Для снятия резерва должна быть заполнена колонка «Документ резерва»:

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

Эти способы снятия резерва наиболее популярные, но есть и другие возможные ситуации:

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

Отчеты по резервированию товаров

Мы убедились, что возможностей для резервирования и снятия резерва в программе очень много. Более того, в большинстве случаев, программа ставит/снимает резерв автоматически, исходя из заполнения документа, никак не сигнализируя об этом пользователю.

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

Отчет «Товары в резерве на складах»

Меню: Отчеты – Запасы (склад) – Товары в резерве на складах

Этот отчет предназначен исключительно для получения информации по резервам. Благодаря ему вы всегда можете узнать: какие товары, по какому заказу и на каком складе находятся в резерве.

Отчет можно настраивать: ставить отборы, менять состав группировок и т.д.

Отчет «Анализ доступности товаров на складах»

Меню: Отчеты – Запасы (склад) – Анализ доступности товаров на складах

Этот отчет показывает более подробную информацию об остатке товара на складе. В нем вы можете посмотреть остаток товара на складе, резерв, количество товара, заказанного у поставщика, и другую информацию:

Для тех, кто работал с конфигурациями 1С, в которых ведется оперативный учет, скорее всего, знакома форма, которая показана на рисунке рядом. Документ проводится сегодняшним числом, и программа 1С предлагает 2 варианта проведения этого документа.

Рассмотрим, что же означают эти режимы проведения документов…

Где применяется?

1С:Управление торговлей 10.3

1С:Управление производственным предприятием 1.3

1С: Комплексная автоматизация 1.1

Оперативное проведение документа 1С

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

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

При оперативном проведении в большинстве конфигураций выполняется проверка на наличие остатков. Если к примеру, на складе нет остатка, то товарный документ не проведется.

Невозможно оперативно провести документ будущей датой.

Неоперативное проведение документа 1С

Неоперативно можно провести документ за любую дату, при этом дата и время документа не изменятся.

При неоперативном проведении остатки могут не контролироваться. Например, документ проводится, но при этом выдает сообщение об отсутствии товара на складе.

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