База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › В чём разница между старой и новой методикой контроля остатков в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 20 минут назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
19 октября 2026 в 19:17 #38870
Готовлюсь к экзамену 1с:специалист. Объясни пошагово, в чём разница между старой и новой методикой контроля остатков и когда их нужно применять.
-
19 октября 2026 в 19:17 #38871
На экзамене под старой и новой методикой контроля остатков обычно понимают порядок выполнения трех операций:
1. удаление старых движений текущего документа;
2. установка блокировки;
3. чтение остатков и формирование новых движений.Главное различие: в какой момент устанавливается блокировка относительно удаления старых движений.
—
# 1. Зачем вообще нужно удалять старые движения
Рассмотрим документ, который уже был проведен.
Например, раньше документ списывал:
1С (Код)1Товар А: 3 штукиПозже пользователь изменил документ:
1С (Код)1Товар А: 5 штукПеред повторной проверкой остатков старые движения текущего документа нужно удалить. Иначе остаток будет рассчитан неправильно.
Было:
1С (Код)123Фактический остаток без этого документа: 10Старое движение документа: расход 3Остаток с учетом старого документа: 7Если при перепроведении нужно списать 5, проверять надо остаток 10, а не 7.
Для удаления прежних движений текущего документа используется:
1С (Код)12Движения.ОстаткиНоменклатуры.Записывать = Истина;Движения.Записать();После этого старые движения текущего документа удаляются из регистра.
Важно: эта команда не записывает новые движения, потому что новые движения еще не добавлены в коллекцию. Она фактически удаляет старые движения текущего документа.
—
# 2. Старая методика
Старая последовательность выглядит так:
1С (Код)1234561. Разрешить запись движений.2. Записать движения, чтобы удалить старые движения текущего документа.3. Установить блокировку.4. Прочитать остатки.5. Проверить наличие товара.6. Добавить новые движения.Пример:
1С (Код)1234567891011121314151617181920212223242526Движения.ОстаткиНоменклатуры.Записывать = Истина;Движения.Записать();Блокировка = Новый БлокировкаДанных;ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");ЭлементБлокировки.УстановитьЗначение("Склад",Склад);ЭлементБлокировки.Режим =РежимБлокировкиДанных.Исключительный;ЭлементБлокировки.ИсточникДанных =СписокНоменклатуры;ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура");Блокировка.Заблокировать();Затем выполняется запрос остатков:
1С (Код)12345678910111213141516171819202122232425262728Запрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| Остатки.Номенклатура КАК Номенклатура,| Остатки.КоличествоОстаток КАК КоличествоОстаток|ИЗ| РегистрНакопления.ОстаткиНоменклатуры.Остатки(| &МоментВремени,| Номенклатура В| (| ВЫБРАТЬ| Товары.Номенклатура| ИЗ| &Товары КАК Товары| )| И Склад = &Склад| ) КАК Остатки";Запрос.УстановитьПараметр("МоментВремени",МоментВремени());Запрос.УстановитьПараметр("Склад",Склад);## Проблема старой методики
Между командами:
1С (Код)1Движения.Записать();и:
1С (Код)1Блокировка.Заблокировать();существует промежуток времени, когда старые движения текущего документа уже удалены, но нужные данные еще не заблокированы.
Условно:
1С (Код)12345Старые движения удалены↓Остатки еще не заблокированы↓Установлена блокировкаВ этот промежуток другой пользователь может начать проведение документа по тем же товарам.
Это создает несколько проблем:
— другой документ может прочитать остатки до установки блокировки;
— несколько документов могут одновременно начать проверку одного товара;
— удаление старых движений и проверка остатков выполняются не в одной защищенной последовательности;
— при сложной схеме блокировок возможны конфликты и взаимные ожидания.Старая методика часто встречается в старых материалах, старых экзаменационных решениях и типовых примерах.
—
# 3. Новая методика
В новой методике порядок меняется:
1С (Код)1234561. Разрешить запись движений.2. Установить блокировку.3. Удалить старые движения текущего документа.4. Прочитать остатки.5. Проверить наличие товара.6. Добавить новые движения.То есть блокировка ставится до
Движения.Записать().Пример:
1С (Код)12345678910111213141516171819202122232425262728Движения.ОстаткиНоменклатуры.Записывать = Истина;Блокировка = Новый БлокировкаДанных;ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");ЭлементБлокировки.УстановитьЗначение("Склад",Склад);ЭлементБлокировки.Режим =РежимБлокировкиДанных.Исключительный;ЭлементБлокировки.ИсточникДанных =СписокНоменклатуры;ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура");Блокировка.Заблокировать();// Теперь старые движения удаляются уже внутри защищенного участка.Движения.Записать();После этого читаются остатки:
1С (Код)12345678910111213141516171819202122232425262728Запрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| Остатки.Номенклатура КАК Номенклатура,| Остатки.КоличествоОстаток КАК КоличествоОстаток|ИЗ| РегистрНакопления.ОстаткиНоменклатуры.Остатки(| &МоментВремени,| Номенклатура В| (| ВЫБРАТЬ| Товары.Номенклатура| ИЗ| &Товары КАК Товары| )| И Склад = &Склад| ) КАК Остатки";Запрос.УстановитьПараметр("МоментВремени",МоментВремени());Запрос.УстановитьПараметр("Склад",Склад);## Преимущество новой методики
Получается защищенная последовательность:
1С (Код)123456789Получили блокировку↓Удалили старые движения↓Прочитали остатки↓Проверили наличие↓Сформировали новые движенияДругой документ не сможет вмешаться в работу с теми же складом и номенклатурой между удалением старых движений и проверкой остатков.
—
# 4. Сравнение на конкретном примере
Пусть имеется:
1С (Код)123Склад: Основной складТовар: Товар АФактический остаток: 10Есть два документа:
1С (Код)12Документ 1: списать 7Документ 2: списать 7Они проводятся почти одновременно.
## При корректной блокировке
Документ 1:
1С (Код)1234Установил блокировкуПрочитал остаток 10Списал 7Завершил проведениеДокумент 2:
1С (Код)1234Получил блокировку после документа 1Прочитал остаток 3Обнаружил нехваткуНе провелсяОтрицательного остатка не возникает.
## При отсутствии блокировки
Оба документа могут сделать так:
1С (Код)1234Документ 1 прочитал остаток 10Документ 2 прочитал остаток 10Документ 1 списал 7Документ 2 списал 7Итог:
1С (Код)110 - 7 - 7 = -4Именно поэтому блокировка должна быть установлена до чтения остатков.
—
# 5. Почему в новой методике
Движения.Записать()идет после блокировкиНа первый взгляд кажется, что это нелогично:
1С (Код)12Блокировка.Заблокировать();Движения.Записать();Ведь
Движения.Записать()удаляет старые движения, а не проверяет остатки.Но при перепроведении документа это обязательная часть алгоритма:
1С (Код)123456789Документ уже имеет старые движения↓Получаем блокировку по нужным остаткам↓Удаляем старые движения↓Считаем остатки без старой версии документа↓Формируем новую версию движенийИменно поэтому новая методика безопаснее.
—
# 6. Что блокируется в новой методике
Блокируется не виртуальная таблица
.Остатки, а сам регистр:1С (Код)123ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");В запросе используется виртуальная таблица:
1С (Код)1|РегистрНакопления.ОстаткиНоменклатуры.Остатки(...)Это разные вещи:
1С (Код)1РегистрНакопления.ОстаткиНоменклатурыэто объект данных, по которому устанавливается блокировка.
1С (Код)1РегистрНакопления.ОстаткиНоменклатуры.Остаткиэто виртуальная таблица запроса, через которую платформа рассчитывает остатки.
Поэтому в блокировке:
1С (Код)1"РегистрНакопления.ОстаткиНоменклатуры"А в запросе:
1С (Код)1|РегистрНакопления.ОстаткиНоменклатуры.Остатки(...)—
# 7. Зачем передавать табличную часть как источник данных
В новой методике часто используется:
1С (Код)1234567ЭлементБлокировки.ИсточникДанных =СписокНоменклатуры;ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура");Это означает:
1С (Код)12Блокировать регистр по складу текущего документаи по номенклатуре из табличной части текущего документа.Например, табличная часть содержит:
1С (Код)123Товар АТовар БТовар ВТогда блокировка устанавливается примерно по условию:
1С (Код)12Склад = Основной складИ Номенклатура В (Товар А, Товар Б, Товар В)Табличная часть сама не блокируется. Она используется только как источник значений для отбора.
—
# 8. Когда применять старую методику
Старую методику можно встретить:
— в старых учебных материалах;
— в старых решениях экзаменационных задач;
— в коде, написанном до распространения новой схемы управляемых блокировок;
— в примерах, где не рассматривается безопасное перепроведение;
— в конфигурациях, где алгоритм уже построен именно таким образом и его нельзя быстро изменить.С точки зрения подготовки к экзамену ее нужно знать, потому что в старых сборниках и видео она встречается достаточно часто.
Но если в задании требуется современная реализация оперативного проведения с управляемыми блокировками, предпочтительнее использовать новую методику.
—
# 9. Когда применять новую методику
Новую методику нужно использовать, когда:
— документ является оперативным;
— есть контроль остатков;
— документ может проводиться одновременно с другими документами;
— документ может перепроводиться;
— необходимо защититься от отрицательных остатков;
— используется управляемый режим блокировок;
— в задании явно говорится о конкурентном проведении или необходимости исключить отрицательные остатки.На экзамене это обычно безопасный основной вариант.
—
# 10. Полный каркас новой методики
Общая схема:
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121Процедура ОбработкаПроведения(Отказ, Режим)Движения.ОстаткиНоменклатуры.Записывать = Истина;Блокировка = Новый БлокировкаДанных;ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");ЭлементБлокировки.УстановитьЗначение("Склад",Склад);ЭлементБлокировки.Режим =РежимБлокировкиДанных.Исключительный;ЭлементБлокировки.ИсточникДанных =СписокНоменклатуры;ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура");Блокировка.Заблокировать();// Удаление старых движений текущего документа.Движения.Записать();// Получение остатков.Запрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| Товары.Номенклатура КАК Номенклатура,| Товары.Количество КАК Количество,| ЕСТЬNULL(| Остатки.КоличествоОстаток,| 0| ) КАК КоличествоОстаток|ИЗ| &Товары КАК Товары| ЛЕВОЕ СОЕДИНЕНИЕ| РегистрНакопления.ОстаткиНоменклатуры.Остатки(| &МоментВремени,| Номенклатура В| (| ВЫБРАТЬ| Товары.Номенклатура| ИЗ| &Товары КАК Товары| )| И Склад = &Склад| ) КАК Остатки| ПО Товары.Номенклатура =| Остатки.Номенклатура";Запрос.УстановитьПараметр("МоментВремени",МоментВремени());Запрос.УстановитьПараметр("Склад",Склад);Запрос.УстановитьПараметр("Товары",СписокНоменклатуры.Выгрузить());РезультатЗапроса = Запрос.Выполнить();ТаблицаОстатков = РезультатЗапроса.Выгрузить();// Сначала полностью проверяем документ.Для каждого СтрокаОстатковИз ТаблицаОстатков ЦиклЕсли СтрокаОстатков.Количество >СтрокаОстатков.КоличествоОстаток ТогдаСообщение = Новый СообщениеПользователю;Сообщение.Текст ="Недостаточно товара "+ Строка(СтрокаОстатков.Номенклатура);Сообщение.Сообщить();Отказ = Истина;КонецЕсли;КонецЦикла;Если Отказ ТогдаВозврат;КонецЕсли;// Только после полной проверки формируем движения.Для каждого СтрокаОстатковИз ТаблицаОстатков ЦиклДвижение =Движения.ОстаткиНоменклатуры.Добавить();Движение.ВидДвижения =ВидДвиженияНакопления.Расход;Движение.Период = Дата;Движение.Номенклатура =СтрокаОстатков.Номенклатура;Движение.Склад = Склад;Движение.Количество =СтрокаОстатков.Количество;КонецЦикла;КонецПроцедурыВ экзаменационном решении структура может отличаться, но логика должна быть такой:
1С (Код)1234567установить признак записи движенийустановить блокировкузаписать старые движенияполучить остаткипроверить все строкипри нехватке завершить проведениепри отсутствии ошибок сформировать движения—
# 11. Важная оговорка для экзамена
На конкретном экзамене нужно ориентироваться прежде всего на:
— формулировку задания;
— методические рекомендации к текущей версии экзамена;
— каркас конфигурации;
— требования к оперативному или неоперативному проведению;
— наличие управляемого режима блокировок.Термины «старая методика» и «новая методика» могут использоваться авторами учебных материалов немного по-разному. Но практически важное отличие обычно заключается именно в этом:
1С (Код)1234567Старая методика:Движения.Записать();Блокировка.Заблокировать();Новая методика:Блокировка.Заблокировать();Движения.Записать();Для современного решения контроля остатков при конкурентном проведении используйте:
1С (Код)12Блокировка.Заблокировать();Движения.Записать();Затем читайте остатки и только после успешной проверки формируйте новые движения.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.