Оповещение о дублях в заказе на перемещение. Розница 3
Клиенту нужно чтобы при добавлении товара в документ «Заказ на перемещение» если такой товар уже есть, выходило предупреждение.
Сделал контроль при добавлении через подбор:

При добавлении строки:

При реализации интересно обрабатываю, изменилась табличная часть или нет, через контроль состава таблицы до и после, чтобы не залазить внутрь модулей.
Расширяю форму документа:
&НаКлиенте &Вместо("ОбработкаОповещения") Процедура дор_ОбработкаОповещения(ИмяСобытия, Параметр, Источник) ЭтоСобытиеПодбораВЭтуФорму = ИмяСобытия = "ПодборПроизведен" И Источник <> Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") И Источник = УникальныйИдентификатор; Если ЭтоСобытиеПодбораВЭтуФорму Тогда СооЗапасы = Новый Соответствие(); Для Каждого Строка из Объект.Запасы Цикл С = Новый Структура("Номенклатура, Характеристика, Количество", Строка.Номенклатура, строка.Характеристика, Строка.Количество); СооЗапасы.Вставить("" + Строка.Номенклатура + "|" + строка.Характеристика, С); КонецЦикла; КонецЕсли; ПродолжитьВызов(ИмяСобытия, Параметр, Источник); Если ЭтоСобытиеПодбораВЭтуФорму Тогда Текст = ""; Для Каждого Строка из Объект.Запасы Цикл С = СооЗапасы.Получить("" + Строка.Номенклатура + "|" + строка.Характеристика); Если С <> неопределено Тогда Если С.Количество < строка.Количество Тогда Текст = Текст + ?(Текст = "", "", Символы.ПС) + "Уже есть товар:" + С.Номенклатура + " " + С.Характеристика + " было: " + С.Количество + " стало: " + Строка.Количество; КонецЕсли; КонецЕсли; КонецЦикла; Если Текст <> "" И дор_С.ЭтоТоваровед() Тогда ПоказатьПредупреждение(, Текст); КонецЕсли; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура дор_ЗапасыПриОкончанииРедактированияПосле(Элемент, НоваяСтрока, ОтменаРедактирования) ТекущиеДанные = Элементы.Запасы.ТекущиеДанные; С = Новый Структура("Номенклатура, Характеристика", ТекущиеДанные.Номенклатура, ТекущиеДанные.Характеристика); ИскСтроки = Объект.Запасы.НайтиСтроки(С); Если НоваяСтрока И ИскСтроки.Количество() > 1 И дор_С.ЭтоТоваровед() тогда Текст = "Уже есть товар:" + С.Номенклатура + " " + С.Характеристика + " в строке: " + ИскСтроки[0].номерСтроки; ПоказатьПредупреждение(, Текст); КонецЕсли; КонецПроцедуры
Среда: Розница 3.0.12.237. Объем: 1 час.




Ну что ж, начнем:
1.
ЭтоСобытиеПодбораВЭтуФорму =
ИмяСобытия = «ПодборПроизведен»
И Источник Новый УникальныйИдентификатор(«00000000-0000-0000-0000-000000000000») // это зачем?
И Источник = УникальныйИдентификатор; // если есть это?
2.
СооЗапасы.Вставить(«» + Строка.Номенклатура + «|» + строка.Характеристика,
С); //так себе ключ, уникальность не обеспечена
3. при разных строках с одним товаром — количество не суммируется, а «перетирается» последним. Проще было использовать выгрузку через таблицу значений со сверткой
4.
Текст = Текст + ?(Текст = «», «», Символы.ПС) + «Уже есть товар:» + С.Номенклатура + » » + С.Характеристика
+ » было: » + С.Количество
+ » стало: » + Строка.Количество; / / вместо конкатенации надо использовать шаблоны подстановок
//вместо конкатенации в цикле нужно использовать массив с одной конкатенацией СтрСоединить
5. товар могут изменить уже в существующей строке — проверки вообще нет
1. чтобы не обрабатывать события чужих форм, это копия типовой проверки
2. можно использовать гуиды для параноиков
3. можно было бы, но это надо дергать сервер, про перерирание не понял
4. Почему НАДО? Я привык через конкатенацию, это таки ближе к php и других серьезным языкам
5. не могут, это не практикуют и от этого защиты не хотят.
Про перетирание: если в табличной части уже есть две строки с одной Номенклатурой и Характеристикой, вы обе кладёте в Соответствие под одним ключом. Вторая Вставить() заменит значение первой, а не сложит количество. Поэтому в Соответствии останется количество только последней строки, и дальнейшее сравнение было-стало уже будет считать от неверной исходной суммы.
возможно, такое не встречается на практике. но если что, можно и суммировать по ключу.
Про серьезные языки особенно смешно было.
1. В большинстве языков общего использования (и в PHP тоже) есть средство построения строки по коллекции строк.
2. В большинстве языков общего использования (и в PHP тоже) есть интерполяция строк.
Оба инструмента призваны решать проблемы, связанные с простой конкатенацией.
есть, но на практике используется конкатенация, без всяких проблем. Проблемы возникают у перфекционистов.
Не понятно зачем к тебе обращаться, если даже ты сам признаёшь дыры в логике. А другие просто не понимаешь.
не все дыры нужно штопать. Но чтобы это понять, нужно много лет практики.
Никто так не самоуверен в себе, как миддл, только вчера вышедший из джунов
Спасибо за самокритику в последнем предложении