Имя: Пароль:
1C
1С v8
8.2 Изменить программно ячейку табличной части
0 artist
 
11.07.13
02:36
Дано:
Документ, с табличной частью, с колонками "Количество" и "Цена"
Хочу, что бы для строк, у которых Количество = 0 невозможно было изменить цену (что бы ячейка цена в строке с Количество = 0 было недоступно).

Сразу приходит на ум процедура ПередНачаломИзменения, и она прекрасно работает, на уже существующих строках.

Если добавить новую строку, указать Количество = 0 и нажать энтер - процедура ПередНачаломИзменения не срабатывает, и поле Цена становится доступным для редактирования.

Что можно ещё предпринять?
1 artist
 
11.07.13
02:44
Всё, разобрался, надо в КоличествоПриИзмении и в ПриАктивизацииСтроки добавить проверку на количество, и в зависимости результата устанавливать Элементы.Цена.ТолькоПросмотр...


Или это я через зад гланды оперирую?
2 kosts
 
11.07.13
05:55
(0) Для установки отдельным ячейкам только просмотр хорошо использовать событие ПриПолученииДанных.
3 Cube
 
11.07.13
06:05
(2) Ты что-то прогнал - нельзя установить ТолькоПросмотр ячейке, можно установить только колонке...
Поэтому в ПриПолученииДанных не взлетит...
4 Cube
 
11.07.13
06:07
(0) Рекомендации п.1.2: Тема должна отражать суть сообщения.
http://www.forum.mista.ru/rules.php
5 SeraFim
 
11.07.13
06:09
(1) всё верно, именно так
6 kosts
 
11.07.13
06:10
(3)
ОформлениеЯчейки.ТолькоПросмотр (CellAppearance.ReadOnly)
ОформлениеЯчейки (CellAppearance)
ТолькоПросмотр (ReadOnly)
Использование:

Чтение и запись.
Описание:

Тип: Булево.
Определяет возможность редактирования ячейки.
7 Cube
 
11.07.13
06:17
(6) А слона-то я и не заметил :)
Беру свои слова обратно и плюсую за вариант (2).
8 Лодырь
 
11.07.13
06:19
А формы то какие кстати?
9 Лодырь
 
11.07.13
06:23
Если управляемые, есть хороший вариант изменения всего через условное оформление формы.
10 hhhh
 
11.07.13
06:36
(7) вариант (2) тормозной получается. При активизации строки в 10 раз быстрее.
11 kosts
 
11.07.13
06:47
(10) Задержки тут будут микроскопические. Другое дело, что нужно проверить как это будет работать, когда количество будут изменять на ноль и наоборот с нуля на число.
12 Cube
 
11.07.13
06:51
(10) Что в 10 раз быстрее? Говори конкретно.
Пример: алгоритм вычисления доступности поля слишком сложен и занимает 1 секунду. На экране отображается 10 строк ТЧ.

Вариант "ПриАктивизацииСтроки" затормозит открытие документа на 1 секунду и будет тормозить КАЖДЫЙ переход по строкам на 1 секунду. То есть, каждый клик мышкой будет стоить 1 секунду простоя.

Вариант "ПриПолученииДанных" затормозит открытие документа на 10 секунд, но не будет тормозить при переходе по строкам.

Каждый для себя выбирает сам, что ему предпочтительней...
13 hhhh
 
11.07.13
07:00
(12) ну например, пользователь открыл документ просто посмотреть и не собирается никакие цены редактировать. А у него при этом во всех 20-ти ячейках только просмотр установится. Оно ему надо? А Вариант "ПриАктивизацииСтроки" запустится в любом случае. В обоих вариантах.
14 Cube
 
11.07.13
07:09
(13) Ну... Если так рассуждать: например, пользователю нужно посмотреть комментарий в счете на оплату. Приходится включать компьютер, открывать 1С, искать счет, открывать счет... Оно ему надо? :)
15 hhhh
 
11.07.13
07:16
(14) в твоем варианте он должет открыть 1000 счетов, в одном из них посмотреть комментарий. В остальных не смотреть, закрывать глаза ладошкой.
16 artist
 
11.07.13
07:58
(8)Забыл сказать - управляемая форма.
(9)Можно в этом месте поподробнее.

ЗЫ Я так понимаю в УФ нет события при получении данных? Это только для обычных форм, или я не туда гляжу?
17 Лодырь
 
11.07.13
08:03
(16) Пример установки доступности ячеек таблицы в зависимости от реквизита. Аналогично делается раскраска.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
       ЭлементУО =   УсловноеОформление.Элементы.Добавить();
   ЭлементУО.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр",Истина);

   ЭлементУсловия =ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
   ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоОшибок.Тип");
   ЭлементУсловия.ВидСравнения  = ВидСравненияКомпоновкиДанных.Равно;
   ЭлементУсловия.ПравоеЗначение  = "К";
   
   ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
   ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ДеревоОшибокПометка");    
КонецПроцедуры
18 artist
 
11.07.13
08:06
(17)Спасибищи, сейчас попробую.
Я так понимаю через это оформление можно и цветом недоступные ячейки подсветить? (или наоборот доступные, не принципиально)
19 artist
 
11.07.13
08:17
(17)А как точно определить имя поля?

В одном случае у тебя через точку:
"ДеревоОшибок.Тип"

А в другом сплошняком:
"ДеревоОшибокПометка"

Так и задумано или это опечатка?
20 artist
 
11.07.13
08:20
+(19)...в отладчике как-нибудь можно посмотреть - какие строки попали в условие?
21 Feunoir
 
11.07.13
08:25
(19) Попробуй всё это настроить прямо в конфигураторе. В свойствах формы. Там есть редактор условного оформления. Может оттуда будет проще.

http://i.imgur.com/T23Bkt6.png
22 artist
 
11.07.13
08:32
(21)Так гораздо понятнее, спасибо!

Правильно ли я понимаю, что к реквизиту ТЧ через точку не обратишься в отборе? т.е. Объект.Товары.Номенклатура.НужныйРеквизит.
23 Лодырь
 
11.07.13
08:35
(22) Обратишся. Смотри пример, там есть обращение
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоОшибок.Тип");
Тут тип это реквизит дерева.
Если же речь идет не о отборе а о оформляемых полях, то там обращение через точку недопустимо.
24 artist
 
11.07.13
08:38
(23)Я так понимаю ДеревоОшибок - у тебя таблица, а Тип - это реквизит(колонка) таблицы, поэтому смело обращаешься.

А вот ДеревоОшибок.Тип.Код - уже нельзя сделать.
25 Лодырь
 
11.07.13
08:41
(24) Угу нельзя. Хотя это еще спорно. Возможно тут могут выручить внешние функции, но не проверял.
26 Feunoir
 
11.07.13
08:42
(24) Это (тонко)клиентский контекст. Там нет реквизитов у ссылок. Можешь просто ради интереса в тонком клиенте посмотреть как выглядит значение любого ссылочного типа на клиенте. Много вопросов отпадет (или наоборот, возникнет :) )
27 artist
 
11.07.13
08:46
Ок. Итого.
Если надо делать доступность просто по реквизиту ТЧ - можно использовать УсловноеОформление.
Если нужен отбор по реквизиту реквизита ТЧ - то только через ПриАктивизацииСтроки...


:(
28 Лодырь
 
11.07.13
08:48
(27) Используй динамические списки ) И вытащи реквизит наверх )
29 Feunoir
 
11.07.13
08:51
(27) ПриАктивизацииСтроки не сработает при редактировании ячейки. То есть вошли в строку - количество нулевое, цену менять нельзя. Поменяли количество на не нулевое, но событие не сработает, поэтому цену всё-равно менять нелья. Придется строку переступать. Я вытаскиваю эти реквизиты в скрытый служебный реквизит ТЧ. Надо только корректно его заполнять при чтении и создании документа.

(28) Динамический список по табличной части нового документа? Научи, плз.
30 Cube
 
11.07.13
08:53
(27) И всё-таки ПриПолученииДанных лучше...
31 Feunoir
 
11.07.13
08:57
(30) Одна только проблема, в управляемых формах нет такого события :)
32 Лодырь
 
11.07.13
09:00
(29) Можно извратиться, добавить табличку в реквизиты формы, читать ее при открытии (для нового пустая),и записывать ее при записи.
33 Feunoir
 
11.07.13
09:08
(32) Ну уж нет. У меня есть пара объектов, в которых мне пришлось такую табличную часть делать. Нет ни малейшего желания повторять :)

А так вообще-то добавляется реквизит в ТЧ формы (!), этот реквизит заполняется в событиях при чтении объекта, после записи и в момент изменения реквизита, к которому эти поля относятся.

Ну а потом по этому реквизиту уже делай что хочешь, хоть отбирай, хоть сортируй, хоть оформление накладывай.
34 Cube
 
11.07.13
09:10
(31) Сегодня не мой день :)
35 Лодырь
 
11.07.13
09:14
(33) Не спорю. Встречалось и такое. Однако все описанные нами способы все же скорее относятся к "вырезанию аппендицита через задницу". )
36 artist
 
11.07.13
11:22
(29)А я ещё в КоличествоПриИзменении проверяю и устанавливаю ТолькоДоступность.

В итоге связка ПриАктивизацииСтроки + ПриИзменении работает идеально.

Я просто думал что в 8.2 есть более красивое решение.

Как вариант - (32) и делаем через УсловноеОформление, но ради такой маленькой задачи городить реквизит ТЧ не очень интересно...
37 Лодырь
 
11.07.13
13:41
(36) Для относительно простых проверок решение вполне красивое. Для сложных - не очень ) Кстати, будь относительно сторожен с обвешиванием табличных частей сложными пересчетами и проверками, у меня почему то они кушают дохрена ресурсов.