Неотрицательные остатки

Публикация № 1721980 12.09.22

Пользовательские инструменты - Адаптация типовых решений

неотрицательные остатки

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

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

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

Первое расширение регистров, которое я хочу предложить, назовем регистром с неотрицательным остатком. Этот регистр работает точно так же, как обычный регистр накопления, за исключением одного момента. При формировании виртуальной таблицы остатков, сначала вычисляются наиболее подробные остатки, т.е остатки по всем измерениям. К этим остаткам применяется операция max(,0). И только после этого выполняется агрегация.

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

У нас есть связка документов Заказ покупателя - Отгрузка. Отгрузка вводится на основании Заказа. При этом возможна связь один-ко-многим. Т.е. на основании одного Заказа может вводиться несколько Отгрузок.

 

 

 

 

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

 

 

Запись в этот регистр из документа Заказ очевидна

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	//Регистр Резервирование - это регистр с неотрицательным остатком
	//для получения остатков по этому регистру следует обращаться к функции ОстаткиПлюс()
	//общего модуля РасширениеРегистров
	Движения.Резервирование.Записывать=истина;
	для каждого стр из Товары цикл
		дв=Движения.Резервирование.Добавить();
		дв.ВидДвижения=ВидДвиженияНакопления.Приход;
		дв.Период=Дата;
		дв.Заказ=Ссылка;
		дв.Товар=стр.Товар;
		дв.Количество=стр.Количество;
	конеццикла;
КонецПроцедуры

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	//Регистр Резервирование - это регистр с неотрицательным остатком
	//для получения остатков по этому регистру следует обращаться к функции ОстаткиПлюс()
	//общего модуля РасширениеРегистров
	если не Основание.Пустая() тогда
		Движения.Резервирование.Записывать=истина;
		для каждого стр из Товары цикл
			дв=Движения.Резервирование.Добавить();
			дв.ВидДвижения=ВидДвиженияНакопления.Расход;
			дв.Период=Дата;
			дв.Заказ=Основание;
			дв.Товар=стр.Товар;
			дв.Количество=стр.Количество;
		конеццикла;
	конецесли;
КонецПроцедуры

В нашем случае мы получим по Товар1 остаток -14. С тех пор, как разработчики платформы 1С убрали обязательное ежемесячное хранение в регистрах накопления, отрицательные остатки, как таковые, перестали быть проблемой. Также нет проблемы с тем, чтобы правильно интерпретировать отрицательный остаток. Можно принимать любые значения <=0 за отсутствие резерва. Но все же мы не можем оставить отрицательные остатки в регистре Резервирование, потому что данные агрегируются.

У нас может быть еще один заказ

 

 

 

И тогда обращение к виртуальной таблице остатков даст нам резерв 15-14=1, что будет неприемлемо.

В общем модуле определим следующую функцию 

Функция ОстаткиПлюс(ИмяРегистра,МоментВремени=неопределено,Отбор=неопределено,Детализация="") экспорт
	тз=РегистрыНакопления[ИмяРегистра].Остатки(МоментВремени,Отбор);
	для каждого стр из тз цикл
		для каждого рес из метаданные.РегистрыНакопления[ИмяРегистра].Ресурсы цикл
			стр[рес.имя]=макс(стр[рес.имя],0);
		конеццикла;	
	конеццикла;
	если не ЗначениеЗаполнено(Детализация) тогда
		для каждого рес из метаданные.РегистрыНакопления[ИмяРегистра].Измерения цикл
			Детализация=Детализация+рес.имя+",";
		конеццикла;
		Детализация=лев(Детализация,стрдлина(Детализация)-1);
	конецесли;
	ресурсы="";
	для каждого рес из метаданные.РегистрыНакопления[ИмяРегистра].Ресурсы цикл
		ресурсы=ресурсы+рес.имя+",";
	конеццикла;
	ресурсы=лев(ресурсы,стрдлина(ресурсы)-1);
	тз.свернуть(Детализация,ресурсы);
	возврат тз;
КонецФункции

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

 

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

Скачать файлы

Наименование Файл Версия Размер
Неотрицательные остатки:

.dt 103,67Kb
8
.dt 103,67Kb 8 Скачать бесплатно

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. CheBurator 3074 12.09.22 10:47 Сейчас в теме
Проще при проведении отгрузки списывать с резерва не то, что указано в отгрузке, а опираться на пересечение с таблицей резервов по документу-основанию.
.
в описанном в статье подходе
1. убирается полностью одно из важнейших свойств РН - возможность получать сразу агрегированные резервы
2. количество чтений результатов из регистра обычно очень намного превосходит количество записей в регистр, будут просадка по производительности.
3. имея "отрицательные" показатели - мы не сможем их правильно трактовать - это ошибка или это "правильно"..? - теряем управление над поведением программы/дествиями пользователя
JohnyDeath; +1 Ответить
3. CheBurator 3074 12.09.22 10:49 Сейчас в теме
(1) плюс к этому можно поступить даже проще - если при проведении получается отрицательное - а это выясняется очень быстро - проверим остатки после записи - на отрицательную дельту сразу "корректируем" запись в регистр чтобы не было "отрицательных" значений и тгогда нафиг не надо никаких допизвращенйи при получении агрегированных данных
2. CheBurator 3074 12.09.22 10:47 Сейчас в теме
4. mkalimulin 658 12.09.22 10:53 Сейчас в теме
И я об этом же думал.
Но все перевешивает функциональный подход. Дождитесь следующей публикации, и там увидите всю его прелесть
5. user1466751 12.09.22 12:00 Сейчас в теме
Слов нет. Вы посмотрите время выполнения этого кода хотя бы на 1 млн заказах. Ну, хочется извращений, сделайте вы это в запросе, зачем это все в код выносить?
Уж не говорим о не закрытой таблице остатков при этом, пухнущей день ото дня, при таком списании резервов реализацией.
Оставьте свое сообщение

См. также

Расширенные регистры

Адаптация типовых решений Платформа 1С v8.3 Бесплатно (free)

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

26.09.2022    572    8    mkalimulin    27    

Остаток в табличной части документа

Обработка документов Склад и ТМЦ Адаптация типовых решений Платформа 1С v8.3 1С:Управление торговлей 11 Россия Управленческий учет Бесплатно (free)

Расширение, показывающее остаток номенклатуры на текущий момент времени по строчке в табличной части документов.

16.01.2022    2922    102    user720820720    2    

Исправление ошибки формирования КУДИР в части возврата от покупателя по безналу в отчете о розничных продажах. 1С:Бухгалтерия 8.3

Розничная торговля Адаптация типовых решений Учет доходов и расходов Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет ИП, ПБОЮЛ, КФХ Бесплатно (free)

При возврате денег покупателю по безналичному расчету в книгу доходов и расходов 1С: Бухгалтерии 3.0 ошибочно пишется запись с отрицательной суммой возврата. В книжке по итогу на эту сумму получается меньше на сумму этого возврата. Расширение конфигурации - костыль для отчета о розничных продажах по возврату безнала от розничного покупателя.

29.07.2021    2853    14    PS_    1    

Заполнение контрагентов по ИНН. Назад в будущее

Адаптация типовых решений Платформа 1С v8.3 Россия Бесплатно (free)

Что делать, если Ваш клиент не смог выйти из каменного века и вместо вменяемой часто модифицируемой под нужды современного мира конфигурации, у него неподъемный мамонт, который пережил несколько ледниковых эпох, такой неуклюжий, умирающий, но близкий к бизнесу и родной сердцу? Проблемы начинаются тогда, когда у этого мамонта отваливаются зубья, или его обладатель поглядывает на современные конфигурации и начинает желать новшеств в виде весоподъемности и скорости самолета. Да вообще и чтобы все, что должно работать, работало в конце концов, как, например, внезапно умерший сервис 1С:Контрагент! А у некоторых мамонтов, он, совершенно точно, провонял и усох. И вот как положить этот артефакт в микроволновку времени и вернуть к работоспособному состоянию.

12.05.2020    5570    0    G.Shatrov    7    

Подсистема хранения файлов

Адаптация типовых решений Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

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

23.03.2010    8691    768    koreav    32    

Механизм блокирования "некорректных" (запрещенных) проводок

Адаптация типовых решений Платформа 1С v8.3 1С:Бухгалтерия 2.0 Россия Бухгалтерский учет Бесплатно (free)

Механизм позволяет настроить правила, по которым будут блокироваться указанные НЕКОРРЕКТНЫЕ (запрещенные) корреспонденции... Полезно при вводе информации для "выпрямления рук" у некоторых бухгалтеров после перехода с других бухгалтерских программ :)

14.11.2009    16009    59    KukA.5    50    

Подсистема "Учет по доп. аналитике" (8.1)

Адаптация типовых решений Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Подсистема "Учет по доп.аналитике" - это дополнение к любой конфигурации на 8.1 решает основную задачу: не ломая конфигурации добавить к нужным документам учет по дополнительной аналитике (аналитикой может выступать как в данном примере Агент по продаже и его вознаграждение или Проект и его руководитель как в файле описания). Данная подсистема является продуктом, готовым к использованию, как дополнение к типовой конфигурации (или к любой конфигурации). Подсистема снова БЕСПЛАТНО (то есть даром) :)

07.09.2009    15277    405    KukA.5    41