Плохой контроль остатков серий в УНФ 3.0

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

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

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

Можно было бы поработать с файловой копией, но все это вопрос времени.

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

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


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

	ОрганизацияДляПроведения = Константы.УчетПоКомпании.Компания(ЭтотОбъект.Ссылка.Организация);
	
    З.УстановитьПараметр("Дата", Граница);                    
    З.УстановитьПараметр("ОрганизацияДляПроведения", ОрганизацияДляПроведения);   
	З.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка);


    Выборка = З.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл       
		Если Выборка.Остаток < Выборка.Количество Тогда
			Сообщить("По серии " + Выборка.Серия + " номенклатуры: " + Выборка.Номенклатура + 
			" остаток: " + Выборка.Остаток + 
			" меньше, чем требуется списать: " + Выборка.Количество +
			" по организации: " +ОрганизацияДляПроведения
			, СтатусСообщения.Важное);
			Отказ = истина;
		КонецЕсли;
    КонецЦикла;

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

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

Среда: УНФ 3.0.6.200 Объем: 1 час

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 4

  1. rzd:

    А в таблицу остатков выгребать все данные, на это надо обратить внимание?

    • мелочи жизни. Пусть работает оптимизатор запросов.

      • rzd:

        Скажи мне пожалуйста, как устроен вызов виртуальной таблицы остатки в 1с с точки зрения SQL? Это к тому, а сможет ли оптимизатор?

        И это но только лишь избыточные данные, это ещё и никому не нужные блокировки.

        В целом же это не мелочи, а культура разработки.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *