| 
    
        
     
     | 
    
    
  | 
Поиск одинаковых ценников в ТЧ | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        Валидатор    
     01.08.14 
            ✎
    14:26 
 | 
         
        Есть табличная часть с номенклатурой, ценой и тд. Нужно сделать цикл, в котором проверялось бы следующее: если в табличной части одинаковая номенклатура, то смотреть ее ценник, если ценник разный, выдавать ошибку, если одинаковый то идти дальше     
         | 
|||
| 
    1
    
        Валидатор    
     01.08.14 
            ✎
    14:27 
 | 
         
        можно на номер строки зацепиться но мне не нравится эта идея     
         | 
|||
| 
    2
    
        Ёпрст    
     гуру 
    01.08.14 
            ✎
    14:29 
 | 
         
        смотреть её ценник - это что за зверь такой ?     
         | 
|||
| 
    3
    
        Timon1405    
     01.08.14 
            ✎
    14:29 
 | 
         
        здесь попкорн сразу выдают или сходить успею?     
         | 
|||
| 
    4
    
        Валидатор    
     01.08.14 
            ✎
    14:30 
 | 
         
        (3) у мамки твоей попкорн я оставил     
         | 
|||
| 
    5
    
        Luhtas    
     01.08.14 
            ✎
    14:32 
 | 
         
        (2) Видимо имеется ввиду цена номенклатуры.     
         | 
|||
| 
    6
    
        Валидатор    
     01.08.14 
            ✎
    14:32 
 | 
         
        То есть если так: 
 
        стул 50р Стул 150р такой вариант должен выдать ошибку, а если Стул 50р Стул 50р, то все норм  | 
|||
| 
    7
    
        Fish    
     гуру 
    01.08.14 
            ✎
    14:37 
 | 
         
        (6) Так а что конкретно не получается?     
         | 
|||
| 
    8
    
        Валидатор    
     01.08.14 
            ✎
    14:38 
 | 
         
        (7) да я не могу придумать как бы их сравнить, ладно если 2 строки, а если у меня n-количество строк, как я их буду сравнивать?     
         | 
|||
| 
    9
    
        Ёпрст    
     гуру 
    01.08.14 
            ✎
    14:42 
 | 
         
        получаешь список уникальной номенклатуры (тупо через выгрузить колонку и свернуть), далее через цикл по уникальным записям по номенклатуре выгружаешь во временную строки с отбором по этой номенклатуре и сворачиваешь эту временную тз по номенклатуре и цене, ежели количество строк в ней будет>1 - то это то, что тебе нужно
 
        Всё это можно сделать и в запросе, поместив ТЧ во временную тз в запросе и ..собственно сам запрос с группировкой +количество()...  | 
|||
| 
    10
    
        IVT_2009    
     01.08.14 
            ✎
    14:43 
 | 
         
        код 1с 77 примерно аналогичная задача
 
        функция тест_вернутьСправочникСинергия() вт = создатьОбъект("таблицаЗначений"); вт.новаяКолонка("код"); вт.новаяКолонка("скю"); запрос = создатьОбъект("запрос"); текстЗапроса = " |спр = справочник.номенклатура.текущийЭлемент; |товар = справочник.номенклатура.наименование; |код = справочник.номенклатура.код; |грпПрв = справочник.номенклатура.производитель.группаКонтрагента; |группировка код без групп; |условие(грпПрв = ВыбГрпПрвРП2 );"; запрос.выполнить(текстЗапроса); пока запрос.группировка(1) = 1 цикл если врег(лев(запрос.товар,2)) = "ЯЯ" тогда продолжить; конецЕслИ; вт.новаяСтрока(); вт.код = вернутьЗначениеСвойства("СвойстваНоменклатуры",запрос.спр,"кодСинергия"); вт.скю = уп(запрос.товар); конецЦикла; вт.свернуть("код,скю",""); вт.сортировать("скю,-код"); вт.новаяКолонка("метка"); //*** есть название , есть код //*** последовательно переберем тз //*** берем первый товар и делаем его опорным , сревним со следующим , если он //*** совпал то проверим на наличие кода. //*** если нет кода то ставим пометку удаления. опТовар = вт.получитьЗначение(1,"скю"); вт.выбратьСтроки(); ъ = 0; пока вт.получитьСтроку()=1 цикл ъ = ъ + 1; если ъ>1 тогда //***первый элемент пропускаем = он равен сам себе ))) если вт.скю = опТовар тогда //если стрДлина(вт.код)=0 тогда //***позиция совпала и код пустой - данную позицию удалим вт.установитьЗначение(ъ,"метка",1); //конецЕсли; иначе опТовар = вт.скю; конецЕсли; конецЕсли; конецЦикла; для Индекс = -вт.КоличествоСтрок() по -1 цикл вт.ПолучитьСтрокуПоНомеру(-Индекс); если вт.метка = 1 тогда вт.УдалитьСтроку(); конецЕсли; конецЦикла; возврат вт; конецФункции //функция тест_вернутьСправочникСинергия()  | 
|||
| 
    11
    
        Фокусник    
     01.08.14 
            ✎
    14:48 
 | 
         
        (8) "ладно если 2 строки, а если у меня n-количество строк, как я их буду сравнивать?"
 
        Можно так: ТЗ1 = ТЧ.Выгрузить().Свернуть("Номенклатура, Цена"); ТЗ2 = ТЧ.Выгрузить().Свернуть("Номенклатура"); Если количество строк в ТЗ1 и в ТЗ2 РАЗНОЕ, значит ошибка. Далее можно вывести сообщения по ТЗ1 по тем номенклатурам, которых >1 попало в ТЗ1  | 
|||
| 
    12
    
        salvator    
     01.08.14 
            ✎
    14:50 
 | 
         
        Таблицу в запрос, итоги по номенклатуре и цене. Далее в цикле проходишь по уровням дерева, если количество() в выборке 2-го уровня больше 1, то ошибка.     
         | 
|||
| 
    13
    
        Валидатор    
     01.08.14 
            ✎
    14:50 
 | 
         
        (11) ценники тоже сворачиваются, допустим у одного цена 50 у другого 250, он сворачивает в 300 жто числовое поле     
         | 
|||
| 
    14
    
        Валидатор    
     01.08.14 
            ✎
    14:50 
 | 
         
        СоответствиеЦен = Новый Соответствие;
 
        Для Каждого СтрокаТЧ ИЗ ТТН.Товары Цикл ТекЦена = СоответствиеЦен.Получить(СтрокаТЧ.Номенклатура); Если ТекЦена = Неопределено Тогда //еще не задано первое значение СоответствиеЦен.Вставить(СтрокаТЧ.Номенклатура, СтрокаТЧ.Цена); ИначеЕсли ТекЦена <> СтрокаТЧ.Цена Тогда Сообщить("Нельзя создавать ТТН по заказам с разными ценами"); Возврат ?! //какую функцию использовать на этом месте чтобы летела ошибка и код далее не выполнялся? КонецЕсли; КонецЦикла;  | 
|||
| 
    15
    
        ale-sarin    
     01.08.14 
            ✎
    14:51 
 | 
         
        (11) Если не запросом, то тогда уж выгрузить в ТЗ, добавить колонку-число, заполнить ее единицами
 
        Потом Свернуть("Номенклатура, Цена", "НоваяКолонка") Ищем где НоваяКолонка больше 1.  | 
|||
| 
    16
    
        Фокусник    
     01.08.14 
            ✎
    14:52 
 | 
         
        (13) Если так: .Свернуть("Номенклатура, Цена"), то НЕ сворачивает, это же поля для группировки, прочитай СП ;)     
         | 
|||
| 
    17
    
        Фокусник    
     01.08.14 
            ✎
    14:53 
 | 
         
        (15) не соответствует условию в (6)     
         | 
|||
| 
    18
    
        ale-sarin    
     01.08.14 
            ✎
    14:56 
 | 
         
        (17) ааа, ну да.
 
        Тогда можно свернуть перед добавлением колонки. А потом (15). Но, конечно, я бы запросом сделал.  | 
|||
| 
    19
    
        ale-sarin    
     01.08.14 
            ✎
    14:59 
 | 
         
        (14) А где этот код выполняется?     
         | 
|||
| 
    20
    
        jsmith    
     01.08.14 
            ✎
    15:00 
 | 
         
        Процедура ПроверкаСтрок()
 
        ТЗ = Объект.Товары.Выгрузить(); Для Каждого Строка Из ТЗ Цикл Строки = НайтиСтроки(Строка.Номенклатура, ТЗ); Валидность = ПроверитьВалидность(МассивСтрок); Если Не Валидность Тогда СообщитьОНевалидности(МассивСтрок); КонецЕсли; КонецЦикла; КонецПроцедуры; Функция НайтиСтроки(Товар, ТЗ) Отбор = Новый Структура("Номенклатура", Товар); МассивСтрок = ТЗ.НайтиСтроки(Отбор); Возврат МассивСтрок; КонецФункции Функция ПроверитьВалидность(МассивСтрок) Валидность = Истина; Цена = МассивСтрок[0].Цена; Для Каждого Строка Из МассивСтрокЦикл Если Строка.Цена <> Цена Тогда Валидность = Ложь; Прервать; КонецЕсли; КонецЦикла; Возврат Валидность; КонецФункции Процедура СообщитьОНевалидности(МассивСтрок) Сообщить("Обнаружены разные цены по товару " + Строка.Номенклатура); Для Каждого Строка Из МассивСтрок Цикл Сообщить("По строке " + Строка.НомерСтроки + ": " + Строка.Цена); КонецЦикла; КонецПроцедуры  | 
|||
| 
    21
    
        Валидатор    
     01.08.14 
            ✎
    15:00 
 | 
         
        (19) на сервере     
         | 
|||
| 
    22
    
        ale-sarin    
     01.08.14 
            ✎
    15:01 
 | 
         
        (21) Откуда вызывается? Переда записью? Или кнопка для проверки?     
         | 
|||
| 
    23
    
        Валидатор    
     01.08.14 
            ✎
    15:01 
 | 
         
        (21) кнопка для проверки, при нажатии которой все это дело делается в функции на сервере, а потом открывается на клиенте     
         | 
|||
| 
    24
    
        Валидатор    
     01.08.14 
            ✎
    15:03 
 | 
         
        dct gj[jle gjyzk     
         | 
|||
| 
    25
    
        Валидатор    
     01.08.14 
            ✎
    15:03 
 | 
         
        все, походу понял     
         | 
|||
| 
    26
    
        Ёпрст    
     гуру 
    01.08.14 
            ✎
    15:03 
 | 
         
        (20) лучше не прервать, а сразу Возврат Ложь.. лепить, красившее как-то     
         | 
|||
| 
    27
    
        Валидатор    
     01.08.14 
            ✎
    15:04 
 | 
         
        &НаКлиенте
 
        Процедура Команда1(Команда) Документ = НаСервере(); Если НЕ Документ = Неопределено Тогда Структура = Новый СТруктура("Ключ",Документ); ОткрытьФорму("Документ.ТТН.Форма.ФормаДокумента",Структура); Иначе Сообщить("Нельзя создавать ТТН по заказам с разными ценами номенклатуры"); КонецЕсли; КонецПроцедуры  | 
|||
| 
    28
    
        Валидатор    
     01.08.14 
            ✎
    15:04 
 | 
         
        (26) возвращаю там теперь просто неопределено)     
         | 
|||
| 
    29
    
        ale-sarin    
     01.08.14 
            ✎
    15:04 
 | 
         
        (23) Я бы не прекращал поиск других кривых строк из-за первой найденной. Нашел бы все несовпадения, вернул их на клиент, и сообщил пользователю.     
         | 
|||
| 
    30
    
        Валидатор    
     01.08.14 
            ✎
    15:14 
 | 
         
        Новая проблема:
 
        Для Каждого СтрокаТЧ ИЗ ТТН.Товары Цикл ТекЦена = СоответствиеЦен.Получить(СтрокаТЧ.Номенклатура); Если ТекЦена = Неопределено Тогда //еще не задано первое значение СоответствиеЦен.Вставить(СтрокаТЧ.Номенклатура, СтрокаТЧ.Цена); ИначеЕсли ТекЦена <> СтрокаТЧ.Цена Тогда Возврат Неопределено; КонецЕсли; КонецЦикла; В случае когда возвращается неопределено, то результатом функции будет неопределно, но если условие не попадает туда где Возврат Неопределно, то все равно функция возвращает неопределено, как быть7  | 
|||
| 
    31
    
        ale-sarin    
     01.08.14 
            ✎
    15:17 
 | 
         
        (30) После цикла сделайте 
 
        Возврат "Все нормально";  | 
|||
| 
    32
    
        Валидатор    
     01.08.14 
            ✎
    15:18 
 | 
         
        СоответствиеЦен = Новый Соответствие;
 
        Для Каждого СтрокаТЧ ИЗ ТТН.Товары Цикл ТекЦена = СоответствиеЦен.Получить(СтрокаТЧ.Номенклатура); Если ТекЦена = Неопределено Тогда //еще не задано первое значение СоответствиеЦен.Вставить(СтрокаТЧ.Номенклатура, СтрокаТЧ.Цена); ИначеЕсли ТекЦена <> СтрокаТЧ.Цена Тогда Возврат Неопределено; Иначе ТТН.Записать(); Возврат ТТН.Ссылка; КонецЕсли; КонецЦикла;  | 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |