Имя: Пароль:
1C
1С v8
Изменение флажка с помощью структуры при скане штрихкода
0 KoalaJustKoala
 
24.05.21
09:35
Имеется вот такое программное изменение флажка, когда он изменяется не ручным методом, но увы, флажок на истину не переделывается(
        ОтмеченнаяНаценка.Вставить(ЭтаФорма.ТекущийЭлемент.ТекущиеДанные, Истина);

Хелп(
1 KoalaJustKoala
 
24.05.21
10:45
ап
2 acht
 
24.05.21
11:01
Формулировка напомнила:
... на хромой блохе с того берега моря, которое зайцу не перелететь, орлу не перебежать, хоть море не море, а так, лужа посреди города, где тень от блохи на зайца упала и насмерть убила, а из шкуры зайца тулуп вышел и пошёл куда глаза глядят, а тут заяц ка-ак прыгнет!..
3 fisher
 
24.05.21
11:07
(0) <vanga mode on> Если это твое художество, а "ОтмеченнаяНаценка" - это список значений с интерактивной пометкой, то открываешь в синтакс-помощнике справку по списку значений и его методам в разделе "Универсальные коллекции" и хлопаешь себя по лбу <vanga mode off>
4 KoalaJustKoala
 
24.05.21
11:12
(3) Используются соответсвия
ОтмеченныйПриход = Новый Соответствие;
ОтмеченныйВозврат = Новый Соответствие;
ОтмеченнаяНаценка = Новый Соответствие;
Перем ОтмеченныйПриход;
Перем ОтмеченныйВозврат;
Перем ОтмеченнаяНаценка;

Процедура ТабПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    ОформлениеСтроки.Ячейки.ПроверкаПриход.ОтображатьФлажок = ИСТИНА;
    ОформлениеСтроки.Ячейки.ПроверкаВозврат.ОтображатьФлажок = ИСТИНА;
    ОформлениеСтроки.Ячейки.ПроверкаУценкаНаценка.ОтображатьФлажок = ИСТИНА;
    
    Если ЭлементыФормы.Таб.ТекущиеДанные.ПроверкаПриход = Неопределено Тогда
        ОформлениеСтроки.Ячейки.ПроверкаПриход.ЗначениеФлажка = Ложь;
    Иначе
        ОформлениеСтроки.Ячейки.ПроверкаПриход.ЗначениеФлажка = Истина;
    КонецЕсли;
    Если ЭлементыФормы.Таб.ТекущиеДанные.ПроверкаВозврат = Неопределено Тогда
        ОформлениеСтроки.Ячейки.ПроверкаВозврат.ЗначениеФлажка = Ложь;
    Иначе
        ОформлениеСтроки.Ячейки.ПроверкаВозврат.ЗначениеФлажка = Истина;
    КонецЕсли;
    Если ЭлементыФормы.Таб.ТекущиеДанные.ПроверкаУценкаНаценка = Неопределено Тогда
        ОформлениеСтроки.Ячейки.ПроверкаУценкаНаценка.ЗначениеФлажка = Ложь;
    Иначе
        ОформлениеСтроки.Ячейки.ПроверкаУценкаНаценка.ЗначениеФлажка = Истина;
    КонецЕсли;
КонецПроцедуры

Процедура ТабПриИзмененииФлажка(Элемент, Колонка)
    Если Колонка.Имя = "ПроверкаПриход" Тогда
        НайденныйЭлемент =  ОтмеченныеСтроки.НайтиПоЗначению(Элемент.ТекущаяСтрока);
        Если НайденныйЭлемент = Неопределено Тогда
            ОтмеченныйПриход.Вставить(Элемент.ТекущаяСтрока, Истина);
        Иначе
            ОтмеченныйПриход.Удалить(НайденныйЭлемент);
        КонецЕсли;
    ИначеЕсли Колонка.Имя = "ПроверкаВозврат" Тогда
        НайденныйЭлемент =  ОтмеченныеСтроки.НайтиПоЗначению(Элемент.ТекущаяСтрока);
        Если НайденныйЭлемент = Неопределено Тогда
            ОтмеченныйВозврат.Вставить(Элемент.ТекущаяСтрока, Истина);
        Иначе
            ОтмеченныйВозврат.Удалить(НайденныйЭлемент);
        КонецЕсли;
    ИначеЕсли Колонка.Имя = "ПроверкаУценкаНаценка" Тогда
        НайденныйЭлемент =  ОтмеченныеСтроки.НайтиПоЗначению(Элемент.ТекущаяСтрока);
        Если НайденныйЭлемент = Неопределено Тогда
            ОтмеченнаяНаценка.Вставить(Элемент.ТекущаяСтрока, Истина);
        Иначе
            ОтмеченнаяНаценка.Удалить(НайденныйЭлемент);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Это все что происходит при нажатии или выводе, это работает
а вот, что должно работать при скане штрих кода :

Функция ВернутьДокументПоШтрихкоду(ШтрихкодД) Экспорт
    
    Табл = ЭлементыФормы.Таб;
    
    ШтрихКод = СокрЛП(ШтрихкодД);
    КодДокумента = Прав(Лев(ШтрихКод,5),2);
    Если КодДокумента = "02" Тогда
        ВидДок = "ПереоценкаТМЗ";
    ИначеЕсли КодДокумента = "01" Тогда  
        
        ВидДок = "ПеремещениеТоваров";
    Иначе
        Возврат Неопределено;  
    КонецЕсли;
    
    ДатаДок=Дата(Сред(ШтрихКод,6,4),Сред(ШтрихКод,10,2),Сред(ШтрихКод,12,2));
    КодСклада = Лев(ШтрихКод,3);
    Если КодСклада = "CNS" Тогда
        КодСклада = "ЦУО";
    КонецЕсли;
    НомерДок = КодСклада + Сред(ШтрихКод,14);
    
    ТекДокумент = Документы[ВидДок].НайтиПоНомеру(НомерДок,ДатаДок);
    
    Если ВидДок = "ПереоценкаТМЗ"  Тогда  //Переоценка
        Табл.ТекущаяСтрока = Таб.Найти(ТекДокумент.Разница);
        Табл.ТекущаяКолонка = Таб.Найти("Наценка Уценка");
        Табл.ТекущаяКолонка = Табл.Колонки["ПроверкаУценкаНаценка"];
        //Чистый тест снизу, а если, а вдруг?
        ТабПриИзмененииФлажка(ЭтаФорма.ТекущийЭлемент, Табл.ТекущаяКолонка)
        //ОтмеченнаяНаценка.Вставить(Табл.ТекущаяКолонка, Истина);
    ИначеЕсли НЕ Таб.Найти(ТекДокумент.Номер,"НомПрих") = Неопределено  Тогда
        Табл.ТекущаяКолонка = Табл.Колонки["СуммаПрих"];
        Табл.ТекущаяСтрока = Таб.Найти(ТекДокумент.СуммаДокумента);
        Табл.ТекущаяКолонка = Табл.Колонки["ПроверкаПриход"];
        ОтмеченныйПриход.Вставить(ЭтаФорма.ТекущийЭлемент.ТекущиеДанные, Истина);
    ИначеЕсли НЕ Таб.Найти(ТекДокумент.Номер,"СуммаВозвр") = Неопределено  Тогда
        Табл.ТекущаяКолонка = Табл.Колонки["СуммаВозвр"];
        Табл.ТекущаяСтрока = Таб.Найти(ТекДокумент.СуммаДокумента);
        Табл.ТекущаяКолонка = Табл.Колонки["ПроверкаВозврат"];
        ОтмеченныйВозврат.Вставить(ЭтаФорма.ТекущийЭлемент.ТекущиеДанные, Истина);
            Иначе
        Предупреждение("Неизвестный штрихкод!");
    КонецЕсли;
    
КонецФункции

и именно в этой функции у меня и должна ставится галочка при скане штрихкода
5 fisher
 
24.05.21
11:31
Просто воткни в конце своей сканировки Табл.Обновить();
6 fisher
 
24.05.21
11:33
Или ОбновитьСтроки(), как оно там в ОФ...
7 fisher
 
24.05.21
11:42
А, не. Тебе еще кажись значение реквизита "ПроверкаУценкаНаценка" поменять надо.
Какого оно типа вообще?
8 KoalaJustKoala
 
24.05.21
11:44
(7) Это колонка в таблице
9 KoalaJustKoala
 
24.05.21
11:45
а у нее стоит булевое значение
10 KoalaJustKoala
 
24.05.21
11:45
(6) Добавил сейчас обновление строк в конце функции
    Табл.ОбновитьСтроки();
Неа, реакции дальше не пошло
11 fisher
 
24.05.21
11:49
Табл.ТекущиеДанные.ПроверкаУценкаНаценка = Истина;
12 KoalaJustKoala
 
24.05.21
11:52
(11) https://prnt.sc/13ca43f гхм, это уже прогресс)
Попробую дальше отталкиваться от этого, спасибо)
13 KoalaJustKoala
 
24.05.21
11:57
Но все таки интересно, а почему черезе соответсвие не хочет работать?
14 KoalaJustKoala
 
24.05.21
11:58
Разве Элемент, который в процедуре ПриИзменениеФлажка - это не то же самое, что ЭтаФорма.ТекущийЭлемент.ТекущаяСтрока /ТекущиеДанные(вроде так)
15 fisher
 
24.05.21
12:12
У тебя в соответствиях только буферизация. Для удобства получения готового списка отмеченных. В "обратную сторону" они не работают.
Отображение флажка рисуется в ТабПриВыводеСтроки() на основании состояния реквизита ПроверкаУценкаНаценка.
А в ПриИзменениеФлажка у тебя просто инвертируется состояние соответствий. Логика - что раз типа "клацнули" флажок, то его значение поменялось на противоположное. При этом сам реквизит ПроверкаУценкаНаценка меняется автоматически, когда интерактивно "клацают" флажок.
16 KoalaJustKoala
 
24.05.21
12:15
(15) Хм, а если сделать отдельную процедуру?
Ну скажем

процедура ИзменениеФлажкаАвтомат(Элемент, Колонка){
    Если Колонка.Имя = "ПроверкаПриход" Тогда
        НайденныйЭлемент =  ОтмеченныеСтроки.НайтиПоЗначению(Элемент.ТекущаяСтрока);
        Если НайденныйЭлемент = Неопределено Тогда
            ОтмеченныйПриход.Вставить(Элемент.ТекущаяСтрока, Истина);
        Иначе
            ОтмеченныйПриход.Удалить(НайденныйЭлемент);
        КонецЕсли;
    ИначеЕсли Колонка.Имя = "ПроверкаВозврат" Тогда
        НайденныйЭлемент =  ОтмеченныеСтроки.НайтиПоЗначению(Элемент.ТекущаяСтрока);
        Если НайденныйЭлемент = Неопределено Тогда
            ОтмеченныйВозврат.Вставить(Элемент.ТекущаяСтрока, Истина);
        Иначе
            ОтмеченныйВозврат.Удалить(НайденныйЭлемент);
        КонецЕсли;
    ИначеЕсли Колонка.Имя = "ПроверкаУценкаНаценка" Тогда
        НайденныйЭлемент =  ОтмеченныеСтроки.НайтиПоЗначению(Элемент.ТекущаяСтрока);
        Если НайденныйЭлемент = Неопределено Тогда
            ОтмеченнаяНаценка.Вставить(Элемент.ТекущаяСтрока, Истина);
        Иначе
            ОтмеченнаяНаценка.Удалить(НайденныйЭлемент);
        КонецЕсли;
    КонецЕсли;
}

и ссылать на него?
или в таком случае, просто ссылаться на процедуру созданную самой 1с
17 fisher
 
24.05.21
12:16
Хотя глядя на твой скриншот, я уже не уверен. Похоже, что значение флажка у тебя отвязано от значения реквизита. И тогда я не очень понимаю, как у тебя до этого все работало. Потому что в ПриВыводеСтроки у тебя анализируется именно значение реквизита.
18 fisher
 
24.05.21
12:18
Если пометки в динамическом списке должны работать независимо от значений реквизитов, тогда и в ПриВыводеСтроки должны анализироваться соответствия. А у тебя винегрет какой-то.
19 KoalaJustKoala
 
24.05.21
12:19
https://prnt.sc/13cbbjj
Гхм, вот настройки, для самой колонки
20 KoalaJustKoala
 
24.05.21
12:19
(18) Да, я на момент времени написания этой обработки, знал гораздо меньше чем сейчас и там сильная мешанина, такое чувство, что переписать, сейчас быстрее и проще, чем починить
21 fisher
 
24.05.21
12:24
(19) Я ОФ уже плохо помнить могу. Но ЕМНИП такие настройки нужны для того, чтобы флажок всегда отображался из значений реквизита "ФлагНаценка". Что не очень подходит для варианта, когда пользователь должен менять эти флажки без перезаписи элементов. Ведь именно это тебе нужно?
22 KoalaJustKoala
 
24.05.21
12:27
(21) Вроде да, если правильно понял
у меня все это не передается никуда дальше, все хранится только в рамках данной обработки, именно все флажки что есть, максимум они дальше уходя в макет, но с макетом, работают на удивление спокойно
23 fisher
 
24.05.21
12:29
(22) А начальное состояние флажков? Опирается на значение каких-то реквизитов или должно быть "пустое"?
24 KoalaJustKoala
 
24.05.21
12:32
(23) Просто пустое, оно заполняется при скане штрихкодов
25 KoalaJustKoala
 
24.05.21
12:33
либо в ручную меняется, если так будет нужно
26 fisher
 
24.05.21
12:35
(24) Тогда, КМК, достаточно просто переписать ТабПриВыводеСтроки(), чтобы флажки выводились по данным из соответствий. Тогда программная установка у тебя сведется к изменению соответствий и ОбновитьСтроки().
27 KoalaJustKoala
 
24.05.21
12:39
(26) Хм, сейчас попробую, перепишу как в итс
Процедура тпСотрудникиПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
ОформлениеСтроки.Ячейки.Отметка.ОтображатьФлажок = Истина;
        
Если ОтмеченныеСотрудники[ДанныеСтроки] = Неопределено Тогда
      ОформлениеСтроки.Ячейки.Отметка.Флажок = Ложь;
Иначе
     ОформлениеСтроки.Ячейки.Отметка.Флажок = Истина;
    КонецЕсли;
КонецПроцедуры
28 fisher
 
24.05.21
12:42
Что такое у тебя "ОтмеченныеСтроки" и как они работают - я тоже не понял.
(27) Во. Как раз то что надо. Только можно чуть проще:
ОформлениеСтроки.Ячейки.Отметка.Флажок = ОтмеченныеСотрудники[ДанныеСтроки] <> Неопределено;
29 KoalaJustKoala
 
24.05.21
12:49
(28) Хм, щас буду пробовать
ИТС это хорошая вещь)
Жаль не ко всему есть допуск(
30 KoalaJustKoala
 
24.05.21
12:52
https://prnt.sc/13cctlu
ОформлениеСтроки.Ячейки.ПроверкаПриход.ОтображатьФлажок = Истина;
    ОформлениеСтроки.Ячейки.ПроверкаВозврат.ОтображатьФлажок = Истина;
    ОформлениеСтроки.Ячейки.ПроверкаУценкаНаценка.ОтображатьФлажок = Истина;
    
    
    Если ОтмеченныйПриход[ДанныеСтроки] = Неопределено Тогда
        ОформлениеСтроки.Ячейки.ПроверкаПриход.Флажок = Ложь;
    Иначе
        ОформлениеСтроки.Ячейки.ПроверкаПриход.Флажок = Истина;
    КонецЕсли;
    
    
    Если ОтмеченныйВозврат[ДанныеСтроки] = Неопределено Тогда
        ОформлениеСтроки.Ячейки.ПроверкаВозврат.Флажок = Ложь;
    Иначе
        ОформлениеСтроки.Ячейки.ПроверкаВозврат.Флажок = Истина;
    КонецЕсли;
    
    Если ОтмеченнаяНаценка[ДанныеСтроки] = Неопределено Тогда
        ОформлениеСтроки.Ячейки.ПроверкаУценкаНаценка.Флажок = Ложь;
    Иначе
        ОформлениеСтроки.Ячейки.ПроверкаУценкаНаценка.Флажок = Истина;
    КонецЕсли;
31 KoalaJustKoala
 
24.05.21
12:53
Оно работает)

    Если ВидДок = "ПереоценкаТМЗ"  Тогда  //Переоценка
        Табл.ТекущаяСтрока = Таб.Найти(ТекДокумент.Разница);
        Табл.ТекущаяКолонка = Таб.Найти("Наценка Уценка");
        Табл.ТекущаяКолонка = Табл.Колонки["ПроверкаУценкаНаценка"];
        ТабПриИзмененииФлажка(ЭтаФорма.ТекущийЭлемент, Табл.ТекущаяКолонка);
    ИначеЕсли НЕ Таб.Найти(ТекДокумент.Номер,"НомПрих") = Неопределено  Тогда
        Табл.ТекущаяКолонка = Табл.Колонки["СуммаПрих"];
        Табл.ТекущаяСтрока = Таб.Найти(ТекДокумент.СуммаДокумента);
        Табл.ТекущаяКолонка = Табл.Колонки["ПроверкаПриход"];
        ТабПриИзмененииФлажка(ЭтаФорма.ТекущийЭлемент, Табл.ТекущаяКолонка);
    ИначеЕсли НЕ Таб.Найти(ТекДокумент.Номер,"СуммаВозвр") = Неопределено  Тогда
        Табл.ТекущаяКолонка = Табл.Колонки["СуммаВозвр"];
        Табл.ТекущаяСтрока = Таб.Найти(ТекДокумент.СуммаДокумента);
        Табл.ТекущаяКолонка = Табл.Колонки["ПроверкаВозврат"];
        ТабПриИзмененииФлажка(ЭтаФорма.ТекущийЭлемент, Табл.ТекущаяКолонка);
    Иначе
        Предупреждение("Неизвестный штрихкод!");
    КонецЕсли;

1 НО, я сделал отправку в изменение флажков)
AdBlock убивает бесплатный контент. 1Сергей