Битва за кратность в УТ11

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

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

Место 1. Обработка ПодборТоваровВДокументПродажи

Расширяем процедуру ДобавитьВКорзинуНаКлиенте. Подменяем количество на кратное, если была подмена, выводим предупреждающее окно:

Подбирает правильно:

Проверим граничные значения количества:

&НаКлиенте
&Вместо("ДобавитьВКорзинуНаКлиенте")
Функция дор_ДобавитьВКорзинуНаКлиенте(ПараметрыТовара, НовыеСтроки)
	//Осипов 2021-07-30 контролируем количество товара
	Кэш = Новый Структура();
	Для Каждого Строка ИЗ НовыеСтроки Цикл
		_Сервер.ИзмененоЛиКоличествоПодКратность(Строка.Номенклатура, Строка.КоличествоУпаковок, Кэш); 
	КонецЦикла;
	Если Кэш.Свойство("Текст") Тогда
		ПоказатьПредупреждение(, "Изменена кратность: " + Символы.ПС + Кэш.Текст);
	КонецЕсли;
	Результат = ПродолжитьВызов(ПараметрыТовара, НовыеСтроки);
	Возврат Результат;
КонецФункции

Место 2. Форма ФормаДокументаРМК чека ККМ.

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

Код отрабатывает должным образом:

&НаКлиенте
Процедура дор_ТоварыКоличествоУпаковокПриИзмененииПеред(Элемент)
	//Осипов 2021-07-30 контролируем количество товара под кратность
	Кэш = Новый Структура();
	ТекСтрока = Элементы.Товары.ТекущиеДанные;
	Если  _Сервер.ИзмененоЛиКоличествоПодКратность(ТекСтрока.Номенклатура, ТекСтрока.КоличествоУпаковок, Кэш) Тогда 
		ПоказатьПредупреждение(, "Изменена кратность: " + Символы.ПС + Кэш.Текст);
	КонецЕсли;
КонецПроцедуры

Место 3. Форма ФормаДокумента реализации товаров.

Код выглядит аналогично чеку:

&НаКлиенте
Процедура дор_ТоварыКоличествоУпаковокПриИзмененииПеред()
	//ОСипов 2021-08-02 добавляем контроль
	Кэш = Новый Структура();
	ТекСтрока = Элементы.Товары.ТекущиеДанные;
	Если  _Сервер.ИзмененоЛиКоличествоПодКратность(ТекСтрока.Номенклатура, ТекСтрока.КоличествоУпаковок, Кэш) Тогда 
		ПоказатьПредупреждение(, "Изменена кратность: " + Символы.ПС + Кэш.Текст);
	КонецЕсли;
КонецПроцедуры

Работает корректно:

Общий код

Код по проверке кратности находится в Модуль _Сервер:

Функция	ИзмененоЛиКоличествоПодКратность(Номенклатура, Количество, Кэш) Экспорт
	//истина - если изменено
	КратностьРеквизит = _Сервер.ДатьДопСвойствоВТЧ(Номенклатура.ДополнительныеРеквизиты, "КратностьПродажи");
	Если ЗначениеЗаполнено(КратностьРеквизит) Тогда
		Попытка
			КратностьСтрокой = СокрЛП(КратностьРеквизит.Наименование);
			Кратность = Число(КратностьСтрокой);
		Исключение
			Сообщить("У номенклатуры: " + Номенклатура + " кратность задана не числом: " + КратностьСтрокой);
		КонецПопытки;
		КоличествоНач = Количество;
		Количество = Число(Кратность) * (Цел(Количество/Кратность) + ?(Количество % Кратность = 0, 0, 1));
		Если НЕ Кэш.Свойство("Текст") Тогда
			Кэш.Вставить("Текст", "");
		КонецЕсли;
		Кэш.Текст = Кэш.Текст + ?(Кэш.Текст = "", "", Символы.ПС) + "Количество изменено с: " + КоличествоНач + " на: " + Количество + " (кратность " + Кратность + ")";
		Возврат истина;
	КонецЕсли;
	Возврат ложь;
КонецФункции

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

Объем план: 1.2 час Среда: УТ 11.4.13.46

fixin

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

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

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

  1. Вячеслав:

    Создал расширение. Но ругается что не может найти реквизит КратностьПродажи. В программировании новичек(

    _Сервер.ДатьДопСвойствоВТЧ(Номенклатура.ДополнительныеРеквизиты, «КратностьПродажи»);

    • нужно добавить доп. свойство у номенклатуры с идентификатором КратностьПродажи и прописать функцию получения доп.свойства:


      Функция ДатьДопСвойство(ИдентификаторДляФормул) Экспорт
      Возврат ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("ИдентификаторДляФормул", ИдентификаторДляФормул);
      КонецФункции

      Функция ДатьДопСвойствоВТЧ(Знач ТЧ, ИдентификаторДляФормул) Экспорт
      ИскСвойство = ДатьДопСвойство(ИдентификаторДляФормул);
      ИскСтроки = ТЧ.НайтиСтроки(Новый Структура("Свойство", ИскСвойство));
      Если ИскСтроки.Количество() = 0 Тогда
      Возврат Неопределено;
      КонецЕсли;
      Возврат ИскСтроки[0].Значение;
      КонецФункции

  2. Алексей:

    Функция ИзмененоЛиКоличествоПодКратность(Номенклатура, Количество, Кэш) Экспорт
    будет всегда выдавать предупреждение при наличие реквизита кратность, даже в случае ввода кратного количества. Непонятно зачем, если ввод количества правильный.
    Функция ДатьДопСвойствоВТЧ(Знач ТЧ, ИдентификаторДляФормул) Экспорт проще и быстрее реализовать через конструктор запроса, но это имхо.
    пс. за идею спасибо, пригодилась.

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

Добавить комментарий для fixin Отменить ответ

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