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

04.01.23

Задачи пользователя - Адаптация типовых решений

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

Бесплатные

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Узнавайте о новых бесплатных решениях в нашей телеграм-группе Инфостарт БЕСПЛАТНО

Наименование Скачано Бесплатно
Неотрицательные остатки:
.dt 103,67Kb
12 Скачать бесплатно

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

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

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

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

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

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

 

 

 

 

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

 

 

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

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

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

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

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

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

 

 

 

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

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

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

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

 

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

Вступайте в нашу телеграмм-группу Инфостарт

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

См. также

Разработка Адаптация типовых решений Производство готовой продукции (работ, услуг) Розничная торговля 1С:Управление торговлей 10 Россия Платные (руб)

Доработка для 1С:Управление торговлей 10.3 (релиз 10.3.88.3) добавляет поддержку маркировки новых категорий товаров согласно постановлениям Правительства РФ 2025–2026 гг. Конфигурация УТ 10.3 снята с поддержки — новые маркируемые категории в типовую поставку больше не попадают. Доработка закрывает этот пробел: новые виды номенклатуры, обмен с ГИС МТ «Честный Знак». Поставляется в виде файла .cf

14640 руб.

23.04.2026    1572    12    13    

16

Адаптация типовых решений БСП (Библиотека стандартных подсистем) Кадровый учет ЭДО и ОФД 1C:Бухгалтерия 1С:Зарплата и кадры 7.7 1C:ERP 1С:ЗУП 1С:УТ 1С:ДО Платные (руб)

Наше расширение 1С Госключ обеспечивает интеграцию любой конфигурации 1С на базе БСП с мобильным приложением «Госключ», позволяя сотрудникам подписывать кадровые документы (КЭДО) и документы материальной ответственности (МОЛ, ПБ) усиленной электронной подписью прямо со смартфона. Решение автоматизирует формирование и отправку документов на подпись, отслеживает статусы подписания и хранит подписанные файлы непосредственно в базе 1С

25000 руб.

06.03.2026    1384    4    0    

3

Печатные формы Адаптация типовых решений Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение позволяет вывести в табличном документе факсимиле печати и подписей и/или вывести произвольную картинку из прикреплённых файлов организации для 1С УТ 11.5, КА 2.5, ERP 2.5, УНФ 3, Розница 3. Вывод факсимиле возможен в табличные документы УПД, УКД, Счёт-фактура, ТОРГ-12 и другие. Возможно настроить вывод для любых типовых макетов (Акт сверки, М-15, ТТН), для этого потребуется отредактировать макет и разместить на нём картинки с соответствующими именами, при выводе на печать в размещённые картинки будут выводиться факсимиле из прикреплённых рисунков. Редактирование осуществляется через типовой механизм в пользовательском интерфейсе.

6000 руб.

07.02.2023    13626    120    25    

76

Адаптация типовых решений 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Расширение для вывода информации об остатках и ценах номенклатуры в форме списка и выбора номенклатуры. (УТ 11, КА 2, ERP). Позволяет получать информацию о ценах, остатках и доступности в разрезе складов и характеристик номенклатуры, информацию по документам резерва.

7930 руб.

16.10.2025    1549    2    0    

2

Логистика, склад и ТМЦ Адаптация типовых решений Пользователь 1С:Предприятие 8 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Расширение для УНФ, чтобы автоматически отменять старые резервы и не мешалть эффективно продавать.

9150 руб.

02.08.2023    8442    26    5    

41

Адаптация типовых решений 1С 8.3 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Беларусь Россия Платные (руб)

Расширение "Дополнительные документы" предназначено для создания дополнительных документов различного назначения, как форм для внесения данных так и печатных форм в расширяемой конфигурации пользовательскими средствами, без работы в конфигураторе и внесения изменений в структуру данных. Тестировалось для "1С:БП", "1С:УНФ","1С:КА"

21859 руб.

29.12.2025    1594    1    8    

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