v8: Управляемый интерфейс: Произвольное поле табличной части
Например, надо узнать какое значение имеет свойство ТолькоПросмотр у поля «Сумма» в строке с индексом 5, табличной части Номенклатура. Свойства полей в одной колонке могут быть разные для разных строк, т.к. есть условное оформление.
Объект.Номенклатура[5].Сумма — дает не поле, а его значение (данные).
| Возможно, вас также заинтересует |
| 08.08.2011 09:33 | Ответ № 1 |
| получай через ЭлементыФормы |
| 08.08.2011 10:54 | Ответ № 2 |
| в Управляемой Форме нет «ЭлементыФормы» Если брать через Элементы.Номенклатура.ПодчиненныеЭлементы[«Сумма»], то получаем колонку, а не конкретное поле конретной строки |
| 08.08.2011 13:07 | Ответ № 3 |
| (2) conborath, да всли управляемое приложение, то «ЭлементыФормы» поменяете на «Элементы» а не проще это сделать через событие ПриВыводеСтроки? |
| 08.08.2011 15:45 | Ответ № 4 |
| 08.08.2011 17:06 | Ответ № 5 |
| (4) conborath, а, точно, ты ж в УП делаешь! до них я пока не добрался *09, времени не хватает( |
| 09.08.2011 09:20 | Ответ № 6 |
| Через Элемент ПриИзменении сделай |
| 09.08.2011 10:12 | Ответ № 7 |
| Хотя нет так не получиться будет контекст всей таблицы, помоему так в управляемых нельзя сделать . Если найдешь как получить напиши сюда пожалуйста |
| 09.08.2011 11:19 | Ответ № 8 |
| Вопрос возник из необходимости загружать в ТЗ данные из файла, но вот нельзя менять те значения, Которые стоят в только просмотр. Можно, конечно, изваражться и составлять вторую таблицу (или массив) тех строк и колонок, которые только просмотр и обращаться туда, но это лишнее, ищу встроеный метод, пока не нашел |
| 26.08.2011 12:31 | Ответ № 9 |
УО = ЭтаФорма.УсловноеОформление;
УО.Элементы.Очистить();
ЭлементУО = УО.Элементы.Добавить();
Оформляемоеполе = ЭлементУО.Поля.Элементы.Добавить(); // Поля таблицы для которых будет действовать оформление
Оформляемоеполе.Поле = Новый ПолеКомпоновкиДанных(«ТабКолонка1»);
Оформляемоеполе.Использование = ИСТИНА;
ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»)); // отбор текущей строки таблицы
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Объект.Таб.НомерСтроки»);
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Объект.Таб[Объект.Таб.Индекс(Объект.Таб.НайтиПоИдентификатору(Элементы.Таб.ТекущаяСтрока)) ].НомерСтроки;
ЭлементУО.Оформление.УстановитьЗначениеПараметра(«ТолькоПросмотр», ИСТИНА); // Установка оформления
ЭлементУО.Оформление.УстановитьЗначениеПараметра(«ЦветФОна»,WebЦвета.БледноЗолотистый);
| 26.08.2011 12:32 | Ответ № 10 |
| только тут для текущей строки если тебя для нескольких строк тогда надо будет создать список значений заполнить их номерами строк и проверить в отборе по списку |
Вывод связанной информации по текущему объекту из списка
Часто возникает необходимость вывести связанную информацию для текущего объекта из списка, например, элемента справочника или документа. Это может быть остаток товара на складе, долг контрагента, автор документа, общая сумма и валюта документа и т.д. Рассмотрим, какие существуют способы решения этой задачи в 1С:Предприятии 8.1.
1-й способ. Колонка табличного поля в формы списка, связанная с реквизитом объекта или графой журнала документов. Хотя это простейший способ, но он не всегда применим, потому что связанная информация обычно берется из других объектов (таблиц).
2-й способ. Системная кнопка «Перейти» или подобные кнопки, разработанные программистом, вызывающие отчеты или другие окна со связанной информацией по текущему объекту. Неудобство данного способа заключается в том, что часто информация должна быть еще более доступна, т.е. прямо в этом же окне, без лишних щелчков мыши и других окон.
3-й способ. Обработчик события «ПриАктивизацииСтроки». Это самый желательный способ, потому что он не сильно нагружает систему дополнительной работой и вполне удовлетворительно справляется с задачей в большинстве случаев. Обычно внизу или вверху формы располагается надпись, в которую выводится дополнительная информация о текущем объекте.
Например, обработчик события ПриАктивизацииСтроки в форме списка справочника Номенклатура:
Когда же информация требуется сразу по нескольким строкам списка, вообще без щелчков мыши, то остается последний способ.
4-й способ. Обработчик события ПриВыводеСтроки.

Событие ПриВыводеСтроки вызывается всякий раз, когда система формирует строки табличного поля. Это происходит при открытии списка, его прокрутке (формируются новые строки), при выборе группы (родителя), при нажатии на кнопку «Обновить текущий список» и т.д. При простой перерисовке формы (например, одна форма была перекрыта другой), данное событие не возникает.
ВНИМАНИЕ. В версии 1С:Предприятия 8 в колонке табличного поля не может располагаться выражение на встроенном языке! Для решения подобных задач можно использовать событие ПриВыводеСтроки .
Следующий пример демонстрирует получение связанной информации по элементам справочника из периодического регистра сведений:
В обработчике события ПриВыводеСтроки не рекомендуется всякий раз обращаться к остаткам регистров, выполнять сложные запросы и другие действия, поскольку это может сильно замедлить работу со списком. По крайней мере надо стремиться минимизировать такие обращения.
Непосредственно перед алгоритмом выборки информации желательно проверить, включена ли колонка, как сделано в вышеприведенном примере, потому что пользователь может ее скрыть штатными средствами платформы и вправе рассчитывать на то, что скорость работы со списком увеличится.
Кэширование данных средствами встроенного языка
В некоторых случаях для ускорения работы со списком можно организовать кэширование средствами встроенного языка, при котором уже выбранная из базы данных информация сохраняется в памяти (например, в объекте типа «Соответствие» или «ТаблицаЗначений»), а при последуещем формировании строки информация выбирается из импровизированного кэша, а не из базы данных.
Ниже приведен пример кэширования с использованием объекта «Соответствие»:
Предмет Статус

По мере работы со списком справочника (его прокрутке, при переходах по группам) в соответствие "Статусы" добавляются все новые и новые элементы. Но следует понимать, что информация в кэше может устареть, поэтому нужно иметь способ его периодически обновлять. Конечно, при закрытии окна переменная модуля формы "Статусы" будет уничтожена и кэш полностью очистится. Но более эргономичным решением будет специальная кнопка "Обновить полностью", доступная пользователю, или другой вариант — изменение алгоритма работы стандартной кнопки "Обновить текущий список" . Т.е. вид кнопки будет стандартный, но в алгоритме будет очищаться кэш и затем вызываться метод "Обновить()" текущей формы:
Распространенные ошибки программистов
Кроме правильного кода, в программе важно и то, насколько комфортно в ней работать.
- Элементы формы должны иметь имена, отражающие их сущность. Это облегчит вам жизнь при обращении к данным формы. Например, вместо имен Надпись1 и Панель2 лучше использовать НадписьКонтрагент и КомманднаяПанельТаблицыТоваров.
- Элементы формы должны быть расположены на форме с выравниванием и настроенными привязками. Проверить правильность работы привязок можно, не выходя из Конфигуратора ( + ). При изменении размеров формы размеры элемента должны изменяться пропорционально и не перекрывать друг друга.
- Элементы формы должны нести только необходимый и верный функционал. Например: поле ввода имеет кнопку «очистка», только если допускается использование пустого значения, имеет кнопку «открытие», если допускается просмотр элемента.
- Хорошим тоном считается наличие всплывающих подсказок при наведении курсора мыши на элемент формы.
При работе с запросами основной упор делается на оптимизацию производительности.
- При получении данных из выборки запроса лучше избежать организации получения значений реквизитов через точку. Все необходимые данные должны быть получены в самом запросе.
- При использовании запроса в отчетах в печатную форму выводить нужно строковые значения полей. Например, вместо Выборка.Контрагент использовать Выборка.Контрагент.Наименование.
- Если есть такая возможность, то лучше организовать логику работы программы так, чтобы при выборке данных из нескольких таблиц использовать в запросе полное объединение (ОБЪЕДИНИТЬ ВСЕ) вместо левого/правого соединения.
- Если в запросе необходимо отфильтровать данные списком значений (например, получение остатков только по позициям номенклатуры документа), нужно передавать в запрос предварительно созданный массив и фильтровать уже по нему вместо фильтра по результату подзапроса.
- Максимальное количество вложенности запросов не должно превышать 2. На практике всегда можно построить логику программы по-другому, на экзамене «1С:Специалист» это считается грубейшей ошибкой.
- Не нужно получать поля, которые в дальнейшем использоваться не будут. Также не нужно делать лишние группировки и итоги.
- При работе с виртуальными таблицами условия должны находиться в параметрах таблицы. Это увеличивает производительность в разы.
- При использовании таких функций, как СУММА, МАКСИМУМ и др., по полям, в которых может содержаться значение NULL, нужно эти поля преобразовать функцией ЕСТЬNULL().
Для платформы «1С:Предприятие» 7.7
Данный перечень ошибок является критичным, т.е., допустив их, можно не рассчитывать, что программа заработает.
- Точка с запятой после команды КонецПроцедуры или КонецФункции.
- Отсутствие директивы «Далее» для процедуры или функции, которые стоят ниже, чем вызывающая их процедура или функция.
- Для объектов, созданных при помощи оператора СоздатьОбъект(. ), отсутствие команд Записать(), Сохранить() или Провести(. ).
- Отсутствие директивы «Экспорт» для процедуры, функции, переменной глобального модуля, которые используются в других модулях.
- Получение бухгалтерских итогов на произвольную дату без «Ит.ВыполнитьЗапрос().
- Иногда начинающие программисты путают методы ТекущаяСтрока() и НомерСтроки. В таблице значений ТекущаяСтрока() – текущая строка на визуальной таблице (элемент диалога), НомерСтроки – для таблицы значений, созданной по СоздатьОбъект().
- Использование методов ПолучитьЭлемент() или ПолучитьДокумен() без предварительной команды ВыбратьЭлементы(); или ВыбратьДокументы();
- Имя переменной в форме совпадает с именем реквизита формы. Также возможна ошибка, когда имя реквизита формы совпадает с именем глобальной переменной.
- Использование периодического реквизита без метода ИспользоватьДату().
- Попытка создать операцию для документа с отсутствующим признаком «Бухгалтерский учет», или попытка создать движение по регистру для документа с отсутствующим флагом оперативного учета.
- Если название переменной содержит символы кириллицы, попытка получить значение переменной с символами латиницы или наоборот.
- Попытка записать периодический реквизит справочника, у которого нет галочки «Изменяется документами».
- В конце модуля бухгалтерского документа часто забывают писать Операция.Записать().
- Счётчик в запросе нужно писать с буквой «ё».
- Ошибка порядка обхода элементов диалога для радиокнопок (переключателей).
- При удалении строк из таблицы значений не принимается во внимание, что после удаления строки номер следующей уменьшается на единицу и соответственно в цикле по номерам строки перескакивают через одну.
Особенности использования свойства ИзменяетДанные
Все элементы управления, расположенные в форме, имеют свойство ИзменяетДанные . Это свойство следует устанавливать у элементов управления, которые не связаны с данными основного реквизита формы напрямую, но косвенно могут изменить данные.
Например, в форме справочника может быть расположено табличное поле и это табличное поле связано с данными, которые не являются непосредственно данными справочника, но логически с ним связаны. Если табличному полю не установить флаг ИзменяетДанные , то при добавлении, удалении или редактировании строк в этом табличном поле справочник не будет заблокирован и не будет взведен флаг модифицированности в форме. Взведение флага ИзменяетДанные решает эту проблему.
Однако надо помнить, что свойство ИзменяетДанные срабатывает не только при изменении данных связанных с соответствующим элементом управления, но и при отработке его событий, если для них определен обработчик в модуле формы.
Так, например, если у того же табличного поля определить обработчик события При выводе строки , то объект будет блокироваться и у формы будет взведен флаг модифицированности сразу же при открытии формы.
